|
@@ -559,10 +559,14 @@ retry_service_rendezvous_point(const origin_circuit_t *circ)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
-/* Add all possible link specifiers in node to lspecs.
|
|
|
- * legacy ID is mandatory thus MUST be present in node. If the primary address
|
|
|
- * is not IPv4, log a BUG() warning, and return an empty smartlist.
|
|
|
- * Includes ed25519 id and IPv6 link specifiers if present in the node. */
|
|
|
+/* Add all possible link specifiers in node to lspecs:
|
|
|
+ * - legacy ID is mandatory thus MUST be present in node;
|
|
|
+ * - include ed25519 link specifier if present in the node, and the node
|
|
|
+ * supports ed25519 link authentication, even if its link versions are not
|
|
|
+ * compatible with us;
|
|
|
+ * - include IPv4 link specifier, if the primary address is not IPv4, log a
|
|
|
+ * BUG() warning, and return an empty smartlist;
|
|
|
+ * - include IPv6 link specifier if present in the node. */
|
|
|
static void
|
|
|
get_lspecs_from_node(const node_t *node, smartlist_t *lspecs)
|
|
|
{
|
|
@@ -600,8 +604,12 @@ get_lspecs_from_node(const node_t *node, smartlist_t *lspecs)
|
|
|
link_specifier_set_ls_len(ls, link_specifier_getlen_un_legacy_id(ls));
|
|
|
smartlist_add(lspecs, ls);
|
|
|
|
|
|
- /* ed25519 ID is only included if the node has it. */
|
|
|
- if (!ed25519_public_key_is_zero(&node->ed25519_id)) {
|
|
|
+ /* ed25519 ID is only included if the node has it, and the node declares a
|
|
|
+ protocol version that supports ed25519 link authentication, even if that
|
|
|
+ link version is not compatible with us. (We are sending the ed25519 key
|
|
|
+ to another tor, which may support different link versions.) */
|
|
|
+ if (!ed25519_public_key_is_zero(&node->ed25519_id) &&
|
|
|
+ node_supports_ed25519_link_authentication(node, 0)) {
|
|
|
ls = link_specifier_new();
|
|
|
link_specifier_set_ls_type(ls, LS_ED25519_ID);
|
|
|
memcpy(link_specifier_getarray_un_ed25519_id(ls), &node->ed25519_id,
|