Example #1
0
void step5( unsigned char* buffer, int buflen )
{
    BIGNUM* rb = BN_new();
    BIGNUM* c8 = BN_new();
    BIGNUM* d10 = BN_new();
    
    // (rb, c8, d10) = unpackList(buffer)
    unsigned char* ptr = simpleUnpack( buffer, rb );
    ptr = simpleUnpack( ptr, c8);
    ptr = simpleUnpack( ptr, d10);
    
    // if not self.isValidArgument(rb):
    //    raise ValueError("Invalid rb values")
        
    // if not self.checkEqualLogs('8', c8, d10, self.g3b, mulm(self.qa, self.invm(self.qb), self.mod), rb):
    //    raise ValueError("Proof 8 check failed")
    // Step A: self.invm(self.qb)
    // Step B: mulm(self.qa, Step A, self.mod)
    // Step C: checkEqualLogs('8', c8, d10, self.g3b, Step B, rb):
    BIGNUM* stepA = invm( qb, mod );
    BIGNUM* stepB = mulm( qa, stepA, mod );
    if ( checkEqualLogs( "8", c8, d10, g3b, stepB, rb ) != 1 )
        printf( "Proof 8 check failed\n" );
    BN_clear_free( stepA );
    
    // rab = pow(rb, self.x3, self.mod)
    BIGNUM* rab = my_pow( rb, x3, mod );
    
    // inv = self.invm(self.pb)
    BIGNUM* inv = invm( pb, mod );

    // if rab == mulm(self.pa, inv, self.mod):
    //    self.match = True
    stepA = mulm( pa, inv, mod );
    if ( BN_cmp( rab, stepA ) == 0 )
        match = 1;

    // clean up
    BN_clear_free( stepA );
    BN_clear_free( stepB );
    BN_clear_free( rab );
    BN_clear_free( inv );
    BN_clear_free( rb );
    BN_clear_free( c8 );
    BN_clear_free( d10 );
}
Example #2
0
File: calcs.c Project: sakov/enkf-c
/** Calculates M = inv(I + S' * S) [transpose = 0] or M = inv(I + S * S')
 ** [transpose = 1].
 * @param p - size(S, 1)
 * @param m - size(S, 2)
 * @param transpose - flag: whether to transpose S
 * @param S - input, p x m
 * @param M - output, m x m [transpose = 0], p x p [transpose = 1]
 * @return lapack_info (0 = success)
 */
