Home | History | Annotate | Line # | Download | only in ssl
      1      1.1  christos /*
      2      1.1  christos  * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      3      1.1  christos  * Copyright 2005 Nokia. All rights reserved.
      4      1.1  christos  *
      5      1.1  christos  * Licensed under the Apache License 2.0 (the "License").  You may not use
      6      1.1  christos  * this file except in compliance with the License.  You can obtain a copy
      7      1.1  christos  * in the file LICENSE in the source distribution or at
      8      1.1  christos  * https://www.openssl.org/source/license.html
      9      1.1  christos  */
     10      1.1  christos 
     11      1.1  christos #include <stdio.h>
     12      1.1  christos #include <stdlib.h>
     13      1.1  christos #include "ssl_local.h"
     14      1.1  christos #include <openssl/asn1t.h>
     15      1.1  christos #include <openssl/encoder.h>
     16      1.1  christos #include <openssl/x509.h>
     17      1.1  christos 
     18      1.1  christos typedef struct {
     19      1.1  christos     uint32_t version;
     20      1.1  christos     int32_t ssl_version;
     21      1.1  christos     ASN1_OCTET_STRING *cipher;
     22      1.1  christos     ASN1_OCTET_STRING *comp_id;
     23      1.1  christos     ASN1_OCTET_STRING *master_key;
     24      1.1  christos     ASN1_OCTET_STRING *session_id;
     25      1.1  christos     ASN1_OCTET_STRING *key_arg;
     26      1.1  christos     int64_t time;
     27      1.1  christos     int64_t timeout;
     28      1.1  christos     X509 *peer;
     29      1.1  christos     ASN1_OCTET_STRING *session_id_context;
     30      1.1  christos     int32_t verify_result;
     31      1.1  christos     ASN1_OCTET_STRING *tlsext_hostname;
     32      1.1  christos     uint64_t tlsext_tick_lifetime_hint;
     33      1.1  christos     uint32_t tlsext_tick_age_add;
     34      1.1  christos     ASN1_OCTET_STRING *tlsext_tick;
     35      1.1  christos #ifndef OPENSSL_NO_PSK
     36      1.1  christos     ASN1_OCTET_STRING *psk_identity_hint;
     37      1.1  christos     ASN1_OCTET_STRING *psk_identity;
     38      1.1  christos #endif
     39      1.1  christos #ifndef OPENSSL_NO_SRP
     40      1.1  christos     ASN1_OCTET_STRING *srp_username;
     41      1.1  christos #endif
     42      1.1  christos     uint64_t flags;
     43      1.1  christos     uint32_t max_early_data;
     44      1.1  christos     ASN1_OCTET_STRING *alpn_selected;
     45      1.1  christos     uint32_t tlsext_max_fragment_len_mode;
     46      1.1  christos     ASN1_OCTET_STRING *ticket_appdata;
     47      1.1  christos     uint32_t kex_group;
     48      1.1  christos     ASN1_OCTET_STRING *peer_rpk;
     49      1.1  christos } SSL_SESSION_ASN1;
     50      1.1  christos 
     51      1.1  christos ASN1_SEQUENCE(SSL_SESSION_ASN1) = {
     52      1.1  christos     ASN1_EMBED(SSL_SESSION_ASN1, version, UINT32),
     53      1.1  christos     ASN1_EMBED(SSL_SESSION_ASN1, ssl_version, INT32),
     54      1.1  christos     ASN1_SIMPLE(SSL_SESSION_ASN1, cipher, ASN1_OCTET_STRING),
     55      1.1  christos     ASN1_SIMPLE(SSL_SESSION_ASN1, session_id, ASN1_OCTET_STRING),
     56      1.1  christos     ASN1_SIMPLE(SSL_SESSION_ASN1, master_key, ASN1_OCTET_STRING),
     57      1.1  christos     ASN1_IMP_OPT(SSL_SESSION_ASN1, key_arg, ASN1_OCTET_STRING, 0),
     58      1.1  christos     ASN1_EXP_OPT_EMBED(SSL_SESSION_ASN1, time, ZINT64, 1),
     59      1.1  christos     ASN1_EXP_OPT_EMBED(SSL_SESSION_ASN1, timeout, ZINT64, 2),
     60      1.1  christos     ASN1_EXP_OPT(SSL_SESSION_ASN1, peer, X509, 3),
     61      1.1  christos     ASN1_EXP_OPT(SSL_SESSION_ASN1, session_id_context, ASN1_OCTET_STRING, 4),
     62      1.1  christos     ASN1_EXP_OPT_EMBED(SSL_SESSION_ASN1, verify_result, ZINT32, 5),
     63      1.1  christos     ASN1_EXP_OPT(SSL_SESSION_ASN1, tlsext_hostname, ASN1_OCTET_STRING, 6),
     64      1.1  christos #ifndef OPENSSL_NO_PSK
     65      1.1  christos     ASN1_EXP_OPT(SSL_SESSION_ASN1, psk_identity_hint, ASN1_OCTET_STRING, 7),
     66      1.1  christos     ASN1_EXP_OPT(SSL_SESSION_ASN1, psk_identity, ASN1_OCTET_STRING, 8),
     67      1.1  christos #endif
     68      1.1  christos     ASN1_EXP_OPT_EMBED(SSL_SESSION_ASN1, tlsext_tick_lifetime_hint, ZUINT64, 9),
     69      1.1  christos     ASN1_EXP_OPT(SSL_SESSION_ASN1, tlsext_tick, ASN1_OCTET_STRING, 10),
     70      1.1  christos     ASN1_EXP_OPT(SSL_SESSION_ASN1, comp_id, ASN1_OCTET_STRING, 11),
     71      1.1  christos #ifndef OPENSSL_NO_SRP
     72      1.1  christos     ASN1_EXP_OPT(SSL_SESSION_ASN1, srp_username, ASN1_OCTET_STRING, 12),
     73      1.1  christos #endif
     74      1.1  christos     ASN1_EXP_OPT_EMBED(SSL_SESSION_ASN1, flags, ZUINT64, 13),
     75      1.1  christos     ASN1_EXP_OPT_EMBED(SSL_SESSION_ASN1, tlsext_tick_age_add, ZUINT32, 14),
     76      1.1  christos     ASN1_EXP_OPT_EMBED(SSL_SESSION_ASN1, max_early_data, ZUINT32, 15),
     77      1.1  christos     ASN1_EXP_OPT(SSL_SESSION_ASN1, alpn_selected, ASN1_OCTET_STRING, 16),
     78      1.1  christos     ASN1_EXP_OPT_EMBED(SSL_SESSION_ASN1, tlsext_max_fragment_len_mode, ZUINT32, 17),
     79      1.1  christos     ASN1_EXP_OPT(SSL_SESSION_ASN1, ticket_appdata, ASN1_OCTET_STRING, 18),
     80      1.1  christos     ASN1_EXP_OPT_EMBED(SSL_SESSION_ASN1, kex_group, UINT32, 19),
     81      1.1  christos     ASN1_EXP_OPT(SSL_SESSION_ASN1, peer_rpk, ASN1_OCTET_STRING, 20)
     82      1.1  christos } static_ASN1_SEQUENCE_END(SSL_SESSION_ASN1)
     83      1.1  christos 
     84  1.1.1.2  christos     IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(SSL_SESSION_ASN1)
     85      1.1  christos 
     86      1.1  christos /* Utility functions for i2d_SSL_SESSION */
     87      1.1  christos 
     88      1.1  christos /* Initialise OCTET STRING from buffer and length */
     89      1.1  christos 
     90      1.1  christos static void ssl_session_oinit(ASN1_OCTET_STRING **dest, ASN1_OCTET_STRING *os,
     91  1.1.1.2  christos     const unsigned char *data, size_t len)
     92      1.1  christos {
     93      1.1  christos     os->data = (unsigned char *)data; /* justified cast: data is not modified */
     94      1.1  christos     os->length = (int)len;
     95      1.1  christos     os->flags = 0;
     96      1.1  christos     *dest = os;
     97      1.1  christos }
     98      1.1  christos 
     99      1.1  christos /* Initialise OCTET STRING from string */
    100      1.1  christos static void ssl_session_sinit(ASN1_OCTET_STRING **dest, ASN1_OCTET_STRING *os,
    101  1.1.1.2  christos     const char *data)
    102      1.1  christos {
    103      1.1  christos     if (data != NULL)
    104      1.1  christos         ssl_session_oinit(dest, os, (const unsigned char *)data, strlen(data));
    105      1.1  christos     else
    106      1.1  christos         *dest = NULL;
    107      1.1  christos }
    108      1.1  christos 
    109      1.1  christos int i2d_SSL_SESSION(const SSL_SESSION *in, unsigned char **pp)
    110      1.1  christos {
    111      1.1  christos 
    112      1.1  christos     SSL_SESSION_ASN1 as;
    113      1.1  christos 
    114      1.1  christos     ASN1_OCTET_STRING cipher;
    115      1.1  christos     unsigned char cipher_data[2];
    116      1.1  christos     ASN1_OCTET_STRING master_key, session_id, sid_ctx;
    117      1.1  christos 
    118      1.1  christos #ifndef OPENSSL_NO_COMP
    119      1.1  christos     ASN1_OCTET_STRING comp_id;
    120      1.1  christos     unsigned char comp_id_data;
    121      1.1  christos #endif
    122      1.1  christos     ASN1_OCTET_STRING tlsext_hostname, tlsext_tick;
    123      1.1  christos #ifndef OPENSSL_NO_SRP
    124      1.1  christos     ASN1_OCTET_STRING srp_username;
    125      1.1  christos #endif
    126      1.1  christos #ifndef OPENSSL_NO_PSK
    127      1.1  christos     ASN1_OCTET_STRING psk_identity, psk_identity_hint;
    128      1.1  christos #endif
    129      1.1  christos     ASN1_OCTET_STRING alpn_selected;
    130      1.1  christos     ASN1_OCTET_STRING ticket_appdata;
    131      1.1  christos     ASN1_OCTET_STRING peer_rpk;
    132      1.1  christos 
    133      1.1  christos     long l;
    134      1.1  christos     int ret;
    135      1.1  christos 
    136      1.1  christos     if ((in == NULL) || ((in->cipher == NULL) && (in->cipher_id == 0)))
    137      1.1  christos         return 0;
    138      1.1  christos 
    139      1.1  christos     memset(&as, 0, sizeof(as));
    140      1.1  christos 
    141      1.1  christos     as.version = SSL_SESSION_ASN1_VERSION;
    142      1.1  christos     as.ssl_version = in->ssl_version;
    143      1.1  christos 
    144      1.1  christos     as.kex_group = in->kex_group;
    145      1.1  christos 
    146      1.1  christos     if (in->cipher == NULL)
    147      1.1  christos         l = in->cipher_id;
    148      1.1  christos     else
    149      1.1  christos         l = in->cipher->id;
    150      1.1  christos     cipher_data[0] = ((unsigned char)(l >> 8L)) & 0xff;
    151      1.1  christos     cipher_data[1] = ((unsigned char)(l)) & 0xff;
    152      1.1  christos 
    153      1.1  christos     ssl_session_oinit(&as.cipher, &cipher, cipher_data, 2);
    154      1.1  christos 
    155      1.1  christos #ifndef OPENSSL_NO_COMP
    156      1.1  christos     if (in->compress_meth) {
    157      1.1  christos         comp_id_data = (unsigned char)in->compress_meth;
    158      1.1  christos         ssl_session_oinit(&as.comp_id, &comp_id, &comp_id_data, 1);
    159      1.1  christos     }
    160      1.1  christos #endif
    161      1.1  christos 
    162      1.1  christos     ssl_session_oinit(&as.master_key, &master_key,
    163  1.1.1.2  christos         in->master_key, in->master_key_length);
    164      1.1  christos 
    165      1.1  christos     ssl_session_oinit(&as.session_id, &session_id,
    166  1.1.1.2  christos         in->session_id, in->session_id_length);
    167      1.1  christos 
    168      1.1  christos     ssl_session_oinit(&as.session_id_context, &sid_ctx,
    169  1.1.1.2  christos         in->sid_ctx, in->sid_ctx_length);
    170      1.1  christos 
    171      1.1  christos     as.time = (int64_t)ossl_time_to_time_t(in->time);
    172      1.1  christos     as.timeout = (int64_t)ossl_time2seconds(in->timeout);
    173      1.1  christos     as.verify_result = in->verify_result;
    174      1.1  christos 
    175      1.1  christos     as.peer = in->peer;
    176      1.1  christos 
    177      1.1  christos     as.peer_rpk = NULL;
    178      1.1  christos     peer_rpk.data = NULL;
    179      1.1  christos     if (in->peer_rpk != NULL) {
    180      1.1  christos         peer_rpk.length = i2d_PUBKEY(in->peer_rpk, &peer_rpk.data);
    181      1.1  christos         if (peer_rpk.length > 0 && peer_rpk.data != NULL)
    182      1.1  christos             as.peer_rpk = &peer_rpk;
    183      1.1  christos     }
    184      1.1  christos 
    185      1.1  christos     ssl_session_sinit(&as.tlsext_hostname, &tlsext_hostname,
    186  1.1.1.2  christos         in->ext.hostname);
    187      1.1  christos     if (in->ext.tick) {
    188      1.1  christos         ssl_session_oinit(&as.tlsext_tick, &tlsext_tick,
    189  1.1.1.2  christos             in->ext.tick, in->ext.ticklen);
    190      1.1  christos     }
    191      1.1  christos     if (in->ext.tick_lifetime_hint > 0)
    192      1.1  christos         as.tlsext_tick_lifetime_hint = in->ext.tick_lifetime_hint;
    193      1.1  christos     as.tlsext_tick_age_add = in->ext.tick_age_add;
    194      1.1  christos #ifndef OPENSSL_NO_PSK
    195      1.1  christos     ssl_session_sinit(&as.psk_identity_hint, &psk_identity_hint,
    196  1.1.1.2  christos         in->psk_identity_hint);
    197      1.1  christos     ssl_session_sinit(&as.psk_identity, &psk_identity, in->psk_identity);
    198  1.1.1.2  christos #endif /* OPENSSL_NO_PSK */
    199      1.1  christos #ifndef OPENSSL_NO_SRP
    200      1.1  christos     ssl_session_sinit(&as.srp_username, &srp_username, in->srp_username);
    201  1.1.1.2  christos #endif /* OPENSSL_NO_SRP */
    202      1.1  christos 
    203      1.1  christos     as.flags = in->flags;
    204      1.1  christos     as.max_early_data = in->ext.max_early_data;
    205      1.1  christos 
    206      1.1  christos     if (in->ext.alpn_selected == NULL)
    207      1.1  christos         as.alpn_selected = NULL;
    208      1.1  christos     else
    209      1.1  christos         ssl_session_oinit(&as.alpn_selected, &alpn_selected,
    210  1.1.1.2  christos             in->ext.alpn_selected, in->ext.alpn_selected_len);
    211      1.1  christos 
    212      1.1  christos     as.tlsext_max_fragment_len_mode = in->ext.max_fragment_len_mode;
    213      1.1  christos 
    214      1.1  christos     if (in->ticket_appdata == NULL)
    215      1.1  christos         as.ticket_appdata = NULL;
    216      1.1  christos     else
    217      1.1  christos         ssl_session_oinit(&as.ticket_appdata, &ticket_appdata,
    218  1.1.1.2  christos             in->ticket_appdata, in->ticket_appdata_len);
    219      1.1  christos 
    220      1.1  christos     ret = i2d_SSL_SESSION_ASN1(&as, pp);
    221      1.1  christos     OPENSSL_free(peer_rpk.data);
    222      1.1  christos     return ret;
    223      1.1  christos }
    224      1.1  christos 
    225      1.1  christos /* Utility functions for d2i_SSL_SESSION */
    226      1.1  christos 
    227      1.1  christos /* OPENSSL_strndup an OCTET STRING */
    228      1.1  christos 
    229      1.1  christos static int ssl_session_strndup(char **pdst, ASN1_OCTET_STRING *src)
    230      1.1  christos {
    231      1.1  christos     OPENSSL_free(*pdst);
    232      1.1  christos     *pdst = NULL;
    233      1.1  christos     if (src == NULL)
    234      1.1  christos         return 1;
    235      1.1  christos     *pdst = OPENSSL_strndup((char *)src->data, src->length);
    236      1.1  christos     if (*pdst == NULL)
    237      1.1  christos         return 0;
    238      1.1  christos     return 1;
    239      1.1  christos }
    240      1.1  christos 
    241      1.1  christos /* Copy an OCTET STRING, return error if it exceeds maximum length */
    242      1.1  christos 
    243      1.1  christos static int ssl_session_memcpy(unsigned char *dst, size_t *pdstlen,
    244  1.1.1.2  christos     ASN1_OCTET_STRING *src, size_t maxlen)
    245      1.1  christos {
    246      1.1  christos     if (src == NULL || src->length == 0) {
    247      1.1  christos         *pdstlen = 0;
    248      1.1  christos         return 1;
    249      1.1  christos     }
    250      1.1  christos     if (src->length < 0 || src->length > (int)maxlen)
    251      1.1  christos         return 0;
    252      1.1  christos     memcpy(dst, src->data, src->length);
    253      1.1  christos     *pdstlen = src->length;
    254      1.1  christos     return 1;
    255      1.1  christos }
    256      1.1  christos 
    257      1.1  christos SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp,
    258  1.1.1.2  christos     long length)
    259      1.1  christos {
    260      1.1  christos     return d2i_SSL_SESSION_ex(a, pp, length, NULL, NULL);
    261      1.1  christos }
    262      1.1  christos SSL_SESSION *d2i_SSL_SESSION_ex(SSL_SESSION **a, const unsigned char **pp,
    263  1.1.1.2  christos     long length, OSSL_LIB_CTX *libctx,
    264  1.1.1.2  christos     const char *propq)
    265      1.1  christos {
    266      1.1  christos     long id;
    267      1.1  christos     size_t tmpl;
    268      1.1  christos     const unsigned char *p = *pp;
    269      1.1  christos     SSL_SESSION_ASN1 *as = NULL;
    270      1.1  christos     SSL_SESSION *ret = NULL;
    271      1.1  christos 
    272      1.1  christos     as = d2i_SSL_SESSION_ASN1(NULL, &p, length);
    273      1.1  christos     /* ASN.1 code returns suitable error */
    274      1.1  christos     if (as == NULL)
    275      1.1  christos         goto err;
    276      1.1  christos 
    277      1.1  christos     if (a == NULL || *a == NULL) {
    278      1.1  christos         ret = SSL_SESSION_new();
    279      1.1  christos         if (ret == NULL)
    280      1.1  christos             goto err;
    281      1.1  christos     } else {
    282      1.1  christos         ret = *a;
    283      1.1  christos     }
    284      1.1  christos 
    285      1.1  christos     if (as->version != SSL_SESSION_ASN1_VERSION) {
    286      1.1  christos         ERR_raise(ERR_LIB_SSL, SSL_R_UNKNOWN_SSL_VERSION);
    287      1.1  christos         goto err;
    288      1.1  christos     }
    289      1.1  christos 
    290      1.1  christos     if ((as->ssl_version >> 8) != SSL3_VERSION_MAJOR
    291      1.1  christos         && (as->ssl_version >> 8) != DTLS1_VERSION_MAJOR
    292      1.1  christos         && as->ssl_version != DTLS1_BAD_VER) {
    293      1.1  christos         ERR_raise(ERR_LIB_SSL, SSL_R_UNSUPPORTED_SSL_VERSION);
    294      1.1  christos         goto err;
    295      1.1  christos     }
    296      1.1  christos 
    297      1.1  christos     ret->ssl_version = (int)as->ssl_version;
    298      1.1  christos 
    299      1.1  christos     ret->kex_group = as->kex_group;
    300      1.1  christos 
    301      1.1  christos     if (as->cipher->length != 2) {
    302      1.1  christos         ERR_raise(ERR_LIB_SSL, SSL_R_CIPHER_CODE_WRONG_LENGTH);
    303      1.1  christos         goto err;
    304      1.1  christos     }
    305      1.1  christos 
    306      1.1  christos     id = 0x03000000L | ((unsigned long)as->cipher->data[0] << 8L)
    307  1.1.1.2  christos         | (unsigned long)as->cipher->data[1];
    308      1.1  christos 
    309      1.1  christos     ret->cipher_id = id;
    310      1.1  christos     ret->cipher = ssl3_get_cipher_by_id(id);
    311      1.1  christos     if (ret->cipher == NULL)
    312      1.1  christos         goto err;
    313      1.1  christos 
    314      1.1  christos     if (!ssl_session_memcpy(ret->session_id, &ret->session_id_length,
    315  1.1.1.2  christos             as->session_id, SSL3_MAX_SSL_SESSION_ID_LENGTH))
    316      1.1  christos         goto err;
    317      1.1  christos 
    318      1.1  christos     if (!ssl_session_memcpy(ret->master_key, &tmpl,
    319  1.1.1.2  christos             as->master_key, TLS13_MAX_RESUMPTION_PSK_LENGTH))
    320      1.1  christos         goto err;
    321      1.1  christos 
    322      1.1  christos     ret->master_key_length = tmpl;
    323      1.1  christos 
    324      1.1  christos     if (as->time != 0)
    325      1.1  christos         ret->time = ossl_time_from_time_t(as->time);
    326      1.1  christos     else
    327      1.1  christos         ret->time = ossl_time_now();
    328      1.1  christos 
    329      1.1  christos     if (as->timeout != 0)
    330      1.1  christos         ret->timeout = ossl_seconds2time(as->timeout);
    331      1.1  christos     else
    332      1.1  christos         ret->timeout = ossl_seconds2time(3);
    333      1.1  christos     ssl_session_calculate_timeout(ret);
    334      1.1  christos 
    335      1.1  christos     X509_free(ret->peer);
    336      1.1  christos     ret->peer = as->peer;
    337      1.1  christos     as->peer = NULL;
    338      1.1  christos 
    339      1.1  christos     EVP_PKEY_free(ret->peer_rpk);
    340      1.1  christos     ret->peer_rpk = NULL;
    341      1.1  christos     if (as->peer_rpk != NULL) {
    342      1.1  christos         const unsigned char *data = as->peer_rpk->data;
    343      1.1  christos 
    344      1.1  christos         /*
    345      1.1  christos          * |data| is incremented; we don't want to lose original ptr
    346      1.1  christos          */
    347      1.1  christos         ret->peer_rpk = d2i_PUBKEY_ex(NULL, &data, as->peer_rpk->length, libctx, propq);
    348      1.1  christos         if (ret->peer_rpk == NULL)
    349      1.1  christos             goto err;
    350      1.1  christos     }
    351      1.1  christos 
    352      1.1  christos     if (!ssl_session_memcpy(ret->sid_ctx, &ret->sid_ctx_length,
    353  1.1.1.2  christos             as->session_id_context, SSL_MAX_SID_CTX_LENGTH))
    354      1.1  christos         goto err;
    355      1.1  christos 
    356      1.1  christos     /* NB: this defaults to zero which is X509_V_OK */
    357      1.1  christos     ret->verify_result = as->verify_result;
    358      1.1  christos 
    359      1.1  christos     if (!ssl_session_strndup(&ret->ext.hostname, as->tlsext_hostname))
    360      1.1  christos         goto err;
    361      1.1  christos 
    362      1.1  christos #ifndef OPENSSL_NO_PSK
    363      1.1  christos     if (!ssl_session_strndup(&ret->psk_identity_hint, as->psk_identity_hint))
    364      1.1  christos         goto err;
    365      1.1  christos     if (!ssl_session_strndup(&ret->psk_identity, as->psk_identity))
    366      1.1  christos         goto err;
    367      1.1  christos #endif
    368      1.1  christos 
    369      1.1  christos     ret->ext.tick_lifetime_hint = (unsigned long)as->tlsext_tick_lifetime_hint;
    370      1.1  christos     ret->ext.tick_age_add = as->tlsext_tick_age_add;
    371      1.1  christos     OPENSSL_free(ret->ext.tick);
    372      1.1  christos     if (as->tlsext_tick != NULL) {
    373      1.1  christos         ret->ext.tick = as->tlsext_tick->data;
    374      1.1  christos         ret->ext.ticklen = as->tlsext_tick->length;
    375      1.1  christos         as->tlsext_tick->data = NULL;
    376      1.1  christos     } else {
    377      1.1  christos         ret->ext.tick = NULL;
    378      1.1  christos     }
    379      1.1  christos #ifndef OPENSSL_NO_COMP
    380      1.1  christos     if (as->comp_id) {
    381      1.1  christos         if (as->comp_id->length != 1) {
    382      1.1  christos             ERR_raise(ERR_LIB_SSL, SSL_R_BAD_LENGTH);
    383      1.1  christos             goto err;
    384      1.1  christos         }
    385      1.1  christos         ret->compress_meth = as->comp_id->data[0];
    386      1.1  christos     } else {
    387      1.1  christos         ret->compress_meth = 0;
    388      1.1  christos     }
    389      1.1  christos #endif
    390      1.1  christos 
    391      1.1  christos #ifndef OPENSSL_NO_SRP
    392      1.1  christos     if (!ssl_session_strndup(&ret->srp_username, as->srp_username))
    393      1.1  christos         goto err;
    394  1.1.1.2  christos #endif /* OPENSSL_NO_SRP */
    395      1.1  christos     /* Flags defaults to zero which is fine */
    396      1.1  christos     ret->flags = (int32_t)as->flags;
    397      1.1  christos     ret->ext.max_early_data = as->max_early_data;
    398      1.1  christos 
    399      1.1  christos     OPENSSL_free(ret->ext.alpn_selected);
    400      1.1  christos     if (as->alpn_selected != NULL) {
    401      1.1  christos         ret->ext.alpn_selected = as->alpn_selected->data;
    402      1.1  christos         ret->ext.alpn_selected_len = as->alpn_selected->length;
    403      1.1  christos         as->alpn_selected->data = NULL;
    404      1.1  christos     } else {
    405      1.1  christos         ret->ext.alpn_selected = NULL;
    406      1.1  christos         ret->ext.alpn_selected_len = 0;
    407      1.1  christos     }
    408      1.1  christos 
    409      1.1  christos     ret->ext.max_fragment_len_mode = as->tlsext_max_fragment_len_mode;
    410      1.1  christos 
    411      1.1  christos     OPENSSL_free(ret->ticket_appdata);
    412      1.1  christos     if (as->ticket_appdata != NULL) {
    413      1.1  christos         ret->ticket_appdata = as->ticket_appdata->data;
    414      1.1  christos         ret->ticket_appdata_len = as->ticket_appdata->length;
    415      1.1  christos         as->ticket_appdata->data = NULL;
    416      1.1  christos     } else {
    417      1.1  christos         ret->ticket_appdata = NULL;
    418      1.1  christos         ret->ticket_appdata_len = 0;
    419      1.1  christos     }
    420      1.1  christos 
    421      1.1  christos     M_ASN1_free_of(as, SSL_SESSION_ASN1);
    422      1.1  christos 
    423      1.1  christos     if ((a != NULL) && (*a == NULL))
    424      1.1  christos         *a = ret;
    425      1.1  christos     *pp = p;
    426      1.1  christos     return ret;
    427      1.1  christos 
    428  1.1.1.2  christos err:
    429      1.1  christos     M_ASN1_free_of(as, SSL_SESSION_ASN1);
    430      1.1  christos     if ((a == NULL) || (*a != ret))
    431      1.1  christos         SSL_SESSION_free(ret);
    432      1.1  christos     return NULL;
    433      1.1  christos }
    434