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