link_t link_keys(mesh_t mesh, lob_t keys) { uint8_t csid; if(!mesh || !keys) return LOG("invalid args"); csid = hashname_id(mesh->keys,keys); if(!csid) return LOG("no supported key"); return link_key(mesh, hashname_im(keys,csid)); }
lob_t link_handshakes(link_t link) { uint32_t i; uint8_t csid; char *key; lob_t tmp, hs = NULL, handshakes = NULL; if(!link) return NULL; // no keys means we have to generate a handshake for each key if(!link->x) { for(i=0;(key = lob_get_index(link->mesh->keys,i));i+=2) { util_unhex(key,2,&csid); hs = lob_new(); tmp = hashname_im(link->mesh->keys, csid); lob_body(hs, lob_raw(tmp), lob_len(tmp)); lob_free(tmp); handshakes = lob_link(hs, handshakes); } }else{ // generate one just for this csid handshakes = lob_new(); tmp = hashname_im(link->mesh->keys, link->csid); lob_body(handshakes, lob_raw(tmp), lob_len(tmp)); lob_free(tmp); } // add any custom per-link for(hs = link->handshakes; hs; hs = lob_linked(hs)) handshakes = lob_link(lob_copy(hs), handshakes); // add any mesh-wide handshakes for(hs = link->mesh->handshakes; hs; hs = lob_linked(hs)) handshakes = lob_link(lob_copy(hs), handshakes); // encrypt them if we can if(link->x) { tmp = handshakes; handshakes = NULL; for(hs = tmp; hs; hs = lob_linked(hs)) handshakes = lob_link(e3x_exchange_handshake(link->x, hs), handshakes); lob_free(tmp); } return handshakes; }
hashname_t hashname_keys(lob_t keys) { hashname_t hn; lob_t im; if(!keys) return LOG("bad args"); im = hashname_im(keys,0); hn = hashname_key(im,0); lob_free(im); return hn; }
link_t link_get_keys(mesh_t mesh, lob_t keys) { uint8_t csid; if(!mesh || !keys) return LOG("invalid args"); csid = hashname_id(mesh->keys,keys); if(!csid) return LOG("no supported key"); lob_t key = hashname_im(keys,csid); link_t ret = link_get_key(mesh, key, csid); lob_free(key); return ret; }
lob_t link_handshake(link_t link) { if(!link) return NULL; if(!link->x) return LOG_DEBUG("no exchange"); LOG_DEBUG("generating a new handshake in %lu out %lu",link->x->in,link->x->out); lob_t handshake = lob_copy(link->mesh->handshake); lob_t tmp = hashname_im(link->mesh->keys, link->csid); lob_body(handshake, lob_raw(tmp), lob_len(tmp)); lob_free(tmp); // encrypt it tmp = handshake; handshake = e3x_exchange_handshake(link->x, tmp); lob_free(tmp); return handshake; }