-
-int ans_key_h(conn_list_t *cl)
-{
- char *from_id, *to_id, *datakey;
- int keylength;
- conn_list_t *from, *to;
-cp
- if(sscanf(cl->buffer, "%*d %as %as %as", &from_id, &to_id, &datakey) != 3)
- {
- syslog(LOG_ERR, _("Got bad ANS_KEY from %s (%s)"), cl->id, cl->hostname);
- return -1;
- }
-
- if(!(from = lookup_id(from_id)))
- {
- syslog(LOG_ERR, _("Got ANS_KEY from %s (%s) origin %s which does not exist in our connection list"), cl->id, cl->hostname, from_id);
- free(from_id); free(to_id); free(datakey);
- return -1;
- }
-
- /* Check if this key request is for us */
-
- if(!strcmp(id, myself->strcmp))
- {
- /* It is for us, convert it to binary and set the key with it. */
-
- keylength = strlen(datakey);
-
- if((keylength%2) || (keylength <= 0))
- {
- syslog(LOG_ERR, _("Got bad ANS_KEY from %s (%s) origin %s: invalid key"), cl->id, cl->hostname, from->id);
- free(from_id); free(to_id); free(datakey);
- return -1;
- }
- keylength /= 2;
- hex2bin(datakey, datakey, keylength);
- BF_set_key(cl->datakey, keylength, datakey);
- }
- else
- {
- if(!(to = lookup_id(to_id)))
- {
- syslog(LOG_ERR, _("Got ANS_KEY from %s (%s) destination %s which does not exist in our connection list"), cl->id, cl->hostname, to_id);
- free(from_id); free(to_id); free(datakey);
- return -1;
- }
- send_ans_key(from, to, datakey);
- }
-
- free(from_id); free(to_id); free(datakey);
-cp
- return 0;
-}
-
-/* Old routines */
-
-/*
- Notify all my direct connections of a new host
- that was added to the vpn, with the exception
- of the source of the announcement.
-*/
-
-int notify_others(conn_list_t *new, conn_list_t *source,
- int (*function)(conn_list_t*, conn_list_t*))
-{
- conn_list_t *p;
-cp
- for(p = conn_list; p != NULL; p = p->next)
- if(p != new && p != source && p->status.meta && p->status.active)
- function(p, new);
-cp
- return 0;
-}
-
-/*
- Notify one connection of everything
- I have connected
-*/
-
-int notify_one(conn_list_t *new)
-{
- conn_list_t *p;
-cp
- for(p = conn_list; p != NULL; p = p->next)
- if(p != new && p->status.active)
- send_add_host(new, p);
-cp
- return 0;
-}
-
-/* "Complete overhaul". */
-
-int (*request_handlers[])(conn_list_t*) = {
- id_h, challenge_h, chal_reply_h, ack_h,
- status_h, error_h, termreq_h,
- ping_h, pong_h,
- add_host_h, del_host_h,
- add_subnet_h, del_subnet_h,
- key_changed_h, req_key_h, ans_key_h,
-};
-
-char (*request_name[]) = {
- "ID", "CHALLENGE", "CHAL_REPLY", "ACK",
- "STATUS", "ERROR", "TERMREQ",
- "PING", "PONG",
- "ADD_HOST", "DEL_HOST",
- "ADD_SUBNET", "DEL_SUBNET",
- "KEY_CHANGED", "REQ_KEY", "ANS_KEY",
-};