diff options
Diffstat (limited to 'src/lib/libtls/tls_keypair.c')
| -rw-r--r-- | src/lib/libtls/tls_keypair.c | 93 |
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 | ||
| 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 | } | ||
