summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2018-02-10 04:57:35 +0000
committerjsing <>2018-02-10 04:57:35 +0000
commit55d7f5b4e436517c599ae10fb98d503022d8cca3 (patch)
tree220397ac4d651f9ebaa0a028f81a800a6991a0eb
parent1ad3c784cb5a6f09eb35a87556f57f9a129ac572 (diff)
downloadopenbsd-55d7f5b4e436517c599ae10fb98d503022d8cca3.tar.gz
openbsd-55d7f5b4e436517c599ae10fb98d503022d8cca3.tar.bz2
openbsd-55d7f5b4e436517c599ae10fb98d503022d8cca3.zip
Move the keypair pubkey hash handling code to during config.
The keypair pubkey hash was being generated and set in the keypair when the TLS context was being configured. This code should not be messing around with the keypair contents, since it is part of the config (and not the context). Instead, generate the pubkey hash and store it in the keypair when the certificate is configured. This means that we are guaranteed to have the pubkey hash and as a side benefit, we identify bad certificate content when it is provided, instead of during the context configuration. ok beck@
-rw-r--r--src/lib/libtls/tls.c33
-rw-r--r--src/lib/libtls/tls_config.c18
-rw-r--r--src/lib/libtls/tls_internal.h20
-rw-r--r--src/lib/libtls/tls_keypair.c93
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
293int 293int
294tls_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
321int
294tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx, 322tls_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
431tls_config_set_cert_mem(struct tls_config *config, const uint8_t *cert, 432tls_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
437int 439int
@@ -592,7 +594,8 @@ int
592tls_config_set_key_mem(struct tls_config *config, const uint8_t *key, 594tls_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
598static int 601static int
@@ -789,7 +792,8 @@ int
789tls_config_set_ocsp_staple_mem(struct tls_config *config, const uint8_t *staple, 792tls_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
795int 799int
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,
199int tls_set_string(const char **_dest, const char *_src); 199int tls_set_string(const char **_dest, const char *_src);
200 200
201struct tls_keypair *tls_keypair_new(void); 201struct tls_keypair *tls_keypair_new(void);
202void tls_keypair_clear_key(struct tls_keypair *_keypair); 202void tls_keypair_clear(struct tls_keypair *_keypair);
203void tls_keypair_free(struct tls_keypair *_keypair);
203int tls_keypair_set_cert_file(struct tls_keypair *_keypair, 204int 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);
205int tls_keypair_set_cert_mem(struct tls_keypair *_keypair, const uint8_t *_cert, 206int 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);
207int tls_keypair_set_key_file(struct tls_keypair *_keypair, 208int 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);
209int tls_keypair_set_key_mem(struct tls_keypair *_keypair, const uint8_t *_key, 210int 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);
211int tls_keypair_set_ocsp_staple_file(struct tls_keypair *_keypair, 212int 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);
213int tls_keypair_set_ocsp_staple_mem(struct tls_keypair *_keypair, 214int 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);
215void tls_keypair_clear(struct tls_keypair *_keypair);
216void tls_keypair_free(struct tls_keypair *_keypair);
217int tls_keypair_load_cert(struct tls_keypair *_keypair, 216int tls_keypair_load_cert(struct tls_keypair *_keypair,
218 struct tls_error *_error, X509 **_cert); 217 struct tls_error *_error, X509 **_cert);
219int tls_keypair_pubkey_hash(struct tls_keypair *_keypair,
220 struct tls_error *_error, char **_hash);
221 218
222struct tls_sni_ctx *tls_sni_ctx_new(void); 219struct tls_sni_ctx *tls_sni_ctx_new(void);
223void tls_sni_ctx_free(struct tls_sni_ctx *sni_ctx); 220void 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);
281int tls_hex_string(const unsigned char *_in, size_t _inlen, char **_out, 278int tls_hex_string(const unsigned char *_in, size_t _inlen, char **_out,
282 size_t *_outlen); 279 size_t *_outlen);
283int tls_cert_hash(X509 *_cert, char **_hash); 280int tls_cert_hash(X509 *_cert, char **_hash);
281int tls_cert_pubkey_hash(X509 *_cert, char **_hash);
284 282
285int tls_password_cb(char *_buf, int _size, int _rwflag, void *_u); 283int 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
32void 32static void
33tls_keypair_clear_key(struct tls_keypair *keypair) 33tls_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
40static int
41tls_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
40int 67int
41tls_keypair_set_cert_file(struct tls_keypair *keypair, struct tls_error *error, 68tls_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
48int 77int
49tls_keypair_set_cert_mem(struct tls_keypair *keypair, const uint8_t *cert, 78tls_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
55int 86int
@@ -62,8 +93,8 @@ tls_keypair_set_key_file(struct tls_keypair *keypair, struct tls_error *error,
62} 93}
63 94
64int 95int
65tls_keypair_set_key_mem(struct tls_keypair *keypair, const uint8_t *key, 96tls_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
80int 111int
81tls_keypair_set_ocsp_staple_mem(struct tls_keypair *keypair, 112tls_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,
88void 119void
89tls_keypair_clear(struct tls_keypair *keypair) 120tls_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
147int
148tls_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}