LCOV - code coverage report
Current view: top level - third_party/openssl/ssl - ssl_asn1.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 213 314 67.8 %
Date: 2015-10-10 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /* ssl/ssl_asn1.c */
       2             : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
       3             :  * All rights reserved.
       4             :  *
       5             :  * This package is an SSL implementation written
       6             :  * by Eric Young (eay@cryptsoft.com).
       7             :  * The implementation was written so as to conform with Netscapes SSL.
       8             :  *
       9             :  * This library is free for commercial and non-commercial use as long as
      10             :  * the following conditions are aheared to.  The following conditions
      11             :  * apply to all code found in this distribution, be it the RC4, RSA,
      12             :  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
      13             :  * included with this distribution is covered by the same copyright terms
      14             :  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
      15             :  *
      16             :  * Copyright remains Eric Young's, and as such any Copyright notices in
      17             :  * the code are not to be removed.
      18             :  * If this package is used in a product, Eric Young should be given attribution
      19             :  * as the author of the parts of the library used.
      20             :  * This can be in the form of a textual message at program startup or
      21             :  * in documentation (online or textual) provided with the package.
      22             :  *
      23             :  * Redistribution and use in source and binary forms, with or without
      24             :  * modification, are permitted provided that the following conditions
      25             :  * are met:
      26             :  * 1. Redistributions of source code must retain the copyright
      27             :  *    notice, this list of conditions and the following disclaimer.
      28             :  * 2. Redistributions in binary form must reproduce the above copyright
      29             :  *    notice, this list of conditions and the following disclaimer in the
      30             :  *    documentation and/or other materials provided with the distribution.
      31             :  * 3. All advertising materials mentioning features or use of this software
      32             :  *    must display the following acknowledgement:
      33             :  *    "This product includes cryptographic software written by
      34             :  *     Eric Young (eay@cryptsoft.com)"
      35             :  *    The word 'cryptographic' can be left out if the rouines from the library
      36             :  *    being used are not cryptographic related :-).
      37             :  * 4. If you include any Windows specific code (or a derivative thereof) from
      38             :  *    the apps directory (application code) you must include an acknowledgement:
      39             :  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
      40             :  *
      41             :  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
      42             :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      43             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      44             :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      45             :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      46             :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      47             :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      48             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      49             :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      50             :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      51             :  * SUCH DAMAGE.
      52             :  *
      53             :  * The licence and distribution terms for any publically available version or
      54             :  * derivative of this code cannot be changed.  i.e. this code cannot simply be
      55             :  * copied and put under another distribution licence
      56             :  * [including the GNU Public Licence.]
      57             :  */
      58             : /* ====================================================================
      59             :  * Copyright 2005 Nokia. All rights reserved.
      60             :  *
      61             :  * The portions of the attached software ("Contribution") is developed by
      62             :  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
      63             :  * license.
      64             :  *
      65             :  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
      66             :  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
      67             :  * support (see RFC 4279) to OpenSSL.
      68             :  *
      69             :  * No patent licenses or other rights except those expressly stated in
      70             :  * the OpenSSL open source license shall be deemed granted or received
      71             :  * expressly, by implication, estoppel, or otherwise.
      72             :  *
      73             :  * No assurances are provided by Nokia that the Contribution does not
      74             :  * infringe the patent or other intellectual property rights of any third
      75             :  * party or that the license provides you with all the necessary rights
      76             :  * to make use of the Contribution.
      77             :  *
      78             :  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
      79             :  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
      80             :  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
      81             :  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
      82             :  * OTHERWISE.
      83             :  */
      84             : 
      85             : #include <stdio.h>
      86             : #include <stdlib.h>
      87             : #include "ssl_locl.h"
      88             : #include <openssl/asn1_mac.h>
      89             : #include <openssl/objects.h>
      90             : #include <openssl/x509.h>
      91             : 
      92             : typedef struct ssl_session_asn1_st {
      93             :     ASN1_INTEGER version;
      94             :     ASN1_INTEGER ssl_version;
      95             :     ASN1_OCTET_STRING cipher;
      96             :     ASN1_OCTET_STRING comp_id;
      97             :     ASN1_OCTET_STRING master_key;
      98             :     ASN1_OCTET_STRING session_id;
      99             :     ASN1_OCTET_STRING session_id_context;
     100             :     ASN1_OCTET_STRING key_arg;
     101             : #ifndef OPENSSL_NO_KRB5
     102             :     ASN1_OCTET_STRING krb5_princ;
     103             : #endif                          /* OPENSSL_NO_KRB5 */
     104             :     ASN1_INTEGER time;
     105             :     ASN1_INTEGER timeout;
     106             :     ASN1_INTEGER verify_result;
     107             : #ifndef OPENSSL_NO_TLSEXT
     108             :     ASN1_OCTET_STRING tlsext_hostname;
     109             :     ASN1_INTEGER tlsext_tick_lifetime;
     110             :     ASN1_OCTET_STRING tlsext_tick;
     111             : #endif                          /* OPENSSL_NO_TLSEXT */
     112             : #ifndef OPENSSL_NO_PSK
     113             :     ASN1_OCTET_STRING psk_identity_hint;
     114             :     ASN1_OCTET_STRING psk_identity;
     115             : #endif                          /* OPENSSL_NO_PSK */
     116             : #ifndef OPENSSL_NO_SRP
     117             :     ASN1_OCTET_STRING srp_username;
     118             : #endif                          /* OPENSSL_NO_SRP */
     119             : } SSL_SESSION_ASN1;
     120             : 
     121        1468 : int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp)
     122             : {
     123             : #define LSIZE2 (sizeof(long)*2)
     124             :     int v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v7 = 0, v8 = 0;
     125             :     unsigned char buf[4], ibuf1[LSIZE2], ibuf2[LSIZE2];
     126             :     unsigned char ibuf3[LSIZE2], ibuf4[LSIZE2], ibuf5[LSIZE2];
     127             : #ifndef OPENSSL_NO_TLSEXT
     128             :     int v6 = 0, v9 = 0, v10 = 0;
     129             :     unsigned char ibuf6[LSIZE2];
     130             : #endif
     131             : #ifndef OPENSSL_NO_COMP
     132             :     unsigned char cbuf;
     133             :     int v11 = 0;
     134             : #endif
     135             : #ifndef OPENSSL_NO_SRP
     136             :     int v12 = 0;
     137             : #endif
     138             :     long l;
     139             :     SSL_SESSION_ASN1 a;
     140        1468 :     M_ASN1_I2D_vars(in);
     141             : 
     142        1468 :     if ((in == NULL) || ((in->cipher == NULL) && (in->cipher_id == 0)))
     143             :         return (0);
     144             : 
     145             :     /*
     146             :      * Note that I cheat in the following 2 assignments.  I know that if the
     147             :      * ASN1_INTEGER passed to ASN1_INTEGER_set is > sizeof(long)+1, the
     148             :      * buffer will not be re-OPENSSL_malloc()ed. This is a bit evil but makes
     149             :      * things simple, no dynamic allocation to clean up :-)
     150             :      */
     151        1468 :     a.version.length = LSIZE2;
     152        1468 :     a.version.type = V_ASN1_INTEGER;
     153        1468 :     a.version.data = ibuf1;
     154        1468 :     ASN1_INTEGER_set(&(a.version), SSL_SESSION_ASN1_VERSION);
     155             : 
     156        1468 :     a.ssl_version.length = LSIZE2;
     157        1468 :     a.ssl_version.type = V_ASN1_INTEGER;
     158        1468 :     a.ssl_version.data = ibuf2;
     159        1468 :     ASN1_INTEGER_set(&(a.ssl_version), in->ssl_version);
     160             : 
     161        1468 :     a.cipher.type = V_ASN1_OCTET_STRING;
     162        1468 :     a.cipher.data = buf;
     163             : 
     164        1468 :     if (in->cipher == NULL)
     165         734 :         l = in->cipher_id;
     166             :     else
     167         734 :         l = in->cipher->id;
     168        1468 :     if (in->ssl_version == SSL2_VERSION) {
     169           0 :         a.cipher.length = 3;
     170           0 :         buf[0] = ((unsigned char)(l >> 16L)) & 0xff;
     171           0 :         buf[1] = ((unsigned char)(l >> 8L)) & 0xff;
     172           0 :         buf[2] = ((unsigned char)(l)) & 0xff;
     173             :     } else {
     174        1468 :         a.cipher.length = 2;
     175        1468 :         buf[0] = ((unsigned char)(l >> 8L)) & 0xff;
     176        1468 :         buf[1] = ((unsigned char)(l)) & 0xff;
     177             :     }
     178             : 
     179             : #ifndef OPENSSL_NO_COMP
     180        1468 :     if (in->compress_meth) {
     181           0 :         cbuf = (unsigned char)in->compress_meth;
     182           0 :         a.comp_id.length = 1;
     183           0 :         a.comp_id.type = V_ASN1_OCTET_STRING;
     184           0 :         a.comp_id.data = &cbuf;
     185             :     }
     186             : #endif
     187             : 
     188        1468 :     a.master_key.length = in->master_key_length;
     189        1468 :     a.master_key.type = V_ASN1_OCTET_STRING;
     190        1468 :     a.master_key.data = in->master_key;
     191             : 
     192        1468 :     a.session_id.length = in->session_id_length;
     193        1468 :     a.session_id.type = V_ASN1_OCTET_STRING;
     194        1468 :     a.session_id.data = in->session_id;
     195             : 
     196        1468 :     a.session_id_context.length = in->sid_ctx_length;
     197        1468 :     a.session_id_context.type = V_ASN1_OCTET_STRING;
     198        1468 :     a.session_id_context.data = in->sid_ctx;
     199             : 
     200        1468 :     a.key_arg.length = in->key_arg_length;
     201        1468 :     a.key_arg.type = V_ASN1_OCTET_STRING;
     202        1468 :     a.key_arg.data = in->key_arg;
     203             : 
     204             : #ifndef OPENSSL_NO_KRB5
     205             :     if (in->krb5_client_princ_len) {
     206             :         a.krb5_princ.length = in->krb5_client_princ_len;
     207             :         a.krb5_princ.type = V_ASN1_OCTET_STRING;
     208             :         a.krb5_princ.data = in->krb5_client_princ;
     209             :     }
     210             : #endif                          /* OPENSSL_NO_KRB5 */
     211             : 
     212        1468 :     if (in->time != 0L) {
     213        1468 :         a.time.length = LSIZE2;
     214        1468 :         a.time.type = V_ASN1_INTEGER;
     215        1468 :         a.time.data = ibuf3;
     216        1468 :         ASN1_INTEGER_set(&(a.time), in->time);
     217             :     }
     218             : 
     219        1468 :     if (in->timeout != 0L) {
     220        1468 :         a.timeout.length = LSIZE2;
     221        1468 :         a.timeout.type = V_ASN1_INTEGER;
     222        1468 :         a.timeout.data = ibuf4;
     223        1468 :         ASN1_INTEGER_set(&(a.timeout), in->timeout);
     224             :     }
     225             : 
     226        1468 :     if (in->verify_result != X509_V_OK) {
     227           0 :         a.verify_result.length = LSIZE2;
     228           0 :         a.verify_result.type = V_ASN1_INTEGER;
     229           0 :         a.verify_result.data = ibuf5;
     230           0 :         ASN1_INTEGER_set(&a.verify_result, in->verify_result);
     231             :     }
     232             : #ifndef OPENSSL_NO_TLSEXT
     233        1468 :     if (in->tlsext_hostname) {
     234        1468 :         a.tlsext_hostname.length = strlen(in->tlsext_hostname);
     235        1468 :         a.tlsext_hostname.type = V_ASN1_OCTET_STRING;
     236        1468 :         a.tlsext_hostname.data = (unsigned char *)in->tlsext_hostname;
     237             :     }
     238        1468 :     if (in->tlsext_tick) {
     239           0 :         a.tlsext_tick.length = in->tlsext_ticklen;
     240           0 :         a.tlsext_tick.type = V_ASN1_OCTET_STRING;
     241           0 :         a.tlsext_tick.data = (unsigned char *)in->tlsext_tick;
     242             :     }
     243        1468 :     if (in->tlsext_tick_lifetime_hint > 0) {
     244           0 :         a.tlsext_tick_lifetime.length = LSIZE2;
     245           0 :         a.tlsext_tick_lifetime.type = V_ASN1_INTEGER;
     246           0 :         a.tlsext_tick_lifetime.data = ibuf6;
     247           0 :         ASN1_INTEGER_set(&a.tlsext_tick_lifetime,
     248             :                          in->tlsext_tick_lifetime_hint);
     249             :     }
     250             : #endif                          /* OPENSSL_NO_TLSEXT */
     251             : #ifndef OPENSSL_NO_PSK
     252        1468 :     if (in->psk_identity_hint) {
     253           0 :         a.psk_identity_hint.length = strlen(in->psk_identity_hint);
     254           0 :         a.psk_identity_hint.type = V_ASN1_OCTET_STRING;
     255           0 :         a.psk_identity_hint.data = (unsigned char *)(in->psk_identity_hint);
     256             :     }
     257        1468 :     if (in->psk_identity) {
     258           0 :         a.psk_identity.length = strlen(in->psk_identity);
     259           0 :         a.psk_identity.type = V_ASN1_OCTET_STRING;
     260           0 :         a.psk_identity.data = (unsigned char *)(in->psk_identity);
     261             :     }
     262             : #endif                          /* OPENSSL_NO_PSK */
     263             : #ifndef OPENSSL_NO_SRP
     264        1468 :     if (in->srp_username) {
     265           0 :         a.srp_username.length = strlen(in->srp_username);
     266           0 :         a.srp_username.type = V_ASN1_OCTET_STRING;
     267           0 :         a.srp_username.data = (unsigned char *)(in->srp_username);
     268             :     }
     269             : #endif                          /* OPENSSL_NO_SRP */
     270             : 
     271        1468 :     M_ASN1_I2D_len(&(a.version), i2d_ASN1_INTEGER);
     272        1468 :     M_ASN1_I2D_len(&(a.ssl_version), i2d_ASN1_INTEGER);
     273        1468 :     M_ASN1_I2D_len(&(a.cipher), i2d_ASN1_OCTET_STRING);
     274        1468 :     M_ASN1_I2D_len(&(a.session_id), i2d_ASN1_OCTET_STRING);
     275        1468 :     M_ASN1_I2D_len(&(a.master_key), i2d_ASN1_OCTET_STRING);
     276             : #ifndef OPENSSL_NO_KRB5
     277             :     if (in->krb5_client_princ_len)
     278             :         M_ASN1_I2D_len(&(a.krb5_princ), i2d_ASN1_OCTET_STRING);
     279             : #endif                          /* OPENSSL_NO_KRB5 */
     280        1468 :     if (in->key_arg_length > 0)
     281           0 :         M_ASN1_I2D_len_IMP_opt(&(a.key_arg), i2d_ASN1_OCTET_STRING);
     282        1468 :     if (in->time != 0L)
     283        1468 :         M_ASN1_I2D_len_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1);
     284        1468 :     if (in->timeout != 0L)
     285        1468 :         M_ASN1_I2D_len_EXP_opt(&(a.timeout), i2d_ASN1_INTEGER, 2, v2);
     286        1468 :     if (in->peer != NULL)
     287           0 :         M_ASN1_I2D_len_EXP_opt(in->peer, i2d_X509, 3, v3);
     288        1468 :     M_ASN1_I2D_len_EXP_opt(&a.session_id_context, i2d_ASN1_OCTET_STRING, 4,
     289             :                            v4);
     290        1468 :     if (in->verify_result != X509_V_OK)
     291           0 :         M_ASN1_I2D_len_EXP_opt(&(a.verify_result), i2d_ASN1_INTEGER, 5, v5);
     292             : 
     293             : #ifndef OPENSSL_NO_TLSEXT
     294        1468 :     if (in->tlsext_tick_lifetime_hint > 0)
     295           0 :         M_ASN1_I2D_len_EXP_opt(&a.tlsext_tick_lifetime, i2d_ASN1_INTEGER, 9,
     296             :                                v9);
     297        1468 :     if (in->tlsext_tick)
     298           0 :         M_ASN1_I2D_len_EXP_opt(&(a.tlsext_tick), i2d_ASN1_OCTET_STRING, 10,
     299             :                                v10);
     300        1468 :     if (in->tlsext_hostname)
     301        1468 :         M_ASN1_I2D_len_EXP_opt(&(a.tlsext_hostname), i2d_ASN1_OCTET_STRING, 6,
     302             :                                v6);
     303             : # ifndef OPENSSL_NO_COMP
     304        1468 :     if (in->compress_meth)
     305           0 :         M_ASN1_I2D_len_EXP_opt(&(a.comp_id), i2d_ASN1_OCTET_STRING, 11, v11);
     306             : # endif
     307             : #endif                          /* OPENSSL_NO_TLSEXT */
     308             : #ifndef OPENSSL_NO_PSK
     309        1468 :     if (in->psk_identity_hint)
     310           0 :         M_ASN1_I2D_len_EXP_opt(&(a.psk_identity_hint), i2d_ASN1_OCTET_STRING,
     311             :                                7, v7);
     312        1468 :     if (in->psk_identity)
     313           0 :         M_ASN1_I2D_len_EXP_opt(&(a.psk_identity), i2d_ASN1_OCTET_STRING, 8,
     314             :                                v8);
     315             : #endif                          /* OPENSSL_NO_PSK */
     316             : #ifndef OPENSSL_NO_SRP
     317        1468 :     if (in->srp_username)
     318           0 :         M_ASN1_I2D_len_EXP_opt(&(a.srp_username), i2d_ASN1_OCTET_STRING, 12,
     319             :                                v12);
     320             : #endif                          /* OPENSSL_NO_SRP */
     321             : 
     322        1468 :     M_ASN1_I2D_seq_total();
     323             : 
     324         734 :     M_ASN1_I2D_put(&(a.version), i2d_ASN1_INTEGER);
     325         734 :     M_ASN1_I2D_put(&(a.ssl_version), i2d_ASN1_INTEGER);
     326         734 :     M_ASN1_I2D_put(&(a.cipher), i2d_ASN1_OCTET_STRING);
     327         734 :     M_ASN1_I2D_put(&(a.session_id), i2d_ASN1_OCTET_STRING);
     328         734 :     M_ASN1_I2D_put(&(a.master_key), i2d_ASN1_OCTET_STRING);
     329             : #ifndef OPENSSL_NO_KRB5
     330             :     if (in->krb5_client_princ_len)
     331             :         M_ASN1_I2D_put(&(a.krb5_princ), i2d_ASN1_OCTET_STRING);
     332             : #endif                          /* OPENSSL_NO_KRB5 */
     333         734 :     if (in->key_arg_length > 0)
     334           0 :         M_ASN1_I2D_put_IMP_opt(&(a.key_arg), i2d_ASN1_OCTET_STRING, 0);
     335         734 :     if (in->time != 0L)
     336         734 :         M_ASN1_I2D_put_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1);
     337         734 :     if (in->timeout != 0L)
     338         734 :         M_ASN1_I2D_put_EXP_opt(&(a.timeout), i2d_ASN1_INTEGER, 2, v2);
     339         734 :     if (in->peer != NULL)
     340           0 :         M_ASN1_I2D_put_EXP_opt(in->peer, i2d_X509, 3, v3);
     341         734 :     M_ASN1_I2D_put_EXP_opt(&a.session_id_context, i2d_ASN1_OCTET_STRING, 4,
     342             :                            v4);
     343         734 :     if (in->verify_result != X509_V_OK)
     344           0 :         M_ASN1_I2D_put_EXP_opt(&a.verify_result, i2d_ASN1_INTEGER, 5, v5);
     345             : #ifndef OPENSSL_NO_TLSEXT
     346         734 :     if (in->tlsext_hostname)
     347         734 :         M_ASN1_I2D_put_EXP_opt(&(a.tlsext_hostname), i2d_ASN1_OCTET_STRING, 6,
     348             :                                v6);
     349             : #endif                          /* OPENSSL_NO_TLSEXT */
     350             : #ifndef OPENSSL_NO_PSK
     351         734 :     if (in->psk_identity_hint)
     352           0 :         M_ASN1_I2D_put_EXP_opt(&(a.psk_identity_hint), i2d_ASN1_OCTET_STRING,
     353             :                                7, v7);
     354         734 :     if (in->psk_identity)
     355           0 :         M_ASN1_I2D_put_EXP_opt(&(a.psk_identity), i2d_ASN1_OCTET_STRING, 8,
     356             :                                v8);
     357             : #endif                          /* OPENSSL_NO_PSK */
     358             : #ifndef OPENSSL_NO_TLSEXT
     359         734 :     if (in->tlsext_tick_lifetime_hint > 0)
     360           0 :         M_ASN1_I2D_put_EXP_opt(&a.tlsext_tick_lifetime, i2d_ASN1_INTEGER, 9,
     361             :                                v9);
     362         734 :     if (in->tlsext_tick)
     363           0 :         M_ASN1_I2D_put_EXP_opt(&(a.tlsext_tick), i2d_ASN1_OCTET_STRING, 10,
     364             :                                v10);
     365             : #endif                          /* OPENSSL_NO_TLSEXT */
     366             : #ifndef OPENSSL_NO_COMP
     367         734 :     if (in->compress_meth)
     368           0 :         M_ASN1_I2D_put_EXP_opt(&(a.comp_id), i2d_ASN1_OCTET_STRING, 11, v11);
     369             : #endif
     370             : #ifndef OPENSSL_NO_SRP
     371         734 :     if (in->srp_username)
     372           0 :         M_ASN1_I2D_put_EXP_opt(&(a.srp_username), i2d_ASN1_OCTET_STRING, 12,
     373             :                                v12);
     374             : #endif                          /* OPENSSL_NO_SRP */
     375         734 :     M_ASN1_I2D_finish();
     376             : }
     377             : 
     378         367 : SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp,
     379             :                              long length)
     380             : {
     381             :     int ssl_version = 0, i;
     382             :     long id;
     383             :     ASN1_INTEGER ai, *aip;
     384             :     ASN1_OCTET_STRING os, *osp;
     385         367 :     M_ASN1_D2I_vars(a, SSL_SESSION *, SSL_SESSION_new);
     386             : 
     387         367 :     aip = &ai;
     388         367 :     osp = &os;
     389             : 
     390         367 :     M_ASN1_D2I_Init();
     391         367 :     M_ASN1_D2I_start_sequence();
     392             : 
     393         367 :     ai.data = NULL;
     394         367 :     ai.length = 0;
     395         367 :     M_ASN1_D2I_get_x(ASN1_INTEGER, aip, d2i_ASN1_INTEGER);
     396         367 :     if (ai.data != NULL) {
     397         367 :         OPENSSL_free(ai.data);
     398         367 :         ai.data = NULL;
     399         367 :         ai.length = 0;
     400             :     }
     401             : 
     402             :     /* we don't care about the version right now :-) */
     403         367 :     M_ASN1_D2I_get_x(ASN1_INTEGER, aip, d2i_ASN1_INTEGER);
     404         367 :     ssl_version = (int)ASN1_INTEGER_get(aip);
     405         367 :     ret->ssl_version = ssl_version;
     406         367 :     if (ai.data != NULL) {
     407         367 :         OPENSSL_free(ai.data);
     408         367 :         ai.data = NULL;
     409         367 :         ai.length = 0;
     410             :     }
     411             : 
     412         367 :     os.data = NULL;
     413         367 :     os.length = 0;
     414         367 :     M_ASN1_D2I_get_x(ASN1_OCTET_STRING, osp, d2i_ASN1_OCTET_STRING);
     415         367 :     if (ssl_version == SSL2_VERSION) {
     416           0 :         if (os.length != 3) {
     417           0 :             c.error = SSL_R_CIPHER_CODE_WRONG_LENGTH;
     418           0 :             c.line = __LINE__;
     419           0 :             goto err;
     420             :         }
     421           0 :         id = 0x02000000L |
     422           0 :             ((unsigned long)os.data[0] << 16L) |
     423           0 :             ((unsigned long)os.data[1] << 8L) | (unsigned long)os.data[2];
     424         734 :     } else if ((ssl_version >> 8) == SSL3_VERSION_MAJOR
     425         367 :         || (ssl_version >> 8) == DTLS1_VERSION_MAJOR
     426           0 :         || ssl_version == DTLS1_BAD_VER) {
     427         367 :         if (os.length != 2) {
     428           0 :             c.error = SSL_R_CIPHER_CODE_WRONG_LENGTH;
     429           0 :             c.line = __LINE__;
     430           0 :             goto err;
     431             :         }
     432         367 :         id = 0x03000000L |
     433         367 :             ((unsigned long)os.data[0] << 8L) | (unsigned long)os.data[1];
     434             :     } else {
     435           0 :         c.error = SSL_R_UNKNOWN_SSL_VERSION;
     436           0 :         c.line = __LINE__;
     437           0 :         goto err;
     438             :     }
     439             : 
     440         367 :     ret->cipher = NULL;
     441         367 :     ret->cipher_id = id;
     442             : 
     443         367 :     M_ASN1_D2I_get_x(ASN1_OCTET_STRING, osp, d2i_ASN1_OCTET_STRING);
     444             :     if ((ssl_version >> 8) >= SSL3_VERSION_MAJOR)
     445             :         i = SSL3_MAX_SSL_SESSION_ID_LENGTH;
     446             :     else                        /* if (ssl_version>>8 == SSL2_VERSION_MAJOR) */
     447             :         i = SSL2_MAX_SSL_SESSION_ID_LENGTH;
     448             : 
     449         367 :     if (os.length > i)
     450           0 :         os.length = i;
     451         367 :     if (os.length > (int)sizeof(ret->session_id)) /* can't happen */
     452           0 :         os.length = sizeof(ret->session_id);
     453             : 
     454         367 :     ret->session_id_length = os.length;
     455         367 :     OPENSSL_assert(os.length <= (int)sizeof(ret->session_id));
     456         367 :     memcpy(ret->session_id, os.data, os.length);
     457             : 
     458         367 :     M_ASN1_D2I_get_x(ASN1_OCTET_STRING, osp, d2i_ASN1_OCTET_STRING);
     459         367 :     if (os.length > SSL_MAX_MASTER_KEY_LENGTH)
     460           0 :         ret->master_key_length = SSL_MAX_MASTER_KEY_LENGTH;
     461             :     else
     462         367 :         ret->master_key_length = os.length;
     463         367 :     memcpy(ret->master_key, os.data, ret->master_key_length);
     464             : 
     465         367 :     os.length = 0;
     466             : 
     467             : #ifndef OPENSSL_NO_KRB5
     468             :     os.length = 0;
     469             :     M_ASN1_D2I_get_opt(osp, d2i_ASN1_OCTET_STRING, V_ASN1_OCTET_STRING);
     470             :     if (os.data) {
     471             :         if (os.length > SSL_MAX_KRB5_PRINCIPAL_LENGTH)
     472             :             ret->krb5_client_princ_len = 0;
     473             :         else
     474             :             ret->krb5_client_princ_len = os.length;
     475             :         memcpy(ret->krb5_client_princ, os.data, ret->krb5_client_princ_len);
     476             :         OPENSSL_free(os.data);
     477             :         os.data = NULL;
     478             :         os.length = 0;
     479             :     } else
     480             :         ret->krb5_client_princ_len = 0;
     481             : #endif                          /* OPENSSL_NO_KRB5 */
     482             : 
     483         367 :     M_ASN1_D2I_get_IMP_opt(osp, d2i_ASN1_OCTET_STRING, 0,
     484             :                            V_ASN1_OCTET_STRING);
     485         367 :     if (os.length > SSL_MAX_KEY_ARG_LENGTH)
     486           0 :         ret->key_arg_length = SSL_MAX_KEY_ARG_LENGTH;
     487             :     else
     488         367 :         ret->key_arg_length = os.length;
     489         367 :     memcpy(ret->key_arg, os.data, ret->key_arg_length);
     490         367 :     if (os.data != NULL)
     491         367 :         OPENSSL_free(os.data);
     492             : 
     493         367 :     ai.length = 0;
     494         367 :     M_ASN1_D2I_get_EXP_opt(aip, d2i_ASN1_INTEGER, 1);
     495         367 :     if (ai.data != NULL) {
     496         367 :         ret->time = ASN1_INTEGER_get(aip);
     497         367 :         OPENSSL_free(ai.data);
     498         367 :         ai.data = NULL;
     499         367 :         ai.length = 0;
     500             :     } else
     501           0 :         ret->time = (unsigned long)time(NULL);
     502             : 
     503         367 :     ai.length = 0;
     504         367 :     M_ASN1_D2I_get_EXP_opt(aip, d2i_ASN1_INTEGER, 2);
     505         367 :     if (ai.data != NULL) {
     506         367 :         ret->timeout = ASN1_INTEGER_get(aip);
     507         367 :         OPENSSL_free(ai.data);
     508         367 :         ai.data = NULL;
     509         367 :         ai.length = 0;
     510             :     } else
     511           0 :         ret->timeout = 3;
     512             : 
     513         367 :     if (ret->peer != NULL) {
     514           0 :         X509_free(ret->peer);
     515           0 :         ret->peer = NULL;
     516             :     }
     517         367 :     M_ASN1_D2I_get_EXP_opt(ret->peer, d2i_X509, 3);
     518             : 
     519         367 :     os.length = 0;
     520         367 :     os.data = NULL;
     521         367 :     M_ASN1_D2I_get_EXP_opt(osp, d2i_ASN1_OCTET_STRING, 4);
     522             : 
     523         367 :     if (os.data != NULL) {
     524         367 :         if (os.length > SSL_MAX_SID_CTX_LENGTH) {
     525           0 :             c.error = SSL_R_BAD_LENGTH;
     526           0 :             c.line = __LINE__;
     527           0 :             goto err;
     528             :         } else {
     529         367 :             ret->sid_ctx_length = os.length;
     530         367 :             memcpy(ret->sid_ctx, os.data, os.length);
     531             :         }
     532         367 :         OPENSSL_free(os.data);
     533         367 :         os.data = NULL;
     534         367 :         os.length = 0;
     535             :     } else
     536           0 :         ret->sid_ctx_length = 0;
     537             : 
     538         367 :     ai.length = 0;
     539         367 :     M_ASN1_D2I_get_EXP_opt(aip, d2i_ASN1_INTEGER, 5);
     540         367 :     if (ai.data != NULL) {
     541           0 :         ret->verify_result = ASN1_INTEGER_get(aip);
     542           0 :         OPENSSL_free(ai.data);
     543           0 :         ai.data = NULL;
     544           0 :         ai.length = 0;
     545             :     } else
     546         367 :         ret->verify_result = X509_V_OK;
     547             : 
     548             : #ifndef OPENSSL_NO_TLSEXT
     549         367 :     os.length = 0;
     550         367 :     os.data = NULL;
     551         367 :     M_ASN1_D2I_get_EXP_opt(osp, d2i_ASN1_OCTET_STRING, 6);
     552         367 :     if (os.data) {
     553         367 :         ret->tlsext_hostname = BUF_strndup((char *)os.data, os.length);
     554         367 :         OPENSSL_free(os.data);
     555         367 :         os.data = NULL;
     556         367 :         os.length = 0;
     557             :     } else
     558           0 :         ret->tlsext_hostname = NULL;
     559             : #endif                          /* OPENSSL_NO_TLSEXT */
     560             : 
     561             : #ifndef OPENSSL_NO_PSK
     562         367 :     os.length = 0;
     563         367 :     os.data = NULL;
     564         367 :     M_ASN1_D2I_get_EXP_opt(osp, d2i_ASN1_OCTET_STRING, 7);
     565         367 :     if (os.data) {
     566           0 :         ret->psk_identity_hint = BUF_strndup((char *)os.data, os.length);
     567           0 :         OPENSSL_free(os.data);
     568           0 :         os.data = NULL;
     569           0 :         os.length = 0;
     570             :     } else
     571         367 :         ret->psk_identity_hint = NULL;
     572             : 
     573         367 :     os.length = 0;
     574         367 :     os.data = NULL;
     575         367 :     M_ASN1_D2I_get_EXP_opt(osp, d2i_ASN1_OCTET_STRING, 8);
     576         367 :     if (os.data) {
     577           0 :         ret->psk_identity = BUF_strndup((char *)os.data, os.length);
     578           0 :         OPENSSL_free(os.data);
     579           0 :         os.data = NULL;
     580           0 :         os.length = 0;
     581             :     } else
     582         367 :         ret->psk_identity = NULL;
     583             : #endif                          /* OPENSSL_NO_PSK */
     584             : 
     585             : #ifndef OPENSSL_NO_TLSEXT
     586         367 :     ai.length = 0;
     587         367 :     M_ASN1_D2I_get_EXP_opt(aip, d2i_ASN1_INTEGER, 9);
     588         367 :     if (ai.data != NULL) {
     589           0 :         ret->tlsext_tick_lifetime_hint = ASN1_INTEGER_get(aip);
     590           0 :         OPENSSL_free(ai.data);
     591           0 :         ai.data = NULL;
     592           0 :         ai.length = 0;
     593         367 :     } else if (ret->tlsext_ticklen && ret->session_id_length)
     594           0 :         ret->tlsext_tick_lifetime_hint = -1;
     595             :     else
     596         367 :         ret->tlsext_tick_lifetime_hint = 0;
     597         367 :     os.length = 0;
     598         367 :     os.data = NULL;
     599         367 :     M_ASN1_D2I_get_EXP_opt(osp, d2i_ASN1_OCTET_STRING, 10);
     600         367 :     if (os.data) {
     601           0 :         ret->tlsext_tick = os.data;
     602           0 :         ret->tlsext_ticklen = os.length;
     603           0 :         os.data = NULL;
     604           0 :         os.length = 0;
     605             :     } else
     606         367 :         ret->tlsext_tick = NULL;
     607             : #endif                          /* OPENSSL_NO_TLSEXT */
     608             : #ifndef OPENSSL_NO_COMP
     609         367 :     os.length = 0;
     610         367 :     os.data = NULL;
     611         367 :     M_ASN1_D2I_get_EXP_opt(osp, d2i_ASN1_OCTET_STRING, 11);
     612         367 :     if (os.data) {
     613           0 :         ret->compress_meth = os.data[0];
     614           0 :         OPENSSL_free(os.data);
     615           0 :         os.data = NULL;
     616             :     }
     617             : #endif
     618             : 
     619             : #ifndef OPENSSL_NO_SRP
     620         367 :     os.length = 0;
     621         367 :     os.data = NULL;
     622         367 :     M_ASN1_D2I_get_EXP_opt(osp, d2i_ASN1_OCTET_STRING, 12);
     623         367 :     if (os.data) {
     624           0 :         ret->srp_username = BUF_strndup((char *)os.data, os.length);
     625           0 :         OPENSSL_free(os.data);
     626           0 :         os.data = NULL;
     627           0 :         os.length = 0;
     628             :     } else
     629         367 :         ret->srp_username = NULL;
     630             : #endif                          /* OPENSSL_NO_SRP */
     631             : 
     632         367 :     M_ASN1_D2I_Finish(a, SSL_SESSION_free, SSL_F_D2I_SSL_SESSION);
     633             : }

Generated by: LCOV version 1.10