xref: /src/crypto/openssl/include/internal/ssl_unwrap.h (revision f25b8c9fb4f58cf61adb47d7570abe7caa6d385d)
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() || (m) == OSSL_QUIC_client_thread_method() || (m) == OSSL_QUIC_server_method())
53 
54 #define IS_QUIC_CTX(ctx) IS_QUIC_METHOD((ctx)->method)
55 
56 #define QUIC_CONNECTION_FROM_SSL_int(ssl, c)                  \
57     ((ssl) == NULL ? NULL                                     \
58                    : ((ssl)->type == SSL_TYPE_QUIC_CONNECTION \
59                              ? (c QUIC_CONNECTION *)(ssl)     \
60                              : NULL))
61 
62 #define QUIC_XSO_FROM_SSL_int(ssl, c)                                                   \
63     ((ssl) == NULL                                                                      \
64             ? NULL                                                                      \
65             : (((ssl)->type == SSL_TYPE_QUIC_XSO                                        \
66                       ? (c QUIC_XSO *)(ssl)                                             \
67                       : ((ssl)->type == SSL_TYPE_QUIC_CONNECTION                        \
68                                 ? (c QUIC_XSO *)((QUIC_CONNECTION *)(ssl))->default_xso \
69                                 : NULL))))
70 
71 #define SSL_CONNECTION_FROM_QUIC_SSL_int(ssl, c)                                     \
72     ((ssl) == NULL ? NULL                                                            \
73                    : ((ssl)->type == SSL_TYPE_QUIC_CONNECTION                        \
74                              ? (c SSL_CONNECTION *)((c QUIC_CONNECTION *)(ssl))->tls \
75                              : NULL))
76 
77 #define QUIC_LISTENER_FROM_SSL_int(ssl, c)           \
78     ((ssl) == NULL                                   \
79             ? NULL                                   \
80             : ((ssl)->type == SSL_TYPE_QUIC_LISTENER \
81                       ? (c QUIC_LISTENER *)(ssl)     \
82                       : NULL))
83 
84 #define QUIC_DOMAIN_FROM_SSL_int(ssl, c)           \
85     ((ssl) == NULL                                 \
86             ? NULL                                 \
87             : ((ssl)->type == SSL_TYPE_QUIC_DOMAIN \
88                       ? (c QUIC_DOMAIN *)(ssl)     \
89                       : NULL))
90 
91 #define IS_QUIC_CS(ssl) ((ssl) != NULL          \
92     && ((ssl)->type == SSL_TYPE_QUIC_CONNECTION \
93         || (ssl)->type == SSL_TYPE_QUIC_XSO))
94 
95 #define IS_QUIC(ssl) \
96     ((ssl) != NULL && SSL_TYPE_IS_QUIC((ssl)->type))
97 
98 #else
99 
100 #define QUIC_CONNECTION_FROM_SSL_int(ssl, c) NULL
101 #define QUIC_XSO_FROM_SSL_int(ssl, c) NULL
102 #define QUIC_LISTENER_FROM_SSL_int(ssl, c) NULL
103 #define SSL_CONNECTION_FROM_QUIC_SSL_int(ssl, c) NULL
104 #define IS_QUIC(ssl) 0
105 #define IS_QUIC_CS(ssl) 0
106 #define IS_QUIC_CTX(ctx) 0
107 #define IS_QUIC_METHOD(m) 0
108 
109 #endif
110 
111 #define QUIC_CONNECTION_FROM_SSL(ssl) \
112     QUIC_CONNECTION_FROM_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
113 #define QUIC_CONNECTION_FROM_CONST_SSL(ssl) \
114     QUIC_CONNECTION_FROM_SSL_int(ssl, const)
115 #define QUIC_XSO_FROM_SSL(ssl) \
116     QUIC_XSO_FROM_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
117 #define QUIC_XSO_FROM_CONST_SSL(ssl) \
118     QUIC_XSO_FROM_SSL_int(ssl, const)
119 #define QUIC_LISTENER_FROM_SSL(ssl) \
120     QUIC_LISTENER_FROM_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
121 #define QUIC_LISTENER_FROM_CONST_SSL(ssl) \
122     QUIC_LISTENER_FROM_SSL_int(ssl, const)
123 #define SSL_CONNECTION_FROM_QUIC_SSL(ssl) \
124     SSL_CONNECTION_FROM_QUIC_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
125 #define SSL_CONNECTION_FROM_CONST_QUIC_SSL(ssl) \
126     SSL_CONNECTION_FROM_CONST_QUIC_SSL_int(ssl, const)
127 
128 #endif
129