xref: /freebsd/crypto/openssl/include/internal/ssl_unwrap.h (revision e7be843b4a162e68651d3911f0357ed464915629)
1 /*
2  * Copyright 2024-2025 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9 
10 #ifndef OSSL_SSL_UNWRAP_H
11 # define OSSL_SSL_UNWRAP_H
12 
13 # include <openssl/ssl.h>
14 # include "internal/quic_predef.h"
15 
16 # define SSL_CONNECTION_FROM_SSL_ONLY_int(ssl, c) \
17     ((ssl) == NULL ? NULL                         \
18      : ((ssl)->type == SSL_TYPE_SSL_CONNECTION    \
19        ? (c SSL_CONNECTION *)(ssl)                \
20        : NULL))
21 # define SSL_CONNECTION_NO_CONST
22 # define SSL_CONNECTION_FROM_SSL_ONLY(ssl) \
23     SSL_CONNECTION_FROM_SSL_ONLY_int(ssl, SSL_CONNECTION_NO_CONST)
24 # define SSL_CONNECTION_FROM_CONST_SSL_ONLY(ssl) \
25     SSL_CONNECTION_FROM_SSL_ONLY_int(ssl, const)
26 # define SSL_CONNECTION_GET_CTX(sc) ((sc)->ssl.ctx)
27 # define SSL_CONNECTION_GET_SSL(sc) (&(sc)->ssl)
28 # define SSL_CONNECTION_GET_USER_SSL(sc) ((sc)->user_ssl)
29 # ifndef OPENSSL_NO_QUIC
30 struct ssl_connection_st *ossl_quic_obj_get0_handshake_layer(QUIC_OBJ *obj);
31 #  define SSL_CONNECTION_FROM_SSL_int(ssl, c)                                           \
32     ((ssl) == NULL ? NULL                                                               \
33      : ((ssl)->type == SSL_TYPE_SSL_CONNECTION                                          \
34         ? (c SSL_CONNECTION *)(ssl)                                                     \
35         : (SSL_TYPE_IS_QUIC((ssl)->type)                                                \
36           ? (c SSL_CONNECTION *)ossl_quic_obj_get0_handshake_layer((QUIC_OBJ *)(ssl))   \
37           : NULL)))
38 #  define SSL_CONNECTION_FROM_SSL(ssl) \
39     SSL_CONNECTION_FROM_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
40 #  define SSL_CONNECTION_FROM_CONST_SSL(ssl) \
41     SSL_CONNECTION_FROM_SSL_int(ssl, const)
42 # else
43 #  define SSL_CONNECTION_FROM_SSL(ssl) \
44     SSL_CONNECTION_FROM_SSL_ONLY_int(ssl, SSL_CONNECTION_NO_CONST)
45 #  define SSL_CONNECTION_FROM_CONST_SSL(ssl) \
46     SSL_CONNECTION_FROM_SSL_ONLY_int(ssl, const)
47 # endif
48 
49 # ifndef OPENSSL_NO_QUIC
50 
51 #  define IS_QUIC_METHOD(m) \
52     ((m) == OSSL_QUIC_client_method() || \
53      (m) == OSSL_QUIC_client_thread_method() || \
54      (m) == OSSL_QUIC_server_method())
55 
56 #  define IS_QUIC_CTX(ctx)          IS_QUIC_METHOD((ctx)->method)
57 
58 #  define QUIC_CONNECTION_FROM_SSL_int(ssl, c)   \
59      ((ssl) == NULL ? NULL                       \
60       : ((ssl)->type == SSL_TYPE_QUIC_CONNECTION \
61          ? (c QUIC_CONNECTION *)(ssl)            \
62          : NULL))
63 
64 #  define QUIC_XSO_FROM_SSL_int(ssl, c)                             \
65     ((ssl) == NULL                                                  \
66      ? NULL                                                         \
67      : (((ssl)->type == SSL_TYPE_QUIC_XSO                           \
68         ? (c QUIC_XSO *)(ssl)                                       \
69         : ((ssl)->type == SSL_TYPE_QUIC_CONNECTION                  \
70            ? (c QUIC_XSO *)((QUIC_CONNECTION *)(ssl))->default_xso  \
71            : NULL))))
72 
73 #  define SSL_CONNECTION_FROM_QUIC_SSL_int(ssl, c)               \
74      ((ssl) == NULL ? NULL                                       \
75       : ((ssl)->type == SSL_TYPE_QUIC_CONNECTION                 \
76          ? (c SSL_CONNECTION *)((c QUIC_CONNECTION *)(ssl))->tls \
77          : NULL))
78 
79 #  define QUIC_LISTENER_FROM_SSL_int(ssl, c)                            \
80     ((ssl) == NULL                                                      \
81      ? NULL                                                             \
82      : ((ssl)->type == SSL_TYPE_QUIC_LISTENER                           \
83         ? (c QUIC_LISTENER *)(ssl)                                      \
84         : NULL))
85 
86 #  define QUIC_DOMAIN_FROM_SSL_int(ssl, c)                              \
87     ((ssl) == NULL                                                      \
88      ? NULL                                                             \
89      : ((ssl)->type == SSL_TYPE_QUIC_DOMAIN                             \
90         ? (c QUIC_DOMAIN *)(ssl)                                        \
91         : NULL))
92 
93 #  define IS_QUIC_CS(ssl) ((ssl) != NULL                                \
94                            && ((ssl)->type == SSL_TYPE_QUIC_CONNECTION  \
95                                || (ssl)->type == SSL_TYPE_QUIC_XSO))
96 
97 #  define IS_QUIC(ssl)                                                  \
98     ((ssl) != NULL && SSL_TYPE_IS_QUIC((ssl)->type))
99 
100 # else
101 
102 #  define QUIC_CONNECTION_FROM_SSL_int(ssl, c) NULL
103 #  define QUIC_XSO_FROM_SSL_int(ssl, c) NULL
104 #  define QUIC_LISTENER_FROM_SSL_int(ssl, c) NULL
105 #  define SSL_CONNECTION_FROM_QUIC_SSL_int(ssl, c) NULL
106 #  define IS_QUIC(ssl) 0
107 #  define IS_QUIC_CS(ssl) 0
108 #  define IS_QUIC_CTX(ctx) 0
109 #  define IS_QUIC_METHOD(m) 0
110 
111 # endif
112 
113 # define QUIC_CONNECTION_FROM_SSL(ssl) \
114     QUIC_CONNECTION_FROM_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
115 # define QUIC_CONNECTION_FROM_CONST_SSL(ssl) \
116     QUIC_CONNECTION_FROM_SSL_int(ssl, const)
117 # define QUIC_XSO_FROM_SSL(ssl) \
118     QUIC_XSO_FROM_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
119 # define QUIC_XSO_FROM_CONST_SSL(ssl) \
120     QUIC_XSO_FROM_SSL_int(ssl, const)
121 # define QUIC_LISTENER_FROM_SSL(ssl) \
122     QUIC_LISTENER_FROM_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
123 # define QUIC_LISTENER_FROM_CONST_SSL(ssl) \
124     QUIC_LISTENER_FROM_SSL_int(ssl, const)
125 # define SSL_CONNECTION_FROM_QUIC_SSL(ssl) \
126     SSL_CONNECTION_FROM_QUIC_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
127 # define SSL_CONNECTION_FROM_CONST_QUIC_SSL(ssl) \
128     SSL_CONNECTION_FROM_CONST_QUIC_SSL_int(ssl, const)
129 
130 #endif
131