** configure: Trust store file must be explicitly set or unset when
cross compiling.
+** libgnutls: Private keys are overwritten on deinitialization.
+
** API and ABI modifications:
gnutls_x509_crt_get_issuer_dn2: Added
gnutls_x509_crt_get_dn2: Added
{
bigint_t (*bigint_new) (int nbits);
void (*bigint_release) (bigint_t n);
+ void (*bigint_clear) (bigint_t n); /* zeros the int */
/* 0 for equality, > 0 for m1>m2, < 0 for m1<m2 */
int (*bigint_cmp) (const bigint_t m1, const bigint_t m2);
/* as bigint_cmp */
void gnutls_pk_params_release (gnutls_pk_params_st * p);
+ void gnutls_pk_params_clear (gnutls_pk_params_st * p);
void gnutls_pk_params_init (gnutls_pk_params_st * p);
bigint_t _gnutls_mpi_randomize (bigint_t, unsigned int bits,
gnutls_rnd_level_t level);
-#define _gnutls_mpi_new(x) _gnutls_mpi_ops.bigint_new(x)
-#define _gnutls_mpi_cmp(x,y) _gnutls_mpi_ops.bigint_cmp(x,y)
-#define _gnutls_mpi_cmp_ui(x,y) _gnutls_mpi_ops.bigint_cmp_ui(x,y)
-#define _gnutls_mpi_mod(x,y) _gnutls_mpi_ops.bigint_mod(x,y)
-#define _gnutls_mpi_set(x,y) _gnutls_mpi_ops.bigint_set(x,y)
-#define _gnutls_mpi_set_ui(x,y) _gnutls_mpi_ops.bigint_set_ui(x,y)
-#define _gnutls_mpi_get_nbits(x) _gnutls_mpi_ops.bigint_get_nbits(x)
+#define _gnutls_mpi_new _gnutls_mpi_ops.bigint_new
+#define _gnutls_mpi_clear _gnutls_mpi_ops.bigint_clear
+#define _gnutls_mpi_cmp _gnutls_mpi_ops.bigint_cmp
+#define _gnutls_mpi_cmp_ui _gnutls_mpi_ops.bigint_cmp_ui
+#define _gnutls_mpi_mod _gnutls_mpi_ops.bigint_mod
+#define _gnutls_mpi_set _gnutls_mpi_ops.bigint_set
+#define _gnutls_mpi_set_ui _gnutls_mpi_ops.bigint_set_ui
+#define _gnutls_mpi_get_nbits _gnutls_mpi_ops.bigint_get_nbits
#define _gnutls_mpi_alloc_like(x) _gnutls_mpi_new(_gnutls_mpi_get_nbits(x))
-#define _gnutls_mpi_powm(x,y,z,w) _gnutls_mpi_ops.bigint_powm(x,y,z,w)
-#define _gnutls_mpi_addm(x,y,z,w) _gnutls_mpi_ops.bigint_addm(x,y,z,w)
-#define _gnutls_mpi_subm(x,y,z,w) _gnutls_mpi_ops.bigint_subm(x,y,z,w)
-#define _gnutls_mpi_mulm(x,y,z,w) _gnutls_mpi_ops.bigint_mulm(x,y,z,w)
-#define _gnutls_mpi_add(x,y,z) _gnutls_mpi_ops.bigint_add(x,y,z)
-#define _gnutls_mpi_sub(x,y,z) _gnutls_mpi_ops.bigint_sub(x,y,z)
-#define _gnutls_mpi_mul(x,y,z) _gnutls_mpi_ops.bigint_mul(x,y,z)
-#define _gnutls_mpi_div(x,y,z) _gnutls_mpi_ops.bigint_div(x,y,z)
-#define _gnutls_mpi_add_ui(x,y,z) _gnutls_mpi_ops.bigint_add_ui(x,y,z)
-#define _gnutls_mpi_sub_ui(x,y,z) _gnutls_mpi_ops.bigint_sub_ui(x,y,z)
-#define _gnutls_mpi_mul_ui(x,y,z) _gnutls_mpi_ops.bigint_mul_ui(x,y,z)
-#define _gnutls_prime_check(z) _gnutls_mpi_ops.bigint_prime_check(z)
+#define _gnutls_mpi_powm _gnutls_mpi_ops.bigint_powm
+#define _gnutls_mpi_addm _gnutls_mpi_ops.bigint_addm
+#define _gnutls_mpi_subm _gnutls_mpi_ops.bigint_subm
+#define _gnutls_mpi_mulm _gnutls_mpi_ops.bigint_mulm
+#define _gnutls_mpi_add _gnutls_mpi_ops.bigint_add
+#define _gnutls_mpi_sub _gnutls_mpi_ops.bigint_sub
+#define _gnutls_mpi_mul _gnutls_mpi_ops.bigint_mul
+#define _gnutls_mpi_div _gnutls_mpi_ops.bigint_div
+#define _gnutls_mpi_add_ui _gnutls_mpi_ops.bigint_add_ui
+#define _gnutls_mpi_sub_ui _gnutls_mpi_ops.bigint_sub_ui
+#define _gnutls_mpi_mul_ui _gnutls_mpi_ops.bigint_mul_ui
+#define _gnutls_prime_check _gnutls_mpi_ops.bigint_prime_check
#define _gnutls_mpi_print(x,y,z) _gnutls_mpi_ops.bigint_print(x,y,z,GNUTLS_MPI_FORMAT_USG)
#define _gnutls_mpi_print_lz(x,y,z) _gnutls_mpi_ops.bigint_print(x,y,z,GNUTLS_MPI_FORMAT_STD)
#define _gnutls_mpi_print_pgp(x,y,z) _gnutls_mpi_ops.bigint_print(x,y,z,GNUTLS_MPI_FORMAT_PGP)
p->params_nr = 0;
}
+void
+gnutls_pk_params_clear (gnutls_pk_params_st * p)
+{
+ unsigned int i;
+ for (i = 0; i < p->params_nr; i++)
+ {
+ _gnutls_mpi_clear (p->params[i]);
+ }
+}
+
int
_gnutls_pk_get_hash_algorithm (gnutls_pk_algorithm_t pk,
gnutls_pk_params_st* params,
gnutls_assert ();
return NULL;
}
- mpz_init2 (*p, nbits);
+ if (nbits == 0)
+ mpz_init(*p);
+ else
+ mpz_init2 (*p, nbits);
return p;
}
static unsigned int
wrap_nettle_mpi_get_nbits (bigint_t a)
{
- return mpz_sizeinbase (*((mpz_t *) a), 2);
+ return mpz_sizeinbase (TOMPZ( a), 2);
}
static void
wrap_nettle_mpi_release (bigint_t a)
{
- mpz_clear (*((mpz_t *) a));
+ mpz_clear (TOMPZ( a));
gnutls_free (a);
}
+static void
+wrap_nettle_mpi_clear (bigint_t a)
+{
+ memset(TOMPZ(a)[0]._mp_d, 0, TOMPZ(a)[0]._mp_alloc*sizeof(mp_limb_t));
+}
+
static bigint_t
wrap_nettle_mpi_mod (const bigint_t a, const bigint_t b)
{
if (r == NULL)
return NULL;
- mpz_mod (*((mpz_t *) r), *((mpz_t *) a), *((mpz_t *) b));
+ mpz_mod (TOMPZ( r), TOMPZ( a), TOMPZ( b));
return r;
}
if (w == NULL)
return NULL;
- mpz_powm (*((mpz_t *) w), *((mpz_t *) b), *((mpz_t *) e), *((mpz_t *) m));
+ mpz_powm (TOMPZ( w), TOMPZ( b), TOMPZ( e), TOMPZ( m));
return w;
}
if (w == NULL)
return NULL;
- mpz_add (*((mpz_t *) w), *((mpz_t *) b), *((mpz_t *) a));
- mpz_fdiv_r (*((mpz_t *) w), *((mpz_t *) w), *((mpz_t *) m));
+ mpz_add (TOMPZ( w), TOMPZ( b), TOMPZ( a));
+ mpz_fdiv_r (TOMPZ( w), TOMPZ( w), TOMPZ( m));
return w;
}
if (w == NULL)
return NULL;
- mpz_sub (*((mpz_t *) w), *((mpz_t *) a), *((mpz_t *) b));
- mpz_fdiv_r (*((mpz_t *) w), *((mpz_t *) w), *((mpz_t *) m));
+ mpz_sub (TOMPZ( w), TOMPZ( a), TOMPZ( b));
+ mpz_fdiv_r (TOMPZ( w), TOMPZ( w), TOMPZ( m));
return w;
}
if (w == NULL)
return NULL;
- mpz_mul (*((mpz_t *) w), *((mpz_t *) a), *((mpz_t *) b));
- mpz_fdiv_r (*((mpz_t *) w), *((mpz_t *) w), *((mpz_t *) m));
+ mpz_mul (TOMPZ( w), TOMPZ( a), TOMPZ( b));
+ mpz_fdiv_r (TOMPZ( w), TOMPZ( w), TOMPZ( m));
return w;
}
if (w == NULL)
return NULL;
- mpz_add (*((mpz_t *) w), *((mpz_t *) a), *((mpz_t *) b));
+ mpz_add (TOMPZ( w), TOMPZ( a), TOMPZ( b));
return w;
}
if (w == NULL)
return NULL;
- mpz_sub (*((mpz_t *) w), *((mpz_t *) a), *((mpz_t *) b));
+ mpz_sub (TOMPZ( w), TOMPZ( a), TOMPZ( b));
return w;
}
if (w == NULL)
return NULL;
- mpz_mul (*((mpz_t *) w), *((mpz_t *) a), *((mpz_t *) b));
+ mpz_mul (TOMPZ( w), TOMPZ( a), TOMPZ( b));
return w;
}
if (q == NULL)
return NULL;
- mpz_cdiv_q (*((mpz_t *) q), *((mpz_t *) a), *((mpz_t *) b));
+ mpz_cdiv_q (TOMPZ( q), TOMPZ( a), TOMPZ( b));
return q;
}
if (w == NULL)
return NULL;
- mpz_add_ui (*((mpz_t *) w), *((mpz_t *) a), b);
+ mpz_add_ui (TOMPZ( w), TOMPZ( a), b);
return w;
}
if (w == NULL)
return NULL;
- mpz_sub_ui (*((mpz_t *) w), *((mpz_t *) a), b);
+ mpz_sub_ui (TOMPZ( w), TOMPZ( a), b);
return w;
if (w == NULL)
return NULL;
- mpz_mul_ui (*((mpz_t *) w), *((mpz_t *) a), b);
+ mpz_mul_ui (TOMPZ( w), TOMPZ( a), b);
return w;
wrap_nettle_prime_check (bigint_t pp)
{
int ret;
- ret = mpz_probab_prime_p (*((mpz_t *) pp), PRIME_CHECK_PARAM);
+ ret = mpz_probab_prime_p (TOMPZ( pp), PRIME_CHECK_PARAM);
if (ret > 0)
{
.bigint_div = wrap_nettle_mpi_div,
.bigint_prime_check = wrap_nettle_prime_check,
.bigint_release = wrap_nettle_mpi_release,
+ .bigint_clear = wrap_nettle_mpi_clear,
.bigint_print = wrap_nettle_mpi_print,
.bigint_scan = wrap_nettle_mpi_scan,
.bigint_generate_group = wrap_nettle_generate_group
return 0;
error:
+ gnutls_pk_params_clear(params);
gnutls_pk_params_release(params);
return result;
ret = 0;
cleanup:
+ gnutls_pk_params_clear(¶ms);
gnutls_pk_params_release(¶ms);
return ret;
}
ret = 0;
cleanup:
+ gnutls_pk_params_clear(¶ms);
gnutls_pk_params_release(¶ms);
return ret;
}
result =
_gnutls_pk_sign (pk_algorithm, signature, hash, ¶ms);
+ gnutls_pk_params_clear(¶ms);
gnutls_pk_params_release(¶ms);
if (result < 0)
result = _gnutls_pk_decrypt (pk_algorithm, plaintext, ciphertext, ¶ms);
+ gnutls_pk_params_clear(¶ms);
gnutls_pk_params_release(¶ms);
if (result < 0)
if (!key)
return;
+ gnutls_pk_params_clear(&key->params);
gnutls_pk_params_release(&key->params);
asn1_delete_structure (&key->key);
gnutls_free (key);
error:
asn1_delete_structure (&pkey_asn);
+ gnutls_pk_params_clear (&pkey->params);
gnutls_pk_params_release (&pkey->params);
return NULL;
error:
asn1_delete_structure (&pkey_asn);
+ gnutls_pk_params_clear (&pkey->params);
gnutls_pk_params_release (&pkey->params);
return NULL;
error:
asn1_delete_structure (&dsa_asn);
+ gnutls_pk_params_clear(&pkey->params);
gnutls_pk_params_release(&pkey->params);
return NULL;
return 0;
cleanup:
+ gnutls_pk_params_clear(&key->params);
gnutls_pk_params_release(&key->params);
return ret;
return 0;
cleanup:
+ gnutls_pk_params_clear(&key->params);
gnutls_pk_params_release(&key->params);
return ret;
return 0;
cleanup:
+ gnutls_pk_params_clear(&key->params);
gnutls_pk_params_release(&key->params);
return ret;
}
}
+ gnutls_pk_params_clear(&pk_params);
gnutls_pk_params_release (&pk_params);
return 0;
_gnutls_free_datum (e);
_gnutls_free_datum (p);
_gnutls_free_datum (q);
+ gnutls_pk_params_clear(&pk_params);
gnutls_pk_params_release (&pk_params);
return ret;
cleanup:
key->pk_algorithm = GNUTLS_PK_UNKNOWN;
+ gnutls_pk_params_clear(&key->params);
gnutls_pk_params_release(&key->params);
return ret;