Home | History | Annotate | Line # | Download | only in internal
      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