X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=site.c;h=37968896ccb50f1d07370a7ff582d1697a158327;hb=1b8af2f7f86131a5364f2270865895ea597c591e;hp=2a89880c7e9e167bb6afeff2a0131512d3f7602d;hpb=48c12bf40ab30af78abfdf20dde47e00c011afbe;p=secnet.git diff --git a/site.c b/site.c index 2a89880..3796889 100644 --- a/site.c +++ b/site.c @@ -806,10 +806,16 @@ static bool_t check_msg(struct site *st, uint32_t type, struct msg *m, return False; } -static bool_t generate_msg1(struct site *st, const struct msg *prompt_maybe_0) +static bool_t kex_init(struct site *st) { st->random->generate(st->random->st,NONCELEN,st->localN); - return generate_msg(st,LABEL_MSG1,"site:MSG1",prompt_maybe_0); + return True; +} + +static bool_t generate_msg1(struct site *st, const struct msg *prompt_maybe_0) +{ + return + generate_msg(st,LABEL_MSG1,"site:MSG1",prompt_maybe_0); } static bool_t process_msg1(struct site *st, struct buffer_if *msg1, @@ -829,8 +835,8 @@ static bool_t process_msg1(struct site *st, struct buffer_if *msg1, static bool_t generate_msg2(struct site *st, const struct msg *prompt_may_be_null) { - st->random->generate(st->random->st,NONCELEN,st->localN); - return generate_msg(st,LABEL_MSG2,"site:MSG2",prompt_may_be_null); + return + generate_msg(st,LABEL_MSG2,"site:MSG2",prompt_may_be_null); } static bool_t process_msg2(struct site *st, struct buffer_if *msg2, @@ -1593,12 +1599,14 @@ static bool_t enter_new_state(struct site *st, uint32_t next, switch(next) { case SITE_SENTMSG1: state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE); + if (!kex_init(st)) return False; gen=generate_msg1; st->msg1_crossed_logged = False; break; case SITE_SENTMSG2: state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE || st->state==SITE_SENTMSG1 || st->state==SITE_WAIT); + if (!kex_init(st)) return False; gen=generate_msg2; break; case SITE_SENTMSG3: @@ -1813,15 +1821,31 @@ static void site_outgoing(void *sst, struct buffer_if *buf) } static bool_t named_for_us(struct site *st, const struct buffer_if *buf_in, - uint32_t type, struct msg *m) + uint32_t type, struct msg *m, + struct priomsg *whynot) /* For packets which are identified by the local and remote names. * If it has our name and our peer's name in it it's for us. */ { struct buffer_if buf[1]; buffer_readonly_clone(buf,buf_in); - return unpick_msg(st,type,buf,m) - && name_matches(&m->remote,st->remotename) - && name_matches(&m->local,st->localname); + + if (!unpick_msg(st,type,buf,m)) { + priomsg_update_fixed(whynot, comm_notify_whynot_unpick, "malformed"); + return False; + } +#define NAME_MATCHES(lr) \ + if (!name_matches(&m->lr, st->lr##name)) { \ + if (priomsg_update_fixed(whynot, comm_notify_whynot_name_##lr, \ + "unknown " #lr " name: ")) { \ + truncmsg_add_packet_string(&whynot->m, m->lr.len, m->lr.name); \ + } \ + return False; \ + } + NAME_MATCHES(remote); + NAME_MATCHES(local ); +#undef NAME_MATCHES + + return True; } static bool_t we_have_priority(struct site *st, const struct msg *m) { @@ -1842,7 +1866,7 @@ static bool_t setup_late_msg_ok(struct site *st, * late. Maybe they came via a different path. All we do is make * a note of the sending address, iff they look like they are part * of the current key setup attempt. */ - if (!named_for_us(st,buf_in,msgtype,m)) + if (!named_for_us(st,buf_in,msgtype,m,0)) /* named_for_us calls unpick_msg which gets the nonces */ return False; if (!consttime_memeq(m->nR,st->remoteN,NONCELEN) || @@ -1859,7 +1883,8 @@ static bool_t setup_late_msg_ok(struct site *st, this current site instance (and should therefore not be processed by other sites), even if the packet was otherwise ignored. */ static bool_t site_incoming(void *sst, struct buffer_if *buf, - const struct comm_addr *source) + const struct comm_addr *source, + struct priomsg *whynot) { struct site *st=sst; @@ -1871,7 +1896,7 @@ static bool_t site_incoming(void *sst, struct buffer_if *buf, /* initialised by named_for_us, or process_msgN for N!=1 */ if (msgtype==LABEL_MSG1) { - if (!named_for_us(st,buf,msgtype,&msg)) + if (!named_for_us(st,buf,msgtype,&msg,whynot)) return False; /* It's a MSG1 addressed to us. Decide what to do about it. */ dump_packet(st,buf,source,True,True); @@ -1935,7 +1960,7 @@ static bool_t site_incoming(void *sst, struct buffer_if *buf, return True; } if (msgtype==LABEL_PROD) { - if (!named_for_us(st,buf,msgtype,&msg)) + if (!named_for_us(st,buf,msgtype,&msg,whynot)) return False; dump_packet(st,buf,source,True,True); if (st->state!=SITE_RUN) { @@ -2064,6 +2089,8 @@ static bool_t site_incoming(void *sst, struct buffer_if *buf, return True; } + priomsg_update_fixed(whynot, comm_notify_whynot_general, + "not MSG1 or PROD; unknown dest index"); return False; }