diff options
author | Nick Mathewson <nickm@torproject.org> | 2018-09-25 14:19:48 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2018-09-25 15:14:57 -0400 |
commit | 934859cf80902e6a16fb69d884fadc8ea831779f (patch) | |
tree | 0567013871dbad5cfb70f87292e4a1772361a535 /src/feature/nodelist | |
parent | c82163dff468443d28b6d0c9b1253f7721eb3fdc (diff) | |
download | tor-934859cf80902e6a16fb69d884fadc8ea831779f.tar.gz tor-934859cf80902e6a16fb69d884fadc8ea831779f.zip |
Move key-loading and crosscert-checking out of feature/relay
This is also used by onion services, so it needs to go in another
module.
Diffstat (limited to 'src/feature/nodelist')
-rw-r--r-- | src/feature/nodelist/torcert.c | 37 | ||||
-rw-r--r-- | src/feature/nodelist/torcert.h | 6 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/feature/nodelist/torcert.c b/src/feature/nodelist/torcert.c index fe67e56403..675d5c97b7 100644 --- a/src/feature/nodelist/torcert.c +++ b/src/feature/nodelist/torcert.c @@ -638,6 +638,43 @@ or_handshake_certs_ed25519_ok(int severity, return 1; } +/** Check whether an RSA-TAP cross-certification is correct. Return 0 if it + * is, -1 if it isn't. */ +MOCK_IMPL(int, +check_tap_onion_key_crosscert,(const uint8_t *crosscert, + int crosscert_len, + const crypto_pk_t *onion_pkey, + const ed25519_public_key_t *master_id_pkey, + const uint8_t *rsa_id_digest)) +{ + uint8_t *cc = tor_malloc(crypto_pk_keysize(onion_pkey)); + int cc_len = + crypto_pk_public_checksig(onion_pkey, + (char*)cc, + crypto_pk_keysize(onion_pkey), + (const char*)crosscert, + crosscert_len); + if (cc_len < 0) { + goto err; + } + if (cc_len < DIGEST_LEN + ED25519_PUBKEY_LEN) { + log_warn(LD_DIR, "Short signature on cross-certification with TAP key"); + goto err; + } + if (tor_memneq(cc, rsa_id_digest, DIGEST_LEN) || + tor_memneq(cc + DIGEST_LEN, master_id_pkey->pubkey, + ED25519_PUBKEY_LEN)) { + log_warn(LD_DIR, "Incorrect cross-certification with TAP key"); + goto err; + } + + tor_free(cc); + return 0; + err: + tor_free(cc); + return -1; +} + /** * Check the Ed certificates and/or the RSA certificates, as appropriate. If * we obtained an Ed25519 identity, set *ed_id_out. If we obtained an RSA diff --git a/src/feature/nodelist/torcert.h b/src/feature/nodelist/torcert.h index 5fa97679df..cb5e23cc33 100644 --- a/src/feature/nodelist/torcert.h +++ b/src/feature/nodelist/torcert.h @@ -107,4 +107,10 @@ void or_handshake_certs_check_both(int severity, int tor_cert_encode_ed22519(const tor_cert_t *cert, char **cert_str_out); +MOCK_DECL(int, check_tap_onion_key_crosscert,(const uint8_t *crosscert, + int crosscert_len, + const crypto_pk_t *onion_pkey, + const ed25519_public_key_t *master_id_pkey, + const uint8_t *rsa_id_digest)); + #endif /* !defined(TORCERT_H_INCLUDED) */ |