return gnutls_assert_val(ret);
_gnutls_mpi_release(&session->key.client_Y);
- _gnutls_mpi_release(&session->key.dh_secret);
+ zrelease_temp_mpi_key(&session->key.dh_secret);
if (psk_key == NULL) {
ret =
_gnutls_set_psk_session_key(session, psk_key,
&tmp_dh_key);
- _gnutls_free_datum(&tmp_dh_key);
+ _gnutls_zfree_datum(&tmp_dh_key);
}
- _gnutls_mpi_release(&session->key.KEY);
+ zrelease_temp_mpi_key(&session->key.KEY);
if (ret < 0) {
return ret;
gnutls_buffer_st * data,
gnutls_datum_t * pskkey)
{
- bigint_t x = NULL, X = NULL;
+ bigint_t x = NULL, Y = NULL;
int ret;
- ret = gnutls_calc_dh_secret(&X, &x, session->key.client_g,
+ ret = gnutls_calc_dh_secret(&Y, &x, session->key.client_g,
session->key.client_p, 0);
if (ret < 0) {
gnutls_assert();
_gnutls_dh_set_secret_bits(session, _gnutls_mpi_get_nbits(x));
- ret = _gnutls_buffer_append_mpi(data, 16, X, 0);
+ ret = _gnutls_buffer_append_mpi(data, 16, Y, 0);
if (ret < 0) {
gnutls_assert();
goto error;
ret =
_gnutls_set_psk_session_key(session, pskkey,
&tmp_dh_key);
- _gnutls_free_datum(&tmp_dh_key);
+ _gnutls_zfree_datum(&tmp_dh_key);
}
- _gnutls_mpi_release(&session->key.KEY);
+ zrelease_temp_mpi_key(&session->key.KEY);
if (ret < 0) {
gnutls_assert();
ret = data->length;
error:
- _gnutls_mpi_release(&x);
- _gnutls_mpi_release(&X);
+ zrelease_temp_mpi_key(&x);
+ _gnutls_mpi_release(&Y);
return ret;
}
}
ret = data->length;
- cleanup:
+cleanup:
_gnutls_mpi_release(&Y);
return ret;
cleanup:
if (free) {
_gnutls_free_datum(&username);
- _gnutls_free_datum(&key);
+ _gnutls_zfree_datum(&key);
}
return ret;
cleanup:
if (free) {
_gnutls_free_datum(&username);
- _gnutls_free_datum(&key);
+ _gnutls_zfree_datum(&key);
}
return ret;
ret = _gnutls_proc_dh_common_client_kx(session, data, data_size,
g, p, &psk_key);
- _gnutls_free_datum(&psk_key);
+ _gnutls_zfree_datum(&psk_key);
return ret;
_gnutls_session_ecc_curve_get
(session), &psk_key);
- _gnutls_free_datum(&psk_key);
+ _gnutls_zfree_datum(&psk_key);
return ret;
}
ret =
_gnutls_set_psk_session_key(session, psk_key,
&tmp_dh_key);
- _gnutls_free_datum(&tmp_dh_key);
+ _gnutls_zfree_datum(&tmp_dh_key);
}
if (ret < 0) {
ret = 0;
error:
- _gnutls_free_datum(&pwd_psk);
+ _gnutls_zfree_datum(&pwd_psk);
return ret;
}
cleanup:
if (free) {
gnutls_free(username.data);
- gnutls_free(key.data);
+ _gnutls_zfree_datum(&key);
}
return ret;
ret = 0;
error:
- _gnutls_free_datum(&psk_key);
+ _gnutls_zfree_datum(&psk_key);
return ret;
}
cleanup:
if (fd != NULL)
fclose(fd);
+
free(line);
return ret;
cleanup:
_gnutls_free_datum(&sdata);
- _gnutls_free_datum(&premaster_secret);
+ _gnutls_zfree_datum(&premaster_secret);
if (free) {
- gnutls_free(key.data);
+ _gnutls_zfree_datum(&key);
gnutls_free(username.data);
}
ret = 0;
cleanup:
- _gnutls_free_datum(&pwd_psk);
- _gnutls_free_datum(&premaster_secret);
+ _gnutls_zfree_datum(&pwd_psk);
+ _gnutls_zfree_datum(&premaster_secret);
return ret;
}
_gnutls_mpi_log("SRP B: ", B);
- _gnutls_mpi_release(&_b);
- _gnutls_mpi_release(&V);
- _gnutls_mpi_release(&session->key.u);
- _gnutls_mpi_release(&B);
+ zrelease_temp_mpi_key(&_b);
+ zrelease_temp_mpi_key(&V);
+ zrelease_temp_mpi_key(&session->key.u);
+ zrelease_temp_mpi_key(&B);
ret = _gnutls_mpi_dprint(session->key.KEY, &session->key.key);
- _gnutls_mpi_release(&S);
+ zrelease_temp_mpi_key(&S);
if (ret < 0) {
gnutls_assert();
_gnutls_mpi_log("SRP S: ", S);
_gnutls_mpi_release(&A);
- _gnutls_mpi_release(&_b);
- _gnutls_mpi_release(&V);
- _gnutls_mpi_release(&session->key.u);
- _gnutls_mpi_release(&B);
+ zrelease_temp_mpi_key(&_b);
+ zrelease_temp_mpi_key(&V);
+ zrelease_temp_mpi_key(&session->key.u);
+ zrelease_temp_mpi_key(&B);
ret = _gnutls_mpi_dprint(session->key.KEY, &session->key.key);
- _gnutls_mpi_release(&S);
+ zrelease_temp_mpi_key(&S);
if (ret < 0) {
gnutls_assert();
entry->username = gnutls_strdup(str);
if (entry->username == NULL) {
_gnutls_free_datum(&entry->salt);
- _gnutls_free_datum(&entry->v);
+ _gnutls_zfree_datum(&entry->v);
gnutls_assert();
return GNUTLS_E_MEMORY_ERROR;
}
*/
void _gnutls_srp_entry_free(SRP_PWD_ENTRY * entry)
{
- _gnutls_free_datum(&entry->v);
+ _gnutls_zfree_datum(&entry->v);
_gnutls_free_datum(&entry->salt);
if ((entry->g.data != gnutls_srp_1024_group_generator.data)
int _gnutls_datum_append(gnutls_datum_t * dat, const void *data,
size_t data_size);
-void _gnutls_free_datum(gnutls_datum_t * dat);
+
+inline static
+void _gnutls_free_datum(gnutls_datum_t * dat)
+{
+ if (dat->data != NULL)
+ gnutls_free(dat->data);
+
+ dat->data = NULL;
+ dat->size = 0;
+}
+
+#ifdef ENABLE_FIPS140
+inline static
+void _gnutls_zfree_datum(gnutls_datum_t * dat)
+{
+ if (dat->data != NULL) {
+ memset(dat->data, 0, dat->size);
+ gnutls_free(dat->data);
+ }
+
+ dat->data = NULL;
+ dat->size = 0;
+}
+#else
+# define _gnutls_zfree_datum _gnutls_free_datum
+#endif
#endif
}
if (!keep_premaster)
- _gnutls_free_datum(premaster);
+ _gnutls_zfree_datum(premaster);
if (ret < 0)
return ret;
_gnutls_selected_certs_deinit(session);
gnutls_pk_params_release(&session->key.ecdh_params);
- _gnutls_mpi_release(&session->key.ecdh_x);
- _gnutls_mpi_release(&session->key.ecdh_y);
+ zrelease_temp_mpi_key(&session->key.ecdh_x);
+ zrelease_temp_mpi_key(&session->key.ecdh_y);
- _gnutls_mpi_release(&session->key.KEY);
- _gnutls_mpi_release(&session->key.client_Y);
- _gnutls_mpi_release(&session->key.client_p);
- _gnutls_mpi_release(&session->key.client_g);
+ zrelease_temp_mpi_key(&session->key.KEY);
+ zrelease_temp_mpi_key(&session->key.client_Y);
+ zrelease_temp_mpi_key(&session->key.client_p);
+ zrelease_temp_mpi_key(&session->key.client_g);
- _gnutls_mpi_release(&session->key.u);
- _gnutls_mpi_release(&session->key.a);
- _gnutls_mpi_release(&session->key.x);
- _gnutls_mpi_release(&session->key.A);
- _gnutls_mpi_release(&session->key.B);
- _gnutls_mpi_release(&session->key.b);
+ zrelease_temp_mpi_key(&session->key.u);
+ zrelease_temp_mpi_key(&session->key.a);
+ zrelease_temp_mpi_key(&session->key.x);
+ zrelease_temp_mpi_key(&session->key.A);
+ zrelease_temp_mpi_key(&session->key.B);
+ zrelease_temp_mpi_key(&session->key.b);
/* RSA */
- _gnutls_mpi_release(&session->key.rsa[0]);
- _gnutls_mpi_release(&session->key.rsa[1]);
+ zrelease_temp_mpi_key(&session->key.rsa[0]);
+ zrelease_temp_mpi_key(&session->key.rsa[1]);
- _gnutls_mpi_release(&session->key.dh_secret);
+ zrelease_temp_mpi_key(&session->key.dh_secret);
+ _gnutls_zfree_datum(&session->key.key);
gnutls_free(session);
}
gnutls_assert();
return GNUTLS_E_INTERNAL_ERROR;
}
+ zeroize_temp_key(des_key, sizeof(des_key));
+
break;
case GNUTLS_CIPHER_DES_CBC:
if (keysize != DES_KEY_SIZE) {
gnutls_assert();
return GNUTLS_E_INTERNAL_ERROR;
}
+ zeroize_temp_key(des_key, sizeof(des_key));
break;
case GNUTLS_CIPHER_ARCFOUR_128:
case GNUTLS_CIPHER_ARCFOUR_40:
}
-static void wrap_nettle_cipher_close(void *h)
+static void wrap_nettle_cipher_close(void *_ctx)
{
- gnutls_free(h);
+ struct nettle_cipher_ctx *ctx = _ctx;
+
+ zeroize_temp_key(ctx, sizeof(*ctx));
+ gnutls_free(ctx);
}
gnutls_crypto_cipher_st _gnutls_cipher_ops = {
ctx.set_key(&ctx, key_size, key);
ctx.update(&ctx, text_size, text);
ctx.digest(&ctx, ctx.length, digest);
+
+ zeroize_temp_key(&ctx, sizeof(ctx));
return 0;
}
static void wrap_nettle_mac_deinit(void *hd)
{
- gnutls_free(hd);
+ struct nettle_mac_ctx *ctx = hd;
+
+ zeroize_temp_key(ctx, sizeof(*ctx));
+ gnutls_free(ctx);
}
/* Hash functions