/** * Just compute Yc = g^a % p and return it in "key_exchange_message". The * premaster secret is Ys ^ a % p. */ int dh_key_exchange( dh_key *server_dh_key, unsigned char *premaster_secret, unsigned char **key_exchange_message ) { huge Yc; huge Z; huge a; int message_size; short transmit_len; // TODO obviously, make this random, and much longer set_huge( &a, 6 ); mod_pow( &server_dh_key->g, &a, &server_dh_key->p, &Yc ); mod_pow( &server_dh_key->Y, &a, &server_dh_key->p, &Z ); // Now copy Z into premaster secret and Yc into key_exchange_message memcpy( premaster_secret, Z.rep, Z.size ); message_size = Yc.size + 2; transmit_len = htons( Yc.size ); *key_exchange_message = malloc( message_size ); memcpy( *key_exchange_message, &transmit_len, 2 ); memcpy( *key_exchange_message + 2, Yc.rep, Yc.size ); free_huge( &Yc ); free_huge( &Z ); free_huge( &a ); return message_size; }
void subtract( huge *h1, huge *h2 ) { int result_sign; // First compute sign of result, then compute magnitude if ( compare( h1, h2 ) > 0 ) { result_sign = h1->sign; if ( h1->sign == h2->sign ) { subtract_magnitude( h1, h2 ); } else { add_magnitude( h1, h2 ); } } else { huge tmp; // put h1 into tmp and h2 into h1 to swap the operands set_huge( &tmp, 0 ); // initialize copy_huge( &tmp, h1 ); copy_huge( h1, h2 ); if ( h1->sign == tmp.sign ) { result_sign = !( h1->sign ); subtract_magnitude( h1, &tmp ); } else { result_sign = !( h2->sign ); add_magnitude( h1, &tmp ); } free_huge( &tmp ); } // Use the stored sign to set the result h1->sign = result_sign; }
void APCObject::Delete(APCHandle* handle) { auto const obj = fromHandle(handle); obj->~APCObject(); // No need to run Prop destructors. free_huge(obj); }