Commit 24b720a9 authored by Nick Mathewson's avatar Nick Mathewson 🦀
Browse files

Include ed25519 keys in microdescriptors.

parent 006b7ce5
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#include "routerlist.h"
#include "routerparse.h"
#include "entrynodes.h" /* needed for guardfraction methods */
#include "torcert.h"

/**
 * \file dirvote.c
@@ -3486,9 +3487,18 @@ dirvote_create_microdescriptor(const routerinfo_t *ri, int consensus_method)
  }

  if (consensus_method >= MIN_METHOD_FOR_ID_HASH_IN_MD) {
    char idbuf[BASE64_DIGEST_LEN+1];
    char idbuf[ED25519_BASE64_LEN+1];
    const char *keytype;
    if (consensus_method >= MIN_METHOD_FOR_ED25519_ID_IN_MD &&
        ri->signing_key_cert &&
        ri->signing_key_cert->signing_key_included) {
      keytype = "ed25519";
      ed25519_public_to_base64(idbuf, &ri->signing_key_cert->signing_key);
    } else {
      keytype = "rsa1024";
      digest_to_base64(idbuf, ri->cache_info.identity_digest);
    smartlist_add_asprintf(chunks, "id rsa1024 %s\n", idbuf);
    }
    smartlist_add_asprintf(chunks, "id %s %s\n", keytype, idbuf);
  }

  output = smartlist_join_strings(chunks, "", 0, NULL);
@@ -3561,7 +3571,8 @@ static const struct consensus_method_range_t {
  {MIN_METHOD_FOR_A_LINES, MIN_METHOD_FOR_P6_LINES - 1},
  {MIN_METHOD_FOR_P6_LINES, MIN_METHOD_FOR_NTOR_KEY - 1},
  {MIN_METHOD_FOR_NTOR_KEY, MIN_METHOD_FOR_ID_HASH_IN_MD - 1},
  {MIN_METHOD_FOR_ID_HASH_IN_MD,  MAX_SUPPORTED_CONSENSUS_METHOD},
  {MIN_METHOD_FOR_ID_HASH_IN_MD, MIN_METHOD_FOR_ED25519_ID_IN_MD - 1},
  {MIN_METHOD_FOR_ED25519_ID_IN_MD, MAX_SUPPORTED_CONSENSUS_METHOD},
  {-1, -1}
};

+5 −1
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@
#define MIN_SUPPORTED_CONSENSUS_METHOD 13

/** The highest consensus method that we currently support. */
#define MAX_SUPPORTED_CONSENSUS_METHOD 20
#define MAX_SUPPORTED_CONSENSUS_METHOD 21

/** Lowest consensus method where microdesc consensuses omit any entry
 * with no microdesc. */
@@ -86,6 +86,10 @@
 * GuardFraction information in microdescriptors. */
#define MIN_METHOD_FOR_GUARDFRACTION 20

/** Lowest consensus method where authorities may include an "id" line for
 * ed25519 identities in microdescriptors. */
#define MIN_METHOD_FOR_ED25519_ID_IN_MD 21

/** Default bandwidth to clip unmeasured bandwidths to using method >=
 * MIN_METHOD_TO_CLIP_UNMEASURED_BW.  (This is not a consensus method; do not
 * get confused with the above macros.) */
+1 −0
Original line number Diff line number Diff line
@@ -738,6 +738,7 @@ microdesc_free_(microdesc_t *md, const char *fname, int lineno)
  if (md->onion_pkey)
    crypto_pk_free(md->onion_pkey);
  tor_free(md->onion_curve25519_pkey);
  tor_free(md->ed25519_identity_pkey);
  if (md->body && md->saved_location != SAVED_IN_CACHE)
    tor_free(md->body);

+2 −0
Original line number Diff line number Diff line
@@ -2234,6 +2234,8 @@ typedef struct microdesc_t {
  crypto_pk_t *onion_pkey;
  /** As routerinfo_t.onion_curve25519_pkey */
  curve25519_public_key_t *onion_curve25519_pkey;
  /** Ed25519 identity key, if included. */
  ed25519_public_key_t *ed25519_identity_pkey;
  /** As routerinfo_t.ipv6_add */
  tor_addr_t ipv6_addr;
  /** As routerinfo_t.ipv6_orport */
+22 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ typedef enum {
  K_CLIENT_VERSIONS,
  K_SERVER_VERSIONS,
  K_OR_ADDRESS,
  K_ID,
  K_P,
  K_P6,
  K_R,
@@ -503,6 +504,7 @@ static token_rule_t networkstatus_detached_signature_token_table[] = {
static token_rule_t microdesc_token_table[] = {
  T1_START("onion-key",        K_ONION_KEY,        NO_ARGS,     NEED_KEY_1024),
  T01("ntor-onion-key",        K_ONION_KEY_NTOR,   GE(1),       NO_OBJ ),
  T0N("id",                    K_ID,               GE(2),       NO_OBJ ),
  T0N("a",                     K_A,                GE(1),       NO_OBJ ),
  T01("family",                K_FAMILY,           ARGS,        NO_OBJ ),
  T01("p",                     K_P,                CONCAT_ARGS, NO_OBJ ),
@@ -4372,6 +4374,26 @@ microdescs_parse_from_string(const char *s, const char *eos,
        tor_memdup(&k, sizeof(curve25519_public_key_t));
    }

    smartlist_t *id_lines = find_all_by_keyword(tokens, K_ID);
    if (id_lines) {
      SMARTLIST_FOREACH_BEGIN(id_lines, directory_token_t *, t) {
        tor_assert(t->n_args >= 2);
        if (!strcmp(t->args[0], "ed25519")) {
          if (md->ed25519_identity_pkey) {
            log_warn(LD_DIR, "Extra ed25519 key in microdesc");
            goto next;
          }
          ed25519_public_key_t k;
          if (ed25519_public_from_base64(&k, t->args[1])<0) {
            log_warn(LD_DIR, "Bogus ed25519 key in microdesc");
            goto next;
          }
          md->ed25519_identity_pkey = tor_memdup(&k, sizeof(k));
        }
      } SMARTLIST_FOREACH_END(t);
      smartlist_free(id_lines);
    }

    {
      smartlist_t *a_lines = find_all_by_keyword(tokens, K_A);
      if (a_lines) {
Loading