diff options
-rw-r--r-- | src/lib/libssl/Makefile | 3 | ||||
-rw-r--r-- | src/lib/libssl/tls13_client.c | 4 | ||||
-rw-r--r-- | src/lib/libssl/tls13_error.c | 99 | ||||
-rw-r--r-- | src/lib/libssl/tls13_internal.h | 29 | ||||
-rw-r--r-- | src/lib/libssl/tls13_lib.c | 23 |
5 files changed, 151 insertions, 7 deletions
diff --git a/src/lib/libssl/Makefile b/src/lib/libssl/Makefile index 778b525224..e3b9a5cac9 100644 --- a/src/lib/libssl/Makefile +++ b/src/lib/libssl/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | # $OpenBSD: Makefile,v 1.57 2019/11/17 06:35:30 jsing Exp $ | 1 | # $OpenBSD: Makefile,v 1.58 2020/01/20 13:10:37 jsing Exp $ |
2 | 2 | ||
3 | .include <bsd.own.mk> | 3 | .include <bsd.own.mk> |
4 | .ifndef NOMAN | 4 | .ifndef NOMAN |
@@ -67,6 +67,7 @@ SRCS= \ | |||
67 | t1_lib.c \ | 67 | t1_lib.c \ |
68 | tls13_buffer.c \ | 68 | tls13_buffer.c \ |
69 | tls13_client.c \ | 69 | tls13_client.c \ |
70 | tls13_error.c \ | ||
70 | tls13_handshake.c \ | 71 | tls13_handshake.c \ |
71 | tls13_handshake_msg.c \ | 72 | tls13_handshake_msg.c \ |
72 | tls13_key_schedule.c \ | 73 | tls13_key_schedule.c \ |
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c index 6dcf8c85b6..07b9ede345 100644 --- a/src/lib/libssl/tls13_client.c +++ b/src/lib/libssl/tls13_client.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_client.c,v 1.19 2019/11/17 06:30:12 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_client.c,v 1.20 2020/01/20 13:10:37 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -499,6 +499,8 @@ tls13_server_certificate_recv(struct tls13_ctx *ctx) | |||
499 | if (ssl_verify_cert_chain(s, certs) <= 0 && | 499 | if (ssl_verify_cert_chain(s, certs) <= 0 && |
500 | s->verify_mode != SSL_VERIFY_NONE) { | 500 | s->verify_mode != SSL_VERIFY_NONE) { |
501 | /* XXX send alert */ | 501 | /* XXX send alert */ |
502 | tls13_set_errorx(ctx, TLS13_ERR_VERIFY_FAILED, 0, | ||
503 | "failed to verify peer certificate", NULL); | ||
502 | goto err; | 504 | goto err; |
503 | } | 505 | } |
504 | ERR_clear_error(); | 506 | ERR_clear_error(); |
diff --git a/src/lib/libssl/tls13_error.c b/src/lib/libssl/tls13_error.c new file mode 100644 index 0000000000..295b6c4fab --- /dev/null +++ b/src/lib/libssl/tls13_error.c | |||
@@ -0,0 +1,99 @@ | |||
1 | /* $OpenBSD: tls13_error.c,v 1.1 2020/01/20 13:10:37 jsing Exp $ */ | ||
2 | /* | ||
3 | * Copyright (c) 2014,2019 Joel Sing <jsing@openbsd.org> | ||
4 | * | ||
5 | * Permission to use, copy, modify, and distribute this software for any | ||
6 | * purpose with or without fee is hereby granted, provided that the above | ||
7 | * copyright notice and this permission notice appear in all copies. | ||
8 | * | ||
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
16 | */ | ||
17 | |||
18 | #include <errno.h> | ||
19 | |||
20 | #include "tls13_internal.h" | ||
21 | |||
22 | void | ||
23 | tls13_error_clear(struct tls13_error *error) | ||
24 | { | ||
25 | error->code = 0; | ||
26 | error->subcode = 0; | ||
27 | error->errnum = 0; | ||
28 | error->file = NULL; | ||
29 | error->line = 0; | ||
30 | free(error->msg); | ||
31 | error->msg = NULL; | ||
32 | } | ||
33 | |||
34 | static int | ||
35 | tls13_error_vset(struct tls13_error *error, int code, int subcode, int errnum, | ||
36 | const char *file, int line, const char *fmt, va_list ap) | ||
37 | { | ||
38 | char *errmsg = NULL; | ||
39 | int rv = -1; | ||
40 | |||
41 | tls13_error_clear(error); | ||
42 | |||
43 | error->code = code; | ||
44 | error->subcode = subcode; | ||
45 | error->errnum = errnum; | ||
46 | error->file = file; | ||
47 | error->line = line; | ||
48 | |||
49 | if (vasprintf(&errmsg, fmt, ap) == -1) { | ||
50 | errmsg = NULL; | ||
51 | goto err; | ||
52 | } | ||
53 | |||
54 | if (errnum == -1) { | ||
55 | error->msg = errmsg; | ||
56 | return 0; | ||
57 | } | ||
58 | |||
59 | if (asprintf(&error->msg, "%s: %s", errmsg, strerror(errnum)) == -1) { | ||
60 | error->msg = NULL; | ||
61 | goto err; | ||
62 | } | ||
63 | rv = 0; | ||
64 | |||
65 | err: | ||
66 | free(errmsg); | ||
67 | |||
68 | return rv; | ||
69 | } | ||
70 | |||
71 | int | ||
72 | tls13_error_set(struct tls13_error *error, int code, int subcode, | ||
73 | const char *file, int line, const char *fmt, ...) | ||
74 | { | ||
75 | va_list ap; | ||
76 | int errnum, rv; | ||
77 | |||
78 | errnum = errno; | ||
79 | |||
80 | va_start(ap, fmt); | ||
81 | rv = tls13_error_vset(error, code, subcode, errnum, file, line, fmt, ap); | ||
82 | va_end(ap); | ||
83 | |||
84 | return (rv); | ||
85 | } | ||
86 | |||
87 | int | ||
88 | tls13_error_setx(struct tls13_error *error, int code, int subcode, | ||
89 | const char *file, int line, const char *fmt, ...) | ||
90 | { | ||
91 | va_list ap; | ||
92 | int rv; | ||
93 | |||
94 | va_start(ap, fmt); | ||
95 | rv = tls13_error_vset(error, code, subcode, -1, file, line, fmt, ap); | ||
96 | va_end(ap); | ||
97 | |||
98 | return (rv); | ||
99 | } | ||
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h index b33e4818af..41833f233f 100644 --- a/src/lib/libssl/tls13_internal.h +++ b/src/lib/libssl/tls13_internal.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_internal.h,v 1.36 2019/11/26 23:46:18 beck Exp $ */ | 1 | /* $OpenBSD: tls13_internal.h,v 1.37 2020/01/20 13:10:37 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018 Bob Beck <beck@openbsd.org> | 3 | * Copyright (c) 2018 Bob Beck <beck@openbsd.org> |
4 | * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> | 4 | * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> |
@@ -37,6 +37,8 @@ __BEGIN_HIDDEN_DECLS | |||
37 | #define TLS13_IO_WANT_POLLOUT -3 | 37 | #define TLS13_IO_WANT_POLLOUT -3 |
38 | #define TLS13_IO_USE_LEGACY -4 | 38 | #define TLS13_IO_USE_LEGACY -4 |
39 | 39 | ||
40 | #define TLS13_ERR_VERIFY_FAILED 16 | ||
41 | |||
40 | typedef void (*tls13_alert_cb)(uint8_t _alert_desc, void *_cb_arg); | 42 | typedef void (*tls13_alert_cb)(uint8_t _alert_desc, void *_cb_arg); |
41 | typedef ssize_t (*tls13_phh_recv_cb)(void *_cb_arg, CBS *cbs); | 43 | typedef ssize_t (*tls13_phh_recv_cb)(void *_cb_arg, CBS *cbs); |
42 | typedef void (*tls13_phh_sent_cb)(void *_cb_arg); | 44 | typedef void (*tls13_phh_sent_cb)(void *_cb_arg); |
@@ -160,7 +162,18 @@ struct tls13_handshake_stage { | |||
160 | 162 | ||
161 | struct ssl_handshake_tls13_st; | 163 | struct ssl_handshake_tls13_st; |
162 | 164 | ||
165 | struct tls13_error { | ||
166 | int code; | ||
167 | int subcode; | ||
168 | int errnum; | ||
169 | const char *file; | ||
170 | int line; | ||
171 | char *msg; | ||
172 | }; | ||
173 | |||
163 | struct tls13_ctx { | 174 | struct tls13_ctx { |
175 | struct tls13_error error; | ||
176 | |||
164 | SSL *ssl; | 177 | SSL *ssl; |
165 | struct ssl_handshake_tls13_st *hs; | 178 | struct ssl_handshake_tls13_st *hs; |
166 | uint8_t mode; | 179 | uint8_t mode; |
@@ -261,6 +274,20 @@ int tls13_server_certificate_verify_recv(struct tls13_ctx *ctx); | |||
261 | int tls13_server_finished_recv(struct tls13_ctx *ctx); | 274 | int tls13_server_finished_recv(struct tls13_ctx *ctx); |
262 | int tls13_server_finished_send(struct tls13_ctx *ctx); | 275 | int tls13_server_finished_send(struct tls13_ctx *ctx); |
263 | 276 | ||
277 | void tls13_error_clear(struct tls13_error *error); | ||
278 | |||
279 | int tls13_error_set(struct tls13_error *error, int code, int subcode, | ||
280 | const char *file, int line, const char *fmt, ...); | ||
281 | int tls13_error_setx(struct tls13_error *error, int code, int subcode, | ||
282 | const char *file, int line, const char *fmt, ...); | ||
283 | |||
284 | #define tls13_set_error(ctx, code, subcode, fmt, ...) \ | ||
285 | tls13_error_set(&(ctx)->error, (code), (subcode), __FILE__, __LINE__, \ | ||
286 | (fmt), __VA_ARGS__) | ||
287 | #define tls13_set_errorx(ctx, code, subcode, fmt, ...) \ | ||
288 | tls13_error_setx(&(ctx)->error, (code), (subcode), __FILE__, __LINE__, \ | ||
289 | (fmt), __VA_ARGS__) | ||
290 | |||
264 | __END_HIDDEN_DECLS | 291 | __END_HIDDEN_DECLS |
265 | 292 | ||
266 | #endif | 293 | #endif |
diff --git a/src/lib/libssl/tls13_lib.c b/src/lib/libssl/tls13_lib.c index 6876528f50..d30d28c45f 100644 --- a/src/lib/libssl/tls13_lib.c +++ b/src/lib/libssl/tls13_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_lib.c,v 1.13 2019/11/26 23:46:18 beck Exp $ */ | 1 | /* $OpenBSD: tls13_lib.c,v 1.14 2020/01/20 13:10:37 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2019 Bob Beck <beck@openbsd.org> | 4 | * Copyright (c) 2019 Bob Beck <beck@openbsd.org> |
@@ -263,6 +263,7 @@ tls13_ctx_free(struct tls13_ctx *ctx) | |||
263 | if (ctx == NULL) | 263 | if (ctx == NULL) |
264 | return; | 264 | return; |
265 | 265 | ||
266 | tls13_error_clear(&ctx->error); | ||
266 | tls13_record_layer_free(ctx->rl); | 267 | tls13_record_layer_free(ctx->rl); |
267 | 268 | ||
268 | freezero(ctx, sizeof(struct tls13_ctx)); | 269 | freezero(ctx, sizeof(struct tls13_ctx)); |
@@ -340,6 +341,22 @@ tls13_legacy_wire_write_cb(const void *buf, size_t n, void *arg) | |||
340 | return tls13_legacy_wire_write(ctx->ssl, buf, n); | 341 | return tls13_legacy_wire_write(ctx->ssl, buf, n); |
341 | } | 342 | } |
342 | 343 | ||
344 | static void | ||
345 | tls13_legacy_error(SSL *ssl) | ||
346 | { | ||
347 | struct tls13_ctx *ctx = ssl->internal->tls13; | ||
348 | int reason = ERR_R_INTERNAL_ERROR; | ||
349 | |||
350 | switch (ctx->error.code) { | ||
351 | case TLS13_ERR_VERIFY_FAILED: | ||
352 | reason = SSL_R_CERTIFICATE_VERIFY_FAILED; | ||
353 | break; | ||
354 | } | ||
355 | |||
356 | ERR_put_error(ERR_LIB_SSL, (0xfff), reason, ctx->error.file, | ||
357 | ctx->error.line); | ||
358 | } | ||
359 | |||
343 | int | 360 | int |
344 | tls13_legacy_return_code(SSL *ssl, ssize_t ret) | 361 | tls13_legacy_return_code(SSL *ssl, ssize_t ret) |
345 | { | 362 | { |
@@ -359,9 +376,7 @@ tls13_legacy_return_code(SSL *ssl, ssize_t ret) | |||
359 | return 0; | 376 | return 0; |
360 | 377 | ||
361 | case TLS13_IO_FAILURE: | 378 | case TLS13_IO_FAILURE: |
362 | /* XXX - we need to record/map internal errors. */ | 379 | tls13_legacy_error(ssl); |
363 | if (ERR_peek_error() == 0) | ||
364 | SSLerror(ssl, ERR_R_INTERNAL_ERROR); | ||
365 | return -1; | 380 | return -1; |
366 | 381 | ||
367 | case TLS13_IO_WANT_POLLIN: | 382 | case TLS13_IO_WANT_POLLIN: |