diff options
-rw-r--r-- | src/lib/libtls/tls.c | 33 | ||||
-rw-r--r-- | src/lib/libtls/tls_config.c | 18 | ||||
-rw-r--r-- | src/lib/libtls/tls_internal.h | 20 | ||||
-rw-r--r-- | src/lib/libtls/tls_keypair.c | 93 |
4 files changed, 95 insertions, 69 deletions
diff --git a/src/lib/libtls/tls.c b/src/lib/libtls/tls.c index 0e206e2c7e..8f2c7dde05 100644 --- a/src/lib/libtls/tls.c +++ b/src/lib/libtls/tls.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls.c,v 1.74 2018/02/08 10:19:31 jsing Exp $ */ | 1 | /* $OpenBSD: tls.c,v 1.75 2018/02/10 04:57:35 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -291,6 +291,34 @@ tls_cert_hash(X509 *cert, char **hash) | |||
291 | } | 291 | } |
292 | 292 | ||
293 | int | 293 | int |
294 | tls_cert_pubkey_hash(X509 *cert, char **hash) | ||
295 | { | ||
296 | char d[EVP_MAX_MD_SIZE], *dhex = NULL; | ||
297 | int dlen, rv = -1; | ||
298 | |||
299 | free(*hash); | ||
300 | *hash = NULL; | ||
301 | |||
302 | if (X509_pubkey_digest(cert, EVP_sha256(), d, &dlen) != 1) | ||
303 | goto err; | ||
304 | |||
305 | if (tls_hex_string(d, dlen, &dhex, NULL) != 0) | ||
306 | goto err; | ||
307 | |||
308 | if (asprintf(hash, "SHA256:%s", dhex) == -1) { | ||
309 | *hash = NULL; | ||
310 | goto err; | ||
311 | } | ||
312 | |||
313 | rv = 0; | ||
314 | |||
315 | err: | ||
316 | free(dhex); | ||
317 | |||
318 | return (rv); | ||
319 | } | ||
320 | |||
321 | int | ||
294 | tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx, | 322 | tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx, |
295 | struct tls_keypair *keypair, int required) | 323 | struct tls_keypair *keypair, int required) |
296 | { | 324 | { |
@@ -313,9 +341,6 @@ tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx, | |||
313 | tls_set_errorx(ctx, "failed to load certificate"); | 341 | tls_set_errorx(ctx, "failed to load certificate"); |
314 | goto err; | 342 | goto err; |
315 | } | 343 | } |
316 | if (tls_keypair_pubkey_hash(keypair, &ctx->error, | ||
317 | &keypair->pubkey_hash) == -1) | ||
318 | goto err; | ||
319 | } | 344 | } |
320 | 345 | ||
321 | if (keypair->key_mem != NULL) { | 346 | if (keypair->key_mem != NULL) { |
diff --git a/src/lib/libtls/tls_config.c b/src/lib/libtls/tls_config.c index 6dfebfaebf..2dab4fc7d8 100644 --- a/src/lib/libtls/tls_config.c +++ b/src/lib/libtls/tls_config.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls_config.c,v 1.48 2018/02/10 04:41:24 jsing Exp $ */ | 1 | /* $OpenBSD: tls_config.c,v 1.49 2018/02/10 04:57:35 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -351,12 +351,13 @@ tls_config_add_keypair_mem_internal(struct tls_config *config, const uint8_t *ce | |||
351 | 351 | ||
352 | if ((keypair = tls_keypair_new()) == NULL) | 352 | if ((keypair = tls_keypair_new()) == NULL) |
353 | return (-1); | 353 | return (-1); |
354 | if (tls_keypair_set_cert_mem(keypair, cert, cert_len) != 0) | 354 | if (tls_keypair_set_cert_mem(keypair, &config->error, cert, cert_len) != 0) |
355 | goto err; | 355 | goto err; |
356 | if (tls_keypair_set_key_mem(keypair, key, key_len) != 0) | 356 | if (tls_keypair_set_key_mem(keypair, &config->error, key, key_len) != 0) |
357 | goto err; | 357 | goto err; |
358 | if (staple != NULL && | 358 | if (staple != NULL && |
359 | tls_keypair_set_ocsp_staple_mem(keypair, staple, staple_len) != 0) | 359 | tls_keypair_set_ocsp_staple_mem(keypair, &config->error, staple, |
360 | staple_len) != 0) | ||
360 | goto err; | 361 | goto err; |
361 | 362 | ||
362 | tls_config_keypair_add(config, keypair); | 363 | tls_config_keypair_add(config, keypair); |
@@ -431,7 +432,8 @@ int | |||
431 | tls_config_set_cert_mem(struct tls_config *config, const uint8_t *cert, | 432 | tls_config_set_cert_mem(struct tls_config *config, const uint8_t *cert, |
432 | size_t len) | 433 | size_t len) |
433 | { | 434 | { |
434 | return tls_keypair_set_cert_mem(config->keypair, cert, len); | 435 | return tls_keypair_set_cert_mem(config->keypair, &config->error, |
436 | cert, len); | ||
435 | } | 437 | } |
436 | 438 | ||
437 | int | 439 | int |
@@ -592,7 +594,8 @@ int | |||
592 | tls_config_set_key_mem(struct tls_config *config, const uint8_t *key, | 594 | tls_config_set_key_mem(struct tls_config *config, const uint8_t *key, |
593 | size_t len) | 595 | size_t len) |
594 | { | 596 | { |
595 | return tls_keypair_set_key_mem(config->keypair, key, len); | 597 | return tls_keypair_set_key_mem(config->keypair, &config->error, |
598 | key, len); | ||
596 | } | 599 | } |
597 | 600 | ||
598 | static int | 601 | static int |
@@ -789,7 +792,8 @@ int | |||
789 | tls_config_set_ocsp_staple_mem(struct tls_config *config, const uint8_t *staple, | 792 | tls_config_set_ocsp_staple_mem(struct tls_config *config, const uint8_t *staple, |
790 | size_t len) | 793 | size_t len) |
791 | { | 794 | { |
792 | return tls_keypair_set_ocsp_staple_mem(config->keypair, staple, len); | 795 | return tls_keypair_set_ocsp_staple_mem(config->keypair, &config->error, |
796 | staple, len); | ||
793 | } | 797 | } |
794 | 798 | ||
795 | int | 799 | int |
diff --git a/src/lib/libtls/tls_internal.h b/src/lib/libtls/tls_internal.h index 14265037eb..f8b9e6118e 100644 --- a/src/lib/libtls/tls_internal.h +++ b/src/lib/libtls/tls_internal.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls_internal.h,v 1.69 2018/02/10 04:41:24 jsing Exp $ */ | 1 | /* $OpenBSD: tls_internal.h,v 1.70 2018/02/10 04:57:35 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org> | 3 | * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org> |
4 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 4 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
@@ -199,25 +199,22 @@ int tls_set_mem(char **_dest, size_t *_destlen, const void *_src, | |||
199 | int tls_set_string(const char **_dest, const char *_src); | 199 | int tls_set_string(const char **_dest, const char *_src); |
200 | 200 | ||
201 | struct tls_keypair *tls_keypair_new(void); | 201 | struct tls_keypair *tls_keypair_new(void); |
202 | void tls_keypair_clear_key(struct tls_keypair *_keypair); | 202 | void tls_keypair_clear(struct tls_keypair *_keypair); |
203 | void tls_keypair_free(struct tls_keypair *_keypair); | ||
203 | int tls_keypair_set_cert_file(struct tls_keypair *_keypair, | 204 | int tls_keypair_set_cert_file(struct tls_keypair *_keypair, |
204 | struct tls_error *_error, const char *_cert_file); | 205 | struct tls_error *_error, const char *_cert_file); |
205 | int tls_keypair_set_cert_mem(struct tls_keypair *_keypair, const uint8_t *_cert, | 206 | int tls_keypair_set_cert_mem(struct tls_keypair *_keypair, |
206 | size_t _len); | 207 | struct tls_error *_error, const uint8_t *_cert, size_t _len); |
207 | int tls_keypair_set_key_file(struct tls_keypair *_keypair, | 208 | int tls_keypair_set_key_file(struct tls_keypair *_keypair, |
208 | struct tls_error *_error, const char *_key_file); | 209 | struct tls_error *_error, const char *_key_file); |
209 | int tls_keypair_set_key_mem(struct tls_keypair *_keypair, const uint8_t *_key, | 210 | int tls_keypair_set_key_mem(struct tls_keypair *_keypair, |
210 | size_t _len); | 211 | struct tls_error *_error, const uint8_t *_key, size_t _len); |
211 | int tls_keypair_set_ocsp_staple_file(struct tls_keypair *_keypair, | 212 | int tls_keypair_set_ocsp_staple_file(struct tls_keypair *_keypair, |
212 | struct tls_error *_error, const char *_ocsp_file); | 213 | struct tls_error *_error, const char *_ocsp_file); |
213 | int tls_keypair_set_ocsp_staple_mem(struct tls_keypair *_keypair, | 214 | int tls_keypair_set_ocsp_staple_mem(struct tls_keypair *_keypair, |
214 | const uint8_t *_staple, size_t _len); | 215 | struct tls_error *_error, const uint8_t *_staple, size_t _len); |
215 | void tls_keypair_clear(struct tls_keypair *_keypair); | ||
216 | void tls_keypair_free(struct tls_keypair *_keypair); | ||
217 | int tls_keypair_load_cert(struct tls_keypair *_keypair, | 216 | int tls_keypair_load_cert(struct tls_keypair *_keypair, |
218 | struct tls_error *_error, X509 **_cert); | 217 | struct tls_error *_error, X509 **_cert); |
219 | int tls_keypair_pubkey_hash(struct tls_keypair *_keypair, | ||
220 | struct tls_error *_error, char **_hash); | ||
221 | 218 | ||
222 | struct tls_sni_ctx *tls_sni_ctx_new(void); | 219 | struct tls_sni_ctx *tls_sni_ctx_new(void); |
223 | void tls_sni_ctx_free(struct tls_sni_ctx *sni_ctx); | 220 | void tls_sni_ctx_free(struct tls_sni_ctx *sni_ctx); |
@@ -281,6 +278,7 @@ struct tls_ocsp *tls_ocsp_setup_from_peer(struct tls *ctx); | |||
281 | int tls_hex_string(const unsigned char *_in, size_t _inlen, char **_out, | 278 | int tls_hex_string(const unsigned char *_in, size_t _inlen, char **_out, |
282 | size_t *_outlen); | 279 | size_t *_outlen); |
283 | int tls_cert_hash(X509 *_cert, char **_hash); | 280 | int tls_cert_hash(X509 *_cert, char **_hash); |
281 | int tls_cert_pubkey_hash(X509 *_cert, char **_hash); | ||
284 | 282 | ||
285 | int tls_password_cb(char *_buf, int _size, int _rwflag, void *_u); | 283 | int tls_password_cb(char *_buf, int _size, int _rwflag, void *_u); |
286 | 284 | ||
diff --git a/src/lib/libtls/tls_keypair.c b/src/lib/libtls/tls_keypair.c index 626a95853f..03e7f4ad76 100644 --- a/src/lib/libtls/tls_keypair.c +++ b/src/lib/libtls/tls_keypair.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls_keypair.c,v 1.4 2018/02/08 10:19:31 jsing Exp $ */ | 1 | /* $OpenBSD: tls_keypair.c,v 1.5 2018/02/10 04:57:35 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -29,7 +29,7 @@ tls_keypair_new(void) | |||
29 | return calloc(1, sizeof(struct tls_keypair)); | 29 | return calloc(1, sizeof(struct tls_keypair)); |
30 | } | 30 | } |
31 | 31 | ||
32 | void | 32 | static void |
33 | tls_keypair_clear_key(struct tls_keypair *keypair) | 33 | tls_keypair_clear_key(struct tls_keypair *keypair) |
34 | { | 34 | { |
35 | freezero(keypair->key_mem, keypair->key_len); | 35 | freezero(keypair->key_mem, keypair->key_len); |
@@ -37,19 +37,50 @@ tls_keypair_clear_key(struct tls_keypair *keypair) | |||
37 | keypair->key_len = 0; | 37 | keypair->key_len = 0; |
38 | } | 38 | } |
39 | 39 | ||
40 | static int | ||
41 | tls_keypair_pubkey_hash(struct tls_keypair *keypair, struct tls_error *error) | ||
42 | { | ||
43 | X509 *cert = NULL; | ||
44 | int rv = -1; | ||
45 | |||
46 | free(keypair->pubkey_hash); | ||
47 | keypair->pubkey_hash = NULL; | ||
48 | |||
49 | if (keypair->cert_mem == NULL) { | ||
50 | rv = 0; | ||
51 | goto done; | ||
52 | } | ||
53 | |||
54 | if (tls_keypair_load_cert(keypair, error, &cert) == -1) | ||
55 | goto err; | ||
56 | if (tls_cert_pubkey_hash(cert, &keypair->pubkey_hash) == -1) | ||
57 | goto err; | ||
58 | |||
59 | rv = 0; | ||
60 | |||
61 | err: | ||
62 | X509_free(cert); | ||
63 | done: | ||
64 | return (rv); | ||
65 | } | ||
66 | |||
40 | int | 67 | int |
41 | tls_keypair_set_cert_file(struct tls_keypair *keypair, struct tls_error *error, | 68 | tls_keypair_set_cert_file(struct tls_keypair *keypair, struct tls_error *error, |
42 | const char *cert_file) | 69 | const char *cert_file) |
43 | { | 70 | { |
44 | return tls_config_load_file(error, "certificate", cert_file, | 71 | if (tls_config_load_file(error, "certificate", cert_file, |
45 | &keypair->cert_mem, &keypair->cert_len); | 72 | &keypair->cert_mem, &keypair->cert_len) == -1) |
73 | return -1; | ||
74 | return tls_keypair_pubkey_hash(keypair, error); | ||
46 | } | 75 | } |
47 | 76 | ||
48 | int | 77 | int |
49 | tls_keypair_set_cert_mem(struct tls_keypair *keypair, const uint8_t *cert, | 78 | tls_keypair_set_cert_mem(struct tls_keypair *keypair, struct tls_error *error, |
50 | size_t len) | 79 | const uint8_t *cert, size_t len) |
51 | { | 80 | { |
52 | return tls_set_mem(&keypair->cert_mem, &keypair->cert_len, cert, len); | 81 | if (tls_set_mem(&keypair->cert_mem, &keypair->cert_len, cert, len) == -1) |
82 | return -1; | ||
83 | return tls_keypair_pubkey_hash(keypair, error); | ||
53 | } | 84 | } |
54 | 85 | ||
55 | int | 86 | int |
@@ -62,8 +93,8 @@ tls_keypair_set_key_file(struct tls_keypair *keypair, struct tls_error *error, | |||
62 | } | 93 | } |
63 | 94 | ||
64 | int | 95 | int |
65 | tls_keypair_set_key_mem(struct tls_keypair *keypair, const uint8_t *key, | 96 | tls_keypair_set_key_mem(struct tls_keypair *keypair, struct tls_error *error, |
66 | size_t len) | 97 | const uint8_t *key, size_t len) |
67 | { | 98 | { |
68 | tls_keypair_clear_key(keypair); | 99 | tls_keypair_clear_key(keypair); |
69 | return tls_set_mem(&keypair->key_mem, &keypair->key_len, key, len); | 100 | return tls_set_mem(&keypair->key_mem, &keypair->key_len, key, len); |
@@ -79,7 +110,7 @@ tls_keypair_set_ocsp_staple_file(struct tls_keypair *keypair, | |||
79 | 110 | ||
80 | int | 111 | int |
81 | tls_keypair_set_ocsp_staple_mem(struct tls_keypair *keypair, | 112 | tls_keypair_set_ocsp_staple_mem(struct tls_keypair *keypair, |
82 | const uint8_t *staple, size_t len) | 113 | struct tls_error *error, const uint8_t *staple, size_t len) |
83 | { | 114 | { |
84 | return tls_set_mem(&keypair->ocsp_staple, &keypair->ocsp_staple_len, | 115 | return tls_set_mem(&keypair->ocsp_staple, &keypair->ocsp_staple_len, |
85 | staple, len); | 116 | staple, len); |
@@ -88,9 +119,11 @@ tls_keypair_set_ocsp_staple_mem(struct tls_keypair *keypair, | |||
88 | void | 119 | void |
89 | tls_keypair_clear(struct tls_keypair *keypair) | 120 | tls_keypair_clear(struct tls_keypair *keypair) |
90 | { | 121 | { |
91 | tls_keypair_set_cert_mem(keypair, NULL, 0); | 122 | struct tls_error error; |
92 | tls_keypair_set_key_mem(keypair, NULL, 0); | 123 | |
93 | tls_keypair_set_ocsp_staple_mem(keypair, NULL, 0); | 124 | tls_keypair_set_cert_mem(keypair, &error, NULL, 0); |
125 | tls_keypair_set_key_mem(keypair, &error, NULL, 0); | ||
126 | tls_keypair_set_ocsp_staple_mem(keypair, &error, NULL, 0); | ||
94 | 127 | ||
95 | free(keypair->pubkey_hash); | 128 | free(keypair->pubkey_hash); |
96 | keypair->pubkey_hash = NULL; | 129 | keypair->pubkey_hash = NULL; |
@@ -143,37 +176,3 @@ tls_keypair_load_cert(struct tls_keypair *keypair, struct tls_error *error, | |||
143 | 176 | ||
144 | return (rv); | 177 | return (rv); |
145 | } | 178 | } |
146 | |||
147 | int | ||
148 | tls_keypair_pubkey_hash(struct tls_keypair *keypair, struct tls_error *error, | ||
149 | char **hash) | ||
150 | { | ||
151 | X509 *cert = NULL; | ||
152 | char d[EVP_MAX_MD_SIZE], *dhex = NULL; | ||
153 | int dlen, rv = -1; | ||
154 | |||
155 | free(*hash); | ||
156 | *hash = NULL; | ||
157 | |||
158 | if (tls_keypair_load_cert(keypair, error, &cert) == -1) | ||
159 | goto err; | ||
160 | |||
161 | if (X509_pubkey_digest(cert, EVP_sha256(), d, &dlen) != 1) | ||
162 | goto err; | ||
163 | |||
164 | if (tls_hex_string(d, dlen, &dhex, NULL) != 0) | ||
165 | goto err; | ||
166 | |||
167 | if (asprintf(hash, "SHA256:%s", dhex) == -1) { | ||
168 | *hash = NULL; | ||
169 | goto err; | ||
170 | } | ||
171 | |||
172 | rv = 0; | ||
173 | |||
174 | err: | ||
175 | X509_free(cert); | ||
176 | free(dhex); | ||
177 | |||
178 | return (rv); | ||
179 | } | ||