diff options
Diffstat (limited to 'src/lib/libtls/tls_config.c')
| -rw-r--r-- | src/lib/libtls/tls_config.c | 114 |
1 files changed, 100 insertions, 14 deletions
diff --git a/src/lib/libtls/tls_config.c b/src/lib/libtls/tls_config.c index 9c2b5810f6..b395337f49 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.15 2016/04/28 16:48:44 jsing Exp $ */ | 1 | /* $OpenBSD: tls_config.c,v 1.16 2016/04/28 17:05:59 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -57,6 +57,63 @@ set_mem(char **dest, size_t *destlen, const void *src, size_t srclen) | |||
| 57 | return 0; | 57 | return 0; |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | static struct tls_keypair * | ||
| 61 | tls_keypair_new() | ||
| 62 | { | ||
| 63 | return calloc(1, sizeof(struct tls_keypair)); | ||
| 64 | } | ||
| 65 | |||
| 66 | static int | ||
| 67 | tls_keypair_set_cert_file(struct tls_keypair *keypair, const char *cert_file) | ||
| 68 | { | ||
| 69 | return set_string(&keypair->cert_file, cert_file); | ||
| 70 | } | ||
| 71 | |||
| 72 | static int | ||
| 73 | tls_keypair_set_cert_mem(struct tls_keypair *keypair, const uint8_t *cert, | ||
| 74 | size_t len) | ||
| 75 | { | ||
| 76 | return set_mem(&keypair->cert_mem, &keypair->cert_len, cert, len); | ||
| 77 | } | ||
| 78 | |||
| 79 | static int | ||
| 80 | tls_keypair_set_key_file(struct tls_keypair *keypair, const char *key_file) | ||
| 81 | { | ||
| 82 | return set_string(&keypair->key_file, key_file); | ||
| 83 | } | ||
| 84 | |||
| 85 | static int | ||
| 86 | tls_keypair_set_key_mem(struct tls_keypair *keypair, const uint8_t *key, | ||
| 87 | size_t len) | ||
| 88 | { | ||
| 89 | if (keypair->key_mem != NULL) | ||
| 90 | explicit_bzero(keypair->key_mem, keypair->key_len); | ||
| 91 | return set_mem(&keypair->key_mem, &keypair->key_len, key, len); | ||
| 92 | } | ||
| 93 | |||
| 94 | static void | ||
| 95 | tls_keypair_clear(struct tls_keypair *keypair) | ||
| 96 | { | ||
| 97 | tls_keypair_set_cert_mem(keypair, NULL, 0); | ||
| 98 | tls_keypair_set_key_mem(keypair, NULL, 0); | ||
| 99 | } | ||
| 100 | |||
| 101 | static void | ||
| 102 | tls_keypair_free(struct tls_keypair *keypair) | ||
| 103 | { | ||
| 104 | if (keypair == NULL) | ||
| 105 | return; | ||
| 106 | |||
| 107 | tls_keypair_clear(keypair); | ||
| 108 | |||
| 109 | free((char *)keypair->cert_file); | ||
| 110 | free(keypair->cert_mem); | ||
| 111 | free((char *)keypair->key_file); | ||
| 112 | free(keypair->key_mem); | ||
| 113 | |||
| 114 | free(keypair); | ||
| 115 | } | ||
| 116 | |||
| 60 | struct tls_config * | 117 | struct tls_config * |
| 61 | tls_config_new(void) | 118 | tls_config_new(void) |
| 62 | { | 119 | { |
| @@ -65,6 +122,9 @@ tls_config_new(void) | |||
| 65 | if ((config = calloc(1, sizeof(*config))) == NULL) | 122 | if ((config = calloc(1, sizeof(*config))) == NULL) |
| 66 | return (NULL); | 123 | return (NULL); |
| 67 | 124 | ||
| 125 | if ((config->keypair = tls_keypair_new()) == NULL) | ||
| 126 | goto err; | ||
| 127 | |||
| 68 | /* | 128 | /* |
| 69 | * Default configuration. | 129 | * Default configuration. |
| 70 | */ | 130 | */ |
| @@ -94,20 +154,21 @@ tls_config_new(void) | |||
| 94 | void | 154 | void |
| 95 | tls_config_free(struct tls_config *config) | 155 | tls_config_free(struct tls_config *config) |
| 96 | { | 156 | { |
| 157 | struct tls_keypair *kp, *nkp; | ||
| 158 | |||
| 97 | if (config == NULL) | 159 | if (config == NULL) |
| 98 | return; | 160 | return; |
| 99 | 161 | ||
| 100 | tls_config_clear_keys(config); | 162 | for (kp = config->keypair; kp != NULL; kp = nkp) { |
| 163 | nkp = kp->next; | ||
| 164 | tls_keypair_free(kp); | ||
| 165 | } | ||
| 101 | 166 | ||
| 102 | free(config->error.msg); | 167 | free(config->error.msg); |
| 103 | 168 | ||
| 104 | free((char *)config->ca_file); | 169 | free((char *)config->ca_file); |
| 105 | free((char *)config->ca_path); | 170 | free((char *)config->ca_path); |
| 106 | free((char *)config->cert_file); | ||
| 107 | free(config->cert_mem); | ||
| 108 | free((char *)config->ciphers); | 171 | free((char *)config->ciphers); |
| 109 | free((char *)config->key_file); | ||
| 110 | free(config->key_mem); | ||
| 111 | 172 | ||
| 112 | free(config); | 173 | free(config); |
| 113 | } | 174 | } |
| @@ -121,9 +182,12 @@ tls_config_error(struct tls_config *config) | |||
| 121 | void | 182 | void |
| 122 | tls_config_clear_keys(struct tls_config *config) | 183 | tls_config_clear_keys(struct tls_config *config) |
| 123 | { | 184 | { |
| 185 | struct tls_keypair *kp; | ||
| 186 | |||
| 187 | for (kp = config->keypair; kp != NULL; kp = kp->next) | ||
| 188 | tls_keypair_clear(kp); | ||
| 189 | |||
| 124 | tls_config_set_ca_mem(config, NULL, 0); | 190 | tls_config_set_ca_mem(config, NULL, 0); |
| 125 | tls_config_set_cert_mem(config, NULL, 0); | ||
| 126 | tls_config_set_key_mem(config, NULL, 0); | ||
| 127 | } | 191 | } |
| 128 | 192 | ||
| 129 | int | 193 | int |
| @@ -205,14 +269,14 @@ tls_config_set_ca_mem(struct tls_config *config, const uint8_t *ca, size_t len) | |||
| 205 | int | 269 | int |
| 206 | tls_config_set_cert_file(struct tls_config *config, const char *cert_file) | 270 | tls_config_set_cert_file(struct tls_config *config, const char *cert_file) |
| 207 | { | 271 | { |
| 208 | return set_string(&config->cert_file, cert_file); | 272 | return tls_keypair_set_cert_file(config->keypair, cert_file); |
| 209 | } | 273 | } |
| 210 | 274 | ||
| 211 | int | 275 | int |
| 212 | tls_config_set_cert_mem(struct tls_config *config, const uint8_t *cert, | 276 | tls_config_set_cert_mem(struct tls_config *config, const uint8_t *cert, |
| 213 | size_t len) | 277 | size_t len) |
| 214 | { | 278 | { |
| 215 | return set_mem(&config->cert_mem, &config->cert_len, cert, len); | 279 | return tls_keypair_set_cert_mem(config->keypair, cert, len); |
| 216 | } | 280 | } |
| 217 | 281 | ||
| 218 | int | 282 | int |
| @@ -272,16 +336,38 @@ tls_config_set_ecdhecurve(struct tls_config *config, const char *name) | |||
| 272 | int | 336 | int |
| 273 | tls_config_set_key_file(struct tls_config *config, const char *key_file) | 337 | tls_config_set_key_file(struct tls_config *config, const char *key_file) |
| 274 | { | 338 | { |
| 275 | return set_string(&config->key_file, key_file); | 339 | return tls_keypair_set_key_file(config->keypair, key_file); |
| 276 | } | 340 | } |
| 277 | 341 | ||
| 278 | int | 342 | int |
| 279 | tls_config_set_key_mem(struct tls_config *config, const uint8_t *key, | 343 | tls_config_set_key_mem(struct tls_config *config, const uint8_t *key, |
| 280 | size_t len) | 344 | size_t len) |
| 281 | { | 345 | { |
| 282 | if (config->key_mem) | 346 | return tls_keypair_set_key_mem(config->keypair, key, len); |
| 283 | explicit_bzero(config->key_mem, config->key_len); | 347 | } |
| 284 | return set_mem(&config->key_mem, &config->key_len, key, len); | 348 | |
| 349 | int | ||
| 350 | tls_config_set_keypair_file(struct tls_config *config, | ||
| 351 | const char *cert_file, const char *key_file) | ||
| 352 | { | ||
| 353 | if (tls_config_set_cert_file(config, cert_file) != 0) | ||
| 354 | return (-1); | ||
| 355 | if (tls_config_set_key_file(config, key_file) != 0) | ||
| 356 | return (-1); | ||
| 357 | |||
| 358 | return (0); | ||
| 359 | } | ||
| 360 | |||
| 361 | int | ||
| 362 | tls_config_set_keypair_mem(struct tls_config *config, const uint8_t *cert, | ||
| 363 | size_t cert_len, const uint8_t *key, size_t key_len) | ||
| 364 | { | ||
| 365 | if (tls_config_set_cert_mem(config, cert, cert_len) != 0) | ||
| 366 | return (-1); | ||
| 367 | if (tls_config_set_key_mem(config, key, key_len) != 0) | ||
| 368 | return (-1); | ||
| 369 | |||
| 370 | return (0); | ||
| 285 | } | 371 | } |
| 286 | 372 | ||
| 287 | void | 373 | void |
