Tor 0.4.9.1-alpha-dev
Macros | Functions
torcert.c File Reference

Implementation for ed25519-signed certificates as used in the Tor protocol. More...

#include "core/or/or.h"
#include "app/config/config.h"
#include "lib/crypt_ops/crypto_util.h"
#include "feature/nodelist/torcert.h"
#include "trunnel/ed25519_cert.h"
#include "lib/log/log.h"
#include "trunnel/link_handshake.h"
#include "lib/tls/tortls.h"
#include "lib/tls/x509.h"
#include "core/or/or_handshake_certs_st.h"

Go to the source code of this file.

Macros

#define RSA_ED_CROSSCERT_PREFIX   "Tor TLS RSA/Ed25519 cross-certificate"
 
#define ERR(code, s)
 
#define ERR(s)
 
#define ADDCERT(cert, pk)
 

Functions

tor_cert_ttor_cert_create_raw (const ed25519_keypair_t *signing_key, uint8_t cert_type, uint8_t signed_key_type, const uint8_t signed_key_info[32], time_t now, time_t lifetime, uint32_t flags)
 
tor_cert_ttor_cert_create_ed25519 (const ed25519_keypair_t *signing_key, uint8_t cert_type, const ed25519_public_key_t *signed_key, time_t now, time_t lifetime, uint32_t flags)
 
void tor_cert_free_ (tor_cert_t *cert)
 
tor_cert_ttor_cert_parse (const uint8_t *encoded, const size_t len)
 
int tor_cert_get_checkable_sig (ed25519_checkable_t *checkable_out, const tor_cert_t *cert, const ed25519_public_key_t *pubkey, time_t *expiration_out)
 
int tor_cert_checksig (tor_cert_t *cert, const ed25519_public_key_t *pubkey, time_t now)
 
const char * tor_cert_describe_signature_status (const tor_cert_t *cert)
 
tor_cert_ttor_cert_dup (const tor_cert_t *cert)
 
int tor_cert_eq (const tor_cert_t *cert1, const tor_cert_t *cert2)
 
int tor_cert_opt_eq (const tor_cert_t *cert1, const tor_cert_t *cert2)
 
ssize_t tor_make_rsa_ed25519_crosscert (const ed25519_public_key_t *ed_key, const crypto_pk_t *rsa_key, time_t expires, uint8_t **cert)
 
int rsa_ed25519_crosscert_check (const uint8_t *crosscert, const size_t crosscert_len, const crypto_pk_t *rsa_id_key, const ed25519_public_key_t *master_key, const time_t reject_if_expired_before)
 
or_handshake_certs_tor_handshake_certs_new (void)
 
void or_handshake_certs_free_ (or_handshake_certs_t *certs)
 
int or_handshake_certs_rsa_ok (int severity, or_handshake_certs_t *certs, tor_tls_t *tls, time_t now)
 
int or_handshake_certs_ed25519_ok (int severity, or_handshake_certs_t *certs, tor_tls_t *tls, time_t now)
 
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)
 
void or_handshake_certs_check_both (int severity, or_handshake_certs_t *certs, tor_tls_t *tls, time_t now, const ed25519_public_key_t **ed_id_out, const common_digests_t **rsa_id_out)
 
int tor_cert_encode_ed22519 (const tor_cert_t *cert, char **cert_str_out)
 

Detailed Description

Implementation for ed25519-signed certificates as used in the Tor protocol.

This certificate format is designed to be simple and compact; it's documented in tor-spec.txt in the torspec.git repository. All of the certificates in this format are signed with an Ed25519 key; the contents themselves may be another Ed25519 key, a digest of a RSA key, or some other material.

In this module there is also support for a cross-certification of Ed25519 identities using (older) RSA1024 identities.

Tor uses other types of certificate too, beyond those described in this module. Notably, our use of TLS requires us to touch X.509 certificates, even though sensible people would stay away from those. Our X.509 certificates are represented with tor_x509_cert_t, and implemented in tortls.c. We also have a separate certificate type that authorities use to authenticate their RSA signing keys with their RSA identity keys: that one is authority_cert_t, and it's mostly handled in routerlist.c.

