X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=site.c;h=03d1e06758492c0e18585226bf07f0522d788521;hb=16339fe17a2a565da0628be523f6ef8ca907f3f5;hp=a91d6c91cd86aa6681b932df5a1d5ed7339a5374;hpb=5c18093b44392ce2370990e08367f6db53ad4035;p=secnet.git diff --git a/site.c b/site.c index a91d6c9..03d1e06 100644 --- a/site.c +++ b/site.c @@ -142,6 +142,7 @@ static cstring_t state_name(uint32_t state) #define LOG_DUMP 0x00000100 #define LOG_ERROR 0x00000400 #define LOG_PEER_ADDRS 0x00000800 +#define LOG_SIGKEYS 0x00001000 static struct flagstr log_event_table[]={ { "unexpected", LOG_UNEXPECTED }, @@ -155,8 +156,9 @@ static struct flagstr log_event_table[]={ { "dump-packets", LOG_DUMP }, { "errors", LOG_ERROR }, { "peer-addrs", LOG_PEER_ADDRS }, + { "sigkeys", LOG_SIGKEYS }, { "default", LOG_SETUP_INIT|LOG_SETUP_TIMEOUT| - LOG_ACTIVATE_KEY|LOG_TIMEOUT_KEY|LOG_SEC|LOG_ERROR }, + LOG_ACTIVATE_KEY|LOG_TIMEOUT_KEY|LOG_SEC|LOG_ERROR|LOG_SIGKEYS }, { "all", 0xffffffff }, { NULL, 0 } }; @@ -392,6 +394,7 @@ static uint32_t event_log_priority(struct site *st, uint32_t event) case LOG_DUMP: return M_DEBUG; case LOG_ERROR: return M_ERR; case LOG_PEER_ADDRS: return M_DEBUG; + case LOG_SIGKEYS: return M_INFO; default: return M_ERR; } } @@ -1828,9 +1831,24 @@ static bool_t named_for_us(struct site *st, const struct buffer_if *buf_in, { 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) { @@ -2074,6 +2092,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; } @@ -2109,6 +2129,17 @@ static void site_childpersist_clearkeys(void *sst, uint32_t newphase) crypto operations, but that's a task for another day. */ } +static void setup_sethash(struct site *st, dict_t *dict, + struct hash_if **hash, struct cloc loc, + sig_sethash_fn *sethash, void *sigkey_st) { + if (!*hash) *hash=find_cl_if(dict,"hash",CL_HASH,True,"site",loc); + sethash(sigkey_st,*hash); +} +#define SETUP_SETHASH(k) do{ \ + if ((k)->sethash) \ + setup_sethash(st,dict, &hash,loc, (k)->sethash,(k)->st); \ +}while(0) + static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context, list_t *args) { @@ -2201,6 +2232,7 @@ static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context, st->log=find_cl_if(dict,"log",CL_LOG,True,"site",loc); st->random=find_cl_if(dict,"random",CL_RANDOMSRC,True,"site",loc); + struct hash_if *hash=0; st->privkey=find_cl_if(dict,"local-key",CL_SIGPRIVKEY,True,"site",loc); st->addresses=dict_read_string_array(dict,"address",False,"site",loc,0); if (st->addresses) @@ -2212,11 +2244,8 @@ static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context, st->dh=find_cl_if(dict,"dh",CL_DH,True,"site",loc); - if (st->privkey->sethash || st->pubkey->sethash) { - struct hash_if *hash=find_cl_if(dict,"hash",CL_HASH,True,"site",loc); - if (st->privkey->sethash) st->privkey->sethash(st->privkey->st,hash); - if (st->pubkey->sethash) st->pubkey->sethash(st->pubkey->st,hash); - } + SETUP_SETHASH(st->privkey); + SETUP_SETHASH(st->pubkey); #define DEFAULT(D) (st->peer_mobile || st->local_mobile \ ? DEFAULT_MOBILE_##D : DEFAULT_##D)