-
-void set_keys(conn_list_t *cl, int expiry, char *key)
-{
- char *ek;
-cp
- if(!cl->public_key)
- {
- cl->public_key = xmalloc(sizeof(*cl->key));
- cl->public_key->key = NULL;
- }
-
- if(cl->public_key->key)
- free(cl->public_key->key);
- cl->public_key->length = strlen(key);
- cl->public_key->expiry = expiry;
- cl->public_key->key = xmalloc(cl->public_key->length + 1);
- strcpy(cl->public_key->key, key);
-
- ek = make_shared_key(key);
-
- if(!cl->key)
- {
- cl->key = xmalloc(sizeof(*cl->key));
- cl->key->key = NULL;
- }
-
- if(cl->key->key)
- free(cl->key->key);
-
- cl->key->length = strlen(ek);
- cl->key->expiry = expiry;
- cl->key->key = xmalloc(cl->key->length + 1);
- strcpy(cl->key->key, ek);
-cp
-}
-
-int ans_key_h(conn_list_t *cl)
-{
- ip_t to;
- ip_t from;
- int expiry;
- char *key;
- conn_list_t *fw, *gk;
-cp
- if(!cl->status.active)
- {
- syslog(LOG_ERR, _("Got unauthorized ANS_KEY from %s (%s)"),
- cl->vpn_hostname, cl->real_hostname);
- return -1;
- }
-
- if(sscanf(cl->buffer, "%*d %lx %lx %d %as", &to, &from, &expiry, &key) != 4)
- {
- syslog(LOG_ERR, _("Got bad ANS_KEY from %s (%s)"),
- cl->vpn_hostname, cl->real_hostname);
- return -1;
- }
-
- if(debug_lvl > 1)
- syslog(LOG_DEBUG, _("Got ANS_KEY origin %d.%d.%d.%d destination %d.%d.%d.%d from %s (%s)"),
- IP_ADDR_V(from), IP_ADDR_V(to), cl->vpn_hostname, cl->real_hostname);
-
- if(to == myself->vpn_ip)
- { /* hey! that key's for ME! :) */
- gk = lookup_conn(from);
-
- if(!gk)
- {
- syslog(LOG_ERR, _("Receiving ANS_KEY origin %d.%d.%d.%d from %s (%s), which does not exist?"),
- IP_ADDR_V(from), cl->vpn_hostname, cl->real_hostname);
- return -1;
- }
-
- set_keys(gk, expiry, key);
- gk->status.validkey = 1;
- gk->status.waitingforkey = 0;
- flush_queues(gk);
- return 0;
- }
-
- fw = lookup_conn(to);
-
- if(!fw)
- {
- syslog(LOG_ERR, _("Attempting to forward ANS_KEY to %d.%d.%d.%d, which does not exist?"),
- IP_ADDR_V(to));
- return -1;
- }
-
- if(debug_lvl > 1)
- syslog(LOG_DEBUG, _("Forwarding ANS_KEY to %s (%s)"),
- fw->nexthop->vpn_hostname, fw->nexthop->real_hostname);
-
- cl->buffer[cl->reqlen-1] = '\n';
-
- if((write(fw->nexthop->meta_socket, cl->buffer, cl->reqlen)) < 0)
- {
- syslog(LOG_ERR, _("Send failed: %s:%d: %m"), __FILE__, __LINE__);
- return -1;
- }
-cp
- return 0;
-}
-
-int key_changed_h(conn_list_t *cl)
-{
- ip_t from;
- conn_list_t *ik;
-cp
- if(!cl->status.active)
- {
- syslog(LOG_ERR, _("Got unauthorized KEY_CHANGED from %s (%s)"),
- cl->vpn_hostname, cl->real_hostname);
- return -1;
- }
-
- if(sscanf(cl->buffer, "%*d %lx", &from) != 1)
- {
- syslog(LOG_ERR, _("Got bad KEY_CHANGED from %s (%s)"),
- cl->vpn_hostname, cl->real_hostname);
- return -1;
- }
-
- ik = lookup_conn(from);
-
- if(!ik)
- {
- syslog(LOG_ERR, _("Got KEY_CHANGED origin %d.%d.%d.%d from %s (%s), which does not exist?"),
- IP_ADDR_V(from), cl->vpn_hostname, cl->real_hostname);
- return -1;
- }
-
- if(debug_lvl > 1)
- syslog(LOG_DEBUG, _("Got KEY_CHANGED origin %s from %s (%s)"),
- ik->vpn_hostname, cl->vpn_hostname, cl->real_hostname);
-
- ik->status.validkey = 0;
- ik->status.waitingforkey = 0;
-
- notify_others(ik, cl, send_key_changed);
-cp
- return 0;
-}
-
-int (*request_handlers[256])(conn_list_t*) = {
- 0, ack_h, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- termreq_h, timeout_h, del_host_h, 0, 0, 0, 0, 0, 0, 0,
- ping_h, pong_h, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- add_host_h, basic_info_h, passphrase_h, public_key_h, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- tcppacket_h, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- req_key_h, ans_key_h, key_changed_h, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0
-};