summaryrefslogtreecommitdiff
path: root/src/lib/libtls/tls_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libtls/tls_config.c')
-rw-r--r--src/lib/libtls/tls_config.c114
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
60static struct tls_keypair *
61tls_keypair_new()
62{
63 return calloc(1, sizeof(struct tls_keypair));
64}
65
66static int
67tls_keypair_set_cert_file(struct tls_keypair *keypair, const char *cert_file)
68{
69 return set_string(&keypair->cert_file, cert_file);
70}
71
72static int
73tls_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
79static int
80tls_keypair_set_key_file(struct tls_keypair *keypair, const char *key_file)
81{
82 return set_string(&keypair->key_file, key_file);
83}
84
85static int
86tls_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
94static void
95tls_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
101static void
102tls_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
60struct tls_config * 117struct tls_config *
61tls_config_new(void) 118tls_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)
94void 154void
95tls_config_free(struct tls_config *config) 155tls_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)
121void 182void
122tls_config_clear_keys(struct tls_config *config) 183tls_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
129int 193int
@@ -205,14 +269,14 @@ tls_config_set_ca_mem(struct tls_config *config, const uint8_t *ca, size_t len)
205int 269int
206tls_config_set_cert_file(struct tls_config *config, const char *cert_file) 270tls_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
211int 275int
212tls_config_set_cert_mem(struct tls_config *config, const uint8_t *cert, 276tls_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
218int 282int
@@ -272,16 +336,38 @@ tls_config_set_ecdhecurve(struct tls_config *config, const char *name)
272int 336int
273tls_config_set_key_file(struct tls_config *config, const char *key_file) 337tls_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
278int 342int
279tls_config_set_key_mem(struct tls_config *config, const uint8_t *key, 343tls_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
349int
350tls_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
361int
362tls_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
287void 373void