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_AUTH_FAILED, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_AGAIN, 0),
GNUTLS_ERROR_ENTRY( GNUTLS_E_DB_ERROR, 1),
{0}
#define GNUTLS_E_HASH_FAILED -33
#define GNUTLS_E_PARSING_ERROR -34
#define GNUTLS_E_MPI_PRINT_FAILED -35
+#define GNUTLS_E_AUTH_FAILED -36
#define GNUTLS_E_UNIMPLEMENTED_FEATURE -50
if (ret < 0) {
gnutls_assert();
gnutls_clearHashDataBuffer(state);
+ /* for srp */
+ if (state->security_parameters.kx_algorithm==GNUTLS_KX_SRP) return GNUTLS_E_AUTH_FAILED;
return ret;
}
if (ret < 0) {
gnutls_assert();
gnutls_clearHashDataBuffer(state);
+ /* in srp failure here - means authentication error */
+ if (state->security_parameters.kx_algorithm==GNUTLS_KX_SRP) return GNUTLS_E_AUTH_FAILED;
return ret;
}
}
#define gcry_mpi_addm mpi_addm
#define gcry_mpi_mul mpi_mul
#define gcry_mpi_mulm mpi_mulm
+MPI generate_public_prime( unsigned nbits );
/* Here functions for SRP (like g^x mod n) are defined
*/
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
-int _gnutls_srp_gn( opaque** ret_g, opaque** ret_n) {
+int _gnutls_srp_gn( opaque** ret_g, opaque** ret_n, int bits) {
MPI g, prime;
- size_t n = sizeof diffie_hellman_group1_prime;
+ size_t n;
int siz;
char* tmp;
- if (gcry_mpi_scan(&prime, GCRYMPI_FMT_USG,
- diffie_hellman_group1_prime, &n)) {
- gnutls_assert();
- return GNUTLS_E_MPI_SCAN_FAILED;
+ n = sizeof diffie_hellman_group1_prime;
+
+ if (bits==n*8) {
+ if (gcry_mpi_scan(&prime, GCRYMPI_FMT_USG,
+ diffie_hellman_group1_prime, &n)) {
+ gnutls_assert();
+ return GNUTLS_E_MPI_SCAN_FAILED;
+ }
+ } else {
+ /* generate a random prime */
+ prime = generate_public_prime(bits);
}
g = gcry_mpi_set_ui(NULL, SRP_G);
MPI _gnutls_calc_srp_A(MPI *a, MPI g, MPI n);
MPI _gnutls_calc_srp_S2(MPI B, MPI g, MPI x, MPI a, MPI u, MPI n);
void* _gnutls_calc_srp_x( char* username, char* password, opaque* salt, int salt_size, uint8 crypt_algo, int* size);
-int _gnutls_srp_gn( opaque** ret_g, opaque** ret_n);
+int _gnutls_srp_gn( opaque** ret_g, opaque** ret_n, int bits);
/* our prime */
extern const uint8 diffie_hellman_group1_prime[130];