OpenCoverage

tls_util.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/tls/tls_util.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: tls_util.c,v 1.12 2018/02/08 07:55:29 jsing Exp $ */-
2/*-
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>-
4 * Copyright (c) 2014 Ted Unangst <tedu@openbsd.org>-
5 * Copyright (c) 2015 Reyk Floeter <reyk@openbsd.org>-
6 *-
7 * Permission to use, copy, modify, and distribute this software for any-
8 * purpose with or without fee is hereby granted, provided that the above-
9 * copyright notice and this permission notice appear in all copies.-
10 *-
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES-
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF-
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR-
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES-
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN-
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF-
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.-
18 */-
19-
20#ifdef _MSC_VER-
21#define NO_REDEF_POSIX_FUNCTIONS-
22#endif-
23-
24#include <sys/stat.h>-
25-
26#include <stdlib.h>-
27#include <unistd.h>-
28#include <fcntl.h>-
29-
30#include "tls.h"-
31#include "tls_internal.h"-
32-
33static void *-
34memdup(const void *in, size_t len)-
35{-
36 void *out;-
37-
38 if ((out = malloc(len)) == NULL)
(out = malloc(...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • keypairtest
0-3
39 return NULL;
never executed: return ((void *)0) ;
0
40 memcpy(out, in, len);-
41 return out;
executed 3 times by 1 test: return out;
Executed by:
  • keypairtest
3
42}-
43-
44int-
45tls_set_mem(char **dest, size_t *destlen, const void *src, size_t srclen)-
46{-
47 free(*dest);-
48 *dest = NULL;-
49 *destlen = 0;-
50 if (src != NULL)
src != ((void *)0)Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • keypairtest
FALSEnever evaluated
0-3
51 if ((*dest = memdup(src, srclen)) == NULL)
(*dest = memdu...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • keypairtest
0-3
52 return -1;
never executed: return -1;
0
53 *destlen = srclen;-
54 return 0;
executed 3 times by 1 test: return 0;
Executed by:
  • keypairtest
3
55}-
56-
57int-
58tls_set_string(const char **dest, const char *src)-
59{-
60 free((char *)*dest);-
61 *dest = NULL;-
62 if (src != NULL)
src != ((void *)0)Description
TRUEevaluated 7 times by 3 tests
Evaluated by:
  • configtest
  • tlstest
  • verifytest
FALSEnever evaluated
0-7
63 if ((*dest = strdup(src)) == NULL)
never executed: __retval = (char *) memcpy (__retval, src , __len);
(*dest = (__ex...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 7 times by 3 tests
Evaluated by:
  • configtest
  • tlstest
  • verifytest
__retval != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
((const char *... ))[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( src )Description
TRUEnever evaluated
FALSEevaluated 7 times by 3 tests
Evaluated by:
  • configtest
  • tlstest
  • verifytest
((size_t)(cons...)( src ) == 1)Description
TRUEnever evaluated
FALSEnever evaluated
0-7
64 return -1;
never executed: return -1;
0
65 return 0;
executed 7 times by 3 tests: return 0;
Executed by:
  • configtest
  • tlstest
  • verifytest
7
66}-
67-
68/*-
69 * Extract the host and port from a colon separated value. For a literal IPv6-
70 * address the address must be contained with square braces. If a host and-
71 * port are successfully extracted, the function will return 0 and the-
72 * caller is responsible for freeing the host and port. If no port is found-
73 * then the function will return 1, with both host and port being NULL.-
74 * On memory allocation failure -1 will be returned.-
75 */-
76int-
77tls_host_port(const char *hostport, char **host, char **port)-
78{-
79 char *h, *p, *s;-
80 int rv = 1;-
81-
82 *host = NULL;-
83 *port = NULL;-
84-
85 if ((s = strdup(hostport)) == NULL)
never executed: __retval = (char *) memcpy (__retval, hostport , __len);
(s = (__extens...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
__retval != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
((const char *... ))[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...p ( hostport )Description
TRUEnever evaluated
FALSEnever evaluated
((size_t)(cons...stport ) == 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
86 goto err;
never executed: goto err;
0
87-
88 h = p = s;-
89-
90 /* See if this is an IPv6 literal with square braces. */-
91 if (p[0] == '[') {
p[0] == '['Description
TRUEnever evaluated
FALSEnever evaluated
0
92 h++;-
93 if ((p = strchr(s, ']')) == NULL)
(p = (__extens...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( ']' )Description
TRUEnever evaluated
FALSEnever evaluated
!__builtin_constant_p ( s )Description
TRUEnever evaluated
FALSEnever evaluated
( ']' ) == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
94 goto done;
never executed: goto done;
0
95 *p++ = '\0';-
96 }
never executed: end of block
0
97-
98 /* Find the port seperator. */-
99 if ((p = strchr(p, ':')) == NULL)
(p = (__extens...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( ':' )Description
TRUEnever evaluated
FALSEnever evaluated
!__builtin_constant_p ( p )Description
TRUEnever evaluated
FALSEnever evaluated
( ':' ) == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
100 goto done;
never executed: goto done;
0
101-
102 /* If there is another separator then we have issues. */-
103 if (strchr(p + 1, ':') != NULL)
(__extension__...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( ':' )Description
TRUEnever evaluated
FALSEnever evaluated
!__builtin_con...nt_p ( p + 1 )Description
TRUEnever evaluated
FALSEnever evaluated
( ':' ) == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
104 goto done;
never executed: goto done;
0
105-
106 *p++ = '\0';-
107-
108 if (asprintf(host, "%s", h) == -1)
asprintf(host, "%s", h) == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
109 goto err;
never executed: goto err;
0
110 if (asprintf(port, "%s", p) == -1)
asprintf(port, "%s", p) == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
111 goto err;
never executed: goto err;
0
112-
113 rv = 0;-
114 goto done;
never executed: goto done;
0
115-
116 err:-
117 free(*host);-
118 *host = NULL;-
119 free(*port);-
120 *port = NULL;-
121 rv = -1;-
122-
123 done:
code before this statement never executed: done:
0
124 free(s);-
125-
126 return (rv);
never executed: return (rv);
0
127}-
128-
129int-
130tls_password_cb(char *buf, int size, int rwflag, void *u)-
131{-
132 size_t len;-
133-
134 if (size < 0)
size < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
135 return (0);
never executed: return (0);
0
136-
137 if (u == NULL) {
u == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
138 memset(buf, 0, size);-
139 return (0);
never executed: return (0);
0
140 }-
141-
142 if ((len = strlcpy(buf, u, size)) >= (size_t)size)
(len = strlcpy...= (size_t)sizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
143 return (0);
never executed: return (0);
0
144-
145 return (len);
never executed: return (len);
0
146}-
147-
148uint8_t *-
149tls_load_file(const char *name, size_t *len, char *password)-
150{-
151 FILE *fp;-
152 EVP_PKEY *key = NULL;-
153 BIO *bio = NULL;-
154 char *data;-
155 uint8_t *buf = NULL;-
156 struct stat st;-
157 size_t size = 0;-
158 int fd = -1;-
159 ssize_t n;-
160-
161 *len = 0;-
162-
163 if ((fd = open(name, O_RDONLY)) == -1)
(fd = open(name, 00 )) == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
164 return (NULL);
never executed: return ( ((void *)0) );
0
165-
166 /* Just load the file into memory without decryption */-
167 if (password == NULL) {
password == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
168 if (fstat(fd, &st) != 0)
fstat(fd, &st) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
169 goto err;
never executed: goto err;
0
170 if (st.st_size < 0)
st.st_size < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
171 goto err;
never executed: goto err;
0
172 size = (size_t)st.st_size;-
173 if ((buf = malloc(size)) == NULL)
(buf = malloc(...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
174 goto err;
never executed: goto err;
0
175 n = read(fd, buf, size);-
176 if (n < 0 || (size_t)n != size)
n < 0Description
TRUEnever evaluated
FALSEnever evaluated
(size_t)n != sizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
177 goto err;
never executed: goto err;
0
178 close(fd);-
179 goto done;
never executed: goto done;
0
180 }-
181-
182 /* Or read the (possibly) encrypted key from file */-
183 if ((fp = fdopen(fd, "r")) == NULL)
(fp = fdopen(f...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
184 goto err;
never executed: goto err;
0
185 fd = -1;-
186-
187 key = PEM_read_PrivateKey(fp, NULL, tls_password_cb, password);-
188 fclose(fp);-
189 if (key == NULL)
key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
190 goto err;
never executed: goto err;
0
191-
192 /* Write unencrypted key to memory buffer */-
193 if ((bio = BIO_new(BIO_s_mem())) == NULL)
(bio = BIO_new...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
194 goto err;
never executed: goto err;
0
195 if (!PEM_write_bio_PrivateKey(bio, key, NULL, NULL, 0, NULL, NULL))
!PEM_write_bio... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
196 goto err;
never executed: goto err;
0
197 if ((size = BIO_get_mem_data(bio, &data)) <= 0)
(size = BIO_ct...*)&data)) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
198 goto err;
never executed: goto err;
0
199 if ((buf = malloc(size)) == NULL)
(buf = malloc(...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
200 goto err;
never executed: goto err;
0
201 memcpy(buf, data, size);-
202-
203 BIO_free_all(bio);-
204 EVP_PKEY_free(key);-
205-
206 done:
code before this statement never executed: done:
0
207 *len = size;-
208 return (buf);
never executed: return (buf);
0
209-
210 err:-
211 if (fd != -1)
fd != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
212 close(fd);
never executed: close(fd);
0
213 freezero(buf, size);-
214 BIO_free_all(bio);-
215 EVP_PKEY_free(key);-
216-
217 return (NULL);
never executed: return ( ((void *)0) );
0
218}-
219-
220void-
221tls_unload_file(uint8_t *buf, size_t len)-
222{-
223 freezero(buf, len);-
224}
never executed: end of block
0
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2