diff options
author | beck <> | 2023-09-29 15:53:59 +0000 |
---|---|---|
committer | beck <> | 2023-09-29 15:53:59 +0000 |
commit | 266a46fc156d909c580ce8946cc574da9a2ee5b4 (patch) | |
tree | 9289b67644f1ef47e15e9b80e3105d2ff11da1d2 /src/regress/lib/libcrypto/x509/constraints.c | |
parent | f4f0e4daf1dec6165cb0996274d1ce8cd63b6dc6 (diff) | |
download | openbsd-266a46fc156d909c580ce8946cc574da9a2ee5b4.tar.gz openbsd-266a46fc156d909c580ce8946cc574da9a2ee5b4.tar.bz2 openbsd-266a46fc156d909c580ce8946cc574da9a2ee5b4.zip |
Allow IP addresses to be specified in a URI.
Our checking here was a bit too aggressive, and did not permit an
IP address in a URI. IP's in a URI are allowed for things like CRLdp's
AIA, SAN URI's etc.). The check for this was also slightly flawed as
we would permit an IP if memory allocation failed while checking for
an IP.
Correct both issues.
ok tb@
Diffstat (limited to 'src/regress/lib/libcrypto/x509/constraints.c')
-rw-r--r-- | src/regress/lib/libcrypto/x509/constraints.c | 54 |
1 files changed, 50 insertions, 4 deletions
diff --git a/src/regress/lib/libcrypto/x509/constraints.c b/src/regress/lib/libcrypto/x509/constraints.c index 8771367bd6..90b7ffbaeb 100644 --- a/src/regress/lib/libcrypto/x509/constraints.c +++ b/src/regress/lib/libcrypto/x509/constraints.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: constraints.c,v 1.15 2022/11/28 07:24:03 tb Exp $ */ | 1 | /* $OpenBSD: constraints.c,v 1.16 2023/09/29 15:53:59 beck Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> | 3 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> |
4 | * | 4 | * |
@@ -154,6 +154,12 @@ unsigned char *invaliduri[] = { | |||
154 | "https://.www.openbsd.org/", | 154 | "https://.www.openbsd.org/", |
155 | "https://www.ope|nbsd.org%", | 155 | "https://www.ope|nbsd.org%", |
156 | "https://www.openbsd.org.#", | 156 | "https://www.openbsd.org.#", |
157 | "https://192.168.1.1./", | ||
158 | "https://192.168.1.1|/", | ||
159 | "https://.192.168.1.1/", | ||
160 | "https://192.168..1.1/", | ||
161 | "https://.2001:0DB8:AC10:FE01::/", | ||
162 | "https://.2001:0DB8:AC10:FE01::|/", | ||
157 | "///", | 163 | "///", |
158 | "//", | 164 | "//", |
159 | "/", | 165 | "/", |
@@ -161,6 +167,15 @@ unsigned char *invaliduri[] = { | |||
161 | NULL, | 167 | NULL, |
162 | }; | 168 | }; |
163 | 169 | ||
170 | unsigned char *validuri[] = { | ||
171 | "https://www.openbsd.org/meep/meep/meep/", | ||
172 | "https://192.168.1.1/", | ||
173 | "https://2001:0DB8:AC10:FE01::/", | ||
174 | "https://192.168.1/", /* Not an IP, but valid component */ | ||
175 | "https://999.999.999.999/", /* Not an IP, but valid component */ | ||
176 | NULL, | ||
177 | }; | ||
178 | |||
164 | static int | 179 | static int |
165 | test_valid_hostnames(void) | 180 | test_valid_hostnames(void) |
166 | { | 181 | { |
@@ -169,7 +184,7 @@ test_valid_hostnames(void) | |||
169 | for (i = 0; valid_hostnames[i] != NULL; i++) { | 184 | for (i = 0; valid_hostnames[i] != NULL; i++) { |
170 | CBS cbs; | 185 | CBS cbs; |
171 | CBS_init(&cbs, valid_hostnames[i], strlen(valid_hostnames[i])); | 186 | CBS_init(&cbs, valid_hostnames[i], strlen(valid_hostnames[i])); |
172 | if (!x509_constraints_valid_host(&cbs)) { | 187 | if (!x509_constraints_valid_host(&cbs, 0)) { |
173 | FAIL("Valid hostname '%s' rejected\n", | 188 | FAIL("Valid hostname '%s' rejected\n", |
174 | valid_hostnames[i]); | 189 | valid_hostnames[i]); |
175 | failure = 1; | 190 | failure = 1; |
@@ -183,6 +198,7 @@ test_valid_hostnames(void) | |||
183 | goto done; | 198 | goto done; |
184 | } | 199 | } |
185 | } | 200 | } |
201 | |||
186 | done: | 202 | done: |
187 | return failure; | 203 | return failure; |
188 | } | 204 | } |
@@ -202,6 +218,7 @@ test_valid_sandns_names(void) | |||
202 | goto done; | 218 | goto done; |
203 | } | 219 | } |
204 | } | 220 | } |
221 | |||
205 | done: | 222 | done: |
206 | return failure; | 223 | return failure; |
207 | } | 224 | } |
@@ -221,6 +238,7 @@ test_valid_domain_constraints(void) | |||
221 | goto done; | 238 | goto done; |
222 | } | 239 | } |
223 | } | 240 | } |
241 | |||
224 | done: | 242 | done: |
225 | return failure; | 243 | return failure; |
226 | } | 244 | } |
@@ -245,6 +263,7 @@ test_valid_mbox_names(void) | |||
245 | free(name.local); | 263 | free(name.local); |
246 | name.local = NULL; | 264 | name.local = NULL; |
247 | } | 265 | } |
266 | |||
248 | done: | 267 | done: |
249 | return failure; | 268 | return failure; |
250 | } | 269 | } |
@@ -259,7 +278,7 @@ test_invalid_hostnames(void) | |||
259 | for (i = 0; invalid_hostnames[i] != NULL; i++) { | 278 | for (i = 0; invalid_hostnames[i] != NULL; i++) { |
260 | CBS_init(&cbs, invalid_hostnames[i], | 279 | CBS_init(&cbs, invalid_hostnames[i], |
261 | strlen(invalid_hostnames[i])); | 280 | strlen(invalid_hostnames[i])); |
262 | if (x509_constraints_valid_host(&cbs)) { | 281 | if (x509_constraints_valid_host(&cbs, 0)) { |
263 | FAIL("Invalid hostname '%s' accepted\n", | 282 | FAIL("Invalid hostname '%s' accepted\n", |
264 | invalid_hostnames[i]); | 283 | invalid_hostnames[i]); |
265 | failure = 1; | 284 | failure = 1; |
@@ -267,7 +286,7 @@ test_invalid_hostnames(void) | |||
267 | } | 286 | } |
268 | } | 287 | } |
269 | CBS_init(&cbs, nulhost, strlen(nulhost) + 1); | 288 | CBS_init(&cbs, nulhost, strlen(nulhost) + 1); |
270 | if (x509_constraints_valid_host(&cbs)) { | 289 | if (x509_constraints_valid_host(&cbs, 0)) { |
271 | FAIL("hostname with NUL byte accepted\n"); | 290 | FAIL("hostname with NUL byte accepted\n"); |
272 | failure = 1; | 291 | failure = 1; |
273 | goto done; | 292 | goto done; |
@@ -278,6 +297,7 @@ test_invalid_hostnames(void) | |||
278 | failure = 1; | 297 | failure = 1; |
279 | goto done; | 298 | goto done; |
280 | } | 299 | } |
300 | |||
281 | done: | 301 | done: |
282 | return failure; | 302 | return failure; |
283 | } | 303 | } |
@@ -297,6 +317,7 @@ test_invalid_sandns_names(void) | |||
297 | goto done; | 317 | goto done; |
298 | } | 318 | } |
299 | } | 319 | } |
320 | |||
300 | done: | 321 | done: |
301 | return failure; | 322 | return failure; |
302 | } | 323 | } |
@@ -321,6 +342,7 @@ test_invalid_mbox_names(void) | |||
321 | free(name.local); | 342 | free(name.local); |
322 | name.local = NULL; | 343 | name.local = NULL; |
323 | } | 344 | } |
345 | |||
324 | done: | 346 | done: |
325 | return failure; | 347 | return failure; |
326 | } | 348 | } |
@@ -340,6 +362,7 @@ test_invalid_domain_constraints(void) | |||
340 | goto done; | 362 | goto done; |
341 | } | 363 | } |
342 | } | 364 | } |
365 | |||
343 | done: | 366 | done: |
344 | return failure; | 367 | return failure; |
345 | } | 368 | } |
@@ -365,6 +388,27 @@ test_invalid_uri(void) | |||
365 | done: | 388 | done: |
366 | return failure; | 389 | return failure; |
367 | } | 390 | } |
391 | static int | ||
392 | test_valid_uri(void) | ||
393 | { | ||
394 | int j, failure = 0; | ||
395 | char *hostpart = NULL; | ||
396 | |||
397 | for (j = 0; validuri[j] != NULL; j++) { | ||
398 | if (x509_constraints_uri_host(validuri[j], | ||
399 | strlen(invaliduri[j]), &hostpart) == 0) { | ||
400 | FAIL("Valid URI '%s' NOT accepted\n", | ||
401 | validuri[j]); | ||
402 | failure = 1; | ||
403 | goto done; | ||
404 | } | ||
405 | free(hostpart); | ||
406 | hostpart = NULL; | ||
407 | } | ||
408 | |||
409 | done: | ||
410 | return failure; | ||
411 | } | ||
368 | 412 | ||
369 | static int | 413 | static int |
370 | test_constraints1(void) | 414 | test_constraints1(void) |
@@ -513,6 +557,7 @@ test_constraints1(void) | |||
513 | failure = 1; | 557 | failure = 1; |
514 | goto done; | 558 | goto done; |
515 | } | 559 | } |
560 | |||
516 | done: | 561 | done: |
517 | return failure; | 562 | return failure; |
518 | } | 563 | } |
@@ -531,6 +576,7 @@ main(int argc, char **argv) | |||
531 | failed |= test_valid_domain_constraints(); | 576 | failed |= test_valid_domain_constraints(); |
532 | failed |= test_invalid_domain_constraints(); | 577 | failed |= test_invalid_domain_constraints(); |
533 | failed |= test_invalid_uri(); | 578 | failed |= test_invalid_uri(); |
579 | failed |= test_valid_uri(); | ||
534 | failed |= test_constraints1(); | 580 | failed |= test_constraints1(); |
535 | 581 | ||
536 | return (failed); | 582 | return (failed); |