Definition in file torcert.c.

Macro Definition Documentation

◆ ADDCERT

#define ADDCERT (   cert,
  pk 
)
Value:
do { \
tor_assert(n_checkable < ARRAY_LENGTH(check)); \
if (tor_cert_get_checkable_sig(&check[n_checkable++], cert, pk, \
&expiration) < 0) \
ERR("Could not get checkable cert."); \
} while (0)
#define ARRAY_LENGTH(x)
int tor_cert_get_checkable_sig(ed25519_checkable_t *checkable_out, const tor_cert_t *cert, const ed25519_public_key_t *pubkey, time_t *expiration_out)
Definition: torcert.c:211

◆ ERR [1/2]

#define ERR (   code,
 
)
Value:
do { \
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, \
"Received a bad RSA->Ed25519 crosscert: %s", \
(s)); \
rv = (code); \
goto err; \
} while (0)
#define LD_PROTOCOL
Definition: log.h:72

Definition at line 497 of file torcert.c.

◆ ERR [2/2]

#define ERR (   s)
Value:
do { \
log_fn(severity, LD_PROTOCOL, \
"Received a bad CERTS cell: %s", \
(s)); \
return 0; \
} while (0)

Definition at line 497 of file torcert.c.

◆ RSA_ED_CROSSCERT_PREFIX

#define RSA_ED_CROSSCERT_PREFIX   "Tor TLS RSA/Ed25519 cross-certificate"

Definition at line 324 of file torcert.c.

Function Documentation

◆ check_tap_onion_key_crosscert()

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 
)

Check whether an RSA-TAP cross-certification is correct. Return 0 if it is, -1 if it isn't.

Definition at line 649 of file torcert.c.

◆ or_handshake_certs_check_both()

void or_handshake_certs_check_both ( int  severity,
or_handshake_certs_t certs,
tor_tls_t tls,
time_t  now,
const ed25519_public_key_t **  ed_id_out,
const common_digests_t **  rsa_id_out 
)

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 identity, set *rs_id_out. Otherwise, set them both to NULL.

Definition at line 685 of file torcert.c.

◆ or_handshake_certs_ed25519_ok()

int or_handshake_certs_ed25519_ok ( int  severity,
or_handshake_certs_t certs,
tor_tls_t tls,
time_t  now 
)

Check all the ed25519 certificates in certs against each other, and against the peer certificate in tls if appropriate. On success, return 0; on failure, return a negative value and warn at level severity

Definition at line 541 of file torcert.c.

Referenced by or_handshake_certs_check_both().

◆ or_handshake_certs_free_()

void or_handshake_certs_free_ ( or_handshake_certs_t certs)

Release all storage held in certs

Definition at line 478 of file torcert.c.

◆ or_handshake_certs_new()

or_handshake_certs_t * or_handshake_certs_new ( void  )

Construct and return a new empty or_handshake_certs object

Definition at line 471 of file torcert.c.

◆ or_handshake_certs_rsa_ok()

int or_handshake_certs_rsa_ok ( int  severity,
or_handshake_certs_t certs,
tor_tls_t tls,
time_t  now 
)

Definition at line 506 of file torcert.c.

◆ rsa_ed25519_crosscert_check()

int rsa_ed25519_crosscert_check ( const uint8_t *  crosscert,
const size_t  crosscert_len,
const crypto_pk_t rsa_id_key,
const ed25519_public_key_t master_key,
const time_t  reject_if_expired_before 
)

Check whether the crosscert_len byte certificate in crosscert is in fact a correct cross-certification of master_key using the RSA key rsa_id_key.

Also reject the certificate if it expired before reject_if_expired_before.

Return 0 on success, negative on failure.

Definition at line 395 of file torcert.c.

◆ tor_cert_checksig()

int tor_cert_checksig ( tor_cert_t cert,
const ed25519_public_key_t pubkey,
time_t  now 
)