static int calc_M(int p, int m, int transpose, double** S, double** M)
{
    int i;
    double a = 1.0;
    double b = 0.0;
    int lapack_info;

    assert(p > 0);

    if (!transpose) {
        /*
         * M = S' * S 
         */
        dgemm_(&doT, &noT, &m, &m, &p, &a, S[0], &p, S[0], &p, &b, M[0], &m);

        /*
         * M = I + S' * S
         */
        for (i = 0; i < m; ++i)
            M[i][i] += 1.0;

        /*
         * M = inv(I + S' * S) 
         */
        lapack_info = invm(m, M);
    } else {
        /*
         * M = S * S' 
         */
        dgemm_(&noT, &doT, &p, &p, &m, &a, S[0], &p, S[0], &p, &b, M[0], &p);
        /*
         * M = I + S * S'
         */
        for (i = 0; i < p; ++i)
            M[i][i] += 1.0;

        lapack_info = invm(p, M);
    }

    return lapack_info;
}
Example #3
0
unsigned int step4( unsigned char* buffer, int buflen )
{
    BIGNUM* pa = BN_new();
    BIGNUM* qa = BN_new();
    BIGNUM* ra = BN_new();
    BIGNUM* c6 = BN_new();
    BIGNUM* d7 = BN_new();
    BIGNUM* d8 = BN_new();
    BIGNUM* c7 = BN_new();
    BIGNUM* d9 = BN_new();
    
    // (g2b, g3b, pb, qb, c3, d3, c4, d4, c5, d5, d6) = unpackList(buffer)
    unsigned char* ptr = simpleUnpack( buffer, pa );
    ptr = simpleUnpack( ptr, qa);
    ptr = simpleUnpack( ptr, ra);
    ptr = simpleUnpack( ptr, c6);
    ptr = simpleUnpack( ptr, d7);
    ptr = simpleUnpack( ptr, d8);
    ptr = simpleUnpack( ptr, c7);
    ptr = simpleUnpack( ptr, d9);

    // if not self.isValidArgument(pa) or not self.isValidArgument(qa) or not self.isValidArgument(ra):
    //    raise ValueError("Invalid pa/qa/ra values")
        
    // if not self.checkCoordsProof('6', c6, d7, d8, self.gb2, self.gb3, pa, qa):
    //    raise ValueError("Proof 6 check failed")
    
    if ( checkCoordsProof( "6", c6, d7, d8, gb2, gb3, pa, qa ) != 1 )
        printf( "Proof 6 check failed" );
    
    // if not self.checkEqualLogs('7', c7, d9, self.g3a, mulm(qa, self.invm(self.qb), self.mod), ra):
    //    raise ValueError("Proof 7 check failed")
    // Step A: self.invm(self.qb)
    // Step B: mulm(qa, StepA, self.mod )
    // Step C: checkEqualLogs( '7',c7, d9, self.g3a, StepB, ra):
    BIGNUM* stepA = invm( qb, mod );

    BIGNUM* stepB = mulm( qa, stepA, mod );
    if ( checkEqualLogs( "7", c7, d9, g3a, stepB, ra)  != 1 )
        printf( "Proof 7 check failed" );
    
    // inv = self.invm(self.qb)
    BIGNUM* inv = invm( qb, mod );
    // rb = pow(mulm(qa, inv, self.mod), self.x3, self.mod)
    // Step A = mulm(qa, inv, self.mod)
    stepA = mulm( qa, inv, mod );
    BIGNUM* rb = my_pow( stepA, x3, mod );
    BN_clear_free( stepA );
    
    // (c8, d10) = self.createEqualLogsProof('8', qa, inv, self.x3)
    BIGNUM* c8 = BN_new();
    BIGNUM* d10 = BN_new();
    createEqualLogsProof( "8", qa, inv, x3, c8, d10 );
    
    // rab = pow(ra, self.x3, self.mod)
    BIGNUM* rab = my_pow( ra, x3, mod );
                
    // inv = self.invm(self.pb)
    inv = invm( pb, mod );
    
    // if rab == mulm(pa, inv, self.mod):
    //    self.match = True
    stepA = mulm( pa, inv, mod );
    if ( BN_cmp( rab, stepA ) == 0 )
        match = 1;
                    
    // # Send rb, c8, d10
    // return packList(rb, c8, d10)
    memset( buffer, 0x00, buflen );
    unsigned char* next = simplePack( buffer, rb );
    next = simplePack( next, c8 );
    next = simplePack( next, d10 );
    
    // clean up
    BN_clear_free( stepB );
    BN_clear_free( inv );
    BN_clear_free( stepA );
    BN_clear_free( rb );
    BN_clear_free( c8 );
    BN_clear_free( d10 );
    BN_clear_free( rab );
    BN_clear_free( pa );
    BN_clear_free( qa );
    BN_clear_free( ra );
    BN_clear_free( c6 );
    BN_clear_free( d7 );
    BN_clear_free( d8 );
    BN_clear_free( c7 );
    BN_clear_free( d9 );
    
    return ( unsigned int )( next - buffer );
}
Example #4
0
unsigned int step3( unsigned char* buffer, int buflen )
{
    BIGNUM* g2b_new = BN_new();
    BIGNUM* g3b_new = BN_new();
    BIGNUM* pb_new = BN_new();
    BIGNUM* qb_new = BN_new();
    BIGNUM* c3_new = BN_new();
    BIGNUM* d3_new = BN_new();
    BIGNUM* c4_new = BN_new();
    BIGNUM* d4_new = BN_new();
    BIGNUM* c5_new = BN_new();
    BIGNUM* d5_new = BN_new();
    BIGNUM* d6_new = BN_new();
    
    // (g2b, g3b, pb, qb, c3, d3, c4, d4, c5, d5, d6) = unpackList(buffer)
    unsigned char* ptr = simpleUnpack( buffer, g2b_new );
    ptr = simpleUnpack( ptr, g3b_new);
    ptr = simpleUnpack( ptr, pb_new);
    ptr = simpleUnpack( ptr, qb_new);
    ptr = simpleUnpack( ptr, c3_new);
    ptr = simpleUnpack( ptr, d3_new);
    ptr = simpleUnpack( ptr, c4_new);
    ptr = simpleUnpack( ptr, d4_new);
    ptr = simpleUnpack( ptr, c5_new);
    ptr = simpleUnpack( ptr, d5_new);
    ptr = simpleUnpack( ptr, d6_new);
    
    // if not self.checkLogProof('3', g2b, c3, d3):
    //    raise ValueError("Proof 3 check failed")
    if ( checkLogProof( "3", g2b_new, c3_new, d3_new ) != 1 )
        printf( "Proof 3 check failed!\n" );
    
    // if not self.checkLogProof('4', g3b, c4, d4):
    //    raise ValueError("Proof 4 check failed")
    if ( checkLogProof( "4", g3b_new, c4_new, d4_new ) != 1 )
        printf( "Proof 4 check failed!\n" );
    
    // self.g2b = g2b
    // self.g3b = g3b
    g3b = g3b_new;

    // self.ga2 = pow(self.g2b, self.x2, self.mod)
    BIGNUM* ga2 = my_pow( g2b_new, x2, mod );
    
    // self.ga3 = pow(self.g3b, self.x3, self.mod)
    BIGNUM* ga3 = my_pow( g3b_new, x3, mod );
    
    // if not self.checkCoordsProof('5', c5, d5, d6, self.ga2, self.ga3, pb, qb):
    //    raise ValueError("Proof 5 check failed")
    if ( checkCoordsProof( "5", c5_new, d5_new, d6_new, ga2, ga3, pb_new, qb_new ) != 1 )
        printf( "Proof 5 check failed!\n" );
    
    // s = createRandomExponent()
    BIGNUM* s = createRandomExponent();
                    
    qb = qb_new;
    pb = pb_new;
    
    // self.pa = pow(self.ga3, s, self.mod)
    pa = my_pow( ga3, s, mod );
    
    // self.qa = mulm(pow(self.gen, s, self.mod), pow(self.ga2, self.secret, self.mod), self.mod)
    // Step A = pow(self.gen, s, self.mod)
    // Step B = pow(self.ga2, self.secret, self.mod)
    // Step C = mulm( StepA, StepB, self.mod)
    BIGNUM* stepA = my_pow( gen, s, mod );
    BIGNUM* stepB = my_pow( ga2, secret, mod );
    qa = mulm( stepA, stepB, mod );
   
    // (c6, d7, d8) = self.createCoordsProof('6', self.ga2, self.ga3, s)
    BIGNUM* c6 = BN_new();
    BIGNUM* d7 = BN_new();
    BIGNUM* d8 = BN_new();
    createCoordsProof( "6", ga2, ga3, s, c6, d7, d8 );
    
    // inv = self.invm(qb)
    BIGNUM* inv = invm( qb_new, mod );
    
    // self.ra = pow(mulm(self.qa, inv, self.mod), self.x3, self.mod)
    // Step A = mulm(self.qa, inv, self.mod)
    stepA = mulm( qa, inv, mod );
    BIGNUM* ra = my_pow( stepA, x3, mod );
    
    // (c7, d9) = self.createEqualLogsProof('7', self.qa, inv, self.x3)
    BIGNUM* c7 = BN_new();
    BIGNUM* d9 = BN_new();
    createEqualLogsProof( "7", qa, inv, x3, c7, d9 );

    // # Sends pa, qa, ra, c6, d7, d8, c7, d9
    // return packList(self.pa, self.qa, self.ra, c6, d7, d8, c7, d9)
    memset( buffer, 0x00, buflen );
    unsigned char* next = simplePack( buffer, pa );
    next = simplePack( next, qa );
    next = simplePack( next, ra );
    next = simplePack( next, c6 );
    next = simplePack( next, d7 );
    next = simplePack( next, d8 );
    next = simplePack( next, c7 );
    next = simplePack( next, d9 );

    // clean up
    BN_clear_free( g2b_new );
    BN_clear_free( c3_new );
    BN_clear_free( d3_new );
    BN_clear_free( c4_new );
    BN_clear_free( d4_new );
    BN_clear_free( c5_new );
    BN_clear_free( d5_new );
    BN_clear_free( d6_new );
    BN_clear_free( ga2 );
    BN_clear_free( ga3 );
    BN_clear_free( s );
    BN_clear_free( stepA );
    BN_clear_free( stepB );
    BN_clear_free( c6 );
    BN_clear_free( d7 );
    BN_clear_free( d8 );
    BN_clear_free( inv );
    BN_clear_free( ra );
    BN_clear_free( c7 );
    BN_clear_free( d9 );

    return ( unsigned int )( next - buffer );
}