This will allow us to maybe use a different Diffie--Hellman group, with
different size requirements, to communicate with the same peer at a
later time. We can't do this yet, of course, but the negotiation
machinery is coming soon.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
_Bool ok;
/* Generate the shared key */
_Bool ok;
/* Generate the shared key */
+ assert(!st->sharedsecret);
+ st->sharedsecret = safe_malloc(st->dh->shared_len, "site:sharedsecret");
if (!st->dh->makeshared(st->dh->st,st->dhsecret,st->dh->secret_len,
pk, st->sharedsecret,st->dh->shared_len))
return False;
if (!st->dh->makeshared(st->dh->st,st->dhsecret,st->dh->secret_len,
pk, st->sharedsecret,st->dh->shared_len))
return False;
static void generate_dhsecret(struct site *st)
{
static void generate_dhsecret(struct site *st)
{
+ assert(!st->dhsecret);
+ st->dhsecret = safe_malloc(st->dh->secret_len, "site:dhsecret");
st->random->generate(st->random->st, st->dh->secret_len,st->dhsecret);
}
st->random->generate(st->random->st, st->dh->secret_len,st->dhsecret);
}
FILLZERO(st->localN);
FILLZERO(st->remoteN);
dispose_transform(&st->new_transform);
FILLZERO(st->localN);
FILLZERO(st->remoteN);
dispose_transform(&st->new_transform);
- memset(st->dhsecret,0,st->dh->secret_len);
- memset(st->sharedsecret,0,st->dh->shared_len);
+ if (st->dhsecret) {
+ memset(st->dhsecret, 0, st->dh->secret_len);
+ free(st->dhsecret);
+ st->dhsecret = 0;
+ }
+ if (st->sharedsecret) {
+ memset(st->sharedsecret, 0, st->dh->shared_len);
+ free(st->sharedsecret);
+ st->sharedsecret = 0;
+ }
set_link_quality(st);
if (st->keepalive && !current_valid(st))
set_link_quality(st);
if (st->keepalive && !current_valid(st))
st->auxiliary_key.key_timeout=0;
transport_peers_clear(st,&st->peers);
transport_peers_clear(st,&st->setup_peers);
st->auxiliary_key.key_timeout=0;
transport_peers_clear(st,&st->peers);
transport_peers_clear(st,&st->setup_peers);
- /* XXX mlock these */
- st->dhsecret=safe_malloc(st->dh->secret_len,"site:dhsecret");
- st->sharedsecret=safe_malloc(st->dh->shared_len, "site:sharedsecret");
+ st->dhsecret=0;
+ st->sharedsecret=0;
#define SET_CAPBIT(bit) do { \
uint32_t capflag = 1UL << (bit); \
#define SET_CAPBIT(bit) do { \
uint32_t capflag = 1UL << (bit); \