pluto and scepclient use the random plugin from libstrongswan

This commit is contained in:
Andreas Steffen
2009-04-30 18:31:48 +00:00
parent 8af25c56af
commit bc2e33ca96
28 changed files with 381 additions and 2075 deletions
+124 -181
View File
@@ -28,7 +28,10 @@
#include <freeswan.h>
#include <ipsec_policy.h>
#include <library.h>
#include <asn1/asn1.h>
#include <crypto/rngs/rng.h>
#include "constants.h"
#include "defs.h"
@@ -52,7 +55,6 @@
#include "server.h"
#include "spdb.h"
#include "timer.h"
#include "rnd.h"
#include "ipsec_doi.h" /* needs demux.h and state.h */
#include "whack.h"
#include "fetch.h"
@@ -120,9 +122,8 @@ echo_hdr(struct msg_digest *md, bool enc, u_int8_t np)
* We make the leap that the length should be that of the group
* (see quoted passage at start of ACCEPT_KE).
*/
static void
compute_dh_shared(struct state *st, const chunk_t g
, const struct oakley_group_desc *group)
static void compute_dh_shared(struct state *st, const chunk_t g,
const struct oakley_group_desc *group)
{
MP_INT mp_g, mp_shared;
struct timeval tv0, tv1;
@@ -158,16 +159,19 @@ compute_dh_shared(struct state *st, const chunk_t g
/* if we haven't already done so, compute a local DH secret (st->st_sec) and
* the corresponding public value (g). This is emitted as a KE payload.
*/
static bool
build_and_ship_KE(struct state *st, chunk_t *g
, const struct oakley_group_desc *group, pb_stream *outs, u_int8_t np)
static bool build_and_ship_KE(struct state *st, chunk_t *g,
const struct oakley_group_desc *group,
pb_stream *outs, u_int8_t np)
{
if (!st->st_sec_in_use)
{
u_char tmp[LOCALSECRETSIZE];
MP_INT mp_g;
get_rnd_bytes(tmp, LOCALSECRETSIZE);
rng_t *rng;
rng = lib->crypto->create_rng(lib->crypto, RNG_STRONG);
rng->get_bytes(rng, LOCALSECRETSIZE, tmp);
rng->destroy(rng);
st->st_sec_in_use = TRUE;
n_to_mpz(&st->st_sec, tmp, LOCALSECRETSIZE);
@@ -192,10 +196,9 @@ build_and_ship_KE(struct state *st, chunk_t *g
* Diffie-Hellman group enforced, if necessary, by pre-pending the
* value with zeros.
*/
static notification_t
accept_KE(chunk_t *dest, const char *val_name
, const struct oakley_group_desc *gr
, pb_stream *pbs)
static notification_t accept_KE(chunk_t *dest, const char *val_name,
const struct oakley_group_desc *gr,
pb_stream *pbs)
{
if (pbs_left(pbs) != gr->bytes)
{
@@ -216,9 +219,8 @@ accept_KE(chunk_t *dest, const char *val_name
* Check and accept optional Quick Mode KE payload for PFS.
* Extends ACCEPT_PFS to check whether KE is allowed or required.
*/
static notification_t
accept_PFS_KE(struct msg_digest *md, chunk_t *dest
, const char *val_name, const char *msg_name)
static notification_t accept_PFS_KE(struct msg_digest *md, chunk_t *dest,
const char *val_name, const char *msg_name)
{
struct state *st = md->st;
struct payload_digest *const ke_pd = md->chain[ISAKMP_NEXT_KE];
@@ -249,18 +251,20 @@ accept_PFS_KE(struct msg_digest *md, chunk_t *dest
return NOTHING_WRONG;
}
static bool
build_and_ship_nonce(chunk_t *n, pb_stream *outs, u_int8_t np
, const char *name)
static bool build_and_ship_nonce(chunk_t *n, pb_stream *outs, u_int8_t np,
const char *name)
{
rng_t *rng;
free(n->ptr);
*n = chunk_create(malloc(DEFAULT_NONCE_SIZE), DEFAULT_NONCE_SIZE);
get_rnd_bytes(n->ptr, DEFAULT_NONCE_SIZE);
rng = lib->crypto->create_rng(lib->crypto, RNG_WEAK);
rng->get_bytes(rng, DEFAULT_NONCE_SIZE, n->ptr);
rng->destroy(rng);
return out_generic_chunk(np, &isakmp_nonce_desc, outs, *n, name);
}
static bool
collect_rw_ca_candidates(struct msg_digest *md, generalName_t **top)
static bool collect_rw_ca_candidates(struct msg_digest *md, generalName_t **top)
{
struct connection *d = find_host_connection(&md->iface->addr
, pluto_port, (ip_address*)NULL, md->sender_port, LEMPTY);
@@ -295,8 +299,8 @@ collect_rw_ca_candidates(struct msg_digest *md, generalName_t **top)
return *top != NULL;
}
static bool
build_and_ship_CR(u_int8_t type, chunk_t ca, pb_stream *outs, u_int8_t np)
static bool build_and_ship_CR(u_int8_t type, chunk_t ca, pb_stream *outs,
u_int8_t np)
{
pb_stream cr_pbs;
struct isakmp_cr cr_hd;
@@ -321,10 +325,10 @@ build_and_ship_CR(u_int8_t type, chunk_t ca, pb_stream *outs, u_int8_t np)
* whether to send the notification, based on the type and the
* destination, if we care to.
*/
static void
send_notification(struct state *sndst, u_int16_t type, struct state *encst,
msgid_t msgid, u_char *icookie, u_char *rcookie,
u_char *spi, size_t spisize, u_char protoid)
static void send_notification(struct state *sndst, u_int16_t type,
struct state *encst, msgid_t msgid,
u_char *icookie, u_char *rcookie,
u_char *spi, size_t spisize, u_char protoid)
{
u_char buffer[1024];
pb_stream pbs, r_hdr_pbs;
@@ -451,9 +455,8 @@ send_notification(struct state *sndst, u_int16_t type, struct state *encst,
}
}
void
send_notification_from_state(struct state *st, enum state_kind state,
u_int16_t type)
void send_notification_from_state(struct state *st, enum state_kind state,
u_int16_t type)
{
struct state *p1st;
@@ -487,8 +490,7 @@ send_notification_from_state(struct state *st, enum state_kind state,
}
}
void
send_notification_from_md(struct msg_digest *md, u_int16_t type)
void send_notification_from_md(struct msg_digest *md, u_int16_t type)
{
/**
* Create a dummy state to be able to use send_packet in
@@ -519,8 +521,7 @@ send_notification_from_md(struct msg_digest *md, u_int16_t type)
* inbound IPSEC SAs. Does nothing if no such SAs are being deleted.
* Delete Notifications cannot announce deletion of outbound IPSEC/ISAKMP SAs.
*/
void
send_delete(struct state *st)
void send_delete(struct state *st)
{
pb_stream reply_pbs;
pb_stream r_hdr_pbs;
@@ -686,8 +687,8 @@ send_delete(struct state *st)
}
}
void
accept_delete(struct state *st, struct msg_digest *md, struct payload_digest *p)
void accept_delete(struct state *st, struct msg_digest *md,
struct payload_digest *p)
{
struct isakmp_delete *d = &(p->payload.delete);
size_t sizespi;
@@ -869,8 +870,7 @@ accept_delete(struct state *st, struct msg_digest *md, struct payload_digest *p)
* rfc2408 3.6 Transform Payload.
* Note: it talks about 4 BYTE boundaries!
*/
void
close_message(pb_stream *pbs)
void close_message(pb_stream *pbs)
{
size_t padding = pad_up(pbs_offset(pbs), 4);
@@ -1062,12 +1062,8 @@ main_outI1(int whack_sock, struct connection *c, struct state *predecessor
return STF_OK;
}
void
ipsecdoi_initiate(int whack_sock
, struct connection *c
, lset_t policy
, unsigned long try
, so_serial_t replacing)
void ipsecdoi_initiate(int whack_sock, struct connection *c, lset_t policy,
unsigned long try, so_serial_t replacing)
{
/* If there's already an ISAKMP SA established, use that and
* go directly to Quick Mode. We are even willing to use one
@@ -1114,8 +1110,7 @@ ipsecdoi_initiate(int whack_sock
* - duplicate whack fd, if live.
* Does not delete the old state -- someone else will do that.
*/
void
ipsecdoi_replace(struct state *st, unsigned long try)
void ipsecdoi_replace(struct state *st, unsigned long try)
{
int whack_sock = dup_any(st->st_whack_sock);
lset_t policy = st->st_policy;
@@ -1160,8 +1155,7 @@ ipsecdoi_replace(struct state *st, unsigned long try)
/* SKEYID for preshared keys.
* See draft-ietf-ipsec-ike-01.txt 4.1
*/
static bool
skeyid_preshared(struct state *st)
static bool skeyid_preshared(struct state *st)
{
const chunk_t *pss = get_preshared_secret(st->st_connection);
@@ -1206,8 +1200,7 @@ skeyid_digisig(struct state *st)
/* Generate the SKEYID_* and new IV
* See draft-ietf-ipsec-ike-01.txt 4.1
*/
static bool
generate_skeyids_iv(struct state *st)
static bool generate_skeyids_iv(struct state *st)
{
/* Generate the SKEYID */
switch (st->st_oakley.auth)
@@ -1347,12 +1340,10 @@ generate_skeyids_iv(struct state *st)
*/
typedef void (*hash_update_t)(union hash_ctx *, const u_char *, size_t) ;
static void
main_mode_hash_body(struct state *st
, bool hashi /* Initiator? */
, const pb_stream *idpl /* ID payload, as PBS */
, union hash_ctx *ctx
, void (*hash_update_void)(void *, const u_char *input, size_t))
static void main_mode_hash_body(struct state *st, bool hashi,
const pb_stream *idpl, union hash_ctx *ctx,
void (*hash_update_void)(void *, const u_char *input, size_t))
{
#define HASH_UPDATE_T (union hash_ctx *, const u_char *input, unsigned int len)
hash_update_t hash_update=(hash_update_t) hash_update_void;
@@ -1401,10 +1392,8 @@ main_mode_hash_body(struct state *st
}
static size_t /* length of hash */
main_mode_hash(struct state *st
, u_char *hash_val /* resulting bytes */
, bool hashi /* Initiator? */
, const pb_stream *idpl) /* ID payload, as PBS; cur must be at end */
main_mode_hash(struct state *st, u_char *hash_val, bool hashi,
const pb_stream *idpl)
{
struct hmac_ctx ctx;
@@ -1438,10 +1427,8 @@ main_mode_sha1(struct state *st
* Use PKCS#1 version 1.5 encryption of hash (called
* RSAES-PKCS1-V1_5) in PKCS#2.
*/
static size_t
RSA_sign_hash(struct connection *c
, u_char sig_val[RSA_MAX_OCTETS]
, const u_char *hash_val, size_t hash_len)
static size_t RSA_sign_hash(struct connection *c, u_char sig_val[RSA_MAX_OCTETS],
const u_char *hash_val, size_t hash_len)
{
size_t sz = 0;
smartcard_t *sc = c->spd.this.sc;
@@ -1511,10 +1498,9 @@ RSA_sign_hash(struct connection *c
* it is not: the knowledge of the private key allows more efficient (i.e.
* different) computation for encryption.
*/
static err_t
try_RSA_signature(const u_char hash_val[MAX_DIGEST_LEN], size_t hash_len
, const pb_stream *sig_pbs, pubkey_t *kr
, struct state *st)
static err_t try_RSA_signature(const u_char hash_val[MAX_DIGEST_LEN],
size_t hash_len, const pb_stream *sig_pbs,
pubkey_t *kr, struct state *st)
{
const u_char *sig_val = sig_pbs->cur;
size_t sig_len = pbs_left(sig_pbs);
@@ -1644,10 +1630,8 @@ struct tac_state {
char *tn; /* roof of tried[] */
};
static bool
take_a_crack(struct tac_state *s
, pubkey_t *kr
, const char *story USED_BY_DEBUG)
static bool take_a_crack(struct tac_state *s, pubkey_t *kr,
const char *story USED_BY_DEBUG)
{
err_t ugh = try_RSA_signature(s->hash_val, s->hash_len, s->sig_pbs
, kr, s->st);
@@ -1679,17 +1663,13 @@ take_a_crack(struct tac_state *s
}
}
static stf_status
RSA_check_signature(const struct id* peer
, struct state *st
, const u_char hash_val[MAX_DIGEST_LEN]
, size_t hash_len
, const pb_stream *sig_pbs
static stf_status RSA_check_signature(const struct id* peer, struct state *st,
const u_char hash_val[MAX_DIGEST_LEN],
size_t hash_len, const pb_stream *sig_pbs,
#ifdef USE_KEYRR
, const pubkey_list_t *keys_from_dns
const pubkey_list_t *keys_from_dns,
#endif /* USE_KEYRR */
, const struct gw_info *gateways_from_dns
)
const struct gw_info *gateways_from_dns)
{
const struct connection *c = st->st_connection;
struct tac_state s;
@@ -1838,8 +1818,8 @@ RSA_check_signature(const struct id* peer
}
}
static notification_t
accept_nonce(struct msg_digest *md, chunk_t *dest, const char *name)
static notification_t accept_nonce(struct msg_digest *md, chunk_t *dest,
const char *name)
{
pb_stream *nonce_pbs = &md->chain[ISAKMP_NEXT_NONCE]->pbs;
size_t len = pbs_left(nonce_pbs);
@@ -1902,9 +1882,9 @@ encrypt_message(pb_stream *pbs, struct state *st)
* Used by: quick_outI1, quick_inI1_outR1 (twice), quick_inR1_outI2
* (see RFC 2409 "IKE" 5.5, pg. 18 or draft-ietf-ipsec-ike-01.txt 6.2 pg 25)
*/
static size_t
quick_mode_hash12(u_char *dest, const u_char *start, const u_char *roof
, const struct state *st, const msgid_t *msgid, bool hash2)
static size_t quick_mode_hash12(u_char *dest, const u_char *start,
const u_char *roof, const struct state *st,
const msgid_t *msgid, bool hash2)
{
struct hmac_ctx ctx;
@@ -1935,8 +1915,7 @@ quick_mode_hash12(u_char *dest, const u_char *start, const u_char *roof
* NOTE: this hash (unlike HASH(1) and HASH(2)) ONLY covers the
* Message ID and Nonces. This is a mistake.
*/
static size_t
quick_mode_hash3(u_char *dest, struct state *st)
static size_t quick_mode_hash3(u_char *dest, struct state *st)
{
struct hmac_ctx ctx;
@@ -1953,8 +1932,7 @@ quick_mode_hash3(u_char *dest, struct state *st)
/* Compute Phase 2 IV.
* Uses Phase 1 IV from st_iv; puts result in st_new_iv.
*/
void
init_phase2_iv(struct state *st, const msgid_t *msgid)
void init_phase2_iv(struct state *st, const msgid_t *msgid)
{
const struct hash_desc *h = st->st_oakley.hasher;
union hash_ctx ctx;
@@ -1981,9 +1959,8 @@ init_phase2_iv(struct state *st, const msgid_t *msgid)
* Note: this is not called from demux.c
*/
static bool
emit_subnet_id(ip_subnet *net
, u_int8_t np, u_int8_t protoid, u_int16_t port, pb_stream *outs)
static bool emit_subnet_id(ip_subnet *net, u_int8_t np, u_int8_t protoid,
u_int16_t port, pb_stream *outs)
{
struct isakmp_ipsec_id id;
pb_stream id_pbs;
@@ -2018,13 +1995,9 @@ emit_subnet_id(ip_subnet *net
return TRUE;
}
stf_status
quick_outI1(int whack_sock
, struct state *isakmp_sa
, struct connection *c
, lset_t policy
, unsigned long try
, so_serial_t replacing)
stf_status quick_outI1(int whack_sock, struct state *isakmp_sa,
struct connection *c, lset_t policy, unsigned long try,
so_serial_t replacing)
{
struct state *st = duplicate_state(isakmp_sa);
pb_stream reply; /* not really a reply */
@@ -2236,8 +2209,7 @@ quick_outI1(int whack_sock
/*
* Decode the CERT payload of Phase 1.
*/
static void
decode_cert(struct msg_digest *md)
static void decode_cert(struct msg_digest *md)
{
struct payload_digest *p;
@@ -2291,8 +2263,7 @@ decode_cert(struct msg_digest *md)
/*
* Decode the CR payload of Phase 1.
*/
static void
decode_cr(struct msg_digest *md, struct connection *c)
static void decode_cr(struct msg_digest *md, struct connection *c)
{
struct payload_digest *p;
@@ -2342,8 +2313,7 @@ decode_cr(struct msg_digest *md, struct connection *c)
* We must be called before SIG or HASH are decoded since we
* may change the peer's RSA key or ID.
*/
static bool
decode_peer_id(struct msg_digest *md, struct id *peer)
static bool decode_peer_id(struct msg_digest *md, struct id *peer)
{
struct state *const st = md->st;
struct payload_digest *const id_pld = md->chain[ISAKMP_NEXT_ID];
@@ -2457,8 +2427,8 @@ decode_peer_id(struct msg_digest *md, struct id *peer)
* - if the initiation was explicit, we'd be ignoring user's intent
* - if opportunistic, we'll lose our HOLD info
*/
static bool
switch_connection(struct msg_digest *md, struct id *peer, bool initiator)
static bool switch_connection(struct msg_digest *md, struct id *peer,
bool initiator)
{
struct state *const st = md->st;
struct connection *c = st->st_connection;
@@ -2569,11 +2539,8 @@ switch_connection(struct msg_digest *md, struct id *peer, bool initiator)
* Rejects 0.0.0.0/32 or IPv6 equivalent because
* (1) it is wrong and (2) we use this value for inband signalling.
*/
static bool
decode_net_id(struct isakmp_ipsec_id *id
, pb_stream *id_pbs
, ip_subnet *net
, const char *which)
static bool decode_net_id(struct isakmp_ipsec_id *id, pb_stream *id_pbs,
ip_subnet *net, const char *which)
{
const struct af_info *afi = NULL;
@@ -2737,14 +2704,9 @@ decode_net_id(struct isakmp_ipsec_id *id
}
/* like decode, but checks that what is received matches what was sent */
static bool
check_net_id(struct isakmp_ipsec_id *id
, pb_stream *id_pbs
, u_int8_t *protoid
, u_int16_t *port
, ip_subnet *net
, const char *which)
static bool check_net_id(struct isakmp_ipsec_id *id, pb_stream *id_pbs,
u_int8_t *protoid, u_int16_t *port, ip_subnet *net,
const char *which)
{
ip_subnet net_temp;
@@ -2763,8 +2725,7 @@ check_net_id(struct isakmp_ipsec_id *id
/*
* look for the existence of a non-expiring preloaded public key
*/
static bool
has_preloaded_public_key(struct state *st)
static bool has_preloaded_public_key(struct state *st)
{
struct connection *c = st->st_connection;
@@ -2797,10 +2758,8 @@ has_preloaded_public_key(struct state *st)
* RFC 2409 "IKE" section 5.5
* specifies how this is to be done.
*/
static void
compute_proto_keymat(struct state *st
, u_int8_t protoid
, struct ipsec_proto_info *pi)
static void compute_proto_keymat(struct state *st, u_int8_t protoid,
struct ipsec_proto_info *pi)
{
size_t needed_len = 0; /* bytes of keying material needed */
@@ -2945,8 +2904,7 @@ compute_proto_keymat(struct state *st
DBG_dump("Peer KEYMAT computed:\n", pi->peer_keymat, pi->keymat_len));
}
static void
compute_keymats(struct state *st)
static void compute_keymats(struct state *st)
{
if (st->st_ah.present)
compute_proto_keymat(st, PROTO_IPSEC_AH, &st->st_ah);
@@ -3245,8 +3203,7 @@ main_inI1_outR1(struct msg_digest *md)
*
* We must verify that the proposal received matches one we sent.
*/
stf_status
main_inR1_outI2(struct msg_digest *md)
stf_status main_inR1_outI2(struct msg_digest *md)
{
struct state *const st = md->st;
@@ -3346,8 +3303,7 @@ main_inR1_outI2(struct msg_digest *md)
* HDR, [ HASH(1), ] <Ni_b>Pubkey_r, <KE_b>Ke_i, <IDi1_b>Ke_i [,<<Cert-I_b>Ke_i]
* --> HDR, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDr1_b>Ke_r
*/
stf_status
main_inI2_outR2(struct msg_digest *md)
stf_status main_inI2_outR2(struct msg_digest *md)
{
struct state *const st = md->st;
pb_stream *keyex_pbs = &md->chain[ISAKMP_NEXT_KE]->pbs;
@@ -3487,8 +3443,7 @@ main_inI2_outR2(struct msg_digest *md)
* SMF_RPKE_AUTH: HDR, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDr1_b>Ke_r
* --> HDR*, HASH_I
*/
stf_status
main_inR2_outI3(struct msg_digest *md)
stf_status main_inR2_outI3(struct msg_digest *md)
{
struct state *const st = md->st;
pb_stream *const keyex_pbs = &md->chain[ISAKMP_NEXT_KE]->pbs;
@@ -3672,8 +3627,8 @@ struct key_continuation {
typedef stf_status (key_tail_fn)(struct msg_digest *md
, struct key_continuation *kc);
static void
report_key_dns_failure(struct id *id, err_t ugh)
static void report_key_dns_failure(struct id *id, err_t ugh)
{
char id_buf[BUF_LEN]; /* arbitrary limit on length of ID reported */
@@ -3843,10 +3798,8 @@ main_id_and_auth(struct msg_digest *md
* to find authentication, or we run out of things
* to try.
*/
static void
key_continue(struct adns_continuation *cr
, err_t ugh
, key_tail_fn *tail)
static void key_continue(struct adns_continuation *cr, err_t ugh,
key_tail_fn *tail)
{
struct key_continuation *kc = (void *)cr;
struct state *st = kc->md->st;
@@ -3898,14 +3851,12 @@ key_continue(struct adns_continuation *cr
*/
static key_tail_fn main_inI3_outR3_tail; /* forward */
stf_status
main_inI3_outR3(struct msg_digest *md)
stf_status main_inI3_outR3(struct msg_digest *md)
{
return main_inI3_outR3_tail(md, NULL);
}
static void
main_inI3_outR3_continue(struct adns_continuation *cr, err_t ugh)
static void main_inI3_outR3_continue(struct adns_continuation *cr, err_t ugh)
{
key_continue(cr, ugh, main_inI3_outR3_tail);
}
@@ -4077,21 +4028,18 @@ main_inI3_outR3_tail(struct msg_digest *md
static key_tail_fn main_inR3_tail; /* forward */
stf_status
main_inR3(struct msg_digest *md)
stf_status main_inR3(struct msg_digest *md)
{
return main_inR3_tail(md, NULL);
}
static void
main_inR3_continue(struct adns_continuation *cr, err_t ugh)
static void main_inR3_continue(struct adns_continuation *cr, err_t ugh)
{
key_continue(cr, ugh, main_inR3_tail);
}
static stf_status
main_inR3_tail(struct msg_digest *md
, struct key_continuation *kc)
static stf_status main_inR3_tail(struct msg_digest *md,
struct key_continuation *kc)
{
struct state *const st = md->st;
@@ -4233,8 +4181,7 @@ struct verify_oppo_continuation {
static stf_status quick_inI1_outR1_tail(struct verify_oppo_bundle *b
, struct adns_continuation *ac);
stf_status
quick_inI1_outR1(struct msg_digest *md)
stf_status quick_inI1_outR1(struct msg_digest *md)
{
const struct state *const p1st = md->st;
struct connection *c = p1st->st_connection;
@@ -4341,8 +4288,7 @@ report_verify_failure(struct verify_oppo_bundle *b, err_t ugh)
, fgwb, cb, which, ugh);
}
static void
quick_inI1_outR1_continue(struct adns_continuation *cr, err_t ugh)
static void quick_inI1_outR1_continue(struct adns_continuation *cr, err_t ugh)
{
stf_status r;
struct verify_oppo_continuation *vc = (void *)cr;
@@ -4372,9 +4318,8 @@ quick_inI1_outR1_continue(struct adns_continuation *cr, err_t ugh)
cur_state = NULL;
}
static stf_status
quick_inI1_outR1_start_query(struct verify_oppo_bundle *b
, enum verify_oppo_step next_step)
static stf_status quick_inI1_outR1_start_query(struct verify_oppo_bundle *b,
enum verify_oppo_step next_step)
{
struct msg_digest *md = b->md;
struct state *p1st = md->st;
@@ -4489,10 +4434,10 @@ quick_inI1_outR1_start_query(struct verify_oppo_bundle *b
}
}
static enum verify_oppo_step
quick_inI1_outR1_process_answer(struct verify_oppo_bundle *b
, struct adns_continuation *ac
, struct state *p1st)
static enum verify_oppo_step quick_inI1_outR1_process_answer(
struct verify_oppo_bundle *b,
struct adns_continuation *ac,
struct state *p1st)
{
struct connection *c = p1st->st_connection;
enum verify_oppo_step next_step = vos_our_client;
@@ -4665,9 +4610,8 @@ quick_inI1_outR1_process_answer(struct verify_oppo_bundle *b
return next_step;
}
static stf_status
quick_inI1_outR1_tail(struct verify_oppo_bundle *b
, struct adns_continuation *ac)
static stf_status quick_inI1_outR1_tail(struct verify_oppo_bundle *b,
struct adns_continuation *ac)
{
struct msg_digest *md = b->md;
struct state *const p1st = md->st;
@@ -5019,8 +4963,7 @@ quick_inI1_outR1_tail(struct verify_oppo_bundle *b
/*
* Initialize RFC 3706 Dead Peer Detection
*/
static void
dpd_init(struct state *st)
static void dpd_init(struct state *st)
{
struct state *p1st = find_state(st->st_icookie, st->st_rcookie
, &st->st_connection->spd.that.host_addr, 0);
@@ -5044,8 +4987,7 @@ dpd_init(struct state *st)
* (see RFC 2409 "IKE" 5.5)
* Installs inbound and outbound IPsec SAs, routing, etc.
*/
stf_status
quick_inR1_outI2(struct msg_digest *md)
stf_status quick_inR1_outI2(struct msg_digest *md)
{
struct state *const st = md->st;
const struct connection *c = st->st_connection;
@@ -5197,8 +5139,7 @@ quick_inR1_outI2(struct msg_digest *md)
* (see RFC 2409 "IKE" 5.5)
* Installs outbound IPsec SAs, routing, etc.
*/
stf_status
quick_inI2(struct msg_digest *md)
stf_status quick_inI2(struct msg_digest *md)
{
struct state *const st = md->st;
@@ -5243,9 +5184,8 @@ quick_inI2(struct msg_digest *md)
return STF_OK;
}
static stf_status
send_isakmp_notification(struct state *st, u_int16_t type
, const void *data, size_t len)
static stf_status send_isakmp_notification(struct state *st, u_int16_t type,
const void *data, size_t len)
{
msgid_t msgid;
pb_stream reply;
@@ -5350,8 +5290,7 @@ send_isakmp_notification(struct state *st, u_int16_t type
/*
* DPD Out Initiator
*/
void
dpd_outI(struct state *p2st)
void dpd_outI(struct state *p2st)
{
struct state *st;
u_int32_t seqno;
@@ -5411,8 +5350,12 @@ dpd_outI(struct state *p2st)
if (!st->st_dpd_seqno)
{
rng_t *rng;
/* Get a non-zero random value that has room to grow */
get_rnd_bytes((u_char *)&st->st_dpd_seqno, sizeof(st->st_dpd_seqno));
rng = lib->crypto->create_rng(lib->crypto, RNG_WEAK);
rng->get_bytes(rng, sizeof(st->st_dpd_seqno), (u_char *)&st->st_dpd_seqno);
rng->destroy(rng);
st->st_dpd_seqno &= 0x7fff;
st->st_dpd_seqno++;
}
@@ -5512,8 +5455,8 @@ dpd_inI_outR(struct state *st, struct isakmp_notification *const n, pb_stream *p
/*
* DPD out Responder
*/
stf_status
dpd_inR(struct state *st, struct isakmp_notification *const n, pb_stream *pbs)
stf_status dpd_inR(struct state *st, struct isakmp_notification *const n,
pb_stream *pbs)
{
u_int32_t seqno;