-Version 0.8.1
+Version 0.8.2
+- The library notifies the application on empty and illegal SRP usernames,
+ so that proper notification (via an alert) is sent to the peer.
+
+Version 0.8.1 (22/01/2003)
- Improved the SRP support, to prevent attackers guessing the
available usernames by brute force.
- Improved the SRP detection in gnutls-cli-debug
- Some fixes which now allow compilation.
-Version 0.8.0 (20/01/2002)
+Version 0.8.0 (20/01/2003)
- Added gnutls_x509_extract_dn_string() which returns a
distinguished name in a single string.
- Added gnutls_openpgp_extract_key_name_string() which returns
ret = GNUTLS_A_BAD_RECORD_MAC;
_level = GNUTLS_AL_FATAL;
break;
+ case GNUTLS_E_ILLEGAL_SRP_USERNAME:
+ ret = GNUTLS_A_ACCESS_DENIED;
+ _level = GNUTLS_AL_FATAL;
+ break;
case GNUTLS_E_DECOMPRESSION_FAILED:
ret = GNUTLS_A_DECOMPRESSION_FAILURE;
_level = GNUTLS_AL_FATAL;
-int gnutls_clear_creds( gnutls_session session);
+void gnutls_credentials_clear( gnutls_session session);
int gnutls_credentials_set( gnutls_session session, gnutls_credentials_type type, void* cred);
const void *_gnutls_get_cred( GNUTLS_KEY key, gnutls_credentials_type kx, int* err);
const void *_gnutls_get_kx_cred( gnutls_session session, gnutls_kx_algorithm algo, int *err);
if (cert == NULL) {
/* No certificate was found
*/
- gnutls_assert();
alg_size = 0;
alg = NULL;
} else {
uint8 *data_n, *data_s;
uint8 *data_g, *username;
SRP_PWD_ENTRY *pwd_entry;
- int err;
SRP_SERVER_AUTH_INFO info;
ssize_t data_size;
size_t n_b;
uint8 *data_b;
-
+
+ if (state->security_parameters.extensions.srp_username[0] == 0) {
+ /* The peer didn't send a valid SRP extension with the
+ * SRP username.
+ */
+ gnutls_assert();
+ return GNUTLS_E_EMPTY_SRP_USERNAME;
+ }
+
if ( (ret=_gnutls_auth_info_set( state, GNUTLS_CRD_SRP, sizeof( SRP_SERVER_AUTH_INFO_INT), 1)) < 0) {
gnutls_assert();
return ret;
info = _gnutls_get_auth_info( state);
username = info->username;
-
+
_gnutls_str_cpy( username, MAX_SRP_USERNAME, state->security_parameters.extensions.srp_username);
ret = _gnutls_srp_pwd_read_entry( state, username, &pwd_entry);
_gnutls_get_random( rndsuffix, sizeof(rndsuffix), GNUTLS_WEAK_RANDOM);
sprintf( rnduser, "__invalid%x%x%x%x", rndsuffix[0],
rndsuffix[1], rndsuffix[2], rndsuffix[3]);
- entry->salt.size = (rndsuffix[4] % 10) + 7;
+ entry->salt.size = (rndsuffix[4] % 10) + 9;
entry->username = gnutls_strdup(rnduser);
if (entry->username == NULL) {
if ( sizeof( state->security_parameters.extensions.srp_username) <= len) {
gnutls_assert();
- return GNUTLS_E_MEMORY_ERROR;
+ return GNUTLS_E_ILLEGAL_SRP_USERNAME;
}
memcpy( state->security_parameters.extensions.srp_username, &data[1], len);
state->security_parameters.extensions.srp_username[len]=0; /* null terminated */
CDK_KBNODE knode = NULL, ctx = NULL, p;
CDK_PACKET *pkt = NULL;
cdkPKT_user_id *uid = NULL;
- char *email;
- int pos = 0, pos1 = 0, pos2 = 0;
+ int pos = 0;
size_t size = 0;
int rc = 0;
char *x509_crlfile = NULL;
static int x509ctype;
-static gnutls_srp_client_credentials cred;
+static gnutls_srp_client_credentials srp_cred;
static gnutls_anon_client_credentials anon_cred;
static gnutls_certificate_credentials xcred;
gnutls_dh_set_prime_bits(session, 512);
gnutls_credentials_set(session, GNUTLS_CRD_ANON, anon_cred);
- if (srp_username != NULL)
- gnutls_credentials_set(session, GNUTLS_CRD_SRP, cred);
+ gnutls_credentials_set(session, GNUTLS_CRD_SRP, srp_cred);
gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
/* send the fingerprint */
socket_bye(&hd);
- if (srp_username != NULL)
- gnutls_srp_free_client_credentials(cred);
+ gnutls_srp_free_client_credentials(srp_cred);
gnutls_certificate_free_credentials(xcred);
gnutls_anon_free_client_credentials(anon_cred);
/* gnutls_certificate_client_callback_func( xcred, cert_callback); */
/* SRP stuff */
- if (srp_username != NULL) {
- if (gnutls_srp_allocate_client_credentials(&cred) < 0) {
- fprintf(stderr, "SRP authentication error\n");
- }
+ if (gnutls_srp_allocate_client_credentials(&srp_cred) < 0) {
+ fprintf(stderr, "SRP authentication error\n");
+ }
- if ((ret=gnutls_srp_set_client_credentials(cred, srp_username, srp_passwd)) < 0) {
+ if (srp_username != NULL) {
+ if ((ret=gnutls_srp_set_client_credentials(srp_cred, srp_username, srp_passwd)) < 0) {
fprintf(stderr, "SRP credentials set error [%d]\n", ret);
}
}