Beispiel #1
0
// def createCoordsProof(self, version, g2, g3, r):
void createCoordsProof( char* version, BIGNUM* g2, BIGNUM* g3, BIGNUM* r, BIGNUM* c, BIGNUM* d1, BIGNUM* d2 )
{
    // r1 = createRandomExponent()
    // r2 = createRandomExponent()
    BIGNUM* r1 = createRandomExponent();
    BIGNUM* r2 = createRandomExponent();
    
    // tmp1 = pow(g3, r1, self.mod)
    BIGNUM* tmp1 = my_pow( g3, r1, mod );
    
    // tmp2 = mulm( pow(self.gen, r1, self.mod), pow(g2, r2, self.mod), self.mod)
    // Step A = pow(self.gen, r1, self.mod)
    BIGNUM* stepA = my_pow( gen, r1, mod );
    
    // Step B = pow(g2, r2, self.mod)
    BIGNUM* stepB = my_pow( g2, r2, mod );
    
    // Step C = mulm( StepA, StepB, mod )
    BIGNUM* tmp2 = mulm( stepA, stepB, mod );
    
    // c = sha256(version + str(tmp1) + str(tmp2))
    BIGNUM* tmp3 = sha_with_version( version, tmp1, tmp2 );
    BN_copy( c, tmp3 );
    
    // d1 = (r1 - mulm(r, c, self.modOrder)) % self.modOrder
    BIGNUM* resultA = mulm( r, c, modOrder );
    BIGNUM* d1_temp = subm( r1, resultA, modOrder );
    BN_copy( d1, d1_temp );
    
    // d2 = (r2 - mulm(self.secret, c, self.modOrder)) % self.modOrder
    BIGNUM* resultB = mulm( secret, c, modOrder );
    BIGNUM* d2_temp = subm( r2, resultB, modOrder );
    BN_copy( d2, d2_temp );

    // clean up
    BN_clear_free( r1 );
    BN_clear_free( r2 );
    BN_clear_free( tmp1 );
    BN_clear_free( stepA );
    BN_clear_free( stepB );
    BN_clear_free( tmp2 );
    BN_clear_free( tmp3 );
    BN_clear_free( resultA );
    BN_clear_free( d1_temp );
    BN_clear_free( resultB );
    BN_clear_free( d2_temp );
    
    // return (c, d1, d2)
}
Beispiel #2
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 );
}
Beispiel #3
0
// def checkCoordsProof(self, version, c, d1, d2, g2, g3, p, q):
int checkCoordsProof( char* version, BIGNUM* c, BIGNUM* d1, BIGNUM* d2, BIGNUM* g2, BIGNUM* g3, BIGNUM* p, BIGNUM* q )
{
    // tmp1 = mulm(pow(g3, d1, self.mod), pow(p, c, self.mod), self.mod)
    // Step A = pow(g3, d1, self.mod)
    BIGNUM* stepA = my_pow( g3, d1, mod );
    
    // Step B = pow(p, c, self.mod)
    BIGNUM* stepB = my_pow( p, c, mod );
    
    // Step C = mulm( StepA, StepB, mod )
    BIGNUM* tmp1 = mulm( stepA, stepB, mod );
    
    // tmp2 = mulm(mulm(pow(self.gen, d1, self.mod), pow(g2, d2, self.mod), self.mod), pow(q, c, self.mod), self.mod)
    // Step A = pow(self.gen, d1, self.mod)
    stepA = my_pow( gen, d1, mod );
    
    // Step B = pow(g2, d2, self.mod)
    stepB = my_pow( g2, d2, mod );
    
    // Step C = pow(q, c, self.mod)
    BIGNUM* stepC = my_pow( q, c, mod );
    
    // Step D = mulm( StepA, StepB, self.mod )
    BIGNUM* stepD = mulm( stepA, stepB, mod );
    
    // Step E = mulm( StepD, StepC, mod )
    BIGNUM* tmp2 = mulm( stepD, stepC, mod );
    
    // cprime = sha256(version + str(tmp1) + str(tmp2))
    BIGNUM* cprime = sha_with_version( version, tmp1, tmp2 );
    int ret = BN_cmp( c, cprime );
    
    // clean up
    BN_clear_free( stepA );
    BN_clear_free( stepB );
    BN_clear_free( tmp1 );
    BN_clear_free( tmp2 );
    BN_clear_free( stepC );
    BN_clear_free( stepD );
    BN_clear_free( cprime );
    
    // return (c == cprime)
    return ( ret == 0 );
}
Beispiel #4
0
// def checkEqualLogs(self, version, c, d, g3, qab, r):
int checkEqualLogs( char* version, BIGNUM* c, BIGNUM* d, BIGNUM* g3, BIGNUM* qab, BIGNUM* r )
{
    // tmp1 = mulm(pow(self.gen, d, self.mod), pow(g3, c, self.mod), self.mod)
    // Step A = pow(self.gen, d, self.mod)
    BIGNUM* stepA = my_pow( gen, d, mod );
    
    // Step B = pow(g3, c, self.mod)
    BIGNUM* stepB = my_pow( g3, c, mod );
    
    // Step C = mulm( StepA, StepB, mod )
    BIGNUM* tmp1 = mulm( stepA, stepB, mod );
    BN_clear_free( stepA );
    BN_clear_free( stepB );
    
    // tmp2 = mulm(pow(qab, d, self.mod), pow(r, c, self.mod), self.mod)
    // Step A = pow(qab, d, self.mod)
    stepA = my_pow( qab, d, mod );
    
    // Step B = pow(r, c, self.mod)
    stepB = my_pow( r, c, mod );
    
    // Step C = mulm( StepA, StepB, mod )
    BIGNUM* tmp2 = mulm( stepA, stepB, mod );
    
    // cprime = sha256(version + str(tmp1) + str(tmp2))
    BIGNUM* cprime = sha_with_version( version, tmp1, tmp2 );
    int ret = ( BN_cmp( c, cprime ) == 0 );
    
    // clean up
    BN_clear_free( stepA );
    BN_clear_free( stepB );
    BN_clear_free( tmp1 );
    BN_clear_free( tmp2 );
    BN_clear_free( cprime );
    
    // return (c == cprime)
    return ret;
}
Beispiel #5
0
// def createEqualLogsProof(self, version, qa, qb, x):
void createEqualLogsProof( char* version, BIGNUM* qa, BIGNUM* qb, BIGNUM* x, /* out */BIGNUM* c, /* out */BIGNUM* d )
{
    // r = createRandomExponent()
    BIGNUM* r = createRandomExponent();
    
    // tmp1 = pow(self.gen, r, self.mod)
    BIGNUM* tmp1 = my_pow( gen, r, mod );
    
    // qab = mulm(qa, qb, self.mod)
    BIGNUM* qab = mulm( qa, qb, mod );
    
    // tmp2 = pow(qab, r, self.mod)
    BIGNUM* tmp2 = my_pow( qab, r, mod );
    
    // c = sha256(version + str(tmp1) + str(tmp2))
    BIGNUM* c_temp = sha_with_version( version, tmp1, tmp2 );
    BN_copy( c, c_temp );
    BN_clear_free( tmp1 );
    
    // tmp1 = mulm(x, c, self.modOrder)
    tmp1 = mulm( x, c, modOrder );
    
    // d = (r - tmp1) % self.modOrder
    BIGNUM* d_temp = subm( r, tmp1, modOrder );
    BN_copy( d, d_temp );
    
    // return (c, d)
    
    // clean up
    BN_clear_free( r );
    BN_clear_free( tmp1 );
    BN_clear_free( qab );
    BN_clear_free( tmp2 );
    BN_clear_free( c_temp );
    BN_clear_free( d_temp );
}
Beispiel #6
0
void main()
{
	clrscr();
	int m,n,p,q,a[20][20],b[20][20],c[20][20];
	cout<<"Enter no:of rows & columns of first matrix:";
	cin>>m>>n;
	cout<<"Enter no:of rows & columns of second matrix:";
	cin>>p>>q;
	if(m!=p||n!=q)
		cout<<"Matrix addition and substraction not possible.\n";
	else
	{
		cout<<"Enter elements of First matrix:\n";
		getm(m,n,a);
		cout<<"Enter elements of Second matrix:\n";
		getm(p,q,b);
		clrscr();
		cout<<"First matrix:\n";
		prim(m,n,a);
		cout<<"Second matrix:\n";
		prim(p,q,b);
		cout<<"Matrix Sum:\n";
		addm(m,n,a,b);
		cout<<"Matrix Difference:\n";
		subm(m,n,a,b);
	}
	if(m!=q)
		cout<<"Matrix multiplication not possible.";
	else
	{
		if(m!=p||n!=q)
		{
			cout<<"Enter elements of First matrix:\n";
			getm(m,n,a);
			cout<<"Enter elements of Second matrix:\n";
			getm(p,q,b);
			clrscr();
			cout<<"First matrix:\n";
			prim(m,n,a);
			cout<<"Second matrix:\n";
			prim(p,q,b);
		}
		cout<<"Matrix Product:\n";
		mulm(m,n,q,a,b,c);
	}
	getch();
}
Beispiel #7
0
//def createLogProof(self, version, x):
void createLogProof( char* version, BIGNUM* x, BIGNUM* c, BIGNUM* d )
{
    // randExponent = createRandomExponent()
    BIGNUM* randExponent = createRandomExponent();
    
    // c = sha256( version + str( pow( self.gen, randExponent, self.mod ) ) )
    BIGNUM* exponPower = my_pow( gen, randExponent, mod );
    
    BIGNUM* c_temp = sha_with_version( version, exponPower, NULL );
    BN_copy( c, c_temp );
    
    // d = ( randExponent - mulm( x, c, self.modOrder ) ) % self.modOrder
    BIGNUM* tmp = mulm( x, c, modOrder );
    BIGNUM* d_temp = subm( randExponent, tmp, modOrder );
    BN_copy( d, d_temp );
    
    // clean up
    BN_clear_free( randExponent );
    BN_clear_free( exponPower );
    BN_clear_free( c_temp );
    BN_clear_free( tmp );
    BN_clear_free( d_temp );
}
Beispiel #8
0
// def checkLogProof(self, version, g, c, d):
int checkLogProof( char* version, BIGNUM* g, BIGNUM* c, BIGNUM* d )
{
    // gd = pow( gen, d, mod )
    BIGNUM* gd = my_pow( gen, d, mod );
    
    // gc = pow( g, c, mod)
    BIGNUM* gc = my_pow( g, c, mod );
    
    // gdgc = gd * gc % self.mod
    BIGNUM* gdgc = mulm( gd, gc, mod );
    
    // return (sha256(version + str(gdgc)) == c)
    BIGNUM* bnShaBytes = sha_with_version( version, gdgc, NULL );
    int ret = BN_cmp( bnShaBytes, c );
    
    // clean up
    BN_clear_free( gd );
    BN_clear_free( gc );
    BN_clear_free( gdgc );
    BN_clear_free( bnShaBytes );
    
    return ( ret == 0 );
}
Beispiel #9
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 );
}
Beispiel #10
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 );
}
Beispiel #11
0
unsigned int step2( unsigned char* buffer, int buflen )
{
    BIGNUM* g2a_new = BN_new();
    BIGNUM* c1_new = BN_new();
    BIGNUM* d1_new = BN_new();
    BIGNUM* c2_new = BN_new();
    BIGNUM* d2_new = BN_new();
    
    // (g2a, g3a, c1, d1, c2, d2) = unpackList(buffer)
    unsigned char* ptr = simpleUnpack( buffer, g2a_new);
    ptr = simpleUnpack( ptr, g3a);
    ptr = simpleUnpack( ptr, c1_new);
    ptr = simpleUnpack( ptr, d1_new);
    ptr = simpleUnpack( ptr, c2_new);
    ptr = simpleUnpack( ptr, d2_new);
    
    // if not self.checkLogProof('1', g2a, c1, d1):
    //    raise ValueError("Proof 1 check failed")
    if ( checkLogProof( "1", g2a_new, c1_new, d1_new ) != 1 )
        printf( "checkLogProof g2, c1, d1 failed!\n" );
    
    // if not self.checkLogProof('2', g3a, c2, d2):
    //    raise ValueError("Proof 2 check failed")
    if ( checkLogProof( "2", g3a, c2_new, d2_new ) != 1 )
        printf( "checkLogProof g3, c2, d2 failed!\n" );
    
    // self.x2 = createRandomExponent()
    // self.x3 = createRandomExponent()
    x2 = createRandomExponent();
    x3 = createRandomExponent();
    
    // self.g2 = pow(self.gen, self.x2, self.mod)
    g2 = my_pow( gen, x2, mod );

    // self.g3 = pow(self.gen, self.x3, self.mod)
    g3 = my_pow( gen, x3, mod );
    
    BIGNUM* c3_new = BN_new();
    BIGNUM* d3_new = BN_new();
    BIGNUM* c4_new = BN_new();
    BIGNUM* d4_new = BN_new();
    // (c3, d3) = self.createLogProof('3', self.x2)
    // (c4, d4) = self.createLogProof('4', self.x3)
    createLogProof( "3", x2, c3_new, d3_new );
    createLogProof( "4", x3, c4_new, d4_new );
    
    // self.gb2 = pow(self.g2a, self.x2, self.mod)
    gb2 = my_pow( g2a_new, x2, mod );
    
    // self.gb3 = pow(self.g3a, self.x3, self.mod)
    gb3 = my_pow( g3a, x3, mod );

    BIGNUM* r = createRandomExponent();
    
    // self.pb = pow(self.gb3, r, self.mod)
    pb = my_pow( gb3, r, mod );
    
    // self.qb = mulm(pow(self.gen, r, self.mod), pow(self.gb2, self.secret, self.mod), self.mod)
    // Step A: pow(self.gen, r, self.mod)
    BIGNUM* stepA = my_pow( gen, r, mod );
    
    // Step B: pow(self.gb2, self.secret, self.mod)
    BIGNUM* stepB = my_pow( gb2, secret, mod );
    
    // Step C: mulm( StepA, StepB, self.mod)
    qb = mulm( stepA, stepB, mod );

    // (c5, d5, d6) = self.createCoordsProof('5', self.gb2, self.gb3, r)
    BIGNUM* c5 = BN_new();
    BIGNUM* d5 = BN_new();
    BIGNUM* d6 = BN_new();
    createCoordsProof( "5", gb2, gb3, r, c5, d5, d6 );
    
    // # Sends g2b, g3b, pb, qb, all the c's and d's
    // return packList(self.g2, self.g3, self.pb, self.qb, c3, d3, c4, d4, c5, d5, d6)
    memset( buffer, 0x00, buflen );
    unsigned char* next = simplePack( buffer, g2 );
    next = simplePack( next, g3 );
    next = simplePack( next, pb );
    next = simplePack( next, qb );
    next = simplePack( next, c3_new );
    next = simplePack( next, d3_new );
    next = simplePack( next, c4_new );
    next = simplePack( next, d4_new );
    next = simplePack( next, c5 );
    next = simplePack( next, d5 );
    next = simplePack( next, d6 );
    
    // clean up
    BN_clear_free( g2a_new );
    BN_clear_free( c1_new );
    BN_clear_free( d1_new );
    BN_clear_free( c2_new );
    BN_clear_free( d2_new );
    BN_clear_free( c3_new );
    BN_clear_free( d3_new );
    BN_clear_free( c4_new );
    BN_clear_free( d4_new );
    BN_clear_free( r );
    BN_clear_free( stepA );
    BN_clear_free( stepB );
    BN_clear_free( c5 );
    BN_clear_free( d5 );
    BN_clear_free( d6 );
    
    return ( unsigned int )( next - buffer );
}