Validates the signature on cert with pubkey relative to the current time now. (If now is 0, do not check the expiration time.) Return 0 on success, -1 on failure. Sets flags in cert as appropriate.

Definition at line 244 of file torcert.c.

◆ tor_cert_create_ed25519()

tor_cert_t * tor_cert_create_ed25519 ( const ed25519_keypair_t signing_key,
uint8_t  cert_type,
const ed25519_public_key_t signed_key,
time_t  now,
time_t  lifetime,
uint32_t  flags 
)

Create and return a new new certificate of type cert_type to authenticate signed_key using the key signing_key. The certificate should remain valid for at least lifetime seconds after now.

If CERT_FLAG_INCLUDE_SIGNING_KEY is set in flags, embed the public part of signing_key in the certificate.

Definition at line 131 of file torcert.c.

Referenced by make_ntor_onion_key_crosscert(), and setup_desc_intro_point().

◆ tor_cert_create_raw()

tor_cert_t * tor_cert_create_raw ( const ed25519_keypair_t signing_key,
uint8_t  cert_type,
uint8_t  signed_key_type,
const uint8_t  signed_key_info[32],
time_t  now,
time_t  lifetime,
uint32_t  flags 
)

As tor_cert_create(), but accept an arbitrary signed_key_type as the subject key – not just an ed25519 key.

Definition at line 44 of file torcert.c.

Referenced by tor_cert_create_ed25519().

◆ tor_cert_describe_signature_status()

const char * tor_cert_describe_signature_status ( const tor_cert_t cert)

Return a string describing the status of the signature on cert

Will always be "unchecked" unless tor_cert_checksig has been called.

Definition at line 279 of file torcert.c.

◆ tor_cert_dup()

tor_cert_t * tor_cert_dup ( const tor_cert_t cert)

Return a new copy of cert

Definition at line 294 of file torcert.c.

◆ tor_cert_encode_ed22519()

int tor_cert_encode_ed22519 ( const tor_cert_t cert,
char **  cert_str_out 
)

Definition at line 728 of file torcert.c.

◆ tor_cert_eq()

int tor_cert_eq ( const tor_cert_t cert1,
const tor_cert_t cert2 
)

Return true iff cert1 and cert2 are the same cert.

Definition at line 304 of file torcert.c.

Referenced by tor_cert_opt_eq().

◆ tor_cert_free_()

void tor_cert_free_ ( tor_cert_t cert)

Release all storage held for cert.

Definition at line 144 of file torcert.c.

◆ tor_cert_get_checkable_sig()

int tor_cert_get_checkable_sig ( ed25519_checkable_t checkable_out,
const tor_cert_t cert,
const ed25519_public_key_t pubkey,
time_t *  expiration_out 
)

Fill in checkable_out with the information needed to check the signature on cert with pubkey.

On success, if expiration_out is provided, and it is some time after the expiration time of this certificate, set it to the expiration time of this certificate.

Definition at line 211 of file torcert.c.

◆ tor_cert_opt_eq()

int tor_cert_opt_eq ( const tor_cert_t cert1,
const tor_cert_t cert2 
)

Return true iff cert1 and cert2 are the same cert, or if they are both NULL.

Definition at line 315 of file torcert.c.

Referenced by routerinfo_incompatible_with_extrainfo().

◆ tor_cert_parse()

tor_cert_t * tor_cert_parse ( const uint8_t *  encoded,
const size_t  len 
)

Parse a certificate encoded with len bytes in encoded.

Definition at line 159 of file torcert.c.

Referenced by cert_parse_and_validate().

◆ tor_make_rsa_ed25519_crosscert()

ssize_t tor_make_rsa_ed25519_crosscert ( const ed25519_public_key_t ed_key,
const crypto_pk_t rsa_key,
time_t  expires,
uint8_t **  cert 
)

Create new cross-certification object to certify ed_key as the master ed25519 identity key for the RSA identity key rsa_key. Allocates and stores the encoded certificate in *cert, and returns the number of bytes stored. Returns negative on error.

Definition at line 331 of file torcert.c.