diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/ct/ct.h | 65 | ||||
-rw-r--r-- | src/lib/libcrypto/ct/ct_b64.c | 260 | ||||
-rw-r--r-- | src/lib/libcrypto/ct/ct_err.c | 136 | ||||
-rw-r--r-- | src/lib/libcrypto/ct/ct_local.h | 96 | ||||
-rw-r--r-- | src/lib/libcrypto/ct/ct_log.c | 371 | ||||
-rw-r--r-- | src/lib/libcrypto/ct/ct_oct.c | 707 | ||||
-rw-r--r-- | src/lib/libcrypto/ct/ct_policy.c | 84 | ||||
-rw-r--r-- | src/lib/libcrypto/ct/ct_prn.c | 168 | ||||
-rw-r--r-- | src/lib/libcrypto/ct/ct_sct.c | 603 | ||||
-rw-r--r-- | src/lib/libcrypto/ct/ct_sct_ctx.c | 398 | ||||
-rw-r--r-- | src/lib/libcrypto/ct/ct_vfy.c | 222 | ||||
-rw-r--r-- | src/lib/libcrypto/ct/ct_x509v3.c | 126 |
12 files changed, 1653 insertions, 1583 deletions
diff --git a/src/lib/libcrypto/ct/ct.h b/src/lib/libcrypto/ct/ct.h index ebdba34d67..ac981fa0b5 100644 --- a/src/lib/libcrypto/ct/ct.h +++ b/src/lib/libcrypto/ct/ct.h | |||
@@ -8,51 +8,51 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | #ifndef HEADER_CT_H | 10 | #ifndef HEADER_CT_H |
11 | # define HEADER_CT_H | 11 | #define HEADER_CT_H |
12 | 12 | ||
13 | # include <openssl/opensslconf.h> | 13 | #include <openssl/opensslconf.h> |
14 | 14 | ||
15 | # ifndef OPENSSL_NO_CT | 15 | #ifndef OPENSSL_NO_CT |
16 | # include <openssl/ossl_typ.h> | 16 | #include <openssl/ossl_typ.h> |
17 | # include <openssl/safestack.h> | 17 | #include <openssl/safestack.h> |
18 | # include <openssl/x509.h> | 18 | #include <openssl/x509.h> |
19 | # include <openssl/cterr.h> | 19 | #include <openssl/cterr.h> |
20 | # ifdef __cplusplus | 20 | #ifdef __cplusplus |
21 | extern "C" { | 21 | extern "C" { |
22 | # endif | 22 | #endif |
23 | 23 | ||
24 | 24 | ||
25 | /* Minimum RSA key size, from RFC6962 */ | 25 | /* Minimum RSA key size, from RFC6962 */ |
26 | # define SCT_MIN_RSA_BITS 2048 | 26 | #define SCT_MIN_RSA_BITS 2048 |
27 | 27 | ||
28 | /* All hashes are SHA256 in v1 of Certificate Transparency */ | 28 | /* All hashes are SHA256 in v1 of Certificate Transparency */ |
29 | # define CT_V1_HASHLEN SHA256_DIGEST_LENGTH | 29 | #define CT_V1_HASHLEN SHA256_DIGEST_LENGTH |
30 | 30 | ||
31 | typedef enum { | 31 | typedef enum { |
32 | CT_LOG_ENTRY_TYPE_NOT_SET = -1, | 32 | CT_LOG_ENTRY_TYPE_NOT_SET = -1, |
33 | CT_LOG_ENTRY_TYPE_X509 = 0, | 33 | CT_LOG_ENTRY_TYPE_X509 = 0, |
34 | CT_LOG_ENTRY_TYPE_PRECERT = 1 | 34 | CT_LOG_ENTRY_TYPE_PRECERT = 1 |
35 | } ct_log_entry_type_t; | 35 | } ct_log_entry_type_t; |
36 | 36 | ||
37 | typedef enum { | 37 | typedef enum { |
38 | SCT_VERSION_NOT_SET = -1, | 38 | SCT_VERSION_NOT_SET = -1, |
39 | SCT_VERSION_V1 = 0 | 39 | SCT_VERSION_V1 = 0 |
40 | } sct_version_t; | 40 | } sct_version_t; |
41 | 41 | ||
42 | typedef enum { | 42 | typedef enum { |
43 | SCT_SOURCE_UNKNOWN, | 43 | SCT_SOURCE_UNKNOWN, |
44 | SCT_SOURCE_TLS_EXTENSION, | 44 | SCT_SOURCE_TLS_EXTENSION, |
45 | SCT_SOURCE_X509V3_EXTENSION, | 45 | SCT_SOURCE_X509V3_EXTENSION, |
46 | SCT_SOURCE_OCSP_STAPLED_RESPONSE | 46 | SCT_SOURCE_OCSP_STAPLED_RESPONSE |
47 | } sct_source_t; | 47 | } sct_source_t; |
48 | 48 | ||
49 | typedef enum { | 49 | typedef enum { |
50 | SCT_VALIDATION_STATUS_NOT_SET, | 50 | SCT_VALIDATION_STATUS_NOT_SET, |
51 | SCT_VALIDATION_STATUS_UNKNOWN_LOG, | 51 | SCT_VALIDATION_STATUS_UNKNOWN_LOG, |
52 | SCT_VALIDATION_STATUS_VALID, | 52 | SCT_VALIDATION_STATUS_VALID, |
53 | SCT_VALIDATION_STATUS_INVALID, | 53 | SCT_VALIDATION_STATUS_INVALID, |
54 | SCT_VALIDATION_STATUS_UNVERIFIED, | 54 | SCT_VALIDATION_STATUS_UNVERIFIED, |
55 | SCT_VALIDATION_STATUS_UNKNOWN_VERSION | 55 | SCT_VALIDATION_STATUS_UNKNOWN_VERSION |
56 | } sct_validation_status_t; | 56 | } sct_validation_status_t; |
57 | 57 | ||
58 | DEFINE_STACK_OF(SCT) | 58 | DEFINE_STACK_OF(SCT) |
@@ -288,7 +288,7 @@ void SCT_print(const SCT *sct, BIO *out, int indent, const CTLOG_STORE *logs); | |||
288 | * came from, so that the log names can be printed. | 288 | * came from, so that the log names can be printed. |
289 | */ | 289 | */ |
290 | void SCT_LIST_print(const STACK_OF(SCT) *sct_list, BIO *out, int indent, | 290 | void SCT_LIST_print(const STACK_OF(SCT) *sct_list, BIO *out, int indent, |
291 | const char *separator, const CTLOG_STORE *logs); | 291 | const char *separator, const CTLOG_STORE *logs); |
292 | 292 | ||
293 | /* | 293 | /* |
294 | * Gets the last result of validating this SCT. | 294 | * Gets the last result of validating this SCT. |
@@ -313,7 +313,7 @@ __owur int SCT_validate(SCT *sct, const CT_POLICY_EVAL_CTX *ctx); | |||
313 | * Returns a negative integer if an error occurs. | 313 | * Returns a negative integer if an error occurs. |
314 | */ | 314 | */ |
315 | __owur int SCT_LIST_validate(const STACK_OF(SCT) *scts, | 315 | __owur int SCT_LIST_validate(const STACK_OF(SCT) *scts, |
316 | CT_POLICY_EVAL_CTX *ctx); | 316 | CT_POLICY_EVAL_CTX *ctx); |
317 | 317 | ||
318 | 318 | ||
319 | /********************************* | 319 | /********************************* |
@@ -345,7 +345,7 @@ __owur int i2o_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp); | |||
345 | * not defined. | 345 | * not defined. |
346 | */ | 346 | */ |
347 | STACK_OF(SCT) *o2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, | 347 | STACK_OF(SCT) *o2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, |
348 | size_t len); | 348 | size_t len); |
349 | 349 | ||
350 | /* | 350 | /* |
351 | * Serialize (to DER format) a stack of SCTs and return the length. | 351 | * Serialize (to DER format) a stack of SCTs and return the length. |
@@ -372,7 +372,7 @@ __owur int i2d_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp); | |||
372 | * not defined. | 372 | * not defined. |
373 | */ | 373 | */ |
374 | STACK_OF(SCT) *d2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, | 374 | STACK_OF(SCT) *d2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, |
375 | long len); | 375 | long len); |
376 | 376 | ||
377 | /* | 377 | /* |
378 | * Serialize (to TLS format) an |sct| and write it to |out|. | 378 | * Serialize (to TLS format) an |sct| and write it to |out|. |
@@ -428,7 +428,7 @@ void CTLOG_free(CTLOG *log); | |||
428 | const char *CTLOG_get0_name(const CTLOG *log); | 428 | const char *CTLOG_get0_name(const CTLOG *log); |
429 | /* Gets the ID of the CT log */ | 429 | /* Gets the ID of the CT log */ |
430 | void CTLOG_get0_log_id(const CTLOG *log, const uint8_t **log_id, | 430 | void CTLOG_get0_log_id(const CTLOG *log, const uint8_t **log_id, |
431 | size_t *log_id_len); | 431 | size_t *log_id_len); |
432 | /* Gets the public key of the CT log */ | 432 | /* Gets the public key of the CT log */ |
433 | EVP_PKEY *CTLOG_get0_public_key(const CTLOG *log); | 433 | EVP_PKEY *CTLOG_get0_public_key(const CTLOG *log); |
434 | 434 | ||
@@ -452,8 +452,7 @@ void CTLOG_STORE_free(CTLOG_STORE *store); | |||
452 | * Returns the CT log, or NULL if no match is found. | 452 | * Returns the CT log, or NULL if no match is found. |
453 | */ | 453 | */ |
454 | const CTLOG *CTLOG_STORE_get0_log_by_id(const CTLOG_STORE *store, | 454 | const CTLOG *CTLOG_STORE_get0_log_by_id(const CTLOG_STORE *store, |
455 | const uint8_t *log_id, | 455 | const uint8_t *log_id, size_t log_id_len); |
456 | size_t log_id_len); | ||
457 | 456 | ||
458 | /* | 457 | /* |
459 | * Loads a CT log list into a |store| from a |file|. | 458 | * Loads a CT log list into a |store| from a |file|. |
diff --git a/src/lib/libcrypto/ct/ct_b64.c b/src/lib/libcrypto/ct/ct_b64.c index 4abe11ca29..8ca5f469df 100644 --- a/src/lib/libcrypto/ct/ct_b64.c +++ b/src/lib/libcrypto/ct/ct_b64.c | |||
@@ -21,109 +21,110 @@ | |||
21 | * A new string will be malloc'd and assigned to |out|. This will be owned by | 21 | * A new string will be malloc'd and assigned to |out|. This will be owned by |
22 | * the caller. Do not provide a pre-allocated string in |out|. | 22 | * the caller. Do not provide a pre-allocated string in |out|. |
23 | */ | 23 | */ |
24 | static int ct_base64_decode(const char *in, unsigned char **out) | 24 | static int |
25 | ct_base64_decode(const char *in, unsigned char **out) | ||
25 | { | 26 | { |
26 | size_t inlen = strlen(in); | 27 | size_t inlen = strlen(in); |
27 | int outlen, i; | 28 | int outlen, i; |
28 | unsigned char *outbuf = NULL; | 29 | unsigned char *outbuf = NULL; |
29 | 30 | ||
30 | if (inlen == 0) { | 31 | if (inlen == 0) { |
31 | *out = NULL; | 32 | *out = NULL; |
32 | return 0; | 33 | return 0; |
33 | } | 34 | } |
34 | 35 | ||
35 | outlen = (inlen / 4) * 3; | 36 | outlen = (inlen / 4) * 3; |
36 | outbuf = OPENSSL_malloc(outlen); | 37 | outbuf = OPENSSL_malloc(outlen); |
37 | if (outbuf == NULL) { | 38 | if (outbuf == NULL) { |
38 | CTerr(CT_F_CT_BASE64_DECODE, ERR_R_MALLOC_FAILURE); | 39 | CTerr(CT_F_CT_BASE64_DECODE, ERR_R_MALLOC_FAILURE); |
39 | goto err; | 40 | goto err; |
40 | } | 41 | } |
41 | 42 | ||
42 | outlen = EVP_DecodeBlock(outbuf, (unsigned char *)in, inlen); | 43 | outlen = EVP_DecodeBlock(outbuf, (unsigned char *)in, inlen); |
43 | if (outlen < 0) { | 44 | if (outlen < 0) { |
44 | CTerr(CT_F_CT_BASE64_DECODE, CT_R_BASE64_DECODE_ERROR); | 45 | CTerr(CT_F_CT_BASE64_DECODE, CT_R_BASE64_DECODE_ERROR); |
45 | goto err; | 46 | goto err; |
46 | } | 47 | } |
47 | 48 | ||
48 | /* Subtract padding bytes from |outlen|. Any more than 2 is malformed. */ | 49 | /* Subtract padding bytes from |outlen|. Any more than 2 is malformed. */ |
49 | i = 0; | 50 | i = 0; |
50 | while (in[--inlen] == '=') { | 51 | while (in[--inlen] == '=') { |
51 | --outlen; | 52 | --outlen; |
52 | if (++i > 2) | 53 | if (++i > 2) |
53 | goto err; | 54 | goto err; |
54 | } | 55 | } |
55 | 56 | ||
56 | *out = outbuf; | 57 | *out = outbuf; |
57 | return outlen; | 58 | return outlen; |
58 | err: | 59 | err: |
59 | OPENSSL_free(outbuf); | 60 | OPENSSL_free(outbuf); |
60 | return -1; | 61 | return -1; |
61 | } | 62 | } |
62 | 63 | ||
63 | SCT *SCT_new_from_base64(unsigned char version, const char *logid_base64, | 64 | SCT * |
64 | ct_log_entry_type_t entry_type, uint64_t timestamp, | 65 | SCT_new_from_base64(unsigned char version, const char *logid_base64, |
65 | const char *extensions_base64, | 66 | ct_log_entry_type_t entry_type, uint64_t timestamp, |
66 | const char *signature_base64) | 67 | const char *extensions_base64, const char *signature_base64) |
67 | { | 68 | { |
68 | SCT *sct = SCT_new(); | 69 | SCT *sct = SCT_new(); |
69 | unsigned char *dec = NULL; | 70 | unsigned char *dec = NULL; |
70 | const unsigned char* p = NULL; | 71 | const unsigned char* p = NULL; |
71 | int declen; | 72 | int declen; |
72 | 73 | ||
73 | if (sct == NULL) { | 74 | if (sct == NULL) { |
74 | CTerr(CT_F_SCT_NEW_FROM_BASE64, ERR_R_MALLOC_FAILURE); | 75 | CTerr(CT_F_SCT_NEW_FROM_BASE64, ERR_R_MALLOC_FAILURE); |
75 | return NULL; | 76 | return NULL; |
76 | } | 77 | } |
77 | 78 | ||
78 | /* | 79 | /* |
79 | * RFC6962 section 4.1 says we "MUST NOT expect this to be 0", but we | 80 | * RFC6962 section 4.1 says we "MUST NOT expect this to be 0", but we |
80 | * can only construct SCT versions that have been defined. | 81 | * can only construct SCT versions that have been defined. |
81 | */ | 82 | */ |
82 | if (!SCT_set_version(sct, version)) { | 83 | if (!SCT_set_version(sct, version)) { |
83 | CTerr(CT_F_SCT_NEW_FROM_BASE64, CT_R_SCT_UNSUPPORTED_VERSION); | 84 | CTerr(CT_F_SCT_NEW_FROM_BASE64, CT_R_SCT_UNSUPPORTED_VERSION); |
84 | goto err; | 85 | goto err; |
85 | } | 86 | } |
86 | 87 | ||
87 | declen = ct_base64_decode(logid_base64, &dec); | 88 | declen = ct_base64_decode(logid_base64, &dec); |
88 | if (declen < 0) { | 89 | if (declen < 0) { |
89 | CTerr(CT_F_SCT_NEW_FROM_BASE64, X509_R_BASE64_DECODE_ERROR); | 90 | CTerr(CT_F_SCT_NEW_FROM_BASE64, X509_R_BASE64_DECODE_ERROR); |
90 | goto err; | 91 | goto err; |
91 | } | 92 | } |
92 | if (!SCT_set0_log_id(sct, dec, declen)) | 93 | if (!SCT_set0_log_id(sct, dec, declen)) |
93 | goto err; | 94 | goto err; |
94 | dec = NULL; | 95 | dec = NULL; |
95 | 96 | ||
96 | declen = ct_base64_decode(extensions_base64, &dec); | 97 | declen = ct_base64_decode(extensions_base64, &dec); |
97 | if (declen < 0) { | 98 | if (declen < 0) { |
98 | CTerr(CT_F_SCT_NEW_FROM_BASE64, X509_R_BASE64_DECODE_ERROR); | 99 | CTerr(CT_F_SCT_NEW_FROM_BASE64, X509_R_BASE64_DECODE_ERROR); |
99 | goto err; | 100 | goto err; |
100 | } | 101 | } |
101 | SCT_set0_extensions(sct, dec, declen); | 102 | SCT_set0_extensions(sct, dec, declen); |
102 | dec = NULL; | 103 | dec = NULL; |
103 | 104 | ||
104 | declen = ct_base64_decode(signature_base64, &dec); | 105 | declen = ct_base64_decode(signature_base64, &dec); |
105 | if (declen < 0) { | 106 | if (declen < 0) { |
106 | CTerr(CT_F_SCT_NEW_FROM_BASE64, X509_R_BASE64_DECODE_ERROR); | 107 | CTerr(CT_F_SCT_NEW_FROM_BASE64, X509_R_BASE64_DECODE_ERROR); |
107 | goto err; | 108 | goto err; |
108 | } | 109 | } |
109 | 110 | ||
110 | p = dec; | 111 | p = dec; |
111 | if (o2i_SCT_signature(sct, &p, declen) <= 0) | 112 | if (o2i_SCT_signature(sct, &p, declen) <= 0) |
112 | goto err; | 113 | goto err; |
113 | OPENSSL_free(dec); | 114 | OPENSSL_free(dec); |
114 | dec = NULL; | 115 | dec = NULL; |
115 | 116 | ||
116 | SCT_set_timestamp(sct, timestamp); | 117 | SCT_set_timestamp(sct, timestamp); |
117 | 118 | ||
118 | if (!SCT_set_log_entry_type(sct, entry_type)) | 119 | if (!SCT_set_log_entry_type(sct, entry_type)) |
119 | goto err; | 120 | goto err; |
120 | 121 | ||
121 | return sct; | 122 | return sct; |
122 | 123 | ||
123 | err: | 124 | err: |
124 | OPENSSL_free(dec); | 125 | OPENSSL_free(dec); |
125 | SCT_free(sct); | 126 | SCT_free(sct); |
126 | return NULL; | 127 | return NULL; |
127 | } | 128 | } |
128 | 129 | ||
129 | /* | 130 | /* |
@@ -132,37 +133,38 @@ SCT *SCT_new_from_base64(unsigned char version, const char *logid_base64, | |||
132 | * 0 on decoding failure, or invalid parameter if any | 133 | * 0 on decoding failure, or invalid parameter if any |
133 | * -1 on internal (malloc) failure | 134 | * -1 on internal (malloc) failure |
134 | */ | 135 | */ |
135 | int CTLOG_new_from_base64(CTLOG **ct_log, const char *pkey_base64, const char *name) | 136 | int |
137 | CTLOG_new_from_base64(CTLOG **ct_log, const char *pkey_base64, const char *name) | ||
136 | { | 138 | { |
137 | unsigned char *pkey_der = NULL; | 139 | unsigned char *pkey_der = NULL; |
138 | int pkey_der_len; | 140 | int pkey_der_len; |
139 | const unsigned char *p; | 141 | const unsigned char *p; |
140 | EVP_PKEY *pkey = NULL; | 142 | EVP_PKEY *pkey = NULL; |
141 | 143 | ||
142 | if (ct_log == NULL) { | 144 | if (ct_log == NULL) { |
143 | CTerr(CT_F_CTLOG_NEW_FROM_BASE64, ERR_R_PASSED_INVALID_ARGUMENT); | 145 | CTerr(CT_F_CTLOG_NEW_FROM_BASE64, ERR_R_PASSED_INVALID_ARGUMENT); |
144 | return 0; | 146 | return 0; |
145 | } | 147 | } |
146 | 148 | ||
147 | pkey_der_len = ct_base64_decode(pkey_base64, &pkey_der); | 149 | pkey_der_len = ct_base64_decode(pkey_base64, &pkey_der); |
148 | if (pkey_der_len < 0) { | 150 | if (pkey_der_len < 0) { |
149 | CTerr(CT_F_CTLOG_NEW_FROM_BASE64, CT_R_LOG_CONF_INVALID_KEY); | 151 | CTerr(CT_F_CTLOG_NEW_FROM_BASE64, CT_R_LOG_CONF_INVALID_KEY); |
150 | return 0; | 152 | return 0; |
151 | } | 153 | } |
152 | 154 | ||
153 | p = pkey_der; | 155 | p = pkey_der; |
154 | pkey = d2i_PUBKEY(NULL, &p, pkey_der_len); | 156 | pkey = d2i_PUBKEY(NULL, &p, pkey_der_len); |
155 | OPENSSL_free(pkey_der); | 157 | OPENSSL_free(pkey_der); |
156 | if (pkey == NULL) { | 158 | if (pkey == NULL) { |
157 | CTerr(CT_F_CTLOG_NEW_FROM_BASE64, CT_R_LOG_CONF_INVALID_KEY); | 159 | CTerr(CT_F_CTLOG_NEW_FROM_BASE64, CT_R_LOG_CONF_INVALID_KEY); |
158 | return 0; | 160 | return 0; |
159 | } | 161 | } |
160 | 162 | ||
161 | *ct_log = CTLOG_new(pkey, name); | 163 | *ct_log = CTLOG_new(pkey, name); |
162 | if (*ct_log == NULL) { | 164 | if (*ct_log == NULL) { |
163 | EVP_PKEY_free(pkey); | 165 | EVP_PKEY_free(pkey); |
164 | return 0; | 166 | return 0; |
165 | } | 167 | } |
166 | 168 | ||
167 | return 1; | 169 | return 1; |
168 | } | 170 | } |
diff --git a/src/lib/libcrypto/ct/ct_err.c b/src/lib/libcrypto/ct/ct_err.c index c0c62fee6c..ab49f58e5a 100644 --- a/src/lib/libcrypto/ct/ct_err.c +++ b/src/lib/libcrypto/ct/ct_err.c | |||
@@ -14,72 +14,72 @@ | |||
14 | #ifndef OPENSSL_NO_ERR | 14 | #ifndef OPENSSL_NO_ERR |
15 | 15 | ||
16 | static const ERR_STRING_DATA CT_str_functs[] = { | 16 | static const ERR_STRING_DATA CT_str_functs[] = { |
17 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_NEW, 0), "CTLOG_new"}, | 17 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_NEW, 0), "CTLOG_new"}, |
18 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_NEW_FROM_BASE64, 0), | 18 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_NEW_FROM_BASE64, 0), |
19 | "CTLOG_new_from_base64"}, | 19 | "CTLOG_new_from_base64"}, |
20 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_NEW_FROM_CONF, 0), "ctlog_new_from_conf"}, | 20 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_NEW_FROM_CONF, 0), "ctlog_new_from_conf"}, |
21 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_STORE_LOAD_CTX_NEW, 0), | 21 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_STORE_LOAD_CTX_NEW, 0), |
22 | "ctlog_store_load_ctx_new"}, | 22 | "ctlog_store_load_ctx_new"}, |
23 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_STORE_LOAD_FILE, 0), | 23 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_STORE_LOAD_FILE, 0), |
24 | "CTLOG_STORE_load_file"}, | 24 | "CTLOG_STORE_load_file"}, |
25 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_STORE_LOAD_LOG, 0), | 25 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_STORE_LOAD_LOG, 0), |
26 | "ctlog_store_load_log"}, | 26 | "ctlog_store_load_log"}, |
27 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_STORE_NEW, 0), "CTLOG_STORE_new"}, | 27 | {ERR_PACK(ERR_LIB_CT, CT_F_CTLOG_STORE_NEW, 0), "CTLOG_STORE_new"}, |
28 | {ERR_PACK(ERR_LIB_CT, CT_F_CT_BASE64_DECODE, 0), "ct_base64_decode"}, | 28 | {ERR_PACK(ERR_LIB_CT, CT_F_CT_BASE64_DECODE, 0), "ct_base64_decode"}, |
29 | {ERR_PACK(ERR_LIB_CT, CT_F_CT_POLICY_EVAL_CTX_NEW, 0), | 29 | {ERR_PACK(ERR_LIB_CT, CT_F_CT_POLICY_EVAL_CTX_NEW, 0), |
30 | "CT_POLICY_EVAL_CTX_new"}, | 30 | "CT_POLICY_EVAL_CTX_new"}, |
31 | {ERR_PACK(ERR_LIB_CT, CT_F_CT_V1_LOG_ID_FROM_PKEY, 0), | 31 | {ERR_PACK(ERR_LIB_CT, CT_F_CT_V1_LOG_ID_FROM_PKEY, 0), |
32 | "ct_v1_log_id_from_pkey"}, | 32 | "ct_v1_log_id_from_pkey"}, |
33 | {ERR_PACK(ERR_LIB_CT, CT_F_I2O_SCT, 0), "i2o_SCT"}, | 33 | {ERR_PACK(ERR_LIB_CT, CT_F_I2O_SCT, 0), "i2o_SCT"}, |
34 | {ERR_PACK(ERR_LIB_CT, CT_F_I2O_SCT_LIST, 0), "i2o_SCT_LIST"}, | 34 | {ERR_PACK(ERR_LIB_CT, CT_F_I2O_SCT_LIST, 0), "i2o_SCT_LIST"}, |
35 | {ERR_PACK(ERR_LIB_CT, CT_F_I2O_SCT_SIGNATURE, 0), "i2o_SCT_signature"}, | 35 | {ERR_PACK(ERR_LIB_CT, CT_F_I2O_SCT_SIGNATURE, 0), "i2o_SCT_signature"}, |
36 | {ERR_PACK(ERR_LIB_CT, CT_F_O2I_SCT, 0), "o2i_SCT"}, | 36 | {ERR_PACK(ERR_LIB_CT, CT_F_O2I_SCT, 0), "o2i_SCT"}, |
37 | {ERR_PACK(ERR_LIB_CT, CT_F_O2I_SCT_LIST, 0), "o2i_SCT_LIST"}, | 37 | {ERR_PACK(ERR_LIB_CT, CT_F_O2I_SCT_LIST, 0), "o2i_SCT_LIST"}, |
38 | {ERR_PACK(ERR_LIB_CT, CT_F_O2I_SCT_SIGNATURE, 0), "o2i_SCT_signature"}, | 38 | {ERR_PACK(ERR_LIB_CT, CT_F_O2I_SCT_SIGNATURE, 0), "o2i_SCT_signature"}, |
39 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_CTX_NEW, 0), "SCT_CTX_new"}, | 39 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_CTX_NEW, 0), "SCT_CTX_new"}, |
40 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_CTX_VERIFY, 0), "SCT_CTX_verify"}, | 40 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_CTX_VERIFY, 0), "SCT_CTX_verify"}, |
41 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_NEW, 0), "SCT_new"}, | 41 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_NEW, 0), "SCT_new"}, |
42 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_NEW_FROM_BASE64, 0), "SCT_new_from_base64"}, | 42 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_NEW_FROM_BASE64, 0), "SCT_new_from_base64"}, |
43 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET0_LOG_ID, 0), "SCT_set0_log_id"}, | 43 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET0_LOG_ID, 0), "SCT_set0_log_id"}, |
44 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET1_EXTENSIONS, 0), "SCT_set1_extensions"}, | 44 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET1_EXTENSIONS, 0), "SCT_set1_extensions"}, |
45 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET1_LOG_ID, 0), "SCT_set1_log_id"}, | 45 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET1_LOG_ID, 0), "SCT_set1_log_id"}, |
46 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET1_SIGNATURE, 0), "SCT_set1_signature"}, | 46 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET1_SIGNATURE, 0), "SCT_set1_signature"}, |
47 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET_LOG_ENTRY_TYPE, 0), | 47 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET_LOG_ENTRY_TYPE, 0), |
48 | "SCT_set_log_entry_type"}, | 48 | "SCT_set_log_entry_type"}, |
49 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET_SIGNATURE_NID, 0), | 49 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET_SIGNATURE_NID, 0), |
50 | "SCT_set_signature_nid"}, | 50 | "SCT_set_signature_nid"}, |
51 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET_VERSION, 0), "SCT_set_version"}, | 51 | {ERR_PACK(ERR_LIB_CT, CT_F_SCT_SET_VERSION, 0), "SCT_set_version"}, |
52 | {0, NULL} | 52 | {0, NULL} |
53 | }; | 53 | }; |
54 | 54 | ||
55 | static const ERR_STRING_DATA CT_str_reasons[] = { | 55 | static const ERR_STRING_DATA CT_str_reasons[] = { |
56 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_BASE64_DECODE_ERROR), "base64 decode error"}, | 56 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_BASE64_DECODE_ERROR), "base64 decode error"}, |
57 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_INVALID_LOG_ID_LENGTH), | 57 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_INVALID_LOG_ID_LENGTH), |
58 | "invalid log id length"}, | 58 | "invalid log id length"}, |
59 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_LOG_CONF_INVALID), "log conf invalid"}, | 59 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_LOG_CONF_INVALID), "log conf invalid"}, |
60 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_LOG_CONF_INVALID_KEY), | 60 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_LOG_CONF_INVALID_KEY), |
61 | "log conf invalid key"}, | 61 | "log conf invalid key"}, |
62 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_LOG_CONF_MISSING_DESCRIPTION), | 62 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_LOG_CONF_MISSING_DESCRIPTION), |
63 | "log conf missing description"}, | 63 | "log conf missing description"}, |
64 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_LOG_CONF_MISSING_KEY), | 64 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_LOG_CONF_MISSING_KEY), |
65 | "log conf missing key"}, | 65 | "log conf missing key"}, |
66 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_LOG_KEY_INVALID), "log key invalid"}, | 66 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_LOG_KEY_INVALID), "log key invalid"}, |
67 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_FUTURE_TIMESTAMP), | 67 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_FUTURE_TIMESTAMP), |
68 | "sct future timestamp"}, | 68 | "sct future timestamp"}, |
69 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_INVALID), "sct invalid"}, | 69 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_INVALID), "sct invalid"}, |
70 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_INVALID_SIGNATURE), | 70 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_INVALID_SIGNATURE), |
71 | "sct invalid signature"}, | 71 | "sct invalid signature"}, |
72 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_LIST_INVALID), "sct list invalid"}, | 72 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_LIST_INVALID), "sct list invalid"}, |
73 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_LOG_ID_MISMATCH), "sct log id mismatch"}, | 73 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_LOG_ID_MISMATCH), "sct log id mismatch"}, |
74 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_NOT_SET), "sct not set"}, | 74 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_NOT_SET), "sct not set"}, |
75 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_UNSUPPORTED_VERSION), | 75 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_SCT_UNSUPPORTED_VERSION), |
76 | "sct unsupported version"}, | 76 | "sct unsupported version"}, |
77 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_UNRECOGNIZED_SIGNATURE_NID), | 77 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_UNRECOGNIZED_SIGNATURE_NID), |
78 | "unrecognized signature nid"}, | 78 | "unrecognized signature nid"}, |
79 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_UNSUPPORTED_ENTRY_TYPE), | 79 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_UNSUPPORTED_ENTRY_TYPE), |
80 | "unsupported entry type"}, | 80 | "unsupported entry type"}, |
81 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_UNSUPPORTED_VERSION), "unsupported version"}, | 81 | {ERR_PACK(ERR_LIB_CT, 0, CT_R_UNSUPPORTED_VERSION), "unsupported version"}, |
82 | {0, NULL} | 82 | {0, NULL} |
83 | }; | 83 | }; |
84 | 84 | ||
85 | #endif | 85 | #endif |
@@ -87,10 +87,10 @@ static const ERR_STRING_DATA CT_str_reasons[] = { | |||
87 | int ERR_load_CT_strings(void) | 87 | int ERR_load_CT_strings(void) |
88 | { | 88 | { |
89 | #ifndef OPENSSL_NO_ERR | 89 | #ifndef OPENSSL_NO_ERR |
90 | if (ERR_func_error_string(CT_str_functs[0].error) == NULL) { | 90 | if (ERR_func_error_string(CT_str_functs[0].error) == NULL) { |
91 | ERR_load_strings_const(CT_str_functs); | 91 | ERR_load_strings_const(CT_str_functs); |
92 | ERR_load_strings_const(CT_str_reasons); | 92 | ERR_load_strings_const(CT_str_reasons); |
93 | } | 93 | } |
94 | #endif | 94 | #endif |
95 | return 1; | 95 | return 1; |
96 | } | 96 | } |
diff --git a/src/lib/libcrypto/ct/ct_local.h b/src/lib/libcrypto/ct/ct_local.h index 9f983c91be..75ff4d8f75 100644 --- a/src/lib/libcrypto/ct/ct_local.h +++ b/src/lib/libcrypto/ct/ct_local.h | |||
@@ -18,8 +18,8 @@ | |||
18 | * From RFC6962: opaque SerializedSCT<1..2^16-1>; struct { SerializedSCT | 18 | * From RFC6962: opaque SerializedSCT<1..2^16-1>; struct { SerializedSCT |
19 | * sct_list <1..2^16-1>; } SignedCertificateTimestampList; | 19 | * sct_list <1..2^16-1>; } SignedCertificateTimestampList; |
20 | */ | 20 | */ |
21 | # define MAX_SCT_SIZE 65535 | 21 | #define MAX_SCT_SIZE 65535 |
22 | # define MAX_SCT_LIST_SIZE MAX_SCT_SIZE | 22 | #define MAX_SCT_LIST_SIZE MAX_SCT_SIZE |
23 | 23 | ||
24 | /* | 24 | /* |
25 | * Macros to read and write integers in network-byte order. | 25 | * Macros to read and write integers in network-byte order. |
@@ -55,60 +55,60 @@ | |||
55 | 55 | ||
56 | /* Signed Certificate Timestamp */ | 56 | /* Signed Certificate Timestamp */ |
57 | struct sct_st { | 57 | struct sct_st { |
58 | sct_version_t version; | 58 | sct_version_t version; |
59 | /* If version is not SCT_VERSION_V1, this contains the encoded SCT */ | 59 | /* If version is not SCT_VERSION_V1, this contains the encoded SCT */ |
60 | unsigned char *sct; | 60 | unsigned char *sct; |
61 | size_t sct_len; | 61 | size_t sct_len; |
62 | /* If version is SCT_VERSION_V1, fields below contain components of the SCT */ | 62 | /* If version is SCT_VERSION_V1, fields below contain components of the SCT */ |
63 | unsigned char *log_id; | 63 | unsigned char *log_id; |
64 | size_t log_id_len; | 64 | size_t log_id_len; |
65 | /* | 65 | /* |
66 | * Note, we cannot distinguish between an unset timestamp, and one | 66 | * Note, we cannot distinguish between an unset timestamp, and one |
67 | * that is set to 0. However since CT didn't exist in 1970, no real | 67 | * that is set to 0. However since CT didn't exist in 1970, no real |
68 | * SCT should ever be set as such. | 68 | * SCT should ever be set as such. |
69 | */ | 69 | */ |
70 | uint64_t timestamp; | 70 | uint64_t timestamp; |
71 | unsigned char *ext; | 71 | unsigned char *ext; |
72 | size_t ext_len; | 72 | size_t ext_len; |
73 | unsigned char hash_alg; | 73 | unsigned char hash_alg; |
74 | unsigned char sig_alg; | 74 | unsigned char sig_alg; |
75 | unsigned char *sig; | 75 | unsigned char *sig; |
76 | size_t sig_len; | 76 | size_t sig_len; |
77 | /* Log entry type */ | 77 | /* Log entry type */ |
78 | ct_log_entry_type_t entry_type; | 78 | ct_log_entry_type_t entry_type; |
79 | /* Where this SCT was found, e.g. certificate, OCSP response, etc. */ | 79 | /* Where this SCT was found, e.g. certificate, OCSP response, etc. */ |
80 | sct_source_t source; | 80 | sct_source_t source; |
81 | /* The result of the last attempt to validate this SCT. */ | 81 | /* The result of the last attempt to validate this SCT. */ |
82 | sct_validation_status_t validation_status; | 82 | sct_validation_status_t validation_status; |
83 | }; | 83 | }; |
84 | 84 | ||
85 | /* Miscellaneous data that is useful when verifying an SCT */ | 85 | /* Miscellaneous data that is useful when verifying an SCT */ |
86 | struct sct_ctx_st { | 86 | struct sct_ctx_st { |
87 | /* Public key */ | 87 | /* Public key */ |
88 | EVP_PKEY *pkey; | 88 | EVP_PKEY *pkey; |
89 | /* Hash of public key */ | 89 | /* Hash of public key */ |
90 | unsigned char *pkeyhash; | 90 | unsigned char *pkeyhash; |
91 | size_t pkeyhashlen; | 91 | size_t pkeyhashlen; |
92 | /* For pre-certificate: issuer public key hash */ | 92 | /* For pre-certificate: issuer public key hash */ |
93 | unsigned char *ihash; | 93 | unsigned char *ihash; |
94 | size_t ihashlen; | 94 | size_t ihashlen; |
95 | /* certificate encoding */ | 95 | /* certificate encoding */ |
96 | unsigned char *certder; | 96 | unsigned char *certder; |
97 | size_t certderlen; | 97 | size_t certderlen; |
98 | /* pre-certificate encoding */ | 98 | /* pre-certificate encoding */ |
99 | unsigned char *preder; | 99 | unsigned char *preder; |
100 | size_t prederlen; | 100 | size_t prederlen; |
101 | /* milliseconds since epoch (to check that the SCT isn't from the future) */ | 101 | /* milliseconds since epoch (to check that the SCT isn't from the future) */ |
102 | uint64_t epoch_time_in_ms; | 102 | uint64_t epoch_time_in_ms; |
103 | }; | 103 | }; |
104 | 104 | ||
105 | /* Context when evaluating whether a Certificate Transparency policy is met */ | 105 | /* Context when evaluating whether a Certificate Transparency policy is met */ |
106 | struct ct_policy_eval_ctx_st { | 106 | struct ct_policy_eval_ctx_st { |
107 | X509 *cert; | 107 | X509 *cert; |
108 | X509 *issuer; | 108 | X509 *issuer; |
109 | CTLOG_STORE *log_store; | 109 | CTLOG_STORE *log_store; |
110 | /* milliseconds since epoch (to check that SCTs aren't from the future) */ | 110 | /* milliseconds since epoch (to check that SCTs aren't from the future) */ |
111 | uint64_t epoch_time_in_ms; | 111 | uint64_t epoch_time_in_ms; |
112 | }; | 112 | }; |
113 | 113 | ||
114 | /* | 114 | /* |
diff --git a/src/lib/libcrypto/ct/ct_log.c b/src/lib/libcrypto/ct/ct_log.c index c1bca3e141..ee44de2bfc 100644 --- a/src/lib/libcrypto/ct/ct_log.c +++ b/src/lib/libcrypto/ct/ct_log.c | |||
@@ -22,9 +22,9 @@ | |||
22 | * Information about a CT log server. | 22 | * Information about a CT log server. |
23 | */ | 23 | */ |
24 | struct ctlog_st { | 24 | struct ctlog_st { |
25 | char *name; | 25 | char *name; |
26 | uint8_t log_id[CT_V1_HASHLEN]; | 26 | uint8_t log_id[CT_V1_HASHLEN]; |
27 | EVP_PKEY *public_key; | 27 | EVP_PKEY *public_key; |
28 | }; | 28 | }; |
29 | 29 | ||
30 | /* | 30 | /* |
@@ -32,14 +32,14 @@ struct ctlog_st { | |||
32 | * It takes ownership of any CTLOG instances added to it. | 32 | * It takes ownership of any CTLOG instances added to it. |
33 | */ | 33 | */ |
34 | struct ctlog_store_st { | 34 | struct ctlog_store_st { |
35 | STACK_OF(CTLOG) *logs; | 35 | STACK_OF(CTLOG) *logs; |
36 | }; | 36 | }; |
37 | 37 | ||
38 | /* The context when loading a CT log list from a CONF file. */ | 38 | /* The context when loading a CT log list from a CONF file. */ |
39 | typedef struct ctlog_store_load_ctx_st { | 39 | typedef struct ctlog_store_load_ctx_st { |
40 | CTLOG_STORE *log_store; | 40 | CTLOG_STORE *log_store; |
41 | CONF *conf; | 41 | CONF *conf; |
42 | size_t invalid_log_entries; | 42 | size_t invalid_log_entries; |
43 | } CTLOG_STORE_LOAD_CTX; | 43 | } CTLOG_STORE_LOAD_CTX; |
44 | 44 | ||
45 | /* | 45 | /* |
@@ -54,95 +54,101 @@ static CTLOG_STORE_LOAD_CTX *ctlog_store_load_ctx_new(void); | |||
54 | */ | 54 | */ |
55 | static void ctlog_store_load_ctx_free(CTLOG_STORE_LOAD_CTX* ctx); | 55 | static void ctlog_store_load_ctx_free(CTLOG_STORE_LOAD_CTX* ctx); |
56 | 56 | ||
57 | static CTLOG_STORE_LOAD_CTX *ctlog_store_load_ctx_new(void) | 57 | static CTLOG_STORE_LOAD_CTX * |
58 | ctlog_store_load_ctx_new(void) | ||
58 | { | 59 | { |
59 | CTLOG_STORE_LOAD_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx)); | 60 | CTLOG_STORE_LOAD_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx)); |
60 | 61 | ||
61 | if (ctx == NULL) | 62 | if (ctx == NULL) |
62 | CTerr(CT_F_CTLOG_STORE_LOAD_CTX_NEW, ERR_R_MALLOC_FAILURE); | 63 | CTerr(CT_F_CTLOG_STORE_LOAD_CTX_NEW, ERR_R_MALLOC_FAILURE); |
63 | 64 | ||
64 | return ctx; | 65 | return ctx; |
65 | } | 66 | } |
66 | 67 | ||
67 | static void ctlog_store_load_ctx_free(CTLOG_STORE_LOAD_CTX* ctx) | 68 | static void |
69 | ctlog_store_load_ctx_free(CTLOG_STORE_LOAD_CTX* ctx) | ||
68 | { | 70 | { |
69 | OPENSSL_free(ctx); | 71 | OPENSSL_free(ctx); |
70 | } | 72 | } |
71 | 73 | ||
72 | /* Converts a log's public key into a SHA256 log ID */ | 74 | /* Converts a log's public key into a SHA256 log ID */ |
73 | static int ct_v1_log_id_from_pkey(EVP_PKEY *pkey, | 75 | static int |
74 | unsigned char log_id[CT_V1_HASHLEN]) | 76 | ct_v1_log_id_from_pkey(EVP_PKEY *pkey, unsigned char log_id[CT_V1_HASHLEN]) |
75 | { | 77 | { |
76 | int ret = 0; | 78 | int ret = 0; |
77 | unsigned char *pkey_der = NULL; | 79 | unsigned char *pkey_der = NULL; |
78 | int pkey_der_len = i2d_PUBKEY(pkey, &pkey_der); | 80 | int pkey_der_len = i2d_PUBKEY(pkey, &pkey_der); |
79 | 81 | ||
80 | if (pkey_der_len <= 0) { | 82 | if (pkey_der_len <= 0) { |
81 | CTerr(CT_F_CT_V1_LOG_ID_FROM_PKEY, CT_R_LOG_KEY_INVALID); | 83 | CTerr(CT_F_CT_V1_LOG_ID_FROM_PKEY, CT_R_LOG_KEY_INVALID); |
82 | goto err; | 84 | goto err; |
83 | } | 85 | } |
84 | 86 | ||
85 | SHA256(pkey_der, pkey_der_len, log_id); | 87 | SHA256(pkey_der, pkey_der_len, log_id); |
86 | ret = 1; | 88 | ret = 1; |
87 | err: | 89 | err: |
88 | OPENSSL_free(pkey_der); | 90 | OPENSSL_free(pkey_der); |
89 | return ret; | 91 | return ret; |
90 | } | 92 | } |
91 | 93 | ||
92 | CTLOG_STORE *CTLOG_STORE_new(void) | 94 | CTLOG_STORE * |
95 | CTLOG_STORE_new(void) | ||
93 | { | 96 | { |
94 | CTLOG_STORE *ret = OPENSSL_zalloc(sizeof(*ret)); | 97 | CTLOG_STORE *ret = OPENSSL_zalloc(sizeof(*ret)); |
95 | 98 | ||
96 | if (ret == NULL) { | 99 | if (ret == NULL) { |
97 | CTerr(CT_F_CTLOG_STORE_NEW, ERR_R_MALLOC_FAILURE); | 100 | CTerr(CT_F_CTLOG_STORE_NEW, ERR_R_MALLOC_FAILURE); |
98 | return NULL; | 101 | return NULL; |
99 | } | 102 | } |
100 | 103 | ||
101 | ret->logs = sk_CTLOG_new_null(); | 104 | ret->logs = sk_CTLOG_new_null(); |
102 | if (ret->logs == NULL) | 105 | if (ret->logs == NULL) |
103 | goto err; | 106 | goto err; |
104 | 107 | ||
105 | return ret; | 108 | return ret; |
106 | err: | 109 | err: |
107 | OPENSSL_free(ret); | 110 | OPENSSL_free(ret); |
108 | return NULL; | 111 | return NULL; |
109 | } | 112 | } |
110 | 113 | ||
111 | void CTLOG_STORE_free(CTLOG_STORE *store) | 114 | void |
115 | CTLOG_STORE_free(CTLOG_STORE *store) | ||
112 | { | 116 | { |
113 | if (store != NULL) { | 117 | if (store != NULL) { |
114 | sk_CTLOG_pop_free(store->logs, CTLOG_free); | 118 | sk_CTLOG_pop_free(store->logs, CTLOG_free); |
115 | OPENSSL_free(store); | 119 | OPENSSL_free(store); |
116 | } | 120 | } |
117 | } | 121 | } |
118 | 122 | ||
119 | static int ctlog_new_from_conf(CTLOG **ct_log, const CONF *conf, const char *section) | 123 | static int |
124 | ctlog_new_from_conf(CTLOG **ct_log, const CONF *conf, const char *section) | ||
120 | { | 125 | { |
121 | const char *description = NCONF_get_string(conf, section, "description"); | 126 | const char *description = NCONF_get_string(conf, section, "description"); |
122 | char *pkey_base64; | 127 | char *pkey_base64; |
123 | 128 | ||
124 | if (description == NULL) { | 129 | if (description == NULL) { |
125 | CTerr(CT_F_CTLOG_NEW_FROM_CONF, CT_R_LOG_CONF_MISSING_DESCRIPTION); | 130 | CTerr(CT_F_CTLOG_NEW_FROM_CONF, CT_R_LOG_CONF_MISSING_DESCRIPTION); |
126 | return 0; | 131 | return 0; |
127 | } | 132 | } |
128 | 133 | ||
129 | pkey_base64 = NCONF_get_string(conf, section, "key"); | 134 | pkey_base64 = NCONF_get_string(conf, section, "key"); |
130 | if (pkey_base64 == NULL) { | 135 | if (pkey_base64 == NULL) { |
131 | CTerr(CT_F_CTLOG_NEW_FROM_CONF, CT_R_LOG_CONF_MISSING_KEY); | 136 | CTerr(CT_F_CTLOG_NEW_FROM_CONF, CT_R_LOG_CONF_MISSING_KEY); |
132 | return 0; | 137 | return 0; |
133 | } | 138 | } |
134 | 139 | ||
135 | return CTLOG_new_from_base64(ct_log, pkey_base64, description); | 140 | return CTLOG_new_from_base64(ct_log, pkey_base64, description); |
136 | } | 141 | } |
137 | 142 | ||
138 | int CTLOG_STORE_load_default_file(CTLOG_STORE *store) | 143 | int |
144 | CTLOG_STORE_load_default_file(CTLOG_STORE *store) | ||
139 | { | 145 | { |
140 | const char *fpath = ossl_safe_getenv(CTLOG_FILE_EVP); | 146 | const char *fpath = ossl_safe_getenv(CTLOG_FILE_EVP); |
141 | 147 | ||
142 | if (fpath == NULL) | 148 | if (fpath == NULL) |
143 | fpath = CTLOG_FILE; | 149 | fpath = CTLOG_FILE; |
144 | 150 | ||
145 | return CTLOG_STORE_load_file(store, fpath); | 151 | return CTLOG_STORE_load_file(store, fpath); |
146 | } | 152 | } |
147 | 153 | ||
148 | /* | 154 | /* |
@@ -151,82 +157,83 @@ int CTLOG_STORE_load_default_file(CTLOG_STORE *store) | |||
151 | * the following log entries. | 157 | * the following log entries. |
152 | * It may stop parsing and returns -1 on any internal (malloc) error. | 158 | * It may stop parsing and returns -1 on any internal (malloc) error. |
153 | */ | 159 | */ |
154 | static int ctlog_store_load_log(const char *log_name, int log_name_len, | 160 | static int |
155 | void *arg) | 161 | ctlog_store_load_log(const char *log_name, int log_name_len, void *arg) |
156 | { | 162 | { |
157 | CTLOG_STORE_LOAD_CTX *load_ctx = arg; | 163 | CTLOG_STORE_LOAD_CTX *load_ctx = arg; |
158 | CTLOG *ct_log = NULL; | 164 | CTLOG *ct_log = NULL; |
159 | /* log_name may not be null-terminated, so fix that before using it */ | 165 | /* log_name may not be null-terminated, so fix that before using it */ |
160 | char *tmp; | 166 | char *tmp; |
161 | int ret = 0; | 167 | int ret = 0; |
162 | 168 | ||
163 | /* log_name will be NULL for empty list entries */ | 169 | /* log_name will be NULL for empty list entries */ |
164 | if (log_name == NULL) | 170 | if (log_name == NULL) |
165 | return 1; | 171 | return 1; |
166 | 172 | ||
167 | tmp = OPENSSL_strndup(log_name, log_name_len); | 173 | tmp = OPENSSL_strndup(log_name, log_name_len); |
168 | if (tmp == NULL) | 174 | if (tmp == NULL) |
169 | goto mem_err; | 175 | goto mem_err; |
170 | 176 | ||
171 | ret = ctlog_new_from_conf(&ct_log, load_ctx->conf, tmp); | 177 | ret = ctlog_new_from_conf(&ct_log, load_ctx->conf, tmp); |
172 | OPENSSL_free(tmp); | 178 | OPENSSL_free(tmp); |
173 | 179 | ||
174 | if (ret < 0) { | 180 | if (ret < 0) { |
175 | /* Propagate any internal error */ | 181 | /* Propagate any internal error */ |
176 | return ret; | 182 | return ret; |
177 | } | 183 | } |
178 | if (ret == 0) { | 184 | if (ret == 0) { |
179 | /* If we can't load this log, record that fact and skip it */ | 185 | /* If we can't load this log, record that fact and skip it */ |
180 | ++load_ctx->invalid_log_entries; | 186 | ++load_ctx->invalid_log_entries; |
181 | return 1; | 187 | return 1; |
182 | } | 188 | } |
183 | 189 | ||
184 | if (!sk_CTLOG_push(load_ctx->log_store->logs, ct_log)) { | 190 | if (!sk_CTLOG_push(load_ctx->log_store->logs, ct_log)) { |
185 | goto mem_err; | 191 | goto mem_err; |
186 | } | 192 | } |
187 | return 1; | 193 | return 1; |
188 | 194 | ||
189 | mem_err: | 195 | mem_err: |
190 | CTLOG_free(ct_log); | 196 | CTLOG_free(ct_log); |
191 | CTerr(CT_F_CTLOG_STORE_LOAD_LOG, ERR_R_MALLOC_FAILURE); | 197 | CTerr(CT_F_CTLOG_STORE_LOAD_LOG, ERR_R_MALLOC_FAILURE); |
192 | return -1; | 198 | return -1; |
193 | } | 199 | } |
194 | 200 | ||
195 | int CTLOG_STORE_load_file(CTLOG_STORE *store, const char *file) | 201 | int |
202 | CTLOG_STORE_load_file(CTLOG_STORE *store, const char *file) | ||
196 | { | 203 | { |
197 | int ret = 0; | 204 | int ret = 0; |
198 | char *enabled_logs; | 205 | char *enabled_logs; |
199 | CTLOG_STORE_LOAD_CTX* load_ctx = ctlog_store_load_ctx_new(); | 206 | CTLOG_STORE_LOAD_CTX* load_ctx = ctlog_store_load_ctx_new(); |
200 | 207 | ||
201 | if (load_ctx == NULL) | 208 | if (load_ctx == NULL) |
202 | return 0; | 209 | return 0; |
203 | load_ctx->log_store = store; | 210 | load_ctx->log_store = store; |
204 | load_ctx->conf = NCONF_new(NULL); | 211 | load_ctx->conf = NCONF_new(NULL); |
205 | if (load_ctx->conf == NULL) | 212 | if (load_ctx->conf == NULL) |
206 | goto end; | 213 | goto end; |
207 | 214 | ||
208 | if (NCONF_load(load_ctx->conf, file, NULL) <= 0) { | 215 | if (NCONF_load(load_ctx->conf, file, NULL) <= 0) { |
209 | CTerr(CT_F_CTLOG_STORE_LOAD_FILE, CT_R_LOG_CONF_INVALID); | 216 | CTerr(CT_F_CTLOG_STORE_LOAD_FILE, CT_R_LOG_CONF_INVALID); |
210 | goto end; | 217 | goto end; |
211 | } | 218 | } |
212 | 219 | ||
213 | enabled_logs = NCONF_get_string(load_ctx->conf, NULL, "enabled_logs"); | 220 | enabled_logs = NCONF_get_string(load_ctx->conf, NULL, "enabled_logs"); |
214 | if (enabled_logs == NULL) { | 221 | if (enabled_logs == NULL) { |
215 | CTerr(CT_F_CTLOG_STORE_LOAD_FILE, CT_R_LOG_CONF_INVALID); | 222 | CTerr(CT_F_CTLOG_STORE_LOAD_FILE, CT_R_LOG_CONF_INVALID); |
216 | goto end; | 223 | goto end; |
217 | } | 224 | } |
218 | 225 | ||
219 | if (!CONF_parse_list(enabled_logs, ',', 1, ctlog_store_load_log, load_ctx) || | 226 | if (!CONF_parse_list(enabled_logs, ',', 1, ctlog_store_load_log, load_ctx) || |
220 | load_ctx->invalid_log_entries > 0) { | 227 | load_ctx->invalid_log_entries > 0) { |
221 | CTerr(CT_F_CTLOG_STORE_LOAD_FILE, CT_R_LOG_CONF_INVALID); | 228 | CTerr(CT_F_CTLOG_STORE_LOAD_FILE, CT_R_LOG_CONF_INVALID); |
222 | goto end; | 229 | goto end; |
223 | } | 230 | } |
224 | 231 | ||
225 | ret = 1; | 232 | ret = 1; |
226 | end: | 233 | end: |
227 | NCONF_free(load_ctx->conf); | 234 | NCONF_free(load_ctx->conf); |
228 | ctlog_store_load_ctx_free(load_ctx); | 235 | ctlog_store_load_ctx_free(load_ctx); |
229 | return ret; | 236 | return ret; |
230 | } | 237 | } |
231 | 238 | ||
232 | /* | 239 | /* |
@@ -234,73 +241,77 @@ end: | |||
234 | * Takes ownership of the public key. | 241 | * Takes ownership of the public key. |
235 | * Copies the name. | 242 | * Copies the name. |
236 | */ | 243 | */ |
237 | CTLOG *CTLOG_new(EVP_PKEY *public_key, const char *name) | 244 | CTLOG * |
245 | CTLOG_new(EVP_PKEY *public_key, const char *name) | ||
238 | { | 246 | { |
239 | CTLOG *ret = OPENSSL_zalloc(sizeof(*ret)); | 247 | CTLOG *ret = OPENSSL_zalloc(sizeof(*ret)); |
240 | 248 | ||
241 | if (ret == NULL) { | 249 | if (ret == NULL) { |
242 | CTerr(CT_F_CTLOG_NEW, ERR_R_MALLOC_FAILURE); | 250 | CTerr(CT_F_CTLOG_NEW, ERR_R_MALLOC_FAILURE); |
243 | return NULL; | 251 | return NULL; |
244 | } | 252 | } |
245 | 253 | ||
246 | ret->name = OPENSSL_strdup(name); | 254 | ret->name = OPENSSL_strdup(name); |
247 | if (ret->name == NULL) { | 255 | if (ret->name == NULL) { |
248 | CTerr(CT_F_CTLOG_NEW, ERR_R_MALLOC_FAILURE); | 256 | CTerr(CT_F_CTLOG_NEW, ERR_R_MALLOC_FAILURE); |
249 | goto err; | 257 | goto err; |
250 | } | 258 | } |
251 | 259 | ||
252 | if (ct_v1_log_id_from_pkey(public_key, ret->log_id) != 1) | 260 | if (ct_v1_log_id_from_pkey(public_key, ret->log_id) != 1) |
253 | goto err; | 261 | goto err; |
254 | 262 | ||
255 | ret->public_key = public_key; | 263 | ret->public_key = public_key; |
256 | return ret; | 264 | return ret; |
257 | err: | 265 | err: |
258 | CTLOG_free(ret); | 266 | CTLOG_free(ret); |
259 | return NULL; | 267 | return NULL; |
260 | } | 268 | } |
261 | 269 | ||
262 | /* Frees CT log and associated structures */ | 270 | /* Frees CT log and associated structures */ |
263 | void CTLOG_free(CTLOG *log) | 271 | void |
272 | CTLOG_free(CTLOG *log) | ||
264 | { | 273 | { |
265 | if (log != NULL) { | 274 | if (log != NULL) { |
266 | OPENSSL_free(log->name); | 275 | OPENSSL_free(log->name); |
267 | EVP_PKEY_free(log->public_key); | 276 | EVP_PKEY_free(log->public_key); |
268 | OPENSSL_free(log); | 277 | OPENSSL_free(log); |
269 | } | 278 | } |
270 | } | 279 | } |
271 | 280 | ||
272 | const char *CTLOG_get0_name(const CTLOG *log) | 281 | const char * |
282 | CTLOG_get0_name(const CTLOG *log) | ||
273 | { | 283 | { |
274 | return log->name; | 284 | return log->name; |
275 | } | 285 | } |
276 | 286 | ||
277 | void CTLOG_get0_log_id(const CTLOG *log, const uint8_t **log_id, | 287 | void |
278 | size_t *log_id_len) | 288 | CTLOG_get0_log_id(const CTLOG *log, const uint8_t **log_id, size_t *log_id_len) |
279 | { | 289 | { |
280 | *log_id = log->log_id; | 290 | *log_id = log->log_id; |
281 | *log_id_len = CT_V1_HASHLEN; | 291 | *log_id_len = CT_V1_HASHLEN; |
282 | } | 292 | } |
283 | 293 | ||
284 | EVP_PKEY *CTLOG_get0_public_key(const CTLOG *log) | 294 | EVP_PKEY * |
295 | CTLOG_get0_public_key(const CTLOG *log) | ||
285 | { | 296 | { |
286 | return log->public_key; | 297 | return log->public_key; |
287 | } | 298 | } |
288 | 299 | ||
289 | /* | 300 | /* |
290 | * Given a log ID, finds the matching log. | 301 | * Given a log ID, finds the matching log. |
291 | * Returns NULL if no match found. | 302 | * Returns NULL if no match found. |
292 | */ | 303 | */ |
293 | const CTLOG *CTLOG_STORE_get0_log_by_id(const CTLOG_STORE *store, | 304 | const CTLOG |
294 | const uint8_t *log_id, | 305 | *CTLOG_STORE_get0_log_by_id(const CTLOG_STORE *store, const uint8_t *log_id, |
295 | size_t log_id_len) | 306 | size_t log_id_len) |
296 | { | 307 | { |
297 | int i; | 308 | int i; |
298 | 309 | ||
299 | for (i = 0; i < sk_CTLOG_num(store->logs); ++i) { | 310 | for (i = 0; i < sk_CTLOG_num(store->logs); ++i) { |
300 | const CTLOG *log = sk_CTLOG_value(store->logs, i); | 311 | const CTLOG *log = sk_CTLOG_value(store->logs, i); |
301 | if (memcmp(log->log_id, log_id, log_id_len) == 0) | 312 | if (memcmp(log->log_id, log_id, log_id_len) == 0) |
302 | return log; | 313 | return log; |
303 | } | 314 | } |
304 | 315 | ||
305 | return NULL; | 316 | return NULL; |
306 | } | 317 | } |
diff --git a/src/lib/libcrypto/ct/ct_oct.c b/src/lib/libcrypto/ct/ct_oct.c index d4b6645af4..7a45bdb5bf 100644 --- a/src/lib/libcrypto/ct/ct_oct.c +++ b/src/lib/libcrypto/ct/ct_oct.c | |||
@@ -21,387 +21,392 @@ | |||
21 | 21 | ||
22 | #include "ct_local.h" | 22 | #include "ct_local.h" |
23 | 23 | ||
24 | int o2i_SCT_signature(SCT *sct, const unsigned char **in, size_t len) | 24 | int |
25 | o2i_SCT_signature(SCT *sct, const unsigned char **in, size_t len) | ||
25 | { | 26 | { |
26 | size_t siglen; | 27 | size_t siglen; |
27 | size_t len_remaining = len; | 28 | size_t len_remaining = len; |
28 | const unsigned char *p; | 29 | const unsigned char *p; |
29 | 30 | ||
30 | if (sct->version != SCT_VERSION_V1) { | 31 | if (sct->version != SCT_VERSION_V1) { |
31 | CTerr(CT_F_O2I_SCT_SIGNATURE, CT_R_UNSUPPORTED_VERSION); | 32 | CTerr(CT_F_O2I_SCT_SIGNATURE, CT_R_UNSUPPORTED_VERSION); |
32 | return -1; | 33 | return -1; |
33 | } | 34 | } |
34 | /* | 35 | /* |
35 | * digitally-signed struct header: (1 byte) Hash algorithm (1 byte) | 36 | * digitally-signed struct header: (1 byte) Hash algorithm (1 byte) |
36 | * Signature algorithm (2 bytes + ?) Signature | 37 | * Signature algorithm (2 bytes + ?) Signature |
37 | * | 38 | * |
38 | * This explicitly rejects empty signatures: they're invalid for | 39 | * This explicitly rejects empty signatures: they're invalid for |
39 | * all supported algorithms. | 40 | * all supported algorithms. |
40 | */ | 41 | */ |
41 | if (len <= 4) { | 42 | if (len <= 4) { |
42 | CTerr(CT_F_O2I_SCT_SIGNATURE, CT_R_SCT_INVALID_SIGNATURE); | 43 | CTerr(CT_F_O2I_SCT_SIGNATURE, CT_R_SCT_INVALID_SIGNATURE); |
43 | return -1; | 44 | return -1; |
44 | } | 45 | } |
45 | 46 | ||
46 | p = *in; | 47 | p = *in; |
47 | /* Get hash and signature algorithm */ | 48 | /* Get hash and signature algorithm */ |
48 | sct->hash_alg = *p++; | 49 | sct->hash_alg = *p++; |
49 | sct->sig_alg = *p++; | 50 | sct->sig_alg = *p++; |
50 | if (SCT_get_signature_nid(sct) == NID_undef) { | 51 | if (SCT_get_signature_nid(sct) == NID_undef) { |
51 | CTerr(CT_F_O2I_SCT_SIGNATURE, CT_R_SCT_INVALID_SIGNATURE); | 52 | CTerr(CT_F_O2I_SCT_SIGNATURE, CT_R_SCT_INVALID_SIGNATURE); |
52 | return -1; | 53 | return -1; |
53 | } | 54 | } |
54 | /* Retrieve signature and check it is consistent with the buffer length */ | 55 | /* Retrieve signature and check it is consistent with the buffer length */ |
55 | n2s(p, siglen); | 56 | n2s(p, siglen); |
56 | len_remaining -= (p - *in); | 57 | len_remaining -= (p - *in); |
57 | if (siglen > len_remaining) { | 58 | if (siglen > len_remaining) { |
58 | CTerr(CT_F_O2I_SCT_SIGNATURE, CT_R_SCT_INVALID_SIGNATURE); | 59 | CTerr(CT_F_O2I_SCT_SIGNATURE, CT_R_SCT_INVALID_SIGNATURE); |
59 | return -1; | 60 | return -1; |
60 | } | 61 | } |
61 | 62 | ||
62 | if (SCT_set1_signature(sct, p, siglen) != 1) | 63 | if (SCT_set1_signature(sct, p, siglen) != 1) |
63 | return -1; | 64 | return -1; |
64 | len_remaining -= siglen; | 65 | len_remaining -= siglen; |
65 | *in = p + siglen; | 66 | *in = p + siglen; |
66 | 67 | ||
67 | return len - len_remaining; | 68 | return len - len_remaining; |
68 | } | 69 | } |
69 | 70 | ||
70 | SCT *o2i_SCT(SCT **psct, const unsigned char **in, size_t len) | 71 | SCT *o2i_SCT(SCT **psct, const unsigned char **in, size_t len) |
71 | { | 72 | { |
72 | SCT *sct = NULL; | 73 | SCT *sct = NULL; |
73 | const unsigned char *p; | 74 | const unsigned char *p; |
74 | 75 | ||
75 | if (len == 0 || len > MAX_SCT_SIZE) { | 76 | if (len == 0 || len > MAX_SCT_SIZE) { |
76 | CTerr(CT_F_O2I_SCT, CT_R_SCT_INVALID); | 77 | CTerr(CT_F_O2I_SCT, CT_R_SCT_INVALID); |
77 | goto err; | 78 | goto err; |
78 | } | 79 | } |
79 | 80 | ||
80 | if ((sct = SCT_new()) == NULL) | 81 | if ((sct = SCT_new()) == NULL) |
81 | goto err; | 82 | goto err; |
82 | 83 | ||
83 | p = *in; | 84 | p = *in; |
84 | 85 | ||
85 | sct->version = *p; | 86 | sct->version = *p; |
86 | if (sct->version == SCT_VERSION_V1) { | 87 | if (sct->version == SCT_VERSION_V1) { |
87 | int sig_len; | 88 | int sig_len; |
88 | size_t len2; | 89 | size_t len2; |
89 | /*- | 90 | /*- |
90 | * Fixed-length header: | 91 | * Fixed-length header: |
91 | * struct { | 92 | * struct { |
92 | * Version sct_version; (1 byte) | 93 | * Version sct_version; (1 byte) |
93 | * log_id id; (32 bytes) | 94 | * log_id id; (32 bytes) |
94 | * uint64 timestamp; (8 bytes) | 95 | * uint64 timestamp; (8 bytes) |
95 | * CtExtensions extensions; (2 bytes + ?) | 96 | * CtExtensions extensions; (2 bytes + ?) |
96 | * } | 97 | * } |
97 | */ | 98 | */ |
98 | if (len < 43) { | 99 | if (len < 43) { |
99 | CTerr(CT_F_O2I_SCT, CT_R_SCT_INVALID); | 100 | CTerr(CT_F_O2I_SCT, CT_R_SCT_INVALID); |
100 | goto err; | 101 | goto err; |
101 | } | 102 | } |
102 | len -= 43; | 103 | len -= 43; |
103 | p++; | 104 | p++; |
104 | sct->log_id = BUF_memdup(p, CT_V1_HASHLEN); | 105 | sct->log_id = BUF_memdup(p, CT_V1_HASHLEN); |
105 | if (sct->log_id == NULL) | 106 | if (sct->log_id == NULL) |
106 | goto err; | 107 | goto err; |
107 | sct->log_id_len = CT_V1_HASHLEN; | 108 | sct->log_id_len = CT_V1_HASHLEN; |
108 | p += CT_V1_HASHLEN; | 109 | p += CT_V1_HASHLEN; |
109 | 110 | ||
110 | n2l8(p, sct->timestamp); | 111 | n2l8(p, sct->timestamp); |
111 | 112 | ||
112 | n2s(p, len2); | 113 | n2s(p, len2); |
113 | if (len < len2) { | 114 | if (len < len2) { |
114 | CTerr(CT_F_O2I_SCT, CT_R_SCT_INVALID); | 115 | CTerr(CT_F_O2I_SCT, CT_R_SCT_INVALID); |
115 | goto err; | 116 | goto err; |
116 | } | 117 | } |
117 | if (len2 > 0) { | 118 | if (len2 > 0) { |
118 | sct->ext = BUF_memdup(p, len2); | 119 | sct->ext = BUF_memdup(p, len2); |
119 | if (sct->ext == NULL) | 120 | if (sct->ext == NULL) |
120 | goto err; | 121 | goto err; |
121 | } | 122 | } |
122 | sct->ext_len = len2; | 123 | sct->ext_len = len2; |
123 | p += len2; | 124 | p += len2; |
124 | len -= len2; | 125 | len -= len2; |
125 | 126 | ||
126 | sig_len = o2i_SCT_signature(sct, &p, len); | 127 | sig_len = o2i_SCT_signature(sct, &p, len); |
127 | if (sig_len <= 0) { | 128 | if (sig_len <= 0) { |
128 | CTerr(CT_F_O2I_SCT, CT_R_SCT_INVALID); | 129 | CTerr(CT_F_O2I_SCT, CT_R_SCT_INVALID); |
129 | goto err; | 130 | goto err; |
130 | } | 131 | } |
131 | len -= sig_len; | 132 | len -= sig_len; |
132 | *in = p + len; | 133 | *in = p + len; |
133 | } else { | 134 | } else { |
134 | /* If not V1 just cache encoding */ | 135 | /* If not V1 just cache encoding */ |
135 | sct->sct = BUF_memdup(p, len); | 136 | sct->sct = BUF_memdup(p, len); |
136 | if (sct->sct == NULL) | 137 | if (sct->sct == NULL) |
137 | goto err; | 138 | goto err; |
138 | sct->sct_len = len; | 139 | sct->sct_len = len; |
139 | *in = p + len; | 140 | *in = p + len; |
140 | } | 141 | } |
141 | 142 | ||
142 | if (psct != NULL) { | 143 | if (psct != NULL) { |
143 | SCT_free(*psct); | 144 | SCT_free(*psct); |
144 | *psct = sct; | 145 | *psct = sct; |
145 | } | 146 | } |
146 | 147 | ||
147 | return sct; | 148 | return sct; |
148 | err: | 149 | err: |
149 | SCT_free(sct); | 150 | SCT_free(sct); |
150 | return NULL; | 151 | return NULL; |
151 | } | 152 | } |
152 | 153 | ||
153 | int i2o_SCT_signature(const SCT *sct, unsigned char **out) | 154 | int |
155 | i2o_SCT_signature(const SCT *sct, unsigned char **out) | ||
154 | { | 156 | { |
155 | size_t len; | 157 | size_t len; |
156 | unsigned char *p = NULL, *pstart = NULL; | 158 | unsigned char *p = NULL, *pstart = NULL; |
157 | 159 | ||
158 | if (!SCT_signature_is_complete(sct)) { | 160 | if (!SCT_signature_is_complete(sct)) { |
159 | CTerr(CT_F_I2O_SCT_SIGNATURE, CT_R_SCT_INVALID_SIGNATURE); | 161 | CTerr(CT_F_I2O_SCT_SIGNATURE, CT_R_SCT_INVALID_SIGNATURE); |
160 | goto err; | 162 | goto err; |
161 | } | 163 | } |
162 | 164 | ||
163 | if (sct->version != SCT_VERSION_V1) { | 165 | if (sct->version != SCT_VERSION_V1) { |
164 | CTerr(CT_F_I2O_SCT_SIGNATURE, CT_R_UNSUPPORTED_VERSION); | 166 | CTerr(CT_F_I2O_SCT_SIGNATURE, CT_R_UNSUPPORTED_VERSION); |
165 | goto err; | 167 | goto err; |
166 | } | 168 | } |
167 | 169 | ||
168 | /* | 170 | /* |
169 | * (1 byte) Hash algorithm | 171 | * (1 byte) Hash algorithm |
170 | * (1 byte) Signature algorithm | 172 | * (1 byte) Signature algorithm |
171 | * (2 bytes + ?) Signature | 173 | * (2 bytes + ?) Signature |
172 | */ | 174 | */ |
173 | len = 4 + sct->sig_len; | 175 | len = 4 + sct->sig_len; |
174 | 176 | ||
175 | if (out != NULL) { | 177 | if (out != NULL) { |
176 | if (*out != NULL) { | 178 | if (*out != NULL) { |
177 | p = *out; | 179 | p = *out; |
178 | *out += len; | 180 | *out += len; |
179 | } else { | 181 | } else { |
180 | pstart = p = OPENSSL_malloc(len); | 182 | pstart = p = OPENSSL_malloc(len); |
181 | if (p == NULL) { | 183 | if (p == NULL) { |
182 | CTerr(CT_F_I2O_SCT_SIGNATURE, ERR_R_MALLOC_FAILURE); | 184 | CTerr(CT_F_I2O_SCT_SIGNATURE, ERR_R_MALLOC_FAILURE); |
183 | goto err; | 185 | goto err; |
184 | } | 186 | } |
185 | *out = p; | 187 | *out = p; |
186 | } | 188 | } |
187 | 189 | ||
188 | *p++ = sct->hash_alg; | 190 | *p++ = sct->hash_alg; |
189 | *p++ = sct->sig_alg; | 191 | *p++ = sct->sig_alg; |
190 | s2n(sct->sig_len, p); | 192 | s2n(sct->sig_len, p); |
191 | memcpy(p, sct->sig, sct->sig_len); | 193 | memcpy(p, sct->sig, sct->sig_len); |
192 | } | 194 | } |
193 | 195 | ||
194 | return len; | 196 | return len; |
195 | err: | 197 | err: |
196 | OPENSSL_free(pstart); | 198 | OPENSSL_free(pstart); |
197 | return -1; | 199 | return -1; |
198 | } | 200 | } |
199 | 201 | ||
200 | int i2o_SCT(const SCT *sct, unsigned char **out) | 202 | int |
203 | i2o_SCT(const SCT *sct, unsigned char **out) | ||
201 | { | 204 | { |
202 | size_t len; | 205 | size_t len; |
203 | unsigned char *p = NULL, *pstart = NULL; | 206 | unsigned char *p = NULL, *pstart = NULL; |
204 | 207 | ||
205 | if (!SCT_is_complete(sct)) { | 208 | if (!SCT_is_complete(sct)) { |
206 | CTerr(CT_F_I2O_SCT, CT_R_SCT_NOT_SET); | 209 | CTerr(CT_F_I2O_SCT, CT_R_SCT_NOT_SET); |
207 | goto err; | 210 | goto err; |
208 | } | 211 | } |
209 | /* | 212 | /* |
210 | * Fixed-length header: struct { (1 byte) Version sct_version; (32 bytes) | 213 | * Fixed-length header: struct { (1 byte) Version sct_version; (32 bytes) |
211 | * log_id id; (8 bytes) uint64 timestamp; (2 bytes + ?) CtExtensions | 214 | * log_id id; (8 bytes) uint64 timestamp; (2 bytes + ?) CtExtensions |
212 | * extensions; (1 byte) Hash algorithm (1 byte) Signature algorithm (2 | 215 | * extensions; (1 byte) Hash algorithm (1 byte) Signature algorithm (2 |
213 | * bytes + ?) Signature | 216 | * bytes + ?) Signature |
214 | */ | 217 | */ |
215 | if (sct->version == SCT_VERSION_V1) | 218 | if (sct->version == SCT_VERSION_V1) |
216 | len = 43 + sct->ext_len + 4 + sct->sig_len; | 219 | len = 43 + sct->ext_len + 4 + sct->sig_len; |
217 | else | 220 | else |
218 | len = sct->sct_len; | 221 | len = sct->sct_len; |
219 | 222 | ||
220 | if (out == NULL) | 223 | if (out == NULL) |
221 | return len; | 224 | return len; |
222 | 225 | ||
223 | if (*out != NULL) { | 226 | if (*out != NULL) { |
224 | p = *out; | 227 | p = *out; |
225 | *out += len; | 228 | *out += len; |
226 | } else { | 229 | } else { |
227 | pstart = p = OPENSSL_malloc(len); | 230 | pstart = p = OPENSSL_malloc(len); |
228 | if (p == NULL) { | 231 | if (p == NULL) { |
229 | CTerr(CT_F_I2O_SCT, ERR_R_MALLOC_FAILURE); | 232 | CTerr(CT_F_I2O_SCT, ERR_R_MALLOC_FAILURE); |
230 | goto err; | 233 | goto err; |
231 | } | 234 | } |
232 | *out = p; | 235 | *out = p; |
233 | } | 236 | } |
234 | 237 | ||
235 | if (sct->version == SCT_VERSION_V1) { | 238 | if (sct->version == SCT_VERSION_V1) { |
236 | *p++ = sct->version; | 239 | *p++ = sct->version; |
237 | memcpy(p, sct->log_id, CT_V1_HASHLEN); | 240 | memcpy(p, sct->log_id, CT_V1_HASHLEN); |
238 | p += CT_V1_HASHLEN; | 241 | p += CT_V1_HASHLEN; |
239 | l2n8(sct->timestamp, p); | 242 | l2n8(sct->timestamp, p); |
240 | s2n(sct->ext_len, p); | 243 | s2n(sct->ext_len, p); |
241 | if (sct->ext_len > 0) { | 244 | if (sct->ext_len > 0) { |
242 | memcpy(p, sct->ext, sct->ext_len); | 245 | memcpy(p, sct->ext, sct->ext_len); |
243 | p += sct->ext_len; | 246 | p += sct->ext_len; |
244 | } | 247 | } |
245 | if (i2o_SCT_signature(sct, &p) <= 0) | 248 | if (i2o_SCT_signature(sct, &p) <= 0) |
246 | goto err; | 249 | goto err; |
247 | } else { | 250 | } else { |
248 | memcpy(p, sct->sct, len); | 251 | memcpy(p, sct->sct, len); |
249 | } | 252 | } |
250 | 253 | ||
251 | return len; | 254 | return len; |
252 | err: | 255 | err: |
253 | OPENSSL_free(pstart); | 256 | OPENSSL_free(pstart); |
254 | return -1; | 257 | return -1; |
255 | } | 258 | } |
256 | 259 | ||
257 | STACK_OF(SCT) *o2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, | 260 | STACK_OF(SCT) * |
258 | size_t len) | 261 | o2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, size_t len) |
259 | { | 262 | { |
260 | STACK_OF(SCT) *sk = NULL; | 263 | STACK_OF(SCT) *sk = NULL; |
261 | size_t list_len, sct_len; | 264 | size_t list_len, sct_len; |
262 | 265 | ||
263 | if (len < 2 || len > MAX_SCT_LIST_SIZE) { | 266 | if (len < 2 || len > MAX_SCT_LIST_SIZE) { |
264 | CTerr(CT_F_O2I_SCT_LIST, CT_R_SCT_LIST_INVALID); | 267 | CTerr(CT_F_O2I_SCT_LIST, CT_R_SCT_LIST_INVALID); |
265 | return NULL; | 268 | return NULL; |
266 | } | 269 | } |
267 | 270 | ||
268 | n2s(*pp, list_len); | 271 | n2s(*pp, list_len); |
269 | if (list_len != len - 2) { | 272 | if (list_len != len - 2) { |
270 | CTerr(CT_F_O2I_SCT_LIST, CT_R_SCT_LIST_INVALID); | 273 | CTerr(CT_F_O2I_SCT_LIST, CT_R_SCT_LIST_INVALID); |
271 | return NULL; | 274 | return NULL; |
272 | } | 275 | } |
273 | 276 | ||
274 | if (a == NULL || *a == NULL) { | 277 | if (a == NULL || *a == NULL) { |
275 | sk = sk_SCT_new_null(); | 278 | sk = sk_SCT_new_null(); |
276 | if (sk == NULL) | 279 | if (sk == NULL) |
277 | return NULL; | 280 | return NULL; |
278 | } else { | 281 | } else { |
279 | SCT *sct; | 282 | SCT *sct; |
280 | 283 | ||
281 | /* Use the given stack, but empty it first. */ | 284 | /* Use the given stack, but empty it first. */ |
282 | sk = *a; | 285 | sk = *a; |
283 | while ((sct = sk_SCT_pop(sk)) != NULL) | 286 | while ((sct = sk_SCT_pop(sk)) != NULL) |
284 | SCT_free(sct); | 287 | SCT_free(sct); |
285 | } | 288 | } |
286 | 289 | ||
287 | while (list_len > 0) { | 290 | while (list_len > 0) { |
288 | SCT *sct; | 291 | SCT *sct; |
289 | 292 | ||
290 | if (list_len < 2) { | 293 | if (list_len < 2) { |
291 | CTerr(CT_F_O2I_SCT_LIST, CT_R_SCT_LIST_INVALID); | 294 | CTerr(CT_F_O2I_SCT_LIST, CT_R_SCT_LIST_INVALID); |
292 | goto err; | 295 | goto err; |
293 | } | 296 | } |
294 | n2s(*pp, sct_len); | 297 | n2s(*pp, sct_len); |
295 | list_len -= 2; | 298 | list_len -= 2; |
296 | 299 | ||
297 | if (sct_len == 0 || sct_len > list_len) { | 300 | if (sct_len == 0 || sct_len > list_len) { |
298 | CTerr(CT_F_O2I_SCT_LIST, CT_R_SCT_LIST_INVALID); | 301 | CTerr(CT_F_O2I_SCT_LIST, CT_R_SCT_LIST_INVALID); |
299 | goto err; | 302 | goto err; |
300 | } | 303 | } |
301 | list_len -= sct_len; | 304 | list_len -= sct_len; |
302 | 305 | ||
303 | if ((sct = o2i_SCT(NULL, pp, sct_len)) == NULL) | 306 | if ((sct = o2i_SCT(NULL, pp, sct_len)) == NULL) |
304 | goto err; | 307 | goto err; |
305 | if (!sk_SCT_push(sk, sct)) { | 308 | if (!sk_SCT_push(sk, sct)) { |
306 | SCT_free(sct); | 309 | SCT_free(sct); |
307 | goto err; | 310 | goto err; |
308 | } | 311 | } |
309 | } | 312 | } |
310 | 313 | ||
311 | if (a != NULL && *a == NULL) | 314 | if (a != NULL && *a == NULL) |
312 | *a = sk; | 315 | *a = sk; |
313 | return sk; | 316 | return sk; |
314 | 317 | ||
315 | err: | 318 | err: |
316 | if (a == NULL || *a == NULL) | 319 | if (a == NULL || *a == NULL) |
317 | SCT_LIST_free(sk); | 320 | SCT_LIST_free(sk); |
318 | return NULL; | 321 | return NULL; |
319 | } | 322 | } |
320 | 323 | ||
321 | int i2o_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp) | 324 | int |
325 | i2o_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp) | ||
322 | { | 326 | { |
323 | int len, sct_len, i, is_pp_new = 0; | 327 | int len, sct_len, i, is_pp_new = 0; |
324 | size_t len2; | 328 | size_t len2; |
325 | unsigned char *p = NULL, *p2; | 329 | unsigned char *p = NULL, *p2; |
326 | 330 | ||
327 | if (pp != NULL) { | 331 | if (pp != NULL) { |
328 | if (*pp == NULL) { | 332 | if (*pp == NULL) { |
329 | if ((len = i2o_SCT_LIST(a, NULL)) == -1) { | 333 | if ((len = i2o_SCT_LIST(a, NULL)) == -1) { |
330 | CTerr(CT_F_I2O_SCT_LIST, CT_R_SCT_LIST_INVALID); | 334 | CTerr(CT_F_I2O_SCT_LIST, CT_R_SCT_LIST_INVALID); |
331 | return -1; | 335 | return -1; |
332 | } | 336 | } |
333 | if ((*pp = OPENSSL_malloc(len)) == NULL) { | 337 | if ((*pp = OPENSSL_malloc(len)) == NULL) { |
334 | CTerr(CT_F_I2O_SCT_LIST, ERR_R_MALLOC_FAILURE); | 338 | CTerr(CT_F_I2O_SCT_LIST, ERR_R_MALLOC_FAILURE); |
335 | return -1; | 339 | return -1; |
336 | } | 340 | } |
337 | is_pp_new = 1; | 341 | is_pp_new = 1; |
338 | } | 342 | } |
339 | p = *pp + 2; | 343 | p = *pp + 2; |
340 | } | 344 | } |
341 | 345 | ||
342 | len2 = 2; | 346 | len2 = 2; |
343 | for (i = 0; i < sk_SCT_num(a); i++) { | 347 | for (i = 0; i < sk_SCT_num(a); i++) { |
344 | if (pp != NULL) { | 348 | if (pp != NULL) { |
345 | p2 = p; | 349 | p2 = p; |
346 | p += 2; | 350 | p += 2; |
347 | if ((sct_len = i2o_SCT(sk_SCT_value(a, i), &p)) == -1) | 351 | if ((sct_len = i2o_SCT(sk_SCT_value(a, i), &p)) == -1) |
348 | goto err; | 352 | goto err; |
349 | s2n(sct_len, p2); | 353 | s2n(sct_len, p2); |
350 | } else { | 354 | } else { |
351 | if ((sct_len = i2o_SCT(sk_SCT_value(a, i), NULL)) == -1) | 355 | if ((sct_len = i2o_SCT(sk_SCT_value(a, i), NULL)) == -1) |
352 | goto err; | 356 | goto err; |
353 | } | 357 | } |
354 | len2 += 2 + sct_len; | 358 | len2 += 2 + sct_len; |
355 | } | 359 | } |
356 | 360 | ||
357 | if (len2 > MAX_SCT_LIST_SIZE) | 361 | if (len2 > MAX_SCT_LIST_SIZE) |
358 | goto err; | 362 | goto err; |
359 | 363 | ||
360 | if (pp != NULL) { | 364 | if (pp != NULL) { |
361 | p = *pp; | 365 | p = *pp; |
362 | s2n(len2 - 2, p); | 366 | s2n(len2 - 2, p); |
363 | if (!is_pp_new) | 367 | if (!is_pp_new) |
364 | *pp += len2; | 368 | *pp += len2; |
365 | } | 369 | } |
366 | return len2; | 370 | return len2; |
367 | 371 | ||
368 | err: | 372 | err: |
369 | if (is_pp_new) { | 373 | if (is_pp_new) { |
370 | OPENSSL_free(*pp); | 374 | OPENSSL_free(*pp); |
371 | *pp = NULL; | 375 | *pp = NULL; |
372 | } | 376 | } |
373 | return -1; | 377 | return -1; |
374 | } | 378 | } |
375 | 379 | ||
376 | STACK_OF(SCT) *d2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, | 380 | STACK_OF(SCT) * |
377 | long len) | 381 | d2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, long len) |
378 | { | 382 | { |
379 | ASN1_OCTET_STRING *oct = NULL; | 383 | ASN1_OCTET_STRING *oct = NULL; |
380 | STACK_OF(SCT) *sk = NULL; | 384 | STACK_OF(SCT) *sk = NULL; |
381 | const unsigned char *p; | 385 | const unsigned char *p; |
382 | 386 | ||
383 | p = *pp; | 387 | p = *pp; |
384 | if (d2i_ASN1_OCTET_STRING(&oct, &p, len) == NULL) | 388 | if (d2i_ASN1_OCTET_STRING(&oct, &p, len) == NULL) |
385 | return NULL; | 389 | return NULL; |
386 | 390 | ||
387 | p = oct->data; | 391 | p = oct->data; |
388 | if ((sk = o2i_SCT_LIST(a, &p, oct->length)) != NULL) | 392 | if ((sk = o2i_SCT_LIST(a, &p, oct->length)) != NULL) |
389 | *pp += len; | 393 | *pp += len; |
390 | 394 | ||
391 | ASN1_OCTET_STRING_free(oct); | 395 | ASN1_OCTET_STRING_free(oct); |
392 | return sk; | 396 | return sk; |
393 | } | 397 | } |
394 | 398 | ||
395 | int i2d_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **out) | 399 | int |
400 | i2d_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **out) | ||
396 | { | 401 | { |
397 | ASN1_OCTET_STRING oct; | 402 | ASN1_OCTET_STRING oct; |
398 | int len; | 403 | int len; |
399 | 404 | ||
400 | oct.data = NULL; | 405 | oct.data = NULL; |
401 | if ((oct.length = i2o_SCT_LIST(a, &oct.data)) == -1) | 406 | if ((oct.length = i2o_SCT_LIST(a, &oct.data)) == -1) |
402 | return -1; | 407 | return -1; |
403 | 408 | ||
404 | len = i2d_ASN1_OCTET_STRING(&oct, out); | 409 | len = i2d_ASN1_OCTET_STRING(&oct, out); |
405 | OPENSSL_free(oct.data); | 410 | OPENSSL_free(oct.data); |
406 | return len; | 411 | return len; |
407 | } | 412 | } |
diff --git a/src/lib/libcrypto/ct/ct_policy.c b/src/lib/libcrypto/ct/ct_policy.c index df66e8a494..43ea6fa093 100644 --- a/src/lib/libcrypto/ct/ct_policy.c +++ b/src/lib/libcrypto/ct/ct_policy.c | |||
@@ -25,74 +25,84 @@ | |||
25 | */ | 25 | */ |
26 | static const time_t SCT_CLOCK_DRIFT_TOLERANCE = 300; | 26 | static const time_t SCT_CLOCK_DRIFT_TOLERANCE = 300; |
27 | 27 | ||
28 | CT_POLICY_EVAL_CTX *CT_POLICY_EVAL_CTX_new(void) | 28 | CT_POLICY_EVAL_CTX * |
29 | CT_POLICY_EVAL_CTX_new(void) | ||
29 | { | 30 | { |
30 | CT_POLICY_EVAL_CTX *ctx = OPENSSL_zalloc(sizeof(CT_POLICY_EVAL_CTX)); | 31 | CT_POLICY_EVAL_CTX *ctx = OPENSSL_zalloc(sizeof(CT_POLICY_EVAL_CTX)); |
31 | 32 | ||
32 | if (ctx == NULL) { | 33 | if (ctx == NULL) { |
33 | CTerr(CT_F_CT_POLICY_EVAL_CTX_NEW, ERR_R_MALLOC_FAILURE); | 34 | CTerr(CT_F_CT_POLICY_EVAL_CTX_NEW, ERR_R_MALLOC_FAILURE); |
34 | return NULL; | 35 | return NULL; |
35 | } | 36 | } |
36 | 37 | ||
37 | /* time(NULL) shouldn't ever fail, so don't bother checking for -1. */ | 38 | /* time(NULL) shouldn't ever fail, so don't bother checking for -1. */ |
38 | ctx->epoch_time_in_ms = (uint64_t)(time(NULL) + SCT_CLOCK_DRIFT_TOLERANCE) * | 39 | ctx->epoch_time_in_ms = (uint64_t)(time(NULL) + SCT_CLOCK_DRIFT_TOLERANCE) * |
39 | 1000; | 40 | 1000; |
40 | 41 | ||
41 | return ctx; | 42 | return ctx; |
42 | } | 43 | } |
43 | 44 | ||
44 | void CT_POLICY_EVAL_CTX_free(CT_POLICY_EVAL_CTX *ctx) | 45 | void |
46 | CT_POLICY_EVAL_CTX_free(CT_POLICY_EVAL_CTX *ctx) | ||
45 | { | 47 | { |
46 | if (ctx == NULL) | 48 | if (ctx == NULL) |
47 | return; | 49 | return; |
48 | X509_free(ctx->cert); | 50 | X509_free(ctx->cert); |
49 | X509_free(ctx->issuer); | 51 | X509_free(ctx->issuer); |
50 | OPENSSL_free(ctx); | 52 | OPENSSL_free(ctx); |
51 | } | 53 | } |
52 | 54 | ||
53 | int CT_POLICY_EVAL_CTX_set1_cert(CT_POLICY_EVAL_CTX *ctx, X509 *cert) | 55 | int |
56 | CT_POLICY_EVAL_CTX_set1_cert(CT_POLICY_EVAL_CTX *ctx, X509 *cert) | ||
54 | { | 57 | { |
55 | if (!X509_up_ref(cert)) | 58 | if (!X509_up_ref(cert)) |
56 | return 0; | 59 | return 0; |
57 | ctx->cert = cert; | 60 | ctx->cert = cert; |
58 | return 1; | 61 | return 1; |
59 | } | 62 | } |
60 | 63 | ||
61 | int CT_POLICY_EVAL_CTX_set1_issuer(CT_POLICY_EVAL_CTX *ctx, X509 *issuer) | 64 | int |
65 | CT_POLICY_EVAL_CTX_set1_issuer(CT_POLICY_EVAL_CTX *ctx, X509 *issuer) | ||
62 | { | 66 | { |
63 | if (!X509_up_ref(issuer)) | 67 | if (!X509_up_ref(issuer)) |
64 | return 0; | 68 | return 0; |
65 | ctx->issuer = issuer; | 69 | ctx->issuer = issuer; |
66 | return 1; | 70 | return 1; |
67 | } | 71 | } |
68 | 72 | ||
69 | void CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE(CT_POLICY_EVAL_CTX *ctx, | 73 | void |
70 | CTLOG_STORE *log_store) | 74 | CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE(CT_POLICY_EVAL_CTX *ctx, |
75 | CTLOG_STORE *log_store) | ||
71 | { | 76 | { |
72 | ctx->log_store = log_store; | 77 | ctx->log_store = log_store; |
73 | } | 78 | } |
74 | 79 | ||
75 | void CT_POLICY_EVAL_CTX_set_time(CT_POLICY_EVAL_CTX *ctx, uint64_t time_in_ms) | 80 | void |
81 | CT_POLICY_EVAL_CTX_set_time(CT_POLICY_EVAL_CTX *ctx, uint64_t time_in_ms) | ||
76 | { | 82 | { |
77 | ctx->epoch_time_in_ms = time_in_ms; | 83 | ctx->epoch_time_in_ms = time_in_ms; |
78 | } | 84 | } |
79 | 85 | ||
80 | X509* CT_POLICY_EVAL_CTX_get0_cert(const CT_POLICY_EVAL_CTX *ctx) | 86 | X509* |
87 | CT_POLICY_EVAL_CTX_get0_cert(const CT_POLICY_EVAL_CTX *ctx) | ||
81 | { | 88 | { |
82 | return ctx->cert; | 89 | return ctx->cert; |
83 | } | 90 | } |
84 | 91 | ||
85 | X509* CT_POLICY_EVAL_CTX_get0_issuer(const CT_POLICY_EVAL_CTX *ctx) | 92 | X509* |
93 | CT_POLICY_EVAL_CTX_get0_issuer(const CT_POLICY_EVAL_CTX *ctx) | ||
86 | { | 94 | { |
87 | return ctx->issuer; | 95 | return ctx->issuer; |
88 | } | 96 | } |
89 | 97 | ||
90 | const CTLOG_STORE *CT_POLICY_EVAL_CTX_get0_log_store(const CT_POLICY_EVAL_CTX *ctx) | 98 | const CTLOG_STORE * |
99 | CT_POLICY_EVAL_CTX_get0_log_store(const CT_POLICY_EVAL_CTX *ctx) | ||
91 | { | 100 | { |
92 | return ctx->log_store; | 101 | return ctx->log_store; |
93 | } | 102 | } |
94 | 103 | ||
95 | uint64_t CT_POLICY_EVAL_CTX_get_time(const CT_POLICY_EVAL_CTX *ctx) | 104 | uint64_t |
105 | CT_POLICY_EVAL_CTX_get_time(const CT_POLICY_EVAL_CTX *ctx) | ||
96 | { | 106 | { |
97 | return ctx->epoch_time_in_ms; | 107 | return ctx->epoch_time_in_ms; |
98 | } | 108 | } |
diff --git a/src/lib/libcrypto/ct/ct_prn.c b/src/lib/libcrypto/ct/ct_prn.c index e6584b57f3..3cd9b8e838 100644 --- a/src/lib/libcrypto/ct/ct_prn.c +++ b/src/lib/libcrypto/ct/ct_prn.c | |||
@@ -16,112 +16,114 @@ | |||
16 | 16 | ||
17 | #include "ct_local.h" | 17 | #include "ct_local.h" |
18 | 18 | ||
19 | static void SCT_signature_algorithms_print(const SCT *sct, BIO *out) | 19 | static void |
20 | SCT_signature_algorithms_print(const SCT *sct, BIO *out) | ||
20 | { | 21 | { |
21 | int nid = SCT_get_signature_nid(sct); | 22 | int nid = SCT_get_signature_nid(sct); |
22 | 23 | ||
23 | if (nid == NID_undef) | 24 | if (nid == NID_undef) |
24 | BIO_printf(out, "%02X%02X", sct->hash_alg, sct->sig_alg); | 25 | BIO_printf(out, "%02X%02X", sct->hash_alg, sct->sig_alg); |
25 | else | 26 | else |
26 | BIO_printf(out, "%s", OBJ_nid2ln(nid)); | 27 | BIO_printf(out, "%s", OBJ_nid2ln(nid)); |
27 | } | 28 | } |
28 | 29 | ||
29 | static void timestamp_print(uint64_t timestamp, BIO *out) | 30 | static void |
31 | timestamp_print(uint64_t timestamp, BIO *out) | ||
30 | { | 32 | { |
31 | ASN1_GENERALIZEDTIME *gen = ASN1_GENERALIZEDTIME_new(); | 33 | ASN1_GENERALIZEDTIME *gen = ASN1_GENERALIZEDTIME_new(); |
32 | char genstr[20]; | 34 | char genstr[20]; |
33 | 35 | ||
34 | if (gen == NULL) | 36 | if (gen == NULL) |
35 | return; | 37 | return; |
36 | ASN1_GENERALIZEDTIME_adj(gen, (time_t)0, | 38 | ASN1_GENERALIZEDTIME_adj(gen, (time_t)0,(int)(timestamp / 86400000), |
37 | (int)(timestamp / 86400000), | 39 | (timestamp % 86400000) / 1000); |
38 | (timestamp % 86400000) / 1000); | 40 | /* |
39 | /* | 41 | * Note GeneralizedTime from ASN1_GENERALIZETIME_adj is always 15 |
40 | * Note GeneralizedTime from ASN1_GENERALIZETIME_adj is always 15 | 42 | * characters long with a final Z. Update it with fractional seconds. |
41 | * characters long with a final Z. Update it with fractional seconds. | 43 | */ |
42 | */ | 44 | BIO_snprintf(genstr, sizeof(genstr), "%.14s.%03dZ", |
43 | BIO_snprintf(genstr, sizeof(genstr), "%.14s.%03dZ", | 45 | ASN1_STRING_get0_data(gen), (unsigned int)(timestamp % 1000)); |
44 | ASN1_STRING_get0_data(gen), (unsigned int)(timestamp % 1000)); | 46 | if (ASN1_GENERALIZEDTIME_set_string(gen, genstr)) |
45 | if (ASN1_GENERALIZEDTIME_set_string(gen, genstr)) | 47 | ASN1_GENERALIZEDTIME_print(out, gen); |
46 | ASN1_GENERALIZEDTIME_print(out, gen); | 48 | ASN1_GENERALIZEDTIME_free(gen); |
47 | ASN1_GENERALIZEDTIME_free(gen); | ||
48 | } | 49 | } |
49 | 50 | ||
50 | const char *SCT_validation_status_string(const SCT *sct) | 51 | const char * |
52 | SCT_validation_status_string(const SCT *sct) | ||
51 | { | 53 | { |
52 | 54 | switch (SCT_get_validation_status(sct)) { | |
53 | switch (SCT_get_validation_status(sct)) { | 55 | case SCT_VALIDATION_STATUS_NOT_SET: |
54 | case SCT_VALIDATION_STATUS_NOT_SET: | 56 | return "not set"; |
55 | return "not set"; | 57 | case SCT_VALIDATION_STATUS_UNKNOWN_VERSION: |
56 | case SCT_VALIDATION_STATUS_UNKNOWN_VERSION: | 58 | return "unknown version"; |
57 | return "unknown version"; | 59 | case SCT_VALIDATION_STATUS_UNKNOWN_LOG: |
58 | case SCT_VALIDATION_STATUS_UNKNOWN_LOG: | 60 | return "unknown log"; |
59 | return "unknown log"; | 61 | case SCT_VALIDATION_STATUS_UNVERIFIED: |
60 | case SCT_VALIDATION_STATUS_UNVERIFIED: | 62 | return "unverified"; |
61 | return "unverified"; | 63 | case SCT_VALIDATION_STATUS_INVALID: |
62 | case SCT_VALIDATION_STATUS_INVALID: | 64 | return "invalid"; |
63 | return "invalid"; | 65 | case SCT_VALIDATION_STATUS_VALID: |
64 | case SCT_VALIDATION_STATUS_VALID: | 66 | return "valid"; |
65 | return "valid"; | 67 | } |
66 | } | 68 | return "unknown status"; |
67 | return "unknown status"; | ||
68 | } | 69 | } |
69 | 70 | ||
70 | void SCT_print(const SCT *sct, BIO *out, int indent, | 71 | void |
71 | const CTLOG_STORE *log_store) | 72 | SCT_print(const SCT *sct, BIO *out, int indent, const CTLOG_STORE *log_store) |
72 | { | 73 | { |
73 | const CTLOG *log = NULL; | 74 | const CTLOG *log = NULL; |
74 | 75 | ||
75 | if (log_store != NULL) { | 76 | if (log_store != NULL) { |
76 | log = CTLOG_STORE_get0_log_by_id(log_store, sct->log_id, | 77 | log = CTLOG_STORE_get0_log_by_id(log_store, sct->log_id, |
77 | sct->log_id_len); | 78 | sct->log_id_len); |
78 | } | 79 | } |
79 | 80 | ||
80 | BIO_printf(out, "%*sSigned Certificate Timestamp:", indent, ""); | 81 | BIO_printf(out, "%*sSigned Certificate Timestamp:", indent, ""); |
81 | BIO_printf(out, "\n%*sVersion : ", indent + 4, ""); | 82 | BIO_printf(out, "\n%*sVersion : ", indent + 4, ""); |
82 | 83 | ||
83 | if (sct->version != SCT_VERSION_V1) { | 84 | if (sct->version != SCT_VERSION_V1) { |
84 | BIO_printf(out, "unknown\n%*s", indent + 16, ""); | 85 | BIO_printf(out, "unknown\n%*s", indent + 16, ""); |
85 | BIO_hex_string(out, indent + 16, 16, sct->sct, sct->sct_len); | 86 | BIO_hex_string(out, indent + 16, 16, sct->sct, sct->sct_len); |
86 | return; | 87 | return; |
87 | } | 88 | } |
88 | 89 | ||
89 | BIO_printf(out, "v1 (0x0)"); | 90 | BIO_printf(out, "v1 (0x0)"); |
90 | 91 | ||
91 | if (log != NULL) { | 92 | if (log != NULL) { |
92 | BIO_printf(out, "\n%*sLog : %s", indent + 4, "", | 93 | BIO_printf(out, "\n%*sLog : %s", indent + 4, "", |
93 | CTLOG_get0_name(log)); | 94 | CTLOG_get0_name(log)); |
94 | } | 95 | } |
95 | 96 | ||
96 | BIO_printf(out, "\n%*sLog ID : ", indent + 4, ""); | 97 | BIO_printf(out, "\n%*sLog ID : ", indent + 4, ""); |
97 | BIO_hex_string(out, indent + 16, 16, sct->log_id, sct->log_id_len); | 98 | BIO_hex_string(out, indent + 16, 16, sct->log_id, sct->log_id_len); |
98 | 99 | ||
99 | BIO_printf(out, "\n%*sTimestamp : ", indent + 4, ""); | 100 | BIO_printf(out, "\n%*sTimestamp : ", indent + 4, ""); |
100 | timestamp_print(sct->timestamp, out); | 101 | timestamp_print(sct->timestamp, out); |
101 | 102 | ||
102 | BIO_printf(out, "\n%*sExtensions: ", indent + 4, ""); | 103 | BIO_printf(out, "\n%*sExtensions: ", indent + 4, ""); |
103 | if (sct->ext_len == 0) | 104 | if (sct->ext_len == 0) |
104 | BIO_printf(out, "none"); | 105 | BIO_printf(out, "none"); |
105 | else | 106 | else |
106 | BIO_hex_string(out, indent + 16, 16, sct->ext, sct->ext_len); | 107 | BIO_hex_string(out, indent + 16, 16, sct->ext, sct->ext_len); |
107 | 108 | ||
108 | BIO_printf(out, "\n%*sSignature : ", indent + 4, ""); | 109 | BIO_printf(out, "\n%*sSignature : ", indent + 4, ""); |
109 | SCT_signature_algorithms_print(sct, out); | 110 | SCT_signature_algorithms_print(sct, out); |
110 | BIO_printf(out, "\n%*s ", indent + 4, ""); | 111 | BIO_printf(out, "\n%*s ", indent + 4, ""); |
111 | BIO_hex_string(out, indent + 16, 16, sct->sig, sct->sig_len); | 112 | BIO_hex_string(out, indent + 16, 16, sct->sig, sct->sig_len); |
112 | } | 113 | } |
113 | 114 | ||
114 | void SCT_LIST_print(const STACK_OF(SCT) *sct_list, BIO *out, int indent, | 115 | void |
115 | const char *separator, const CTLOG_STORE *log_store) | 116 | SCT_LIST_print(const STACK_OF(SCT) *sct_list, BIO *out, int indent, |
117 | const char *separator, const CTLOG_STORE *log_store) | ||
116 | { | 118 | { |
117 | int sct_count = sk_SCT_num(sct_list); | 119 | int sct_count = sk_SCT_num(sct_list); |
118 | int i; | 120 | int i; |
119 | 121 | ||
120 | for (i = 0; i < sct_count; ++i) { | 122 | for (i = 0; i < sct_count; ++i) { |
121 | SCT *sct = sk_SCT_value(sct_list, i); | 123 | SCT *sct = sk_SCT_value(sct_list, i); |
122 | 124 | ||
123 | SCT_print(sct, out, indent, log_store); | 125 | SCT_print(sct, out, indent, log_store); |
124 | if (i < sk_SCT_num(sct_list) - 1) | 126 | if (i < sk_SCT_num(sct_list) - 1) |
125 | BIO_printf(out, "%s", separator); | 127 | BIO_printf(out, "%s", separator); |
126 | } | 128 | } |
127 | } | 129 | } |
diff --git a/src/lib/libcrypto/ct/ct_sct.c b/src/lib/libcrypto/ct/ct_sct.c index 4ff36e2fbd..ca915b763e 100644 --- a/src/lib/libcrypto/ct/ct_sct.c +++ b/src/lib/libcrypto/ct/ct_sct.c | |||
@@ -19,378 +19,405 @@ | |||
19 | 19 | ||
20 | #include "ct_local.h" | 20 | #include "ct_local.h" |
21 | 21 | ||
22 | SCT *SCT_new(void) | 22 | SCT * |
23 | SCT_new(void) | ||
23 | { | 24 | { |
24 | SCT *sct = OPENSSL_zalloc(sizeof(*sct)); | 25 | SCT *sct = OPENSSL_zalloc(sizeof(*sct)); |
25 | 26 | ||
26 | if (sct == NULL) { | 27 | if (sct == NULL) { |
27 | CTerr(CT_F_SCT_NEW, ERR_R_MALLOC_FAILURE); | 28 | CTerr(CT_F_SCT_NEW, ERR_R_MALLOC_FAILURE); |
28 | return NULL; | 29 | return NULL; |
29 | } | 30 | } |
30 | 31 | ||
31 | sct->entry_type = CT_LOG_ENTRY_TYPE_NOT_SET; | 32 | sct->entry_type = CT_LOG_ENTRY_TYPE_NOT_SET; |
32 | sct->version = SCT_VERSION_NOT_SET; | 33 | sct->version = SCT_VERSION_NOT_SET; |
33 | return sct; | 34 | return sct; |
34 | } | 35 | } |
35 | 36 | ||
36 | void SCT_free(SCT *sct) | 37 | void |
38 | SCT_free(SCT *sct) | ||
37 | { | 39 | { |
38 | if (sct == NULL) | 40 | if (sct == NULL) |
39 | return; | 41 | return; |
40 | 42 | ||
41 | OPENSSL_free(sct->log_id); | 43 | OPENSSL_free(sct->log_id); |
42 | OPENSSL_free(sct->ext); | 44 | OPENSSL_free(sct->ext); |
43 | OPENSSL_free(sct->sig); | 45 | OPENSSL_free(sct->sig); |
44 | OPENSSL_free(sct->sct); | 46 | OPENSSL_free(sct->sct); |
45 | OPENSSL_free(sct); | 47 | OPENSSL_free(sct); |
46 | } | 48 | } |
47 | 49 | ||
48 | void SCT_LIST_free(STACK_OF(SCT) *a) | 50 | void |
51 | SCT_LIST_free(STACK_OF(SCT) *a) | ||
49 | { | 52 | { |
50 | sk_SCT_pop_free(a, SCT_free); | 53 | sk_SCT_pop_free(a, SCT_free); |
51 | } | 54 | } |
52 | 55 | ||
53 | int SCT_set_version(SCT *sct, sct_version_t version) | 56 | int |
57 | SCT_set_version(SCT *sct, sct_version_t version) | ||
54 | { | 58 | { |
55 | if (version != SCT_VERSION_V1) { | 59 | if (version != SCT_VERSION_V1) { |
56 | CTerr(CT_F_SCT_SET_VERSION, CT_R_UNSUPPORTED_VERSION); | 60 | CTerr(CT_F_SCT_SET_VERSION, CT_R_UNSUPPORTED_VERSION); |
57 | return 0; | 61 | return 0; |
58 | } | 62 | } |
59 | sct->version = version; | 63 | sct->version = version; |
60 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; | 64 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; |
61 | return 1; | 65 | return 1; |
62 | } | 66 | } |
63 | 67 | ||
64 | int SCT_set_log_entry_type(SCT *sct, ct_log_entry_type_t entry_type) | 68 | int |
69 | SCT_set_log_entry_type(SCT *sct, ct_log_entry_type_t entry_type) | ||
65 | { | 70 | { |
66 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; | 71 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; |
67 | 72 | ||
68 | switch (entry_type) { | 73 | switch (entry_type) { |
69 | case CT_LOG_ENTRY_TYPE_X509: | 74 | case CT_LOG_ENTRY_TYPE_X509: |
70 | case CT_LOG_ENTRY_TYPE_PRECERT: | 75 | case CT_LOG_ENTRY_TYPE_PRECERT: |
71 | sct->entry_type = entry_type; | 76 | sct->entry_type = entry_type; |
72 | return 1; | 77 | return 1; |
73 | case CT_LOG_ENTRY_TYPE_NOT_SET: | 78 | case CT_LOG_ENTRY_TYPE_NOT_SET: |
74 | break; | 79 | break; |
75 | } | 80 | } |
76 | CTerr(CT_F_SCT_SET_LOG_ENTRY_TYPE, CT_R_UNSUPPORTED_ENTRY_TYPE); | 81 | CTerr(CT_F_SCT_SET_LOG_ENTRY_TYPE, CT_R_UNSUPPORTED_ENTRY_TYPE); |
77 | return 0; | 82 | return 0; |
78 | } | 83 | } |
79 | 84 | ||
80 | int SCT_set0_log_id(SCT *sct, unsigned char *log_id, size_t log_id_len) | 85 | int |
86 | SCT_set0_log_id(SCT *sct, unsigned char *log_id, size_t log_id_len) | ||
81 | { | 87 | { |
82 | if (sct->version == SCT_VERSION_V1 && log_id_len != CT_V1_HASHLEN) { | 88 | if (sct->version == SCT_VERSION_V1 && log_id_len != CT_V1_HASHLEN) { |
83 | CTerr(CT_F_SCT_SET0_LOG_ID, CT_R_INVALID_LOG_ID_LENGTH); | 89 | CTerr(CT_F_SCT_SET0_LOG_ID, CT_R_INVALID_LOG_ID_LENGTH); |
84 | return 0; | 90 | return 0; |
85 | } | 91 | } |
86 | 92 | ||
87 | OPENSSL_free(sct->log_id); | 93 | OPENSSL_free(sct->log_id); |
88 | sct->log_id = log_id; | 94 | sct->log_id = log_id; |
89 | sct->log_id_len = log_id_len; | 95 | sct->log_id_len = log_id_len; |
90 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; | 96 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; |
91 | return 1; | 97 | return 1; |
92 | } | 98 | } |
93 | 99 | ||
94 | int SCT_set1_log_id(SCT *sct, const unsigned char *log_id, size_t log_id_len) | 100 | int |
101 | SCT_set1_log_id(SCT *sct, const unsigned char *log_id, size_t log_id_len) | ||
95 | { | 102 | { |
96 | if (sct->version == SCT_VERSION_V1 && log_id_len != CT_V1_HASHLEN) { | 103 | if (sct->version == SCT_VERSION_V1 && log_id_len != CT_V1_HASHLEN) { |
97 | CTerr(CT_F_SCT_SET1_LOG_ID, CT_R_INVALID_LOG_ID_LENGTH); | 104 | CTerr(CT_F_SCT_SET1_LOG_ID, CT_R_INVALID_LOG_ID_LENGTH); |
98 | return 0; | 105 | return 0; |
99 | } | 106 | } |
100 | 107 | ||
101 | OPENSSL_free(sct->log_id); | 108 | OPENSSL_free(sct->log_id); |
102 | sct->log_id = NULL; | 109 | sct->log_id = NULL; |
103 | sct->log_id_len = 0; | 110 | sct->log_id_len = 0; |
104 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; | 111 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; |
105 | 112 | ||
106 | if (log_id != NULL && log_id_len > 0) { | 113 | if (log_id != NULL && log_id_len > 0) { |
107 | sct->log_id = OPENSSL_memdup(log_id, log_id_len); | 114 | sct->log_id = OPENSSL_memdup(log_id, log_id_len); |
108 | if (sct->log_id == NULL) { | 115 | if (sct->log_id == NULL) { |
109 | CTerr(CT_F_SCT_SET1_LOG_ID, ERR_R_MALLOC_FAILURE); | 116 | CTerr(CT_F_SCT_SET1_LOG_ID, ERR_R_MALLOC_FAILURE); |
110 | return 0; | 117 | return 0; |
111 | } | 118 | } |
112 | sct->log_id_len = log_id_len; | 119 | sct->log_id_len = log_id_len; |
113 | } | 120 | } |
114 | return 1; | 121 | return 1; |
115 | } | 122 | } |
116 | 123 | ||
117 | 124 | ||
118 | void SCT_set_timestamp(SCT *sct, uint64_t timestamp) | 125 | void |
126 | SCT_set_timestamp(SCT *sct, uint64_t timestamp) | ||
119 | { | 127 | { |
120 | sct->timestamp = timestamp; | 128 | sct->timestamp = timestamp; |
121 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; | 129 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; |
122 | } | 130 | } |
123 | 131 | ||
124 | int SCT_set_signature_nid(SCT *sct, int nid) | 132 | int |
133 | SCT_set_signature_nid(SCT *sct, int nid) | ||
125 | { | 134 | { |
126 | switch (nid) { | 135 | switch (nid) { |
127 | case NID_sha256WithRSAEncryption: | 136 | case NID_sha256WithRSAEncryption: |
128 | sct->hash_alg = TLSEXT_hash_sha256; | 137 | sct->hash_alg = TLSEXT_hash_sha256; |
129 | sct->sig_alg = TLSEXT_signature_rsa; | 138 | sct->sig_alg = TLSEXT_signature_rsa; |
130 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; | 139 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; |
131 | return 1; | 140 | return 1; |
132 | case NID_ecdsa_with_SHA256: | 141 | case NID_ecdsa_with_SHA256: |
133 | sct->hash_alg = TLSEXT_hash_sha256; | 142 | sct->hash_alg = TLSEXT_hash_sha256; |
134 | sct->sig_alg = TLSEXT_signature_ecdsa; | 143 | sct->sig_alg = TLSEXT_signature_ecdsa; |
135 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; | 144 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; |
136 | return 1; | 145 | return 1; |
137 | default: | 146 | default: |
138 | CTerr(CT_F_SCT_SET_SIGNATURE_NID, CT_R_UNRECOGNIZED_SIGNATURE_NID); | 147 | CTerr(CT_F_SCT_SET_SIGNATURE_NID, CT_R_UNRECOGNIZED_SIGNATURE_NID); |
139 | return 0; | 148 | return 0; |
140 | } | 149 | } |
141 | } | 150 | } |
142 | 151 | ||
143 | void SCT_set0_extensions(SCT *sct, unsigned char *ext, size_t ext_len) | 152 | void |
153 | SCT_set0_extensions(SCT *sct, unsigned char *ext, size_t ext_len) | ||
144 | { | 154 | { |
145 | OPENSSL_free(sct->ext); | 155 | OPENSSL_free(sct->ext); |
146 | sct->ext = ext; | 156 | sct->ext = ext; |
147 | sct->ext_len = ext_len; | 157 | sct->ext_len = ext_len; |
148 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; | 158 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; |
149 | } | 159 | } |
150 | 160 | ||
151 | int SCT_set1_extensions(SCT *sct, const unsigned char *ext, size_t ext_len) | 161 | int |
162 | SCT_set1_extensions(SCT *sct, const unsigned char *ext, size_t ext_len) | ||
152 | { | 163 | { |
153 | OPENSSL_free(sct->ext); | 164 | OPENSSL_free(sct->ext); |
154 | sct->ext = NULL; | 165 | sct->ext = NULL; |
155 | sct->ext_len = 0; | 166 | sct->ext_len = 0; |
156 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; | 167 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; |
157 | 168 | ||
158 | if (ext != NULL && ext_len > 0) { | 169 | if (ext != NULL && ext_len > 0) { |
159 | sct->ext = OPENSSL_memdup(ext, ext_len); | 170 | sct->ext = OPENSSL_memdup(ext, ext_len); |
160 | if (sct->ext == NULL) { | 171 | if (sct->ext == NULL) { |
161 | CTerr(CT_F_SCT_SET1_EXTENSIONS, ERR_R_MALLOC_FAILURE); | 172 | CTerr(CT_F_SCT_SET1_EXTENSIONS, ERR_R_MALLOC_FAILURE); |
162 | return 0; | 173 | return 0; |
163 | } | 174 | } |
164 | sct->ext_len = ext_len; | 175 | sct->ext_len = ext_len; |
165 | } | 176 | } |
166 | return 1; | 177 | return 1; |
167 | } | 178 | } |
168 | 179 | ||
169 | void SCT_set0_signature(SCT *sct, unsigned char *sig, size_t sig_len) | 180 | void |
181 | SCT_set0_signature(SCT *sct, unsigned char *sig, size_t sig_len) | ||
170 | { | 182 | { |
171 | OPENSSL_free(sct->sig); | 183 | OPENSSL_free(sct->sig); |
172 | sct->sig = sig; | 184 | sct->sig = sig; |
173 | sct->sig_len = sig_len; | 185 | sct->sig_len = sig_len; |
174 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; | 186 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; |
175 | } | 187 | } |
176 | 188 | ||
177 | int SCT_set1_signature(SCT *sct, const unsigned char *sig, size_t sig_len) | 189 | int |
190 | SCT_set1_signature(SCT *sct, const unsigned char *sig, size_t sig_len) | ||
178 | { | 191 | { |
179 | OPENSSL_free(sct->sig); | 192 | OPENSSL_free(sct->sig); |
180 | sct->sig = NULL; | 193 | sct->sig = NULL; |
181 | sct->sig_len = 0; | 194 | sct->sig_len = 0; |
182 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; | 195 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; |
183 | 196 | ||
184 | if (sig != NULL && sig_len > 0) { | 197 | if (sig != NULL && sig_len > 0) { |
185 | sct->sig = OPENSSL_memdup(sig, sig_len); | 198 | sct->sig = OPENSSL_memdup(sig, sig_len); |
186 | if (sct->sig == NULL) { | 199 | if (sct->sig == NULL) { |
187 | CTerr(CT_F_SCT_SET1_SIGNATURE, ERR_R_MALLOC_FAILURE); | 200 | CTerr(CT_F_SCT_SET1_SIGNATURE, ERR_R_MALLOC_FAILURE); |
188 | return 0; | 201 | return 0; |
189 | } | 202 | } |
190 | sct->sig_len = sig_len; | 203 | sct->sig_len = sig_len; |
191 | } | 204 | } |
192 | return 1; | 205 | return 1; |
193 | } | 206 | } |
194 | 207 | ||
195 | sct_version_t SCT_get_version(const SCT *sct) | 208 | sct_version_t |
209 | SCT_get_version(const SCT *sct) | ||
196 | { | 210 | { |
197 | return sct->version; | 211 | return sct->version; |
198 | } | 212 | } |
199 | 213 | ||
200 | ct_log_entry_type_t SCT_get_log_entry_type(const SCT *sct) | 214 | ct_log_entry_type_t |
215 | SCT_get_log_entry_type(const SCT *sct) | ||
201 | { | 216 | { |
202 | return sct->entry_type; | 217 | return sct->entry_type; |
203 | } | 218 | } |
204 | 219 | ||
205 | size_t SCT_get0_log_id(const SCT *sct, unsigned char **log_id) | 220 | size_t |
221 | SCT_get0_log_id(const SCT *sct, unsigned char **log_id) | ||
206 | { | 222 | { |
207 | *log_id = sct->log_id; | 223 | *log_id = sct->log_id; |
208 | return sct->log_id_len; | 224 | return sct->log_id_len; |
209 | } | 225 | } |
210 | 226 | ||
211 | uint64_t SCT_get_timestamp(const SCT *sct) | 227 | uint64_t |
228 | SCT_get_timestamp(const SCT *sct) | ||
212 | { | 229 | { |
213 | return sct->timestamp; | 230 | return sct->timestamp; |
214 | } | 231 | } |
215 | 232 | ||
216 | int SCT_get_signature_nid(const SCT *sct) | 233 | int |
234 | SCT_get_signature_nid(const SCT *sct) | ||
217 | { | 235 | { |
218 | if (sct->version == SCT_VERSION_V1) { | 236 | if (sct->version == SCT_VERSION_V1) { |
219 | if (sct->hash_alg == TLSEXT_hash_sha256) { | 237 | if (sct->hash_alg == TLSEXT_hash_sha256) { |
220 | switch (sct->sig_alg) { | 238 | switch (sct->sig_alg) { |
221 | case TLSEXT_signature_ecdsa: | 239 | case TLSEXT_signature_ecdsa: |
222 | return NID_ecdsa_with_SHA256; | 240 | return NID_ecdsa_with_SHA256; |
223 | case TLSEXT_signature_rsa: | 241 | case TLSEXT_signature_rsa: |
224 | return NID_sha256WithRSAEncryption; | 242 | return NID_sha256WithRSAEncryption; |
225 | default: | 243 | default: |
226 | return NID_undef; | 244 | return NID_undef; |
227 | } | 245 | } |
228 | } | 246 | } |
229 | } | 247 | } |
230 | return NID_undef; | 248 | return NID_undef; |
231 | } | 249 | } |
232 | 250 | ||
233 | size_t SCT_get0_extensions(const SCT *sct, unsigned char **ext) | 251 | size_t |
252 | SCT_get0_extensions(const SCT *sct, unsigned char **ext) | ||
234 | { | 253 | { |
235 | *ext = sct->ext; | 254 | *ext = sct->ext; |
236 | return sct->ext_len; | 255 | return sct->ext_len; |
237 | } | 256 | } |
238 | 257 | ||
239 | size_t SCT_get0_signature(const SCT *sct, unsigned char **sig) | 258 | size_t |
259 | SCT_get0_signature(const SCT *sct, unsigned char **sig) | ||
240 | { | 260 | { |
241 | *sig = sct->sig; | 261 | *sig = sct->sig; |
242 | return sct->sig_len; | 262 | return sct->sig_len; |
243 | } | 263 | } |
244 | 264 | ||
245 | int SCT_is_complete(const SCT *sct) | 265 | int |
266 | SCT_is_complete(const SCT *sct) | ||
246 | { | 267 | { |
247 | switch (sct->version) { | 268 | switch (sct->version) { |
248 | case SCT_VERSION_NOT_SET: | 269 | case SCT_VERSION_NOT_SET: |
249 | return 0; | 270 | return 0; |
250 | case SCT_VERSION_V1: | 271 | case SCT_VERSION_V1: |
251 | return sct->log_id != NULL && SCT_signature_is_complete(sct); | 272 | return sct->log_id != NULL && SCT_signature_is_complete(sct); |
252 | default: | 273 | default: |
253 | return sct->sct != NULL; /* Just need cached encoding */ | 274 | return sct->sct != NULL; /* Just need cached encoding */ |
254 | } | 275 | } |
255 | } | 276 | } |
256 | 277 | ||
257 | int SCT_signature_is_complete(const SCT *sct) | 278 | int |
279 | SCT_signature_is_complete(const SCT *sct) | ||
258 | { | 280 | { |
259 | return SCT_get_signature_nid(sct) != NID_undef && | 281 | return SCT_get_signature_nid(sct) != NID_undef && sct->sig != NULL && |
260 | sct->sig != NULL && sct->sig_len > 0; | 282 | sct->sig_len > 0; |
261 | } | 283 | } |
262 | 284 | ||
263 | sct_source_t SCT_get_source(const SCT *sct) | 285 | sct_source_t |
286 | SCT_get_source(const SCT *sct) | ||
264 | { | 287 | { |
265 | return sct->source; | 288 | return sct->source; |
266 | } | 289 | } |
267 | 290 | ||
268 | int SCT_set_source(SCT *sct, sct_source_t source) | 291 | int |
292 | SCT_set_source(SCT *sct, sct_source_t source) | ||
269 | { | 293 | { |
270 | sct->source = source; | 294 | sct->source = source; |
271 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; | 295 | sct->validation_status = SCT_VALIDATION_STATUS_NOT_SET; |
272 | switch (source) { | 296 | switch (source) { |
273 | case SCT_SOURCE_TLS_EXTENSION: | 297 | case SCT_SOURCE_TLS_EXTENSION: |
274 | case SCT_SOURCE_OCSP_STAPLED_RESPONSE: | 298 | case SCT_SOURCE_OCSP_STAPLED_RESPONSE: |
275 | return SCT_set_log_entry_type(sct, CT_LOG_ENTRY_TYPE_X509); | 299 | return SCT_set_log_entry_type(sct, CT_LOG_ENTRY_TYPE_X509); |
276 | case SCT_SOURCE_X509V3_EXTENSION: | 300 | case SCT_SOURCE_X509V3_EXTENSION: |
277 | return SCT_set_log_entry_type(sct, CT_LOG_ENTRY_TYPE_PRECERT); | 301 | return SCT_set_log_entry_type(sct, CT_LOG_ENTRY_TYPE_PRECERT); |
278 | case SCT_SOURCE_UNKNOWN: | 302 | case SCT_SOURCE_UNKNOWN: |
279 | break; | 303 | break; |
280 | } | 304 | } |
281 | /* if we aren't sure, leave the log entry type alone */ | 305 | /* if we aren't sure, leave the log entry type alone */ |
282 | return 1; | 306 | return 1; |
283 | } | 307 | } |
284 | 308 | ||
285 | sct_validation_status_t SCT_get_validation_status(const SCT *sct) | 309 | sct_validation_status_t |
310 | SCT_get_validation_status(const SCT *sct) | ||
286 | { | 311 | { |
287 | return sct->validation_status; | 312 | return sct->validation_status; |
288 | } | 313 | } |
289 | 314 | ||
290 | int SCT_validate(SCT *sct, const CT_POLICY_EVAL_CTX *ctx) | 315 | int |
316 | SCT_validate(SCT *sct, const CT_POLICY_EVAL_CTX *ctx) | ||
291 | { | 317 | { |
292 | int is_sct_valid = -1; | 318 | int is_sct_valid = -1; |
293 | SCT_CTX *sctx = NULL; | 319 | SCT_CTX *sctx = NULL; |
294 | X509_PUBKEY *pub = NULL, *log_pkey = NULL; | 320 | X509_PUBKEY *pub = NULL, *log_pkey = NULL; |
295 | const CTLOG *log; | 321 | const CTLOG *log; |
296 | 322 | ||
297 | /* | 323 | /* |
298 | * With an unrecognized SCT version we don't know what such an SCT means, | 324 | * With an unrecognized SCT version we don't know what such an SCT means, |
299 | * let alone validate one. So we return validation failure (0). | 325 | * let alone validate one. So we return validation failure (0). |
300 | */ | 326 | */ |
301 | if (sct->version != SCT_VERSION_V1) { | 327 | if (sct->version != SCT_VERSION_V1) { |
302 | sct->validation_status = SCT_VALIDATION_STATUS_UNKNOWN_VERSION; | 328 | sct->validation_status = SCT_VALIDATION_STATUS_UNKNOWN_VERSION; |
303 | return 0; | 329 | return 0; |
304 | } | 330 | } |
305 | 331 | ||
306 | log = CTLOG_STORE_get0_log_by_id(ctx->log_store, | 332 | log = CTLOG_STORE_get0_log_by_id(ctx->log_store, sct->log_id, |
307 | sct->log_id, sct->log_id_len); | 333 | sct->log_id_len); |
308 | 334 | ||
309 | /* Similarly, an SCT from an unknown log also cannot be validated. */ | 335 | /* Similarly, an SCT from an unknown log also cannot be validated. */ |
310 | if (log == NULL) { | 336 | if (log == NULL) { |
311 | sct->validation_status = SCT_VALIDATION_STATUS_UNKNOWN_LOG; | 337 | sct->validation_status = SCT_VALIDATION_STATUS_UNKNOWN_LOG; |
312 | return 0; | 338 | return 0; |
313 | } | 339 | } |
314 | 340 | ||
315 | sctx = SCT_CTX_new(); | 341 | sctx = SCT_CTX_new(); |
316 | if (sctx == NULL) | 342 | if (sctx == NULL) |
317 | goto err; | 343 | goto err; |
318 | 344 | ||
319 | if (X509_PUBKEY_set(&log_pkey, CTLOG_get0_public_key(log)) != 1) | 345 | if (X509_PUBKEY_set(&log_pkey, CTLOG_get0_public_key(log)) != 1) |
320 | goto err; | 346 | goto err; |
321 | if (SCT_CTX_set1_pubkey(sctx, log_pkey) != 1) | 347 | if (SCT_CTX_set1_pubkey(sctx, log_pkey) != 1) |
322 | goto err; | 348 | goto err; |
323 | 349 | ||
324 | if (SCT_get_log_entry_type(sct) == CT_LOG_ENTRY_TYPE_PRECERT) { | 350 | if (SCT_get_log_entry_type(sct) == CT_LOG_ENTRY_TYPE_PRECERT) { |
325 | EVP_PKEY *issuer_pkey; | 351 | EVP_PKEY *issuer_pkey; |
326 | 352 | ||
327 | if (ctx->issuer == NULL) { | 353 | if (ctx->issuer == NULL) { |
328 | sct->validation_status = SCT_VALIDATION_STATUS_UNVERIFIED; | 354 | sct->validation_status = SCT_VALIDATION_STATUS_UNVERIFIED; |
329 | goto end; | 355 | goto end; |
330 | } | 356 | } |
331 | 357 | ||
332 | issuer_pkey = X509_get0_pubkey(ctx->issuer); | 358 | issuer_pkey = X509_get0_pubkey(ctx->issuer); |
333 | 359 | ||
334 | if (X509_PUBKEY_set(&pub, issuer_pkey) != 1) | 360 | if (X509_PUBKEY_set(&pub, issuer_pkey) != 1) |
335 | goto err; | 361 | goto err; |
336 | if (SCT_CTX_set1_issuer_pubkey(sctx, pub) != 1) | 362 | if (SCT_CTX_set1_issuer_pubkey(sctx, pub) != 1) |
337 | goto err; | 363 | goto err; |
338 | } | 364 | } |
339 | 365 | ||
340 | SCT_CTX_set_time(sctx, ctx->epoch_time_in_ms); | 366 | SCT_CTX_set_time(sctx, ctx->epoch_time_in_ms); |
341 | 367 | ||
342 | /* | 368 | /* |
343 | * XXX: Potential for optimization. This repeats some idempotent heavy | 369 | * XXX: Potential for optimization. This repeats some idempotent heavy |
344 | * lifting on the certificate for each candidate SCT, and appears to not | 370 | * lifting on the certificate for each candidate SCT, and appears to not |
345 | * use any information in the SCT itself, only the certificate is | 371 | * use any information in the SCT itself, only the certificate is |
346 | * processed. So it may make more sense to to do this just once, perhaps | 372 | * processed. So it may make more sense to to do this just once, perhaps |
347 | * associated with the shared (by all SCTs) policy eval ctx. | 373 | * associated with the shared (by all SCTs) policy eval ctx. |
348 | * | 374 | * |
349 | * XXX: Failure here is global (SCT independent) and represents either an | 375 | * XXX: Failure here is global (SCT independent) and represents either an |
350 | * issue with the certificate (e.g. duplicate extensions) or an out of | 376 | * issue with the certificate (e.g. duplicate extensions) or an out of |
351 | * memory condition. When the certificate is incompatible with CT, we just | 377 | * memory condition. When the certificate is incompatible with CT, we just |
352 | * mark the SCTs invalid, rather than report a failure to determine the | 378 | * mark the SCTs invalid, rather than report a failure to determine the |
353 | * validation status. That way, callbacks that want to do "soft" SCT | 379 | * validation status. That way, callbacks that want to do "soft" SCT |
354 | * processing will not abort handshakes with false positive internal | 380 | * processing will not abort handshakes with false positive internal |
355 | * errors. Since the function does not distinguish between certificate | 381 | * errors. Since the function does not distinguish between certificate |
356 | * issues (peer's fault) and internal problems (out fault) the safe thing | 382 | * issues (peer's fault) and internal problems (out fault) the safe thing |
357 | * to do is to report a validation failure and let the callback or | 383 | * to do is to report a validation failure and let the callback or |
358 | * application decide what to do. | 384 | * application decide what to do. |
359 | */ | 385 | */ |
360 | if (SCT_CTX_set1_cert(sctx, ctx->cert, NULL) != 1) | 386 | if (SCT_CTX_set1_cert(sctx, ctx->cert, NULL) != 1) |
361 | sct->validation_status = SCT_VALIDATION_STATUS_UNVERIFIED; | 387 | sct->validation_status = SCT_VALIDATION_STATUS_UNVERIFIED; |
362 | else | 388 | else |
363 | sct->validation_status = SCT_CTX_verify(sctx, sct) == 1 ? | 389 | sct->validation_status = SCT_CTX_verify(sctx, sct) == 1 ? |
364 | SCT_VALIDATION_STATUS_VALID : SCT_VALIDATION_STATUS_INVALID; | 390 | SCT_VALIDATION_STATUS_VALID : SCT_VALIDATION_STATUS_INVALID; |
365 | 391 | ||
366 | end: | 392 | end: |
367 | is_sct_valid = sct->validation_status == SCT_VALIDATION_STATUS_VALID; | 393 | is_sct_valid = sct->validation_status == SCT_VALIDATION_STATUS_VALID; |
368 | err: | 394 | err: |
369 | X509_PUBKEY_free(pub); | 395 | X509_PUBKEY_free(pub); |
370 | X509_PUBKEY_free(log_pkey); | 396 | X509_PUBKEY_free(log_pkey); |
371 | SCT_CTX_free(sctx); | 397 | SCT_CTX_free(sctx); |
372 | 398 | ||
373 | return is_sct_valid; | 399 | return is_sct_valid; |
374 | } | 400 | } |
375 | 401 | ||
376 | int SCT_LIST_validate(const STACK_OF(SCT) *scts, CT_POLICY_EVAL_CTX *ctx) | 402 | int |
403 | SCT_LIST_validate(const STACK_OF(SCT) *scts, CT_POLICY_EVAL_CTX *ctx) | ||
377 | { | 404 | { |
378 | int are_scts_valid = 1; | 405 | int are_scts_valid = 1; |
379 | int sct_count = scts != NULL ? sk_SCT_num(scts) : 0; | 406 | int sct_count = scts != NULL ? sk_SCT_num(scts) : 0; |
380 | int i; | 407 | int i; |
381 | 408 | ||
382 | for (i = 0; i < sct_count; ++i) { | 409 | for (i = 0; i < sct_count; ++i) { |
383 | int is_sct_valid = -1; | 410 | int is_sct_valid = -1; |
384 | SCT *sct = sk_SCT_value(scts, i); | 411 | SCT *sct = sk_SCT_value(scts, i); |
385 | 412 | ||
386 | if (sct == NULL) | 413 | if (sct == NULL) |
387 | continue; | 414 | continue; |
388 | 415 | ||
389 | is_sct_valid = SCT_validate(sct, ctx); | 416 | is_sct_valid = SCT_validate(sct, ctx); |
390 | if (is_sct_valid < 0) | 417 | if (is_sct_valid < 0) |
391 | return is_sct_valid; | 418 | return is_sct_valid; |
392 | are_scts_valid &= is_sct_valid; | 419 | are_scts_valid &= is_sct_valid; |
393 | } | 420 | } |
394 | 421 | ||
395 | return are_scts_valid; | 422 | return are_scts_valid; |
396 | } | 423 | } |
diff --git a/src/lib/libcrypto/ct/ct_sct_ctx.c b/src/lib/libcrypto/ct/ct_sct_ctx.c index 841e768033..4283cb88aa 100644 --- a/src/lib/libcrypto/ct/ct_sct_ctx.c +++ b/src/lib/libcrypto/ct/ct_sct_ctx.c | |||
@@ -20,26 +20,28 @@ | |||
20 | 20 | ||
21 | #include "ct_local.h" | 21 | #include "ct_local.h" |
22 | 22 | ||
23 | SCT_CTX *SCT_CTX_new(void) | 23 | SCT_CTX * |
24 | SCT_CTX_new(void) | ||
24 | { | 25 | { |
25 | SCT_CTX *sctx = OPENSSL_zalloc(sizeof(*sctx)); | 26 | SCT_CTX *sctx = OPENSSL_zalloc(sizeof(*sctx)); |
26 | 27 | ||
27 | if (sctx == NULL) | 28 | if (sctx == NULL) |
28 | CTerr(CT_F_SCT_CTX_NEW, ERR_R_MALLOC_FAILURE); | 29 | CTerr(CT_F_SCT_CTX_NEW, ERR_R_MALLOC_FAILURE); |
29 | 30 | ||
30 | return sctx; | 31 | return sctx; |
31 | } | 32 | } |
32 | 33 | ||
33 | void SCT_CTX_free(SCT_CTX *sctx) | 34 | void |
35 | SCT_CTX_free(SCT_CTX *sctx) | ||
34 | { | 36 | { |
35 | if (sctx == NULL) | 37 | if (sctx == NULL) |
36 | return; | 38 | return; |
37 | EVP_PKEY_free(sctx->pkey); | 39 | EVP_PKEY_free(sctx->pkey); |
38 | OPENSSL_free(sctx->pkeyhash); | 40 | OPENSSL_free(sctx->pkeyhash); |
39 | OPENSSL_free(sctx->ihash); | 41 | OPENSSL_free(sctx->ihash); |
40 | OPENSSL_free(sctx->certder); | 42 | OPENSSL_free(sctx->certder); |
41 | OPENSSL_free(sctx->preder); | 43 | OPENSSL_free(sctx->preder); |
42 | OPENSSL_free(sctx); | 44 | OPENSSL_free(sctx); |
43 | } | 45 | } |
44 | 46 | ||
45 | /* | 47 | /* |
@@ -47,14 +49,16 @@ void SCT_CTX_free(SCT_CTX *sctx) | |||
47 | * If there is more than one extension with that NID, *is_duplicated is set to | 49 | * If there is more than one extension with that NID, *is_duplicated is set to |
48 | * 1, otherwise 0 (unless it is NULL). | 50 | * 1, otherwise 0 (unless it is NULL). |
49 | */ | 51 | */ |
50 | static int ct_x509_get_ext(X509 *cert, int nid, int *is_duplicated) | 52 | static int |
53 | ct_x509_get_ext(X509 *cert, int nid, int *is_duplicated) | ||
51 | { | 54 | { |
52 | int ret = X509_get_ext_by_NID(cert, nid, -1); | 55 | int ret = X509_get_ext_by_NID(cert, nid, -1); |
53 | 56 | ||
54 | if (is_duplicated != NULL) | 57 | if (is_duplicated != NULL) |
55 | *is_duplicated = ret >= 0 && X509_get_ext_by_NID(cert, nid, ret) >= 0; | 58 | *is_duplicated = ret >= 0 && |
59 | X509_get_ext_by_NID(cert, nid, ret) >= 0; | ||
56 | 60 | ||
57 | return ret; | 61 | return ret; |
58 | } | 62 | } |
59 | 63 | ||
60 | /* | 64 | /* |
@@ -62,202 +66,208 @@ static int ct_x509_get_ext(X509 *cert, int nid, int *is_duplicated) | |||
62 | * AKID from the presigner certificate, if necessary. | 66 | * AKID from the presigner certificate, if necessary. |
63 | * Returns 1 on success, 0 otherwise. | 67 | * Returns 1 on success, 0 otherwise. |
64 | */ | 68 | */ |
65 | __owur static int ct_x509_cert_fixup(X509 *cert, X509 *presigner) | 69 | __owur static int |
70 | ct_x509_cert_fixup(X509 *cert, X509 *presigner) | ||
66 | { | 71 | { |
67 | int preidx, certidx; | 72 | int preidx, certidx; |
68 | int pre_akid_ext_is_dup, cert_akid_ext_is_dup; | 73 | int pre_akid_ext_is_dup, cert_akid_ext_is_dup; |
69 | 74 | ||
70 | if (presigner == NULL) | 75 | if (presigner == NULL) |
71 | return 1; | 76 | return 1; |
72 | 77 | ||
73 | preidx = ct_x509_get_ext(presigner, NID_authority_key_identifier, | 78 | preidx = ct_x509_get_ext(presigner, NID_authority_key_identifier, |
74 | &pre_akid_ext_is_dup); | 79 | &pre_akid_ext_is_dup); |
75 | certidx = ct_x509_get_ext(cert, NID_authority_key_identifier, | 80 | certidx = ct_x509_get_ext(cert, NID_authority_key_identifier, |
76 | &cert_akid_ext_is_dup); | 81 | &cert_akid_ext_is_dup); |
77 | 82 | ||
78 | /* An error occurred whilst searching for the extension */ | 83 | /* An error occurred whilst searching for the extension */ |
79 | if (preidx < -1 || certidx < -1) | 84 | if (preidx < -1 || certidx < -1) |
80 | return 0; | 85 | return 0; |
81 | /* Invalid certificate if they contain duplicate extensions */ | 86 | /* Invalid certificate if they contain duplicate extensions */ |
82 | if (pre_akid_ext_is_dup || cert_akid_ext_is_dup) | 87 | if (pre_akid_ext_is_dup || cert_akid_ext_is_dup) |
83 | return 0; | 88 | return 0; |
84 | /* AKID must be present in both certificate or absent in both */ | 89 | /* AKID must be present in both certificate or absent in both */ |
85 | if (preidx >= 0 && certidx == -1) | 90 | if (preidx >= 0 && certidx == -1) |
86 | return 0; | 91 | return 0; |
87 | if (preidx == -1 && certidx >= 0) | 92 | if (preidx == -1 && certidx >= 0) |
88 | return 0; | 93 | return 0; |
89 | /* Copy issuer name */ | 94 | /* Copy issuer name */ |
90 | if (!X509_set_issuer_name(cert, X509_get_issuer_name(presigner))) | 95 | if (!X509_set_issuer_name(cert, X509_get_issuer_name(presigner))) |
91 | return 0; | 96 | return 0; |
92 | if (preidx != -1) { | 97 | if (preidx != -1) { |
93 | /* Retrieve and copy AKID encoding */ | 98 | /* Retrieve and copy AKID encoding */ |
94 | X509_EXTENSION *preext = X509_get_ext(presigner, preidx); | 99 | X509_EXTENSION *preext = X509_get_ext(presigner, preidx); |
95 | X509_EXTENSION *certext = X509_get_ext(cert, certidx); | 100 | X509_EXTENSION *certext = X509_get_ext(cert, certidx); |
96 | ASN1_OCTET_STRING *preextdata; | 101 | ASN1_OCTET_STRING *preextdata; |
97 | 102 | ||
98 | /* Should never happen */ | 103 | /* Should never happen */ |
99 | if (preext == NULL || certext == NULL) | 104 | if (preext == NULL || certext == NULL) |
100 | return 0; | 105 | return 0; |
101 | preextdata = X509_EXTENSION_get_data(preext); | 106 | preextdata = X509_EXTENSION_get_data(preext); |
102 | if (preextdata == NULL || | 107 | if (preextdata == NULL || |
103 | !X509_EXTENSION_set_data(certext, preextdata)) | 108 | !X509_EXTENSION_set_data(certext, preextdata)) |
104 | return 0; | 109 | return 0; |
105 | } | 110 | } |
106 | return 1; | 111 | return 1; |
107 | } | 112 | } |
108 | 113 | ||
109 | int SCT_CTX_set1_cert(SCT_CTX *sctx, X509 *cert, X509 *presigner) | 114 | int |
115 | SCT_CTX_set1_cert(SCT_CTX *sctx, X509 *cert, X509 *presigner) | ||
110 | { | 116 | { |
111 | unsigned char *certder = NULL, *preder = NULL; | 117 | unsigned char *certder = NULL, *preder = NULL; |
112 | X509 *pretmp = NULL; | 118 | X509 *pretmp = NULL; |
113 | int certderlen = 0, prederlen = 0; | 119 | int certderlen = 0, prederlen = 0; |
114 | int idx = -1; | 120 | int idx = -1; |
115 | int poison_ext_is_dup, sct_ext_is_dup; | 121 | int poison_ext_is_dup, sct_ext_is_dup; |
116 | int poison_idx = ct_x509_get_ext(cert, NID_ct_precert_poison, &poison_ext_is_dup); | 122 | int poison_idx = ct_x509_get_ext(cert, NID_ct_precert_poison, &poison_ext_is_dup); |
117 | 123 | ||
118 | /* Duplicate poison extensions are present - error */ | 124 | /* Duplicate poison extensions are present - error */ |
119 | if (poison_ext_is_dup) | 125 | if (poison_ext_is_dup) |
120 | goto err; | 126 | goto err; |
121 | 127 | ||
122 | /* If *cert doesn't have a poison extension, it isn't a precert */ | 128 | /* If *cert doesn't have a poison extension, it isn't a precert */ |
123 | if (poison_idx == -1) { | 129 | if (poison_idx == -1) { |
124 | /* cert isn't a precert, so we shouldn't have a presigner */ | 130 | /* cert isn't a precert, so we shouldn't have a presigner */ |
125 | if (presigner != NULL) | 131 | if (presigner != NULL) |
126 | goto err; | 132 | goto err; |
127 | 133 | ||
128 | certderlen = i2d_X509(cert, &certder); | 134 | certderlen = i2d_X509(cert, &certder); |
129 | if (certderlen < 0) | 135 | if (certderlen < 0) |
130 | goto err; | 136 | goto err; |
131 | } | 137 | } |
132 | 138 | ||
133 | /* See if cert has a precert SCTs extension */ | 139 | /* See if cert has a precert SCTs extension */ |
134 | idx = ct_x509_get_ext(cert, NID_ct_precert_scts, &sct_ext_is_dup); | 140 | idx = ct_x509_get_ext(cert, NID_ct_precert_scts, &sct_ext_is_dup); |
135 | /* Duplicate SCT extensions are present - error */ | 141 | /* Duplicate SCT extensions are present - error */ |
136 | if (sct_ext_is_dup) | 142 | if (sct_ext_is_dup) |
137 | goto err; | 143 | goto err; |
138 | 144 | ||
139 | if (idx >= 0 && poison_idx >= 0) { | 145 | if (idx >= 0 && poison_idx >= 0) { |
140 | /* | 146 | /* |
141 | * cert can't both contain SCTs (i.e. have an SCT extension) and be a | 147 | * cert can't both contain SCTs (i.e. have an SCT extension) and be a |
142 | * precert (i.e. have a poison extension). | 148 | * precert (i.e. have a poison extension). |
143 | */ | 149 | */ |
144 | goto err; | 150 | goto err; |
145 | } | 151 | } |
146 | 152 | ||
147 | if (idx == -1) { | 153 | if (idx == -1) { |
148 | idx = poison_idx; | 154 | idx = poison_idx; |
149 | } | 155 | } |
150 | 156 | ||
151 | /* | 157 | /* |
152 | * If either a poison or SCT extension is present, remove it before encoding | 158 | * If either a poison or SCT extension is present, remove it before encoding |
153 | * cert. This, along with ct_x509_cert_fixup(), gets a TBSCertificate (see | 159 | * cert. This, along with ct_x509_cert_fixup(), gets a TBSCertificate (see |
154 | * RFC5280) from cert, which is what the CT log signed when it produced the | 160 | * RFC5280) from cert, which is what the CT log signed when it produced the |
155 | * SCT. | 161 | * SCT. |
156 | */ | 162 | */ |
157 | if (idx >= 0) { | 163 | if (idx >= 0) { |
158 | X509_EXTENSION *ext; | 164 | X509_EXTENSION *ext; |
159 | 165 | ||
160 | /* Take a copy of certificate so we don't modify passed version */ | 166 | /* Take a copy of certificate so we don't modify passed version */ |
161 | pretmp = X509_dup(cert); | 167 | pretmp = X509_dup(cert); |
162 | if (pretmp == NULL) | 168 | if (pretmp == NULL) |
163 | goto err; | 169 | goto err; |
164 | 170 | ||
165 | ext = X509_delete_ext(pretmp, idx); | 171 | ext = X509_delete_ext(pretmp, idx); |
166 | X509_EXTENSION_free(ext); | 172 | X509_EXTENSION_free(ext); |
167 | 173 | ||
168 | if (!ct_x509_cert_fixup(pretmp, presigner)) | 174 | if (!ct_x509_cert_fixup(pretmp, presigner)) |
169 | goto err; | 175 | goto err; |
170 | 176 | ||
171 | prederlen = i2d_re_X509_tbs(pretmp, &preder); | 177 | prederlen = i2d_re_X509_tbs(pretmp, &preder); |
172 | if (prederlen <= 0) | 178 | if (prederlen <= 0) |
173 | goto err; | 179 | goto err; |
174 | } | 180 | } |
175 | 181 | ||
176 | X509_free(pretmp); | 182 | X509_free(pretmp); |
177 | 183 | ||
178 | OPENSSL_free(sctx->certder); | 184 | OPENSSL_free(sctx->certder); |
179 | sctx->certder = certder; | 185 | sctx->certder = certder; |
180 | sctx->certderlen = certderlen; | 186 | sctx->certderlen = certderlen; |
181 | 187 | ||
182 | OPENSSL_free(sctx->preder); | 188 | OPENSSL_free(sctx->preder); |
183 | sctx->preder = preder; | 189 | sctx->preder = preder; |
184 | sctx->prederlen = prederlen; | 190 | sctx->prederlen = prederlen; |
185 | 191 | ||
186 | return 1; | 192 | return 1; |
187 | err: | 193 | err: |
188 | OPENSSL_free(certder); | 194 | OPENSSL_free(certder); |
189 | OPENSSL_free(preder); | 195 | OPENSSL_free(preder); |
190 | X509_free(pretmp); | 196 | X509_free(pretmp); |
191 | return 0; | 197 | return 0; |
192 | } | 198 | } |
193 | 199 | ||
194 | __owur static int ct_public_key_hash(X509_PUBKEY *pkey, unsigned char **hash, | 200 | __owur static int |
195 | size_t *hash_len) | 201 | ct_public_key_hash(X509_PUBKEY *pkey, unsigned char **hash, size_t *hash_len) |
196 | { | 202 | { |
197 | int ret = 0; | 203 | int ret = 0; |
198 | unsigned char *md = NULL, *der = NULL; | 204 | unsigned char *md = NULL, *der = NULL; |
199 | int der_len; | 205 | int der_len; |
200 | unsigned int md_len; | 206 | unsigned int md_len; |
201 | 207 | ||
202 | /* Reuse buffer if possible */ | 208 | /* Reuse buffer if possible */ |
203 | if (*hash != NULL && *hash_len >= SHA256_DIGEST_LENGTH) { | 209 | if (*hash != NULL && *hash_len >= SHA256_DIGEST_LENGTH) { |
204 | md = *hash; | 210 | md = *hash; |
205 | } else { | 211 | } else { |
206 | md = OPENSSL_malloc(SHA256_DIGEST_LENGTH); | 212 | md = OPENSSL_malloc(SHA256_DIGEST_LENGTH); |
207 | if (md == NULL) | 213 | if (md == NULL) |
208 | goto err; | 214 | goto err; |
209 | } | 215 | } |
210 | 216 | ||
211 | /* Calculate key hash */ | 217 | /* Calculate key hash */ |
212 | der_len = i2d_X509_PUBKEY(pkey, &der); | 218 | der_len = i2d_X509_PUBKEY(pkey, &der); |
213 | if (der_len <= 0) | 219 | if (der_len <= 0) |
214 | goto err; | 220 | goto err; |
215 | 221 | ||
216 | if (!EVP_Digest(der, der_len, md, &md_len, EVP_sha256(), NULL)) | 222 | if (!EVP_Digest(der, der_len, md, &md_len, EVP_sha256(), NULL)) |
217 | goto err; | 223 | goto err; |
218 | 224 | ||
219 | if (md != *hash) { | 225 | if (md != *hash) { |
220 | OPENSSL_free(*hash); | 226 | OPENSSL_free(*hash); |
221 | *hash = md; | 227 | *hash = md; |
222 | *hash_len = SHA256_DIGEST_LENGTH; | 228 | *hash_len = SHA256_DIGEST_LENGTH; |
223 | } | 229 | } |
224 | 230 | ||
225 | md = NULL; | 231 | md = NULL; |
226 | ret = 1; | 232 | ret = 1; |
227 | err: | 233 | err: |
228 | OPENSSL_free(md); | 234 | OPENSSL_free(md); |
229 | OPENSSL_free(der); | 235 | OPENSSL_free(der); |
230 | return ret; | 236 | return ret; |
231 | } | 237 | } |
232 | 238 | ||
233 | int SCT_CTX_set1_issuer(SCT_CTX *sctx, const X509 *issuer) | 239 | int |
240 | SCT_CTX_set1_issuer(SCT_CTX *sctx, const X509 *issuer) | ||
234 | { | 241 | { |
235 | return SCT_CTX_set1_issuer_pubkey(sctx, X509_get_X509_PUBKEY(issuer)); | 242 | return SCT_CTX_set1_issuer_pubkey(sctx, X509_get_X509_PUBKEY(issuer)); |
236 | } | 243 | } |
237 | 244 | ||
238 | int SCT_CTX_set1_issuer_pubkey(SCT_CTX *sctx, X509_PUBKEY *pubkey) | 245 | int |
246 | SCT_CTX_set1_issuer_pubkey(SCT_CTX *sctx, X509_PUBKEY *pubkey) | ||
239 | { | 247 | { |
240 | return ct_public_key_hash(pubkey, &sctx->ihash, &sctx->ihashlen); | 248 | return ct_public_key_hash(pubkey, &sctx->ihash, &sctx->ihashlen); |
241 | } | 249 | } |
242 | 250 | ||
243 | int SCT_CTX_set1_pubkey(SCT_CTX *sctx, X509_PUBKEY *pubkey) | 251 | int |
252 | SCT_CTX_set1_pubkey(SCT_CTX *sctx, X509_PUBKEY *pubkey) | ||
244 | { | 253 | { |
245 | EVP_PKEY *pkey = X509_PUBKEY_get(pubkey); | 254 | EVP_PKEY *pkey = X509_PUBKEY_get(pubkey); |
246 | 255 | ||
247 | if (pkey == NULL) | 256 | if (pkey == NULL) |
248 | return 0; | 257 | return 0; |
249 | 258 | ||
250 | if (!ct_public_key_hash(pubkey, &sctx->pkeyhash, &sctx->pkeyhashlen)) { | 259 | if (!ct_public_key_hash(pubkey, &sctx->pkeyhash, &sctx->pkeyhashlen)) { |
251 | EVP_PKEY_free(pkey); | 260 | EVP_PKEY_free(pkey); |
252 | return 0; | 261 | return 0; |
253 | } | 262 | } |
254 | 263 | ||
255 | EVP_PKEY_free(sctx->pkey); | 264 | EVP_PKEY_free(sctx->pkey); |
256 | sctx->pkey = pkey; | 265 | sctx->pkey = pkey; |
257 | return 1; | 266 | return 1; |
258 | } | 267 | } |
259 | 268 | ||
260 | void SCT_CTX_set_time(SCT_CTX *sctx, uint64_t time_in_ms) | 269 | void |
270 | SCT_CTX_set_time(SCT_CTX *sctx, uint64_t time_in_ms) | ||
261 | { | 271 | { |
262 | sctx->epoch_time_in_ms = time_in_ms; | 272 | sctx->epoch_time_in_ms = time_in_ms; |
263 | } | 273 | } |
diff --git a/src/lib/libcrypto/ct/ct_vfy.c b/src/lib/libcrypto/ct/ct_vfy.c index 74fd34f415..74642a9304 100644 --- a/src/lib/libcrypto/ct/ct_vfy.c +++ b/src/lib/libcrypto/ct/ct_vfy.c | |||
@@ -17,124 +17,126 @@ | |||
17 | #include "ct_local.h" | 17 | #include "ct_local.h" |
18 | 18 | ||
19 | typedef enum sct_signature_type_t { | 19 | typedef enum sct_signature_type_t { |
20 | SIGNATURE_TYPE_NOT_SET = -1, | 20 | SIGNATURE_TYPE_NOT_SET = -1, |
21 | SIGNATURE_TYPE_CERT_TIMESTAMP, | 21 | SIGNATURE_TYPE_CERT_TIMESTAMP, |
22 | SIGNATURE_TYPE_TREE_HASH | 22 | SIGNATURE_TYPE_TREE_HASH |
23 | } SCT_SIGNATURE_TYPE; | 23 | } SCT_SIGNATURE_TYPE; |
24 | 24 | ||
25 | /* | 25 | /* |
26 | * Update encoding for SCT signature verification/generation to supplied | 26 | * Update encoding for SCT signature verification/generation to supplied |
27 | * EVP_MD_CTX. | 27 | * EVP_MD_CTX. |
28 | */ | 28 | */ |
29 | static int sct_ctx_update(EVP_MD_CTX *ctx, const SCT_CTX *sctx, const SCT *sct) | 29 | static int |
30 | sct_ctx_update(EVP_MD_CTX *ctx, const SCT_CTX *sctx, const SCT *sct) | ||
30 | { | 31 | { |
31 | unsigned char tmpbuf[12]; | 32 | unsigned char tmpbuf[12]; |
32 | unsigned char *p, *der; | 33 | unsigned char *p, *der; |
33 | size_t derlen; | 34 | size_t derlen; |
34 | /*+ | 35 | /*+ |
35 | * digitally-signed struct { | 36 | * digitally-signed struct { |
36 | * (1 byte) Version sct_version; | 37 | * (1 byte) Version sct_version; |
37 | * (1 byte) SignatureType signature_type = certificate_timestamp; | 38 | * (1 byte) SignatureType signature_type = certificate_timestamp; |
38 | * (8 bytes) uint64 timestamp; | 39 | * (8 bytes) uint64 timestamp; |
39 | * (2 bytes) LogEntryType entry_type; | 40 | * (2 bytes) LogEntryType entry_type; |
40 | * (? bytes) select(entry_type) { | 41 | * (? bytes) select(entry_type) { |
41 | * case x509_entry: ASN.1Cert; | 42 | * case x509_entry: ASN.1Cert; |
42 | * case precert_entry: PreCert; | 43 | * case precert_entry: PreCert; |
43 | * } signed_entry; | 44 | * } signed_entry; |
44 | * (2 bytes + sct->ext_len) CtExtensions extensions; | 45 | * (2 bytes + sct->ext_len) CtExtensions extensions; |
45 | * } | 46 | * } |
46 | */ | 47 | */ |
47 | if (sct->entry_type == CT_LOG_ENTRY_TYPE_NOT_SET) | 48 | if (sct->entry_type == CT_LOG_ENTRY_TYPE_NOT_SET) |
48 | return 0; | 49 | return 0; |
49 | if (sct->entry_type == CT_LOG_ENTRY_TYPE_PRECERT && sctx->ihash == NULL) | 50 | if (sct->entry_type == CT_LOG_ENTRY_TYPE_PRECERT && sctx->ihash == NULL) |
50 | return 0; | 51 | return 0; |
51 | 52 | ||
52 | p = tmpbuf; | 53 | p = tmpbuf; |
53 | *p++ = sct->version; | 54 | *p++ = sct->version; |
54 | *p++ = SIGNATURE_TYPE_CERT_TIMESTAMP; | 55 | *p++ = SIGNATURE_TYPE_CERT_TIMESTAMP; |
55 | l2n8(sct->timestamp, p); | 56 | l2n8(sct->timestamp, p); |
56 | s2n(sct->entry_type, p); | 57 | s2n(sct->entry_type, p); |
57 | 58 | ||
58 | if (!EVP_DigestUpdate(ctx, tmpbuf, p - tmpbuf)) | 59 | if (!EVP_DigestUpdate(ctx, tmpbuf, p - tmpbuf)) |
59 | return 0; | 60 | return 0; |
60 | 61 | ||
61 | if (sct->entry_type == CT_LOG_ENTRY_TYPE_X509) { | 62 | if (sct->entry_type == CT_LOG_ENTRY_TYPE_X509) { |
62 | der = sctx->certder; | 63 | der = sctx->certder; |
63 | derlen = sctx->certderlen; | 64 | derlen = sctx->certderlen; |
64 | } else { | 65 | } else { |
65 | if (!EVP_DigestUpdate(ctx, sctx->ihash, sctx->ihashlen)) | 66 | if (!EVP_DigestUpdate(ctx, sctx->ihash, sctx->ihashlen)) |
66 | return 0; | 67 | return 0; |
67 | der = sctx->preder; | 68 | der = sctx->preder; |
68 | derlen = sctx->prederlen; | 69 | derlen = sctx->prederlen; |
69 | } | 70 | } |
70 | 71 | ||
71 | /* If no encoding available, fatal error */ | 72 | /* If no encoding available, fatal error */ |
72 | if (der == NULL) | 73 | if (der == NULL) |
73 | return 0; | 74 | return 0; |
74 | 75 | ||
75 | /* Include length first */ | 76 | /* Include length first */ |
76 | p = tmpbuf; | 77 | p = tmpbuf; |
77 | l2n3(derlen, p); | 78 | l2n3(derlen, p); |
78 | 79 | ||
79 | if (!EVP_DigestUpdate(ctx, tmpbuf, 3)) | 80 | if (!EVP_DigestUpdate(ctx, tmpbuf, 3)) |
80 | return 0; | 81 | return 0; |
81 | if (!EVP_DigestUpdate(ctx, der, derlen)) | 82 | if (!EVP_DigestUpdate(ctx, der, derlen)) |
82 | return 0; | 83 | return 0; |
83 | 84 | ||
84 | /* Add any extensions */ | 85 | /* Add any extensions */ |
85 | p = tmpbuf; | 86 | p = tmpbuf; |
86 | s2n(sct->ext_len, p); | 87 | s2n(sct->ext_len, p); |
87 | if (!EVP_DigestUpdate(ctx, tmpbuf, 2)) | 88 | if (!EVP_DigestUpdate(ctx, tmpbuf, 2)) |
88 | return 0; | 89 | return 0; |
89 | 90 | ||
90 | if (sct->ext_len && !EVP_DigestUpdate(ctx, sct->ext, sct->ext_len)) | 91 | if (sct->ext_len && !EVP_DigestUpdate(ctx, sct->ext, sct->ext_len)) |
91 | return 0; | 92 | return 0; |
92 | 93 | ||
93 | return 1; | 94 | return 1; |
94 | } | 95 | } |
95 | 96 | ||
96 | int SCT_CTX_verify(const SCT_CTX *sctx, const SCT *sct) | 97 | int |
98 | SCT_CTX_verify(const SCT_CTX *sctx, const SCT *sct) | ||
97 | { | 99 | { |
98 | EVP_MD_CTX *ctx = NULL; | 100 | EVP_MD_CTX *ctx = NULL; |
99 | int ret = 0; | 101 | int ret = 0; |
100 | 102 | ||
101 | if (!SCT_is_complete(sct) || sctx->pkey == NULL || | 103 | if (!SCT_is_complete(sct) || sctx->pkey == NULL || |
102 | sct->entry_type == CT_LOG_ENTRY_TYPE_NOT_SET || | 104 | sct->entry_type == CT_LOG_ENTRY_TYPE_NOT_SET || |
103 | (sct->entry_type == CT_LOG_ENTRY_TYPE_PRECERT && sctx->ihash == NULL)) { | 105 | (sct->entry_type == CT_LOG_ENTRY_TYPE_PRECERT && sctx->ihash == NULL)) { |
104 | CTerr(CT_F_SCT_CTX_VERIFY, CT_R_SCT_NOT_SET); | 106 | CTerr(CT_F_SCT_CTX_VERIFY, CT_R_SCT_NOT_SET); |
105 | return 0; | 107 | return 0; |
106 | } | 108 | } |
107 | if (sct->version != SCT_VERSION_V1) { | 109 | if (sct->version != SCT_VERSION_V1) { |
108 | CTerr(CT_F_SCT_CTX_VERIFY, CT_R_SCT_UNSUPPORTED_VERSION); | 110 | CTerr(CT_F_SCT_CTX_VERIFY, CT_R_SCT_UNSUPPORTED_VERSION); |
109 | return 0; | 111 | return 0; |
110 | } | 112 | } |
111 | if (sct->log_id_len != sctx->pkeyhashlen || | 113 | if (sct->log_id_len != sctx->pkeyhashlen || |
112 | memcmp(sct->log_id, sctx->pkeyhash, sctx->pkeyhashlen) != 0) { | 114 | memcmp(sct->log_id, sctx->pkeyhash, sctx->pkeyhashlen) != 0) { |
113 | CTerr(CT_F_SCT_CTX_VERIFY, CT_R_SCT_LOG_ID_MISMATCH); | 115 | CTerr(CT_F_SCT_CTX_VERIFY, CT_R_SCT_LOG_ID_MISMATCH); |
114 | return 0; | 116 | return 0; |
115 | } | 117 | } |
116 | if (sct->timestamp > sctx->epoch_time_in_ms) { | 118 | if (sct->timestamp > sctx->epoch_time_in_ms) { |
117 | CTerr(CT_F_SCT_CTX_VERIFY, CT_R_SCT_FUTURE_TIMESTAMP); | 119 | CTerr(CT_F_SCT_CTX_VERIFY, CT_R_SCT_FUTURE_TIMESTAMP); |
118 | return 0; | 120 | return 0; |
119 | } | 121 | } |
120 | 122 | ||
121 | ctx = EVP_MD_CTX_new(); | 123 | ctx = EVP_MD_CTX_new(); |
122 | if (ctx == NULL) | 124 | if (ctx == NULL) |
123 | goto end; | 125 | goto end; |
124 | 126 | ||
125 | if (!EVP_DigestVerifyInit(ctx, NULL, EVP_sha256(), NULL, sctx->pkey)) | 127 | if (!EVP_DigestVerifyInit(ctx, NULL, EVP_sha256(), NULL, sctx->pkey)) |
126 | goto end; | 128 | goto end; |
127 | 129 | ||
128 | if (!sct_ctx_update(ctx, sctx, sct)) | 130 | if (!sct_ctx_update(ctx, sctx, sct)) |
129 | goto end; | 131 | goto end; |
130 | 132 | ||
131 | /* Verify signature */ | 133 | /* Verify signature */ |
132 | ret = EVP_DigestVerifyFinal(ctx, sct->sig, sct->sig_len); | 134 | ret = EVP_DigestVerifyFinal(ctx, sct->sig, sct->sig_len); |
133 | /* If ret < 0 some other error: fall through without setting error */ | 135 | /* If ret < 0 some other error: fall through without setting error */ |
134 | if (ret == 0) | 136 | if (ret == 0) |
135 | CTerr(CT_F_SCT_CTX_VERIFY, CT_R_SCT_INVALID_SIGNATURE); | 137 | CTerr(CT_F_SCT_CTX_VERIFY, CT_R_SCT_INVALID_SIGNATURE); |
136 | 138 | ||
137 | end: | 139 | end: |
138 | EVP_MD_CTX_free(ctx); | 140 | EVP_MD_CTX_free(ctx); |
139 | return ret; | 141 | return ret; |
140 | } | 142 | } |
diff --git a/src/lib/libcrypto/ct/ct_x509v3.c b/src/lib/libcrypto/ct/ct_x509v3.c index 19c2a852d2..32312e2c6b 100644 --- a/src/lib/libcrypto/ct/ct_x509v3.c +++ b/src/lib/libcrypto/ct/ct_x509v3.c | |||
@@ -13,92 +13,94 @@ | |||
13 | 13 | ||
14 | #include "ct_local.h" | 14 | #include "ct_local.h" |
15 | 15 | ||
16 | static char *i2s_poison(const X509V3_EXT_METHOD *method, void *val) | 16 | static char * |
17 | i2s_poison(const X509V3_EXT_METHOD *method, void *val) | ||
17 | { | 18 | { |
18 | return OPENSSL_strdup("NULL"); | 19 | return OPENSSL_strdup("NULL"); |
19 | } | 20 | } |
20 | 21 | ||
21 | static void *s2i_poison(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, const char *str) | 22 | static void * |
23 | s2i_poison(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, const char *str) | ||
22 | { | 24 | { |
23 | return ASN1_NULL_new(); | 25 | return ASN1_NULL_new(); |
24 | } | 26 | } |
25 | 27 | ||
26 | static int i2r_SCT_LIST(X509V3_EXT_METHOD *method, STACK_OF(SCT) *sct_list, | 28 | static int |
27 | BIO *out, int indent) | 29 | i2r_SCT_LIST(X509V3_EXT_METHOD *method, STACK_OF(SCT) *sct_list, BIO *out, |
30 | int indent) | ||
28 | { | 31 | { |
29 | SCT_LIST_print(sct_list, out, indent, "\n", NULL); | 32 | SCT_LIST_print(sct_list, out, indent, "\n", NULL); |
30 | return 1; | 33 | return 1; |
31 | } | 34 | } |
32 | 35 | ||
33 | static int set_sct_list_source(STACK_OF(SCT) *s, sct_source_t source) | 36 | static int |
37 | set_sct_list_source(STACK_OF(SCT) *s, sct_source_t source) | ||
34 | { | 38 | { |
35 | if (s != NULL) { | 39 | if (s != NULL) { |
36 | int i; | 40 | int i; |
37 | 41 | ||
38 | for (i = 0; i < sk_SCT_num(s); i++) { | 42 | for (i = 0; i < sk_SCT_num(s); i++) { |
39 | int res = SCT_set_source(sk_SCT_value(s, i), source); | 43 | int res = SCT_set_source(sk_SCT_value(s, i), source); |
40 | 44 | ||
41 | if (res != 1) { | 45 | if (res != 1) { |
42 | return 0; | 46 | return 0; |
43 | } | 47 | } |
44 | } | 48 | } |
45 | } | 49 | } |
46 | return 1; | 50 | return 1; |
47 | } | 51 | } |
48 | 52 | ||
49 | static STACK_OF(SCT) *x509_ext_d2i_SCT_LIST(STACK_OF(SCT) **a, | 53 | static STACK_OF(SCT) * |
50 | const unsigned char **pp, | 54 | x509_ext_d2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, long len) |
51 | long len) | ||
52 | { | 55 | { |
53 | STACK_OF(SCT) *s = d2i_SCT_LIST(a, pp, len); | 56 | STACK_OF(SCT) *s = d2i_SCT_LIST(a, pp, len); |
54 | 57 | ||
55 | if (set_sct_list_source(s, SCT_SOURCE_X509V3_EXTENSION) != 1) { | 58 | if (set_sct_list_source(s, SCT_SOURCE_X509V3_EXTENSION) != 1) { |
56 | SCT_LIST_free(s); | 59 | SCT_LIST_free(s); |
57 | *a = NULL; | 60 | *a = NULL; |
58 | return NULL; | 61 | return NULL; |
59 | } | 62 | } |
60 | return s; | 63 | return s; |
61 | } | 64 | } |
62 | 65 | ||
63 | static STACK_OF(SCT) *ocsp_ext_d2i_SCT_LIST(STACK_OF(SCT) **a, | 66 | static STACK_OF(SCT) *o |
64 | const unsigned char **pp, | 67 | csp_ext_d2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, long len) |
65 | long len) | ||
66 | { | 68 | { |
67 | STACK_OF(SCT) *s = d2i_SCT_LIST(a, pp, len); | 69 | STACK_OF(SCT) *s = d2i_SCT_LIST(a, pp, len); |
68 | 70 | ||
69 | if (set_sct_list_source(s, SCT_SOURCE_OCSP_STAPLED_RESPONSE) != 1) { | 71 | if (set_sct_list_source(s, SCT_SOURCE_OCSP_STAPLED_RESPONSE) != 1) { |
70 | SCT_LIST_free(s); | 72 | SCT_LIST_free(s); |
71 | *a = NULL; | 73 | *a = NULL; |
72 | return NULL; | 74 | return NULL; |
73 | } | 75 | } |
74 | return s; | 76 | return s; |
75 | } | 77 | } |
76 | 78 | ||
77 | /* Handlers for X509v3/OCSP Certificate Transparency extensions */ | 79 | /* Handlers for X509v3/OCSP Certificate Transparency extensions */ |
78 | const X509V3_EXT_METHOD v3_ct_scts[3] = { | 80 | const X509V3_EXT_METHOD v3_ct_scts[3] = { |
79 | /* X509v3 extension in certificates that contains SCTs */ | 81 | /* X509v3 extension in certificates that contains SCTs */ |
80 | { NID_ct_precert_scts, 0, NULL, | 82 | { NID_ct_precert_scts, 0, NULL, |
81 | NULL, (X509V3_EXT_FREE)SCT_LIST_free, | 83 | NULL, (X509V3_EXT_FREE)SCT_LIST_free, |
82 | (X509V3_EXT_D2I)x509_ext_d2i_SCT_LIST, (X509V3_EXT_I2D)i2d_SCT_LIST, | 84 | (X509V3_EXT_D2I)x509_ext_d2i_SCT_LIST, (X509V3_EXT_I2D)i2d_SCT_LIST, |
83 | NULL, NULL, | 85 | NULL, NULL, |
84 | NULL, NULL, | 86 | NULL, NULL, |
85 | (X509V3_EXT_I2R)i2r_SCT_LIST, NULL, | 87 | (X509V3_EXT_I2R)i2r_SCT_LIST, NULL, |
86 | NULL }, | 88 | NULL }, |
87 | 89 | ||
88 | /* X509v3 extension to mark a certificate as a pre-certificate */ | 90 | /* X509v3 extension to mark a certificate as a pre-certificate */ |
89 | { NID_ct_precert_poison, 0, ASN1_ITEM_ref(ASN1_NULL), | 91 | { NID_ct_precert_poison, 0, ASN1_ITEM_ref(ASN1_NULL), |
90 | NULL, NULL, NULL, NULL, | 92 | NULL, NULL, NULL, NULL, |
91 | i2s_poison, s2i_poison, | 93 | i2s_poison, s2i_poison, |
92 | NULL, NULL, | 94 | NULL, NULL, |
93 | NULL, NULL, | 95 | NULL, NULL, |
94 | NULL }, | 96 | NULL }, |
95 | 97 | ||
96 | /* OCSP extension that contains SCTs */ | 98 | /* OCSP extension that contains SCTs */ |
97 | { NID_ct_cert_scts, 0, NULL, | 99 | { NID_ct_cert_scts, 0, NULL, |
98 | 0, (X509V3_EXT_FREE)SCT_LIST_free, | 100 | 0, (X509V3_EXT_FREE)SCT_LIST_free, |
99 | (X509V3_EXT_D2I)ocsp_ext_d2i_SCT_LIST, (X509V3_EXT_I2D)i2d_SCT_LIST, | 101 | (X509V3_EXT_D2I)ocsp_ext_d2i_SCT_LIST, (X509V3_EXT_I2D)i2d_SCT_LIST, |
100 | NULL, NULL, | 102 | NULL, NULL, |
101 | NULL, NULL, | 103 | NULL, NULL, |
102 | (X509V3_EXT_I2R)i2r_SCT_LIST, NULL, | 104 | (X509V3_EXT_I2R)i2r_SCT_LIST, NULL, |
103 | NULL }, | 105 | NULL }, |
104 | }; | 106 | }; |