untrusted comment: verify with openbsd-68-base.pub
RWQZj25CSG5R2tHMsSzbcO8IXiSc9hWA1a+0S/P7kjlkCNmfPHdKxUTIgFhmPBgSrqpxgrEac0ypN9LQ6ZExyuMgHFpKj64gwQ0=

OpenBSD 6.8 errata 013, February 3, 2021:

Various interoperability issues and memory leaks were discovered in
libcrypto and libssl.

Apply by doing:
   signify -Vep /etc/signify/openbsd-68-base.pub -x 013_libressl.patch.sig \
       -m - | (cd /usr/src && patch -p0)

And then rebuild and install libcrypto, libssl, isakmpd and unwind:
   cd /usr/src/lib/libcrypto
   make obj
   make
   make install
   cd /usr/src/lib/libssl
   make obj
   make
   make install
   cd /usr/src/sbin/isakmpd
   make obj
   make
   make install
   cd /usr/src/sbin/unwind
   make obj
   make
   make install

Index: lib/libcrypto/x509/x509_verify.c
===================================================================
RCS file: /cvs/src/lib/libcrypto/x509/x509_verify.c,v
retrieving revision 1.13
diff -u -p -r1.13 x509_verify.c
--- lib/libcrypto/x509/x509_verify.c    26 Sep 2020 15:44:06 -0000      1.13
+++ lib/libcrypto/x509/x509_verify.c    18 Jan 2021 21:09:47 -0000
@@ -81,7 +81,7 @@ x509_verify_chain_dup(struct x509_verify
{
       struct x509_verify_chain *new_chain;

-       if ((new_chain = x509_verify_chain_new()) == NULL)
+       if ((new_chain = calloc(1, sizeof(*chain))) == NULL)
               goto err;
       if ((new_chain->certs = X509_chain_up_ref(chain->certs)) == NULL)
               goto err;
Index: lib/libcrypto/x509/x509_vfy.c
===================================================================
RCS file: /cvs/src/lib/libcrypto/x509/x509_vfy.c,v
retrieving revision 1.81
diff -u -p -r1.81 x509_vfy.c
--- lib/libcrypto/x509/x509_vfy.c       26 Sep 2020 02:06:28 -0000      1.81
+++ lib/libcrypto/x509/x509_vfy.c       18 Jan 2021 21:09:54 -0000
@@ -1794,6 +1794,11 @@ x509_vfy_check_policy(X509_STORE_CTX *ct

       if (ctx->parent)
               return 1;
+
+       /* X509_policy_check always allocates a new tree. */
+       X509_policy_tree_free(ctx->tree);
+       ctx->tree = NULL;
+
       ret = X509_policy_check(&ctx->tree, &ctx->explicit_policy, ctx->chain,
           ctx->param->policies, ctx->param->flags);
       if (ret == 0) {
Index: lib/libcrypto/x509/x509_vpm.c
===================================================================
RCS file: /cvs/src/lib/libcrypto/x509/x509_vpm.c,v
retrieving revision 1.22
diff -u -p -r1.22 x509_vpm.c
--- lib/libcrypto/x509/x509_vpm.c       14 Sep 2020 08:10:04 -0000      1.22
+++ lib/libcrypto/x509/x509_vpm.c       30 Jan 2021 08:33:55 -0000
@@ -177,7 +177,7 @@ x509_verify_param_zero(X509_VERIFY_PARAM
       param->trust = 0;
       /*param->inh_flags = X509_VP_FLAG_DEFAULT;*/
       param->inh_flags = 0;
-       param->flags = 0;
+       param->flags = X509_V_FLAG_LEGACY_VERIFY;
       param->depth = -1;
       if (param->policies) {
               sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free);
Index: lib/libssl/d1_both.c
===================================================================
RCS file: /cvs/src/lib/libssl/d1_both.c,v
retrieving revision 1.60
diff -u -p -r1.60 d1_both.c
--- lib/libssl/d1_both.c        26 Sep 2020 14:43:17 -0000      1.60
+++ lib/libssl/d1_both.c        18 Jan 2021 20:58:39 -0000
@@ -1060,18 +1060,18 @@ dtls1_retransmit_message(SSL *s, unsigne
           frag->msg_header.frag_len);

       /* save current state */
-       saved_state.enc_write_ctx = s->internal->enc_write_ctx;
-       saved_state.write_hash = s->internal->write_hash;
       saved_state.session = s->session;
       saved_state.epoch = D1I(s)->w_epoch;

       D1I(s)->retransmitting = 1;

       /* restore state in which the message was originally sent */
-       s->internal->enc_write_ctx = frag->msg_header.saved_retransmit_state.enc_write_ctx;
-       s->internal->write_hash = frag->msg_header.saved_retransmit_state.write_hash;
       s->session = frag->msg_header.saved_retransmit_state.session;
       D1I(s)->w_epoch = frag->msg_header.saved_retransmit_state.epoch;
+       if (!tls12_record_layer_set_write_cipher_hash(s->internal->rl,
+           frag->msg_header.saved_retransmit_state.enc_write_ctx,
+           frag->msg_header.saved_retransmit_state.write_hash, 0))
+               return 0;

       if (frag->msg_header.saved_retransmit_state.epoch ==
           saved_state.epoch - 1) {
@@ -1085,10 +1085,11 @@ dtls1_retransmit_message(SSL *s, unsigne
           SSL3_RT_CHANGE_CIPHER_SPEC : SSL3_RT_HANDSHAKE);

       /* restore current state */
-       s->internal->enc_write_ctx = saved_state.enc_write_ctx;
-       s->internal->write_hash = saved_state.write_hash;
       s->session = saved_state.session;
       D1I(s)->w_epoch = saved_state.epoch;
+       if (!tls12_record_layer_set_write_cipher_hash(s->internal->rl,
+           s->internal->enc_write_ctx, s->internal->write_hash, 0))
+               return 0;

       if (frag->msg_header.saved_retransmit_state.epoch ==
           saved_state.epoch - 1) {
Index: lib/libssl/ssl_both.c
===================================================================
RCS file: /cvs/src/lib/libssl/ssl_both.c,v
retrieving revision 1.20
diff -u -p -r1.20 ssl_both.c
--- lib/libssl/ssl_both.c       24 Sep 2020 18:12:00 -0000      1.20
+++ lib/libssl/ssl_both.c       30 Jan 2021 08:32:31 -0000
@@ -408,6 +408,8 @@ ssl3_output_cert_chain(SSL *s, CBB *cbb,
                       SSLerror(s, ERR_R_X509_LIB);
                       goto err;
               }
+               X509_VERIFY_PARAM_set_flags(X509_STORE_CTX_get0_param(xs_ctx),
+                   X509_V_FLAG_LEGACY_VERIFY);
               X509_verify_cert(xs_ctx);
               ERR_clear_error();
               chain = xs_ctx->chain;
Index: lib/libssl/ssl_lib.c
===================================================================
RCS file: /cvs/src/lib/libssl/ssl_lib.c,v
retrieving revision 1.234
diff -u -p -r1.234 ssl_lib.c
--- lib/libssl/ssl_lib.c        24 Sep 2020 18:12:00 -0000      1.234
+++ lib/libssl/ssl_lib.c        18 Jan 2021 20:59:21 -0000
@@ -1710,8 +1710,17 @@ SSL_export_keying_material(SSL *s, unsig
    const char *label, size_t llen, const unsigned char *p, size_t plen,
    int use_context)
{
-       return (tls1_export_keying_material(s, out, olen,
-           label, llen, p, plen, use_context));
+       if (s->internal->tls13 != NULL && s->version == TLS1_3_VERSION) {
+               if (!use_context) {
+                       p = NULL;
+                       plen = 0;
+               }
+               return tls13_exporter(s->internal->tls13, label, llen, p, plen,
+                   out, olen);
+       }
+
+       return (tls1_export_keying_material(s, out, olen, label, llen, p, plen,
+           use_context));
}

static unsigned long
Index: lib/libssl/tls13_internal.h
===================================================================
RCS file: /cvs/src/lib/libssl/tls13_internal.h,v
retrieving revision 1.86
diff -u -p -r1.86 tls13_internal.h
--- lib/libssl/tls13_internal.h 30 Jul 2020 16:23:17 -0000      1.86
+++ lib/libssl/tls13_internal.h 18 Jan 2021 20:59:21 -0000
@@ -148,6 +148,16 @@ void tls13_secrets_destroy(struct tls13_
int tls13_hkdf_expand_label(struct tls13_secret *out, const EVP_MD *digest,
    const struct tls13_secret *secret, const char *label,
    const struct tls13_secret *context);
+int tls13_hkdf_expand_label_with_length(struct tls13_secret *out,
+    const EVP_MD *digest, const struct tls13_secret *secret,
+    const uint8_t *label, size_t label_len, const struct tls13_secret *context);
+
+int tls13_derive_secret(struct tls13_secret *out, const EVP_MD *digest,
+    const struct tls13_secret *secret, const char *label,
+    const struct tls13_secret *context);
+int tls13_derive_secret_with_label_length(struct tls13_secret *out,
+    const EVP_MD *digest, const struct tls13_secret *secret,
+    const uint8_t *label, size_t label_len, const struct tls13_secret *context);

int tls13_derive_early_secrets(struct tls13_secrets *secrets, uint8_t *psk,
    size_t psk_len, const struct tls13_secret *context);
@@ -411,6 +421,10 @@ int tls13_error_setx(struct tls13_error
#define tls13_set_errorx(ctx, code, subcode, fmt, ...) \
       tls13_error_setx(&(ctx)->error, (code), (subcode), __FILE__, __LINE__, \
           (fmt), __VA_ARGS__)
+
+int tls13_exporter(struct tls13_ctx *ctx, const uint8_t *label, size_t label_len,
+    const uint8_t *context_value, size_t context_value_len, uint8_t *out,
+    size_t out_len);

extern const uint8_t tls13_downgrade_12[8];
extern const uint8_t tls13_downgrade_11[8];
Index: lib/libssl/tls13_key_schedule.c
===================================================================
RCS file: /cvs/src/lib/libssl/tls13_key_schedule.c,v
retrieving revision 1.8
diff -u -p -r1.8 tls13_key_schedule.c
--- lib/libssl/tls13_key_schedule.c     17 Nov 2019 21:01:08 -0000      1.8
+++ lib/libssl/tls13_key_schedule.c     18 Jan 2021 20:59:21 -0000
@@ -174,6 +174,15 @@ tls13_hkdf_expand_label(struct tls13_sec
    const struct tls13_secret *secret, const char *label,
    const struct tls13_secret *context)
{
+       return tls13_hkdf_expand_label_with_length(out, digest, secret, label,
+           strlen(label), context);
+}
+
+int
+tls13_hkdf_expand_label_with_length(struct tls13_secret *out,
+    const EVP_MD *digest, const struct tls13_secret *secret,
+    const uint8_t *label, size_t label_len, const struct tls13_secret *context)
+{
       const char tls13_plabel[] = "tls13 ";
       uint8_t *hkdf_label;
       size_t hkdf_label_len;
@@ -188,7 +197,7 @@ tls13_hkdf_expand_label(struct tls13_sec
               goto err;
       if (!CBB_add_bytes(&child, tls13_plabel, strlen(tls13_plabel)))
               goto err;
-       if (!CBB_add_bytes(&child, label, strlen(label)))
+       if (!CBB_add_bytes(&child, label, label_len))
               goto err;
       if (!CBB_add_u8_length_prefixed(&cbb, &child))
               goto err;
@@ -207,12 +216,21 @@ tls13_hkdf_expand_label(struct tls13_sec
       return(0);
}

-static int
+int
tls13_derive_secret(struct tls13_secret *out, const EVP_MD *digest,
    const struct tls13_secret *secret, const char *label,
    const struct tls13_secret *context)
{
       return tls13_hkdf_expand_label(out, digest, secret, label, context);
+}
+
+int
+tls13_derive_secret_with_label_length(struct tls13_secret *out,
+    const EVP_MD *digest, const struct tls13_secret *secret, const uint8_t *label,
+    size_t label_len, const struct tls13_secret *context)
+{
+       return tls13_hkdf_expand_label_with_length(out, digest, secret, label,
+           label_len, context);
}

int
Index: lib/libssl/tls13_legacy.c
===================================================================
RCS file: /cvs/src/lib/libssl/tls13_legacy.c,v
retrieving revision 1.13
diff -u -p -r1.13 tls13_legacy.c
--- lib/libssl/tls13_legacy.c   13 Sep 2020 15:04:35 -0000      1.13
+++ lib/libssl/tls13_legacy.c   18 Jan 2021 20:57:38 -0000
@@ -40,8 +40,6 @@ tls13_legacy_wire_read(SSL *ssl, uint8_t
       if ((n = BIO_read(ssl->rbio, buf, len)) <= 0) {
               if (BIO_should_read(ssl->rbio))
                       return TLS13_IO_WANT_POLLIN;
-               if (BIO_should_write(ssl->rbio))
-                       return TLS13_IO_WANT_POLLOUT;
               if (n == 0)
                       return TLS13_IO_EOF;

@@ -79,8 +77,6 @@ tls13_legacy_wire_write(SSL *ssl, const
       errno = 0;

       if ((n = BIO_write(ssl->wbio, buf, len)) <= 0) {
-               if (BIO_should_read(ssl->wbio))
-                       return TLS13_IO_WANT_POLLIN;
               if (BIO_should_write(ssl->wbio))
                       return TLS13_IO_WANT_POLLOUT;

Index: lib/libssl/tls13_lib.c
===================================================================
RCS file: /cvs/src/lib/libssl/tls13_lib.c,v
retrieving revision 1.54
diff -u -p -r1.54 tls13_lib.c
--- lib/libssl/tls13_lib.c      11 Sep 2020 15:03:36 -0000      1.54
+++ lib/libssl/tls13_lib.c      18 Jan 2021 20:59:21 -0000
@@ -579,3 +579,75 @@ tls13_clienthello_hash_validate(struct t
       return 1;
}

+int
+tls13_exporter(struct tls13_ctx *ctx, const uint8_t *label, size_t label_len,
+    const uint8_t *context_value, size_t context_value_len, uint8_t *out,
+    size_t out_len)
+{
+       struct tls13_secret context, export_out, export_secret;
+       struct tls13_secrets *secrets = ctx->hs->secrets;
+       EVP_MD_CTX *md_ctx = NULL;
+       unsigned int md_out_len;
+       int md_len;
+       int ret = 0;
+
+       /*
+        * RFC 8446 Section 7.5.
+        */
+
+       memset(&context, 0, sizeof(context));
+       memset(&export_secret, 0, sizeof(export_secret));
+
+       export_out.data = out;
+       export_out.len = out_len;
+
+       if (!ctx->handshake_completed)
+               return 0;
+
+       md_len = EVP_MD_size(secrets->digest);
+       if (md_len <= 0 || md_len > EVP_MAX_MD_SIZE)
+               goto err;
+
+       if ((export_secret.data = calloc(1, md_len)) == NULL)
+               goto err;
+       export_secret.len = md_len;
+
+       if ((context.data = calloc(1, md_len)) == NULL)
+               goto err;
+       context.len = md_len;
+
+       /* In TLSv1.3 no context is equivalent to an empty context. */
+       if (context_value == NULL) {
+               context_value = "";
+               context_value_len = 0;
+       }
+
+       if ((md_ctx = EVP_MD_CTX_new()) == NULL)
+               goto err;
+       if (!EVP_DigestInit_ex(md_ctx, secrets->digest, NULL))
+               goto err;
+       if (!EVP_DigestUpdate(md_ctx, context_value, context_value_len))
+               goto err;
+       if (!EVP_DigestFinal_ex(md_ctx, context.data, &md_out_len))
+               goto err;
+       if (md_len != md_out_len)
+               goto err;
+
+       if (!tls13_derive_secret_with_label_length(&export_secret,
+           secrets->digest, &secrets->exporter_master, label, label_len,
+           &secrets->empty_hash))
+               goto err;
+
+       if (!tls13_hkdf_expand_label(&export_out, secrets->digest,
+           &export_secret, "exporter", &context))
+               goto err;
+
+       ret = 1;
+
+ err:
+       EVP_MD_CTX_free(md_ctx);
+       freezero(context.data, context.len);
+       freezero(export_secret.data, export_secret.len);
+
+       return ret;
+}
Index: lib/libssl/tls13_record_layer.c
===================================================================
RCS file: /cvs/src/lib/libssl/tls13_record_layer.c,v
retrieving revision 1.53
diff -u -p -r1.53 tls13_record_layer.c
--- lib/libssl/tls13_record_layer.c     11 Sep 2020 15:03:36 -0000      1.53
+++ lib/libssl/tls13_record_layer.c     18 Jan 2021 21:01:58 -0000
@@ -134,6 +134,9 @@ tls13_record_layer_free(struct tls13_rec
{
       if (rl == NULL)
               return;
+
+       freezero(rl->alert_data, rl->alert_len);
+       freezero(rl->phh_data, rl->phh_len);

       tls13_record_layer_rbuf_free(rl);

Index: lib/libssl/tls13_server.c
===================================================================
RCS file: /cvs/src/lib/libssl/tls13_server.c,v
retrieving revision 1.61
diff -u -p -r1.61 tls13_server.c
--- lib/libssl/tls13_server.c   3 Jul 2020 04:12:51 -0000       1.61
+++ lib/libssl/tls13_server.c   30 Jan 2021 08:32:31 -0000
@@ -611,6 +611,7 @@ tls13_server_certificate_send(struct tls
       SSL *s = ctx->ssl;
       CBB cert_request_context, cert_list;
       const struct ssl_sigalg *sigalg;
+       X509_STORE_CTX *xsc = NULL;
       STACK_OF(X509) *chain;
       CERT_PKEY *cpk;
       X509 *cert;
@@ -633,6 +634,18 @@ tls13_server_certificate_send(struct tls
       if ((chain = cpk->chain) == NULL)
               chain = s->ctx->extra_certs;

+       if (chain == NULL && !(s->internal->mode & SSL_MODE_NO_AUTO_CHAIN)) {
+               if ((xsc = X509_STORE_CTX_new()) == NULL)
+                       goto err;
+               if (!X509_STORE_CTX_init(xsc, s->ctx->cert_store, cpk->x509, NULL))
+                       goto err;
+               X509_VERIFY_PARAM_set_flags(X509_STORE_CTX_get0_param(xsc),
+                   X509_V_FLAG_LEGACY_VERIFY);
+               X509_verify_cert(xsc);
+               ERR_clear_error();
+               chain = xsc->chain;
+       }
+
       if (!CBB_add_u8_length_prefixed(cbb, &cert_request_context))
               goto err;
       if (!CBB_add_u24_length_prefixed(cbb, &cert_list))
@@ -643,6 +656,15 @@ tls13_server_certificate_send(struct tls

       for (i = 0; i < sk_X509_num(chain); i++) {
               cert = sk_X509_value(chain, i);
+
+               /*
+                * In the case of auto chain, the leaf certificate will be at
+                * the top of the chain - skip over it as we've already added
+                * it earlier.
+                */
+               if (i == 0 && cert == cpk->x509)
+                       continue;
+
               /*
                * XXX we don't send extensions with chain certs to avoid sending
                * a leaf ocsp stape with the chain certs.  This needs to get
@@ -658,6 +680,8 @@ tls13_server_certificate_send(struct tls
       ret = 1;

 err:
+       X509_STORE_CTX_free(xsc);
+
       return ret;
}