diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2001-05-04 22:41:00 +0000 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2001-05-04 22:41:00 +0000 |
commit | 568aa3a845a13a4467db526b643f5a68b383d907 (patch) | |
tree | e7d875439fffc258efbedda06af8d43b81efc2b3 | |
parent | 908e68af7aabd51972f84a57ec9abf5540de215a (diff) | |
download | gnutls-568aa3a845a13a4467db526b643f5a68b383d907.tar.gz |
*** empty log message ***
-rw-r--r-- | lib/auth_srp.c | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/lib/auth_srp.c b/lib/auth_srp.c index 3172d46f5f..1ba52cc21a 100644 --- a/lib/auth_srp.c +++ b/lib/auth_srp.c @@ -56,6 +56,7 @@ MOD_AUTH_STRUCT srp_auth_struct = { #define N key->client_p #define G key->client_g #define V key->x +#define S key->KEY /* Send the first key exchange message ( g, n, s) */ int gen_srp_server_kx( GNUTLS_KEY key, opaque** data) { @@ -134,6 +135,7 @@ int gen_srp_server_kx2( GNUTLS_KEY key, opaque** data) { uint8 *data_b; GNUTLS_MAC_HANDLE td; opaque* hd; + MPI tmp1, tmp2; uint32 u; bits = gcry_mpi_get_nbits( key->client_p); @@ -143,7 +145,7 @@ int gen_srp_server_kx2( GNUTLS_KEY key, opaque** data) { tmpB = mpi_new(bits); /* FIXME: allocate in secure memory */ B = mpi_new(bits); /* FIXME: allocate in secure memory */ mpi_powm( tmpB, G, _b, N); - gcry_mpi_addm( B, V, tmpB, N); + mpi_addm( B, V, tmpB, N); mpi_release(tmpB); @@ -173,7 +175,24 @@ int gen_srp_server_kx2( GNUTLS_KEY key, opaque** data) { key->u = mpi_set_ui( NULL, u); /* CALC HERE */ + /* S = (A * v^u) ^ b % N */ + + S = gcry_mpi_alloc_like(N); + tmp1 = gcry_mpi_alloc_like(N); + tmp2 = gcry_mpi_alloc_like(N); + + mpi_pow(tmp1, V, key->u); + mpi_mul(tmp2, A, tmp1); + mpi_release(tmp1); + mpi_powm( S, tmp2, _b, N); + mpi_release(tmp2); + + mpi_release(A); + mpi_release(_b); + mpi_release(V); + mpi_release(key->u); + mpi_release(B); return n_b + 2; } @@ -329,6 +348,7 @@ int proc_srp_client_kx0( GNUTLS_KEY key, opaque* data, int data_size) { int proc_srp_server_kx2( GNUTLS_KEY key, opaque* data, int data_size) { uint16 n_B; size_t _n_B; + MPI tmp1, tmp2, tmp3, tmp4; memcpy(&n_B, &data[0], 2); #ifndef WORDS_BIGENDIAN @@ -342,6 +362,33 @@ int proc_srp_server_kx2( GNUTLS_KEY key, opaque* data, int data_size) { } /* CALC HERE */ + /* S = (B - g^x) ^ (a + u * x) % N */ + + S = gcry_mpi_alloc_like(N); + tmp1 = gcry_mpi_alloc_like(N); + tmp2 = gcry_mpi_alloc_like(N); + + mpi_pow(tmp1, G, V); + mpi_sub(tmp2, B, tmp1); + mpi_release(tmp1); + + + tmp3 = gcry_mpi_alloc_like(N); + tmp4 = gcry_mpi_alloc_like(N); + + mpi_add( tmp3, key->u, V); + mpi_add( tmp4, _a, tmp3); + mpi_release(tmp3); + + mpi_powm( S, tmp2, tmp4, N); + mpi_release(tmp2); + mpi_release(tmp4); + + mpi_release(A); + mpi_release(_b); + mpi_release(V); + mpi_release(key->u); + mpi_release(B); return 0; } |