12#define TOR_X509_PRIVATE
14#include "lib/tls/x509_internal.h"
18#include "lib/crypt_ops/compat_openssl.h"
22DISABLE_GCC_WARNING(
"-Wredundant-decls")
24#include <openssl/opensslv.h>
27#error "We require OpenSSL with ECC support"
30#include <openssl/err.h>
31#include <openssl/asn1.h>
32#include <openssl/bio.h>
33#include <openssl/bn.h>
34#include <openssl/evp.h>
35#include <openssl/objects.h>
36#include <openssl/rsa.h>
37#include <openssl/x509.h>
39ENABLE_GCC_WARNING(
"-Wredundant-decls")
41#include "lib/log/log.h"
49#define X509_get_notBefore_const(cert) \
50 X509_get0_notBefore(cert)
51#define X509_get_notAfter_const(cert) \
52 X509_get0_notAfter(cert)
53#ifndef X509_get_notBefore
54#define X509_get_notBefore(cert) \
55 X509_getm_notBefore(cert)
57#ifndef X509_get_notAfter
58#define X509_get_notAfter(cert) \
59 X509_getm_notAfter(cert)
69 if (!(
name = X509_NAME_new()))
71 if ((nid = OBJ_txt2nid(
"commonName")) == NID_undef)
goto error;
72 if (!(X509_NAME_add_entry_by_NID(
name, nid, MBSTRING_ASC,
73 (
unsigned char*)cname, -1, -1, 0)))
97 const char *cname_sign,
98 unsigned int cert_lifetime))
102#define SERIAL_NUMBER_SIZE 8
104 time_t start_time, end_time;
105 BIGNUM *serial_number = NULL;
106 unsigned char serial_tmp[SERIAL_NUMBER_SIZE];
107 EVP_PKEY *sign_pkey = NULL, *pkey=NULL;
109 X509_NAME *
name = NULL, *name_issuer=NULL;
113 time_t now = time(NULL);
115 tor_tls_pick_certificate_lifetime(now, cert_lifetime,
116 &start_time, &end_time);
122 if (!(sign_pkey = crypto_pk_get_openssl_evp_pkey_(rsa_sign,1)))
124 if (!(pkey = crypto_pk_get_openssl_evp_pkey_(rsa,0)))
126 if (!(x509 = X509_new()))
128 if (!(X509_set_version(x509, 2)))
132 crypto_rand((
char *)serial_tmp,
sizeof(serial_tmp));
133 if (!(serial_number = BN_bin2bn(serial_tmp,
sizeof(serial_tmp), NULL)))
135 if (!(BN_to_ASN1_INTEGER(serial_number, X509_get_serialNumber(x509))))
141 if (!(X509_set_subject_name(x509,
name)))
145 if (!(X509_set_issuer_name(x509, name_issuer)))
148 if (!X509_time_adj(X509_get_notBefore(x509),0,&start_time))
150 if (!X509_time_adj(X509_get_notAfter(x509),0,&end_time))
152 if (!X509_set_pubkey(x509, pkey))
155 if (!X509_sign(x509, sign_pkey, EVP_sha256()))
167 EVP_PKEY_free(sign_pkey);
171 BN_clear_free(serial_number);
173 X509_NAME_free(
name);
175 X509_NAME_free(name_issuer);
178#undef SERIAL_NUMBER_SIZE
185 unsigned char *buf = NULL;
186 int length = i2d_X509(cert->cert, &buf);
188 if (length <= 0 || buf == NULL) {
191 cert->encoded_len = (size_t) length;
192 cert->encoded = tor_malloc(length);
193 memcpy(cert->encoded, buf, length);
199tor_x509_cert_impl_free_(tor_x509_cert_impl_t *cert)
205tor_x509_cert_impl_t *
206tor_x509_cert_impl_dup_(tor_x509_cert_impl_t *cert)
209 return X509_dup(cert);
218 const uint8_t **encoded_out,
size_t *size_out)
223 *encoded_out = cert->encoded;
224 *size_out = cert->encoded_len;
234 const unsigned char *cp = (
const unsigned char *)certificate;
235 tor_x509_cert_t *newcert;
237 check_no_tls_errors();
239 if (certificate_len > INT_MAX)
242 x509 = d2i_X509(NULL, &cp, (
int)certificate_len);
246 if (cp - certificate != (
int)certificate_len) {
250 newcert = tor_x509_cert_new(x509);
254 if (newcert->encoded_len != certificate_len ||
255 fast_memneq(newcert->encoded, certificate, certificate_len)) {
257 tor_x509_cert_free(newcert);
274 EVP_PKEY *pkey = X509_get_pubkey(cert->cert);
278 rsa = EVP_PKEY_get1_RSA(pkey);
283 result = crypto_new_pk_from_openssl_rsa_(rsa);
295 const tor_x509_cert_t *cert,
296 const tor_x509_cert_t *signing_cert,
300 check_no_tls_errors();
304 if (!signing_cert || !cert)
307 EVP_PKEY *signing_key = X509_get_pubkey(signing_cert->cert);
310 r = X509_verify(cert->cert, signing_key);
311 EVP_PKEY_free(signing_key);
319 TOR_X509_FUTURE_SLOP) < 0)
322 cert_key = X509_get_pubkey(cert->cert);
323 if (check_rsa_1024 && cert_key) {
324 RSA *rsa = EVP_PKEY_get1_RSA(cert_key);
325 if (rsa && RSA_bits(rsa) == 1024) {
328 log_fn(severity,
LD_CRYPTO,
"Invalid certificate: Key is not RSA1024.");
333 }
else if (cert_key) {
336 if (EVP_PKEY_base_id(cert_key) == EVP_PKEY_EC)
339 if (EVP_PKEY_bits(cert_key) >= min_bits)
342 EVP_PKEY_free(cert_key);
361 char *s1=NULL, *s2=NULL;
368 "Certificate %s. Either their clock is set wrong, or your clock "
372 if (!(bio = BIO_new(BIO_s_mem()))) {
373 log_warn(
LD_GENERAL,
"Couldn't allocate BIO!");
goto end;
375 if (!(ASN1_TIME_print(bio, X509_get_notBefore_const(cert)))) {
379 BIO_get_mem_ptr(bio, &buf);
380 s1 = tor_strndup(buf->data, buf->length);
382 (void)BIO_reset(bio);
383 if (!(ASN1_TIME_print(bio, X509_get_notAfter_const(cert)))) {
387 BIO_get_mem_ptr(bio, &buf);
388 s2 = tor_strndup(buf->data, buf->length);
390 n = strftime(mytime, 32,
"%b %d %H:%M:%S %Y UTC",
tor_gmtime_r(&now, &tm));
393 "(certificate lifetime runs from %s through %s. Your time is %s.)",
397 "(certificate lifetime runs from %s through %s. "
398 "Couldn't get your time.)",
419 int past_tolerance,
int future_tolerance)
423 t = now + future_tolerance;
424 if (X509_cmp_time(X509_get_notBefore_const(cert), &t) > 0) {
428 t = now - past_tolerance;
429 if (X509_cmp_time(X509_get_notAfter_const(cert), &t) < 0) {
442tor_x509_cert_replace_expiration(
const tor_x509_cert_t *inp,
443 time_t new_expiration_time,
446 X509 *newc = X509_dup(inp->cert);
447 X509_time_adj(X509_get_notAfter(newc), 0, &new_expiration_time);
448 EVP_PKEY *pk = crypto_pk_get_openssl_evp_pkey_(signing_key, 1);
449 tor_assert(X509_sign(newc, pk, EVP_sha256()));
451 return tor_x509_cert_new(newc);
void crypto_rand(char *to, size_t n)
Common functions for using (pseudo-)random number generators.
Common functions for cryptographic routines.
#define fast_memneq(a, b, c)
void tor_log(int severity, log_domain_mask_t domain, const char *format,...)
#define log_fn(severity, domain, args,...)
#define MOCK_IMPL(rv, funcname, arglist)
struct tm * tor_gmtime_r(const time_t *timep, struct tm *result)
void tls_log_errors(tor_tls_t *tls, int severity, int domain, const char *doing)
Macros to manage assertions, fatal and non-fatal.
crypto_pk_t * tor_tls_cert_get_key(tor_x509_cert_t *cert)
int tor_x509_check_cert_lifetime_internal(int severity, const X509 *cert, time_t now, int past_tolerance, int future_tolerance)
static X509_NAME * tor_x509_name_new(const char *cname)
tor_x509_cert_t * tor_x509_cert_decode(const uint8_t *certificate, size_t certificate_len)
int tor_tls_cert_is_valid(int severity, const tor_x509_cert_t *cert, const tor_x509_cert_t *signing_cert, time_t now, int check_rsa_1024)
X509 * tor_tls_create_certificate(crypto_pk_t *rsa, crypto_pk_t *rsa_sign, const char *cname, const char *cname_sign, unsigned int cert_lifetime)
static void log_cert_lifetime(int severity, const X509 *cert, const char *problem, time_t now)
void tor_x509_cert_get_der(const tor_x509_cert_t *cert, const uint8_t **encoded_out, size_t *size_out)
int tor_x509_cert_set_cached_der_encoding(tor_x509_cert_t *cert)