From: Richard Levitte Date: Tue, 6 Sep 2022 11:59:25 +0000 (+0200) Subject: Move the QUIC_CONNECTION typedef to internal headers X-Git-Tag: openssl-3.2.0-alpha1~2017 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d5ab48a192d45ec51355ef2a186125961331eb9b;p=thirdparty%2Fopenssl.git Move the QUIC_CONNECTION typedef to internal headers Also add internal functionality to get a QUIC_CONNECTION pointer from an SSL pointer, and setters / getters for the GQX and ACKM fields. Reviewed-by: Hugo Landau Reviewed-by: Paul Dale Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/18838) --- diff --git a/doc/designs/quic-design/rx-depacketizer.md b/doc/designs/quic-design/rx-depacketizer.md index b5a1f21541c..1222973c1ba 100644 --- a/doc/designs/quic-design/rx-depacketizer.md +++ b/doc/designs/quic-design/rx-depacketizer.md @@ -13,7 +13,7 @@ Main structures ### Connection Represented by an `QUIC_CONNECTION` object, defined in -[`ssl/quic/quic_local.h`](../../../ssl/quic/quic_local.h). +[`include/internal/quic_ssl.h`](../../../include/internal/quic_ssl.h). ### Stream diff --git a/include/internal/quic_ssl.h b/include/internal/quic_ssl.h new file mode 100644 index 00000000000..d9a0ade6d48 --- /dev/null +++ b/include/internal/quic_ssl.h @@ -0,0 +1,47 @@ +/* + * Copyright 2022 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_QUIC_SSL_H +# define OSSL_QUIC_SSL_H + +# include +# include "internal/quic_record_rx.h" /* OSSL_QRX */ +# include "internal/quic_ackm.h" /* OSSL_ACKM */ + +__owur SSL *ossl_quic_new(SSL_CTX *ctx); +__owur int ossl_quic_init(SSL *s); +void ossl_quic_deinit(SSL *s); +void ossl_quic_free(SSL *s); +int ossl_quic_reset(SSL *s); +int ossl_quic_clear(SSL *s); +__owur int ossl_quic_accept(SSL *s); +__owur int ossl_quic_connect(SSL *s); +__owur int ossl_quic_read(SSL *s, void *buf, size_t len, size_t *readbytes); +__owur int ossl_quic_peek(SSL *s, void *buf, size_t len, size_t *readbytes); +__owur int ossl_quic_write(SSL *s, const void *buf, size_t len, size_t *written); +__owur int ossl_quic_shutdown(SSL *s); +__owur long ossl_quic_ctrl(SSL *s, int cmd, long larg, void *parg); +__owur long ossl_quic_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); +__owur long ossl_quic_callback_ctrl(SSL *s, int cmd, void (*fp) (void)); +__owur long ossl_quic_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp) (void)); +__owur size_t ossl_quic_pending(const SSL *s); +__owur OSSL_TIME ossl_quic_default_timeout(void); +__owur int ossl_quic_num_ciphers(void); +__owur const SSL_CIPHER *ossl_quic_get_cipher(unsigned int u); +int ossl_quic_renegotiate_check(SSL *ssl, int initok); + +typedef struct quic_conn_st QUIC_CONNECTION; + +__owur QUIC_CONNECTION *ossl_quic_conn_from_ssl(SSL *ssl); +int ossl_quic_conn_set_qrx(QUIC_CONNECTION *qc, OSSL_QRX *qrx); +OSSL_QRX *ossl_quic_conn_get_qrx(QUIC_CONNECTION *qc); +int ossl_quic_conn_set_ackm(QUIC_CONNECTION *qc, OSSL_ACKM *ackm); +OSSL_ACKM *ossl_quic_conn_set_akcm(QUIC_CONNECTION *qc); + +#endif diff --git a/ssl/quic/quic_impl.c b/ssl/quic/quic_impl.c index 6d5c1995f8b..ed3b07e63d8 100644 --- a/ssl/quic/quic_impl.c +++ b/ssl/quic/quic_impl.c @@ -239,3 +239,39 @@ int ossl_quic_renegotiate_check(SSL *ssl, int initok) { return 1; } + +QUIC_CONNECTION *ossl_quic_conn_from_ssl(SSL *ssl) +{ + return QUIC_CONNECTION_FROM_SSL(ssl); +} + +/* + * The following are getters and setters of pointers, but they don't affect + * the objects being pointed at. They are CURRENTLY to be freed separately + * by the caller the set them in the first place. + */ +int ossl_quic_conn_set_qrx(QUIC_CONNECTION *qc, OSSL_QRX *qrx) +{ + if (qc == NULL) + return 0; + qc->qrx = qrx; + return 1; +} + +OSSL_QRX *ossl_quic_conn_get_qrx(QUIC_CONNECTION *qc) +{ + return qc != NULL ? qc->qrx : NULL; +} + +int ossl_quic_conn_set_ackm(QUIC_CONNECTION *qc, OSSL_ACKM *ackm) +{ + if (qc == NULL) + return 0; + qc->ackm = ackm; + return 1; +} + +OSSL_ACKM *ossl_quic_conn_set_akcm(QUIC_CONNECTION *qc) +{ + return qc != NULL ? qc->ackm : NULL; +} diff --git a/ssl/quic/quic_local.h b/ssl/quic/quic_local.h index 3f589bba0ba..3305b03aec6 100644 --- a/ssl/quic/quic_local.h +++ b/ssl/quic/quic_local.h @@ -11,16 +11,19 @@ # define OSSL_QUIC_LOCAL_H # include +# include "internal/quic_ssl.h" /* QUIC_CONNECTION */ # include "../ssl_local.h" -typedef struct quic_conn_st { +struct quic_conn_st { /* type identifier and common data */ struct ssl_st ssl; /* the associated tls-1.3 connection data */ SSL *tls; - /* just an example member */ - uint64_t conn_id; -} QUIC_CONNECTION; + + /* For QUIC, diverse handlers */ + OSSL_ACKM *ackm; + OSSL_QRX *qrx; +}; # define QUIC_CONNECTION_FROM_SSL_int(ssl, c) \ ((ssl) == NULL ? NULL \ @@ -86,28 +89,4 @@ const SSL_METHOD *func_name(void) \ return &func_name##_data; \ } -__owur SSL *ossl_quic_new(SSL_CTX *ctx); -__owur int ossl_quic_init(SSL *s); -void ossl_quic_deinit(SSL *s); -void ossl_quic_free(SSL *s); -int ossl_quic_reset(SSL *s); -int ossl_quic_clear(SSL *s); -__owur int ossl_quic_accept(SSL *s); -__owur int ossl_quic_connect(SSL *s); -__owur int ossl_quic_read(SSL *s, void *buf, size_t len, size_t *readbytes); -__owur int ossl_quic_peek(SSL *s, void *buf, size_t len, size_t *readbytes); -__owur int ossl_quic_write(SSL *s, const void *buf, size_t len, size_t *written); -__owur int ossl_quic_shutdown(SSL *s); -__owur long ossl_quic_ctrl(SSL *s, int cmd, long larg, void *parg); -__owur long ossl_quic_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); -__owur long ossl_quic_callback_ctrl(SSL *s, int cmd, void (*fp) (void)); -__owur long ossl_quic_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp) (void)); -__owur size_t ossl_quic_pending(const SSL *s); -__owur OSSL_TIME ossl_quic_default_timeout(void); -__owur int ossl_quic_num_ciphers(void); -__owur const SSL_CIPHER *ossl_quic_get_cipher(unsigned int u); -int ossl_quic_renegotiate_check(SSL *ssl, int initok); - -__owur int ossl_quic_depacketize(QUIC_CONNECTION *connection); - #endif diff --git a/ssl/quic/quic_wire.c b/ssl/quic/quic_wire.c index 4d19ad6013e..2e7e785b7dc 100644 --- a/ssl/quic/quic_wire.c +++ b/ssl/quic/quic_wire.c @@ -9,7 +9,7 @@ #include #include -#include "quic_local.h" +#include "internal/quic_ssl.h" #include "internal/quic_vlint.h" #include "internal/quic_wire.h"