+bool send_ans_key_ecdh(node_t *to) {
+ int siglen = ecdsa_size(&myself->connection->ecdsa);
+ char key[(ECDH_SIZE + siglen) * 2 + 1];
+
+ if(!ecdh_generate_public(&to->ecdh, key))
+ return false;
+
+ if(!ecdsa_sign(&myself->connection->ecdsa, key, ECDH_SIZE, key + ECDH_SIZE))
+ return false;
+
+ b64encode(key, key, ECDH_SIZE + siglen);
+
+ int result = send_request(to->nexthop->connection, "%d %s %s %s %d %d %d %d", ANS_KEY,
+ myself->name, to->name, key,
+ cipher_get_nid(&myself->incipher),
+ digest_get_nid(&myself->indigest),
+ (int)digest_length(&myself->indigest),
+ myself->incompression);
+
+ return result;
+}
+
+bool send_ans_key(node_t *to) {
+ if(experimental && OPTION_VERSION(to->options) >= 2)
+ return send_ans_key_ecdh(to);
+
+ size_t keylen = cipher_keylength(&myself->incipher);
+ char key[keylen * 2 + 1];
+
+ cipher_open_by_nid(&to->incipher, cipher_get_nid(&myself->incipher));
+ digest_open_by_nid(&to->indigest, digest_get_nid(&myself->indigest), digest_length(&myself->indigest));
+ to->incompression = myself->incompression;
+
+ randomize(key, keylen);
+ cipher_set_key(&to->incipher, key, false);
+ digest_set_key(&to->indigest, key, keylen);