From: Ian Jackson Date: Wed, 20 Jul 2011 16:02:06 +0000 (+0100) Subject: Protocol change: Initiate key setup on incoming packets, not outgoing ones X-Git-Tag: v0.2.0~21 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=secnet.git;a=commitdiff_plain;h=837cf01e0e4e3f66989e29abd7a400b96a60ba14 Protocol change: Initiate key setup on incoming packets, not outgoing ones If data is exchanged after the "renegotiation time", we need to refresh the data transfer key - ie, to initiate a key setup. Previously this was done by the peer which wanted to transmit data using an existing but in-need-of-refreshing key. However, mobile peers may often be disconnected. There is no point trying to do a key renegotiation while they are disconnected. Thus it is better to have the renegotiation initiated by a peer which receives a data packet. That means that if there is a network outage, renegotiation will be deferred until the network is restored. In particular, it means that a mobile node which has no underlying network but which has applications trying to send data will not waste effort attempting key renegotiation until it once more has connectivity. This minor functional change should be harmless or even beneficial for non-mobile sites too. It simply means that the other peer will play the role of initiator during renegotiation, but since which peer played this role is arbitrary for non-mobile sites this should make no difference. Compatibility: In the case of an old version of secnet talking to a new version, only data packets in one direction will cause renegotiation. This should not be a problem since all real-world IP protocols involve data in both directions. So we make the new behaviour universal rather than making it depend on the forthcoming "mobile-peer" site config option. Signed-off-by: Ian Jackson --- diff --git a/site.c b/site.c index 13a6bc3..5a4b64a 100644 --- a/site.c +++ b/site.c @@ -656,6 +656,9 @@ static bool_t process_msg0(struct site *st, struct buffer_if *msg0, case LABEL_MSG9: /* Deliver to netlink layer */ st->netlink->deliver(st->netlink->st,msg0); + /* See whether we should start negotiating a new key */ + if (st->now > st->renegotiate_key_time) + initiate_key_setup(st,"incoming packet in renegotiation window"); return True; default: slog(st,LOG_SEC,"incoming encrypted message of type %08x " @@ -1009,9 +1012,6 @@ static void site_outgoing(void *sst, struct buffer_if *buf) st->comm->sendmsg(st->comm->st,buf,&st->peer); } BUF_FREE(buf); - /* See whether we should start negotiating a new key */ - if (st->now > st->renegotiate_key_time) - initiate_key_setup(st,"outgoing packet in renegotiation window"); return; }