summaryrefslogtreecommitdiff
path: root/src/lib/libtls/tls_keypair.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libtls/tls_keypair.c')
-rw-r--r--src/lib/libtls/tls_keypair.c93
1 files changed, 46 insertions, 47 deletions
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}