summaryrefslogtreecommitdiff
path: root/src/lib/libressl/ressl_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libressl/ressl_config.c')
-rw-r--r--src/lib/libressl/ressl_config.c121
1 files changed, 84 insertions, 37 deletions
diff --git a/src/lib/libressl/ressl_config.c b/src/lib/libressl/ressl_config.c
index aa353be01f..5deb8d187f 100644
--- a/src/lib/libressl/ressl_config.c
+++ b/src/lib/libressl/ressl_config.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ressl_config.c,v 1.8 2014/08/27 10:46:53 reyk Exp $ */ 1/* $OpenBSD: ressl_config.c,v 1.9 2014/09/28 06:24:00 tedu Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -21,27 +21,60 @@
21#include <ressl.h> 21#include <ressl.h>
22#include "ressl_internal.h" 22#include "ressl_internal.h"
23 23
24/* 24static int
25 * Default configuration. 25set_string(const char **dest, const char *src)
26 */ 26{
27struct ressl_config ressl_config_default = { 27 free((char *)*dest);
28 .ca_file = _PATH_SSL_CA_FILE, 28 *dest = NULL;
29 .ca_path = NULL, 29 if (src != NULL)
30 .ciphers = NULL, 30 if ((*dest = strdup(src)) == NULL)
31 .ecdhcurve = NID_X9_62_prime256v1, 31 return -1;
32 .verify = 1, 32 return 0;
33 .verify_depth = 6, 33}
34}; 34
35static void *
36memdup(const void *in, size_t len)
37{
38 void *out;
39
40 if ((out = malloc(len)) == NULL)
41 return NULL;
42 memcpy(out, in, len);
43 return out;
44}
45
46static int
47set_mem(char **dest, size_t *destlen, const void *src, size_t srclen)
48{
49 free(*dest);
50 *dest = NULL;
51 *destlen = 0;
52 if (src != NULL)
53 if ((*dest = memdup(src, srclen)) == NULL)
54 return -1;
55 *destlen = srclen;
56 return 0;
57}
35 58
36struct ressl_config * 59struct ressl_config *
37ressl_config_new(void) 60ressl_config_new(void)
38{ 61{
39 struct ressl_config *config; 62 struct ressl_config *config;
40 63
41 if ((config = malloc(sizeof(*config))) == NULL) 64 if ((config = calloc(1, sizeof(*config))) == NULL)
42 return (NULL); 65 return (NULL);
43 66
44 memcpy(config, &ressl_config_default, sizeof(*config)); 67 /*
68 * Default configuration.
69 */
70 if (ressl_config_set_ca_file(config, _PATH_SSL_CA_FILE) != 0) {
71 ressl_config_free(config);
72 return (NULL);
73 }
74 ressl_config_verify(config);
75 ressl_config_set_verify_depth(config, 6);
76 /* ? use function ? */
77 config->ecdhcurve = NID_X9_62_prime256v1;
45 78
46 return (config); 79 return (config);
47} 80}
@@ -49,38 +82,50 @@ ressl_config_new(void)
49void 82void
50ressl_config_free(struct ressl_config *config) 83ressl_config_free(struct ressl_config *config)
51{ 84{
85 if (config == NULL)
86 return;
87 free((char *)config->ca_file);
88 free((char *)config->ca_path);
89 free((char *)config->cert_file);
90 free(config->cert_mem);
91 free((char *)config->ciphers);
92 free((char *)config->key_file);
93 if (config->key_mem != NULL) {
94 explicit_bzero(config->key_mem, config->key_len);
95 free(config->key_mem);
96 }
52 free(config); 97 free(config);
53} 98}
54 99
55void 100int
56ressl_config_set_ca_file(struct ressl_config *config, char *ca_file) 101ressl_config_set_ca_file(struct ressl_config *config, const char *ca_file)
57{ 102{
58 config->ca_file = ca_file; 103 return set_string(&config->ca_file, ca_file);
59} 104}
60 105
61void 106int
62ressl_config_set_ca_path(struct ressl_config *config, char *ca_path) 107ressl_config_set_ca_path(struct ressl_config *config, const char *ca_path)
63{ 108{
64 config->ca_path = ca_path; 109 return set_string(&config->ca_path, ca_path);
65} 110}
66 111
67void 112int
68ressl_config_set_cert_file(struct ressl_config *config, char *cert_file) 113ressl_config_set_cert_file(struct ressl_config *config, const char *cert_file)
69{ 114{
70 config->cert_file = cert_file; 115 return set_string(&config->cert_file, cert_file);
71} 116}
72 117
73void 118int
74ressl_config_set_cert_mem(struct ressl_config *config, char *cert, size_t len) 119ressl_config_set_cert_mem(struct ressl_config *config, const uint8_t *cert,
120 size_t len)
75{ 121{
76 config->cert_mem = cert; 122 return set_mem(&config->cert_mem, &config->cert_len, cert, len);
77 config->cert_len = len;
78} 123}
79 124
80void 125int
81ressl_config_set_ciphers(struct ressl_config *config, char *ciphers) 126ressl_config_set_ciphers(struct ressl_config *config, const char *ciphers)
82{ 127{
83 config->ciphers = ciphers; 128 return set_string(&config->ciphers, ciphers);
84} 129}
85 130
86int 131int
@@ -95,17 +140,19 @@ ressl_config_set_ecdhcurve(struct ressl_config *config, const char *name)
95 return (0); 140 return (0);
96} 141}
97 142
98void 143int
99ressl_config_set_key_file(struct ressl_config *config, char *key_file) 144ressl_config_set_key_file(struct ressl_config *config, const char *key_file)
100{ 145{
101 config->key_file = key_file; 146 return set_string(&config->key_file, key_file);
102} 147}
103 148
104void 149int
105ressl_config_set_key_mem(struct ressl_config *config, char *key, size_t len) 150ressl_config_set_key_mem(struct ressl_config *config, const uint8_t *key,
151 size_t len)
106{ 152{
107 config->key_mem = key; 153 if (config->key_mem)
108 config->key_len = len; 154 explicit_bzero(config->key_mem, config->key_len);
155 return set_mem(&config->key_mem, &config->key_len, key, len);
109} 156}
110 157
111void 158void