#include "auth_srp.h"
#include "gnutls_auth_int.h"
#include "gnutls_srp.h"
+#include "debug.h"
int gen_srp_server_kx(GNUTLS_KEY, opaque **);
int gen_srp_server_kx2(GNUTLS_KEY, opaque **);
pwd_algo = (uint8) pwd_entry->algorithm;
- gcry_mpi_print(GCRYMPI_FMT_USG, NULL, &n_g, pwd_entry->g);
- gcry_mpi_print(GCRYMPI_FMT_USG, NULL, &n_n, pwd_entry->n);
+ if (gcry_mpi_print(GCRYMPI_FMT_USG, NULL, &n_g, pwd_entry->g)!=0)
+ return GNUTLS_E_MPI_PRINT_FAILED;
+ if (gcry_mpi_print(GCRYMPI_FMT_USG, NULL, &n_n, pwd_entry->n)!=0)
+ return GNUTLS_E_MPI_PRINT_FAILED;
/* copy from pwd_entry to local variables (actually in state) */
G = gcry_mpi_alloc_like(pwd_entry->g);
memcpy( data_g, &pwd_algo, 1);
data_g++;
- gcry_mpi_print(GCRYMPI_FMT_USG, &data_g[2], &n_g, G);
+ if(gcry_mpi_print(GCRYMPI_FMT_USG, &data_g[2], &n_g, G)!=0)
+ return GNUTLS_E_MPI_PRINT_FAILED;
_n_g = n_g;
#ifndef WORDS_BIGENDIAN
_n_g = byteswap16(_n_g);
/* copy N (mod n) */
data_n = &data_g[2 + n_g];
- gcry_mpi_print(GCRYMPI_FMT_USG, &data_n[2], &n_n, N);
+ if (gcry_mpi_print(GCRYMPI_FMT_USG, &data_n[2], &n_n, N)!=0)
+ return GNUTLS_E_MPI_PRINT_FAILED;
_n_n = n_n;
#ifndef WORDS_BIGENDIAN
_n_n = byteswap16(_n_n);
/* calculate: B = (v + g^b) % N */
B = _gnutls_calc_srp_B( &_b, G, N, V);
- gcry_mpi_print(GCRYMPI_FMT_USG, NULL, &n_b, B);
+ if (gcry_mpi_print(GCRYMPI_FMT_USG, NULL, &n_b, B)!=0)
+ return GNUTLS_E_MPI_PRINT_FAILED;
(*data) = gnutls_malloc(n_b + 2);
/* copy B */
data_b = (*data);
- gcry_mpi_print(GCRYMPI_FMT_USG, &data_b[2], &n_b, B);
+ if (gcry_mpi_print(GCRYMPI_FMT_USG, &data_b[2], &n_b, B)!=0)
+ return GNUTLS_E_MPI_PRINT_FAILED;
_n_b = n_b;
#ifndef WORDS_BIGENDIAN
/* calc A = g^a % N */
A = _gnutls_calc_srp_A( &_a, G, N);
- gcry_mpi_print(GCRYMPI_FMT_USG, NULL, &n_a, A);
+ if (gcry_mpi_print(GCRYMPI_FMT_USG, NULL, &n_a, A)!=0)
+ return GNUTLS_E_MPI_PRINT_FAILED;
(*data) = gnutls_malloc(n_a + 2);
/* copy A */
data_a = (*data);
- gcry_mpi_print(GCRYMPI_FMT_USG, &data_a[2], &n_a, A);
+ if (gcry_mpi_print(GCRYMPI_FMT_USG, &data_a[2], &n_a, A)!=0)
+ return GNUTLS_E_MPI_PRINT_FAILED;
+
_n_a = n_a;
#ifndef WORDS_BIGENDIAN
_n_a = byteswap16(_n_a);
return GNUTLS_E_INSUFICIENT_CRED;
/* read the algorithm used to generate V */
+ i = 0;
memcpy( &pwd_algo, data, 1);
- i = 1;
+ i++;
memcpy(&n_g, &data[i], 2);
i += 2;
#ifndef WORDS_BIGENDIAN
gnutls_assert();
return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
}
+
memcpy(&n_n, &data[i], 2);
#ifndef WORDS_BIGENDIAN
n_n = byteswap16(n_n);
#include "gnutls_auth_int.h"
#include "gnutls_srp.h"
#include "gnutls_random.h"
+#include "debug.h"
static int pwd_put_values( GNUTLS_SRP_PWD_ENTRY *entry, char *str, int str_size) {
char * p;
int len;
opaque *verifier;
int verifier_size;
+opaque * tmp;
+int tmp_size;
p = rindex( str, '$'); /* we have n */
if (p==NULL) return -1;
p++;
len = strlen(p);
- if (gcry_mpi_scan(&entry->n, GCRYMPI_FMT_HEX, p, NULL)) {
+ tmp_size = _gnutls_base64_decode( p, len, &tmp);
+ if (tmp_size < 0) {
+ gnutls_free(tmp);
+ return GNUTLS_E_PARSING_ERROR;
+ }
+ if (gcry_mpi_scan(&entry->n, GCRYMPI_FMT_USG, tmp, &tmp_size)) {
gnutls_assert();
- return -1;
+ gnutls_free(tmp);
+ return GNUTLS_E_MPI_SCAN_FAILED;
}
+ gnutls_free(tmp);
/* now go for g */
p = rindex( str, '$'); /* we have g */
if (p==NULL) {
mpi_release(entry->n);
- return -1;
+ gnutls_assert();
+ return GNUTLS_E_PARSING_ERROR;
}
*p='\0';
p++;
len = strlen(p);
- if (gcry_mpi_scan(&entry->g, GCRYMPI_FMT_HEX, p, NULL)) {
+ tmp_size = _gnutls_base64_decode( p, len, &tmp);
+
+ if (tmp_size < 0) {
gnutls_assert();
mpi_release(entry->n);
- return -1;
+ gnutls_free(tmp);
+ return GNUTLS_E_PARSING_ERROR;
+ }
+ if (gcry_mpi_scan(&entry->g, GCRYMPI_FMT_USG, tmp, &tmp_size)) {
+ gnutls_assert();
+ gnutls_free(tmp);
+ mpi_release(entry->n);
+ return GNUTLS_E_MPI_SCAN_FAILED;
}
+ gnutls_free(tmp);
+
/* now go for verifier */
p = rindex( str, '$'); /* we have verifier */
if (p==NULL) {
mpi_release(entry->n);
mpi_release(entry->g);
- return -1;
+ return GNUTLS_E_PARSING_ERROR;
}
*p='\0';
gnutls_assert();
mpi_release(entry->n);
mpi_release(entry->g);
- return -1;
+ return GNUTLS_E_PARSING_ERROR;
}
if (gcry_mpi_scan(&entry->v, GCRYMPI_FMT_USG, verifier, &verifier_size)) {
gnutls_assert();
mpi_release(entry->n);
mpi_release(entry->g);
- return -1;
+ return GNUTLS_E_MPI_SCAN_FAILED;
}
mpi_release(entry->g);
mpi_release(entry->v);
gnutls_free(entry->salt);
- return -1;
+ return GNUTLS_E_PARSING_ERROR;
}
*p='\0';
return -1;
result[2] = ((a1 << 6) & 0xff) | (a2 & 0xff);
- if (data[3] == '=')
- ret--;
- if (data[4] == '=')
+ if (data[2] == '=')
ret--;
+ if (data[3] == '=')
+ ret--;
return ret;
}
data_size *= 4;
ret = data_size / 4 * 3;
- (*result) = gnutls_malloc(ret);
+ (*result) = gnutls_malloc(ret+1);
if ((*result) == NULL)
return -1;
#ifdef B64_TEST
int main()
{
- char x[99024];
+ char x[100*1024];
int siz;
uint8 *b64;
}
return 0;*/
- siz = fread(x, 1, 9004, stdin);
+ siz = fread(x, 1, sizeof(x), stdin);
// siz = _gnutls_fbase64_encode("CERTIFICATE", x, siz, &b64);
-// siz = _gnutls_base64_encode(x, siz, &b64);
- siz = _gnutls_base64_decode(x, siz, &b64);
+ siz = _gnutls_base64_encode(x, siz, &b64);
+// siz = _gnutls_base64_decode(x, siz, &b64);
// siz = _gnutls_fbase64_decode("CERTIFICATE", x, siz, &b64);
int i, salt_size = strlen(salt);
unsigned char *local_salt, *v;
int passwd_len, vsize;
- char *tmp, *g, *n;
+ opaque *tmp, *g, *n;
passwd_len = strlen(passwd) + 1; /* we want the null also */
if (passwd_len > 56)
int passwd_len;
GNUTLS_MAC_HANDLE h1;
int vsize, hash_len = gnutls_hash_get_algo_len(GNUTLS_MAC_SHA);
- char *tmp, *g, *n;
+ opaque *tmp, *g, *n;
uint8 *rtext, * csalt;
passwd_len = strlen(passwd); /* we do not want the null */
GNUTLS_ERROR_ENTRY( GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_UNKNOWN_KX_ALGORITHM, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_MPI_SCAN_FAILED, 1),
+ GNUTLS_ERROR_ENTRY( GNUTLS_E_MPI_PRINT_FAILED, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_DECRYPTION_FAILED, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_DECOMPRESSION_FAILED, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_COMPRESSION_FAILED, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_PWD_ERROR, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_EXPIRED, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_HASH_FAILED, 1),
+ GNUTLS_ERROR_ENTRY( GNUTLS_E_PARSING_ERROR, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_AGAIN, 0),
GNUTLS_ERROR_ENTRY( GNUTLS_E_DB_ERROR, 1),
{0}
#define GNUTLS_E_PWD_ERROR -31
#define GNUTLS_E_INSUFICIENT_CRED -32
#define GNUTLS_E_HASH_FAILED -33
+#define GNUTLS_E_PARSING_ERROR -34
+#define GNUTLS_E_MPI_PRINT_FAILED -35
#define GNUTLS_E_UNIMPLEMENTED_FEATURE -50
uint8 *dataptr=NULL; /* for realloc */
uint24 num;
int handshake_headers = HANDSHAKE_HEADERS_SIZE;
- int recv_type;
+ HandshakeType recv_type;
if (type == GNUTLS_CERTIFICATE) {
/* If the ciphersuite does not support certificate just quit */
if (state->gnutls_internals.resumed == RESUME_FALSE) /* if we are not resuming */
ret = _gnutls_recv_server_kx_message(cd, state);
if (ret < 0) {
+ gnutls_assert();
ERR("recv server kx message", ret);
gnutls_clearHashDataBuffer(state);
return ret;
if (state->gnutls_internals.resumed == RESUME_FALSE) /* if we are not resuming */
ret = _gnutls_send_client_kx_message0(cd, state);
if (ret < 0) {
+ gnutls_assert();
ERR("send client kx0", ret);
gnutls_clearHashDataBuffer(state);
return ret;
if (state->gnutls_internals.resumed == RESUME_FALSE) /* if we are not resuming */
ret = _gnutls_recv_server_kx_message2(cd, state);
if (ret < 0) {
+ gnutls_assert();
ERR("recv server kx message2", ret);
gnutls_clearHashDataBuffer(state);
return ret;
_gnutls_recv_handshake(cd, state, NULL, NULL,
GNUTLS_SERVER_HELLO_DONE);
if (ret < 0) {
+ gnutls_assert();
ERR("recv server hello done", ret);
gnutls_clearHashDataBuffer(state);
return ret;
if (state->gnutls_internals.resumed == RESUME_FALSE) /* if we are not resuming */
ret = _gnutls_send_client_certificate(cd, state);
if (ret < 0) {
+ gnutls_assert();
ERR("send client certificate", ret);
gnutls_clearHashDataBuffer(state);
return ret;
if (state->gnutls_internals.resumed == RESUME_FALSE) /* if we are not resuming */
ret = _gnutls_send_client_kx_message(cd, state);
if (ret < 0) {
+ gnutls_assert();
ERR("send client kx", ret);
gnutls_clearHashDataBuffer(state);
return ret;
_gnutls_send_client_certificate_verify(cd,
state);
if (ret < 0) {
+ gnutls_assert();
ERR("send client certificate verify", ret);
gnutls_clearHashDataBuffer(state);
return ret;
_gnutls_send_handshake(cd, state, NULL, 0,
GNUTLS_SERVER_HELLO_DONE);
if (ret < 0) {
+ gnutls_assert();
ERR("send server hello done", ret);
gnutls_clearHashDataBuffer(state);
return ret;
if (state->gnutls_internals.resumed == RESUME_FALSE) /* if we are not resuming */
ret = _gnutls_recv_client_kx_message(cd, state);
if (ret < 0) {
+ gnutls_assert();
ERR("recv client kx", ret);
gnutls_clearHashDataBuffer(state);
return ret;
#define READ_DEBUG
#define WRITE_DEBUG
#define BUFFERS_DEBUG
-#define HARD_DEBUG
#define HANDSHAKE_DEBUG
-#define DEBUG
+#define HARD_DEBUG
*/
+#define DEBUG
#define MAX32 4294967295
#define MAX24 16777215
(state->gnutls_internals.current_cipher_suite);
/* Do key exchange only if the algorithm permits it */
- if (_gnutls_kx_server_key_exchange(algorithm) != 0) {
+ if (_gnutls_kx_client_key_exchange(algorithm) != 0) {
ret =
_gnutls_recv_handshake(cd, state, &data,
#include <gnutls_errors.h>
#include <crypt_bcrypt.h>
#include <gnutls_srp.h>
+#include <cert_b64.h>
+#include "debug.h"
-// temp here ---
+/* These should be added in gcrypt.h */
#define gcry_mpi_add mpi_add
#define gcry_mpi_subm mpi_subm
#define gcry_mpi_addm mpi_addm
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
-int _gnutls_srp_gx(opaque *text, int textsize, opaque** result, char** ret_g, char** ret_n) {
+int _gnutls_srp_gx(opaque *text, int textsize, opaque** result, opaque** ret_g, opaque** ret_n) {
MPI g, prime, x, e;
size_t n = sizeof diffie_hellman_group1_prime;
int result_size, siz;
-
+ char* tmp;
+
if (gcry_mpi_scan(&prime, GCRYMPI_FMT_USG,
diffie_hellman_group1_prime, &n)) {
gnutls_assert();
/* e = g^x mod prime (n) */
gcry_mpi_powm(e, g, x, prime);
-
gcry_mpi_release(x);
gcry_mpi_print(GCRYMPI_FMT_USG, NULL, &result_size, e);
}
siz = 0;
- gcry_mpi_print(GCRYMPI_FMT_HEX, NULL, &siz, g);
+ gcry_mpi_print(GCRYMPI_FMT_USG, NULL, &siz, g);
if (ret_g!=NULL) {
- *ret_g = gnutls_malloc(siz+1);
- gcry_mpi_print(GCRYMPI_FMT_HEX, *ret_g, &siz, g);
- (*ret_g)[siz] = 0;
+ tmp = gnutls_malloc(siz);
+ gcry_mpi_print(GCRYMPI_FMT_USG, tmp, &siz, g);
+
+ if (_gnutls_base64_encode( tmp, siz, ret_g) < 0) {
+ gnutls_free(tmp);
+ return GNUTLS_E_UNKNOWN_ERROR;
+ }
+ gnutls_free(tmp);
}
siz = 0;
- gcry_mpi_print(GCRYMPI_FMT_HEX, NULL, &siz, prime);
+ gcry_mpi_print(GCRYMPI_FMT_USG, NULL, &siz, prime);
if (ret_n!=NULL) {
- *ret_n = gnutls_malloc(siz+1);
- gcry_mpi_print(GCRYMPI_FMT_HEX, *ret_n, &siz, prime);
- (*ret_n)[siz] = 0;
+ tmp = gnutls_malloc(siz);
+ gcry_mpi_print(GCRYMPI_FMT_USG, tmp, &siz, prime);
+ if (_gnutls_base64_encode( tmp, siz, ret_n) < 0) {
+ gnutls_free(tmp);
+ return GNUTLS_E_UNKNOWN_ERROR;
+ }
+
+ gnutls_free(tmp);
}
-
+
gcry_mpi_release(e);
gcry_mpi_release(g);
gcry_mpi_release(prime);
-int _gnutls_srp_gx(opaque *text, int textsize, opaque** result, char** ret_g, char** ret_n);
+int _gnutls_srp_gx(opaque *text, int textsize, opaque** result, opaque** ret_g, opaque** ret_n);
MPI _gnutls_calc_srp_B(MPI * ret_b, MPI g, MPI n, MPI v);
MPI _gnutls_calc_srp_u( MPI B);
MPI _gnutls_calc_srp_S1(MPI A, MPI b, MPI u, MPI v, MPI n);
gnutls_set_cipher_priority( state, 3, GNUTLS_3DES, GNUTLS_ARCFOUR, GNUTLS_RIJNDAEL);
gnutls_set_compression_priority( state, 2, GNUTLS_ZLIB, GNUTLS_NULL_COMPRESSION);
-// gnutls_set_kx_priority( state, 2, GNUTLS_KX_SRP, GNUTLS_KX_ANON_DH);
- gnutls_set_kx_priority( state, 1, GNUTLS_KX_ANON_DH);
+ gnutls_set_kx_priority( state, 2, GNUTLS_KX_SRP, GNUTLS_KX_ANON_DH);
gnutls_set_kx_cred( state, GNUTLS_KX_ANON_DH, NULL, 0);
gnutls_set_kx_cred( state, GNUTLS_KX_SRP, &cred, sizeof(cred));
int optval = 1;
SRP_SERVER_CREDENTIALS cred;
+ /* this is a password file (created with the included crypt utility)
+ */
cred.password_file="/tmp/pwd";
listen_sd = socket(AF_INET, SOCK_STREAM, 0);