diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libssl/ssl.h | 151 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_lib.c | 25 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_locl.h | 5 |
3 files changed, 172 insertions, 9 deletions
diff --git a/src/lib/libssl/ssl.h b/src/lib/libssl/ssl.h index 359b554ecc..be116de775 100644 --- a/src/lib/libssl/ssl.h +++ b/src/lib/libssl/ssl.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl.h,v 1.225 2022/08/21 19:18:57 jsing Exp $ */ | 1 | /* $OpenBSD: ssl.h,v 1.226 2022/08/21 19:32:38 jsing Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -361,6 +361,10 @@ typedef struct ssl_method_st SSL_METHOD; | |||
| 361 | typedef struct ssl_cipher_st SSL_CIPHER; | 361 | typedef struct ssl_cipher_st SSL_CIPHER; |
| 362 | typedef struct ssl_session_st SSL_SESSION; | 362 | typedef struct ssl_session_st SSL_SESSION; |
| 363 | 363 | ||
| 364 | #if defined(LIBRESSL_HAS_QUIC) || defined(LIBRESSL_INTERNAL) | ||
| 365 | typedef struct ssl_quic_method_st SSL_QUIC_METHOD; | ||
| 366 | #endif | ||
| 367 | |||
| 364 | DECLARE_STACK_OF(SSL_CIPHER) | 368 | DECLARE_STACK_OF(SSL_CIPHER) |
| 365 | 369 | ||
| 366 | /* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/ | 370 | /* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/ |
| @@ -1591,6 +1595,36 @@ int SSL_CTX_get_security_level(const SSL_CTX *ctx); | |||
| 1591 | 1595 | ||
| 1592 | #if defined(LIBRESSL_HAS_QUIC) || defined(LIBRESSL_INTERNAL) | 1596 | #if defined(LIBRESSL_HAS_QUIC) || defined(LIBRESSL_INTERNAL) |
| 1593 | /* | 1597 | /* |
| 1598 | * QUIC integration. | ||
| 1599 | * | ||
| 1600 | * QUIC acts as an underlying transport for the TLS 1.3 handshake. The following | ||
| 1601 | * functions allow a QUIC implementation to serve as the underlying transport as | ||
| 1602 | * described in RFC 9001. | ||
| 1603 | * | ||
| 1604 | * When configured for QUIC, |SSL_do_handshake| will drive the handshake as | ||
| 1605 | * before, but it will not use the configured |BIO|. It will call functions on | ||
| 1606 | * |SSL_QUIC_METHOD| to configure secrets and send data. If data is needed from | ||
| 1607 | * the peer, it will return |SSL_ERROR_WANT_READ|. As the caller receives data | ||
| 1608 | * it can decrypt, it calls |SSL_provide_quic_data|. Subsequent | ||
| 1609 | * |SSL_do_handshake| calls will then consume that data and progress the | ||
| 1610 | * handshake. After the handshake is complete, the caller should continue to | ||
| 1611 | * call |SSL_provide_quic_data| for any post-handshake data, followed by | ||
| 1612 | * |SSL_process_quic_post_handshake| to process it. It is an error to call | ||
| 1613 | * |SSL_peek|, |SSL_read| and |SSL_write| in QUIC. | ||
| 1614 | * | ||
| 1615 | * To avoid DoS attacks, the QUIC implementation must limit the amount of data | ||
| 1616 | * being queued up. The implementation can call | ||
| 1617 | * |SSL_quic_max_handshake_flight_len| to get the maximum buffer length at each | ||
| 1618 | * encryption level. | ||
| 1619 | * | ||
| 1620 | * QUIC implementations must additionally configure transport parameters with | ||
| 1621 | * |SSL_set_quic_transport_params|. |SSL_get_peer_quic_transport_params| may be | ||
| 1622 | * used to query the value received from the peer. This extension is handled | ||
| 1623 | * as an opaque byte string, which the caller is responsible for serializing | ||
| 1624 | * and parsing. See RFC 9000 section 7.4 for further details. | ||
| 1625 | */ | ||
| 1626 | |||
| 1627 | /* | ||
| 1594 | * ssl_encryption_level_t specifies the QUIC encryption level used to transmit | 1628 | * ssl_encryption_level_t specifies the QUIC encryption level used to transmit |
| 1595 | * handshake messages. | 1629 | * handshake messages. |
| 1596 | */ | 1630 | */ |
| @@ -1601,16 +1635,120 @@ typedef enum ssl_encryption_level_t { | |||
| 1601 | ssl_encryption_application, | 1635 | ssl_encryption_application, |
| 1602 | } OSSL_ENCRYPTION_LEVEL; | 1636 | } OSSL_ENCRYPTION_LEVEL; |
| 1603 | 1637 | ||
| 1638 | /* | ||
| 1639 | * ssl_quic_method_st (aka |SSL_QUIC_METHOD|) describes custom QUIC hooks. | ||
| 1640 | * | ||
| 1641 | * Note that we provide both the new (BoringSSL) secrets interface | ||
| 1642 | * (set_read_secret/set_write_secret) along with the old interface | ||
| 1643 | * (set_encryption_secrets), which quictls is still using. | ||
| 1644 | * | ||
| 1645 | * Since some consumers fail to use named initialisers, the order of these | ||
| 1646 | * functions is important. Hopefully all of these consumers use the old version. | ||
| 1647 | */ | ||
| 1648 | struct ssl_quic_method_st { | ||
| 1649 | /* | ||
| 1650 | * set_encryption_secrets configures the read and write secrets for the | ||
| 1651 | * given encryption level. This function will always be called before an | ||
| 1652 | * encryption level other than |ssl_encryption_initial| is used. | ||
| 1653 | * | ||
| 1654 | * When reading packets at a given level, the QUIC implementation must | ||
| 1655 | * send ACKs at the same level, so this function provides read and write | ||
| 1656 | * secrets together. The exception is |ssl_encryption_early_data|, where | ||
| 1657 | * secrets are only available in the client to server direction. The | ||
| 1658 | * other secret will be NULL. The server acknowledges such data at | ||
| 1659 | * |ssl_encryption_application|, which will be configured in the same | ||
| 1660 | * |SSL_do_handshake| call. | ||
| 1661 | * | ||
| 1662 | * This function should use |SSL_get_current_cipher| to determine the TLS | ||
| 1663 | * cipher suite. | ||
| 1664 | */ | ||
| 1665 | int (*set_encryption_secrets)(SSL *ssl, enum ssl_encryption_level_t level, | ||
| 1666 | const uint8_t *read_secret, const uint8_t *write_secret, | ||
| 1667 | size_t secret_len); | ||
| 1668 | |||
| 1669 | /* | ||
| 1670 | * add_handshake_data adds handshake data to the current flight at the | ||
| 1671 | * given encryption level. It returns one on success and zero on error. | ||
| 1672 | * Callers should defer writing data to the network until |flush_flight| | ||
| 1673 | * to better pack QUIC packets into transport datagrams. | ||
| 1674 | * | ||
| 1675 | * If |level| is not |ssl_encryption_initial|, this function will not be | ||
| 1676 | * called before |level| is initialized with |set_write_secret|. | ||
| 1677 | */ | ||
| 1678 | int (*add_handshake_data)(SSL *ssl, enum ssl_encryption_level_t level, | ||
| 1679 | const uint8_t *data, size_t len); | ||
| 1680 | |||
| 1681 | /* | ||
| 1682 | * flush_flight is called when the current flight is complete and should | ||
| 1683 | * be written to the transport. Note a flight may contain data at | ||
| 1684 | * several encryption levels. It returns one on success and zero on | ||
| 1685 | * error. | ||
| 1686 | */ | ||
| 1687 | int (*flush_flight)(SSL *ssl); | ||
| 1688 | |||
| 1689 | /* | ||
| 1690 | * send_alert sends a fatal alert at the specified encryption level. It | ||
| 1691 | * returns one on success and zero on error. | ||
| 1692 | * | ||
| 1693 | * If |level| is not |ssl_encryption_initial|, this function will not be | ||
| 1694 | * called before |level| is initialized with |set_write_secret|. | ||
| 1695 | */ | ||
| 1696 | int (*send_alert)(SSL *ssl, enum ssl_encryption_level_t level, | ||
| 1697 | uint8_t alert); | ||
| 1698 | |||
| 1699 | /* | ||
| 1700 | * set_read_secret configures the read secret and cipher suite for the | ||
| 1701 | * given encryption level. It returns one on success and zero to | ||
| 1702 | * terminate the handshake with an error. It will be called at most once | ||
| 1703 | * per encryption level. | ||
| 1704 | * | ||
| 1705 | * Read keys will not be released before QUIC may use them. Once a level | ||
| 1706 | * has been initialized, QUIC may begin processing data from it. | ||
| 1707 | * Handshake data should be passed to |SSL_provide_quic_data| and | ||
| 1708 | * application data (if |level| is |ssl_encryption_early_data| or | ||
| 1709 | * |ssl_encryption_application|) may be processed according to the rules | ||
| 1710 | * of the QUIC protocol. | ||
| 1711 | */ | ||
| 1712 | int (*set_read_secret)(SSL *ssl, enum ssl_encryption_level_t level, | ||
| 1713 | const SSL_CIPHER *cipher, const uint8_t *secret, size_t secret_len); | ||
| 1714 | |||
| 1715 | /* | ||
| 1716 | * set_write_secret behaves like |set_read_secret| but configures the | ||
| 1717 | * write secret and cipher suite for the given encryption level. It will | ||
| 1718 | * be called at most once per encryption level. | ||
| 1719 | * | ||
| 1720 | * Write keys will not be released before QUIC may use them. If |level| | ||
| 1721 | * is |ssl_encryption_early_data| or |ssl_encryption_application|, QUIC | ||
| 1722 | * may begin sending application data at |level|. | ||
| 1723 | */ | ||
| 1724 | int (*set_write_secret)(SSL *ssl, enum ssl_encryption_level_t level, | ||
| 1725 | const SSL_CIPHER *cipher, const uint8_t *secret, size_t secret_len); | ||
| 1726 | }; | ||
| 1727 | |||
| 1728 | /* | ||
| 1729 | * SSL_CTX_set_quic_method configures the QUIC hooks. This should only be | ||
| 1730 | * configured with a minimum version of TLS 1.3. |quic_method| must remain valid | ||
| 1731 | * for the lifetime of |ctx|. It returns one on success and zero on error. | ||
| 1732 | */ | ||
| 1733 | int SSL_CTX_set_quic_method(SSL_CTX *ctx, const SSL_QUIC_METHOD *quic_method); | ||
| 1734 | |||
| 1735 | /* | ||
| 1736 | * SSL_set_quic_method configures the QUIC hooks. This should only be | ||
| 1737 | * configured with a minimum version of TLS 1.3. |quic_method| must remain valid | ||
| 1738 | * for the lifetime of |ssl|. It returns one on success and zero on error. | ||
| 1739 | */ | ||
| 1740 | int SSL_set_quic_method(SSL *ssl, const SSL_QUIC_METHOD *quic_method); | ||
| 1741 | |||
| 1742 | /* SSL_is_quic returns true if an SSL has been configured for use with QUIC. */ | ||
| 1604 | int SSL_is_quic(const SSL *ssl); | 1743 | int SSL_is_quic(const SSL *ssl); |
| 1605 | 1744 | ||
| 1606 | /* | 1745 | /* |
| 1607 | * SSL_set_quic_transport_params configures |ssl| to send |params| (of length | 1746 | * SSL_set_quic_transport_params configures |ssl| to send |params| (of length |
| 1608 | * |params_len|) in the quic_transport_parameters extension in either the | 1747 | * |params_len|) in the quic_transport_parameters extension in either the |
| 1609 | * ClientHello or EncryptedExtensions handshake message. This extension will | 1748 | * ClientHello or EncryptedExtensions handshake message. It is an error to set |
| 1610 | * only be sent if the TLS version is at least 1.3, and for a server, only if | 1749 | * transport parameters if |ssl| is not configured for QUIC. The buffer pointed |
| 1611 | * the client sent the extension. The buffer pointed to by |params| only need be | 1750 | * to by |params| only need be valid for the duration of the call to this |
| 1612 | * valid for the duration of the call to this function. This function returns 1 | 1751 | * function. This function returns 1 on success and 0 on failure. |
| 1613 | *on success and 0 on failure. | ||
| 1614 | */ | 1752 | */ |
| 1615 | int SSL_set_quic_transport_params(SSL *ssl, const uint8_t *params, | 1753 | int SSL_set_quic_transport_params(SSL *ssl, const uint8_t *params, |
| 1616 | size_t params_len); | 1754 | size_t params_len); |
| @@ -1624,6 +1762,7 @@ int SSL_set_quic_transport_params(SSL *ssl, const uint8_t *params, | |||
| 1624 | */ | 1762 | */ |
| 1625 | void SSL_get_peer_quic_transport_params(const SSL *ssl, | 1763 | void SSL_get_peer_quic_transport_params(const SSL *ssl, |
| 1626 | const uint8_t **out_params, size_t *out_params_len); | 1764 | const uint8_t **out_params, size_t *out_params_len); |
| 1765 | |||
| 1627 | #endif | 1766 | #endif |
| 1628 | 1767 | ||
| 1629 | void ERR_load_SSL_strings(void); | 1768 | void ERR_load_SSL_strings(void); |
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index 515065de6c..f0f0150d19 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_lib.c,v 1.302 2022/08/21 18:17:11 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_lib.c,v 1.303 2022/08/21 19:32:38 jsing Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -339,6 +339,7 @@ SSL_new(SSL_CTX *ctx) | |||
| 339 | s->verify_result = X509_V_OK; | 339 | s->verify_result = X509_V_OK; |
| 340 | 340 | ||
| 341 | s->method = ctx->method; | 341 | s->method = ctx->method; |
| 342 | s->quic_method = ctx->quic_method; | ||
| 342 | 343 | ||
| 343 | if (!s->method->ssl_new(s)) | 344 | if (!s->method->ssl_new(s)) |
| 344 | goto err; | 345 | goto err; |
| @@ -2585,6 +2586,28 @@ SSL_get_error(const SSL *s, int i) | |||
| 2585 | } | 2586 | } |
| 2586 | 2587 | ||
| 2587 | int | 2588 | int |
| 2589 | SSL_CTX_set_quic_method(SSL_CTX *ctx, const SSL_QUIC_METHOD *quic_method) | ||
| 2590 | { | ||
| 2591 | if (ctx->method->dtls) | ||
| 2592 | return 0; | ||
| 2593 | |||
| 2594 | ctx->quic_method = quic_method; | ||
| 2595 | |||
| 2596 | return 1; | ||
| 2597 | } | ||
| 2598 | |||
| 2599 | int | ||
| 2600 | SSL_set_quic_method(SSL *ssl, const SSL_QUIC_METHOD *quic_method) | ||
| 2601 | { | ||
| 2602 | if (ssl->method->dtls) | ||
| 2603 | return 0; | ||
| 2604 | |||
| 2605 | ssl->quic_method = quic_method; | ||
| 2606 | |||
| 2607 | return 1; | ||
| 2608 | } | ||
| 2609 | |||
| 2610 | int | ||
| 2588 | SSL_do_handshake(SSL *s) | 2611 | SSL_do_handshake(SSL *s) |
| 2589 | { | 2612 | { |
| 2590 | if (s->internal->handshake_func == NULL) { | 2613 | if (s->internal->handshake_func == NULL) { |
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 6a4f14d281..d45983ac1e 100644 --- a/src/lib/libssl/ssl_locl.h +++ b/src/lib/libssl/ssl_locl.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_locl.h,v 1.422 2022/08/18 07:00:59 tb Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.423 2022/08/21 19:32:38 jsing Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -882,6 +882,7 @@ typedef struct ssl_ctx_internal_st { | |||
| 882 | 882 | ||
| 883 | struct ssl_ctx_st { | 883 | struct ssl_ctx_st { |
| 884 | const SSL_METHOD *method; | 884 | const SSL_METHOD *method; |
| 885 | const SSL_QUIC_METHOD *quic_method; | ||
| 885 | 886 | ||
| 886 | STACK_OF(SSL_CIPHER) *cipher_list; | 887 | STACK_OF(SSL_CIPHER) *cipher_list; |
| 887 | 888 | ||
| @@ -1073,7 +1074,7 @@ struct ssl_st { | |||
| 1073 | int version; | 1074 | int version; |
| 1074 | 1075 | ||
| 1075 | const SSL_METHOD *method; | 1076 | const SSL_METHOD *method; |
| 1076 | const void *quic_method; /* XXX */ | 1077 | const SSL_QUIC_METHOD *quic_method; |
| 1077 | 1078 | ||
| 1078 | /* There are 2 BIO's even though they are normally both the | 1079 | /* There are 2 BIO's even though they are normally both the |
| 1079 | * same. This is so data can be read and written to different | 1080 | * same. This is so data can be read and written to different |
