LCOV - code coverage report
Current view: top level - home/mbr/git/openssl.git/ssl - ssl_asn1.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 233 300 77.7 %
Date: 2014-08-02 Functions: 2 2 100.0 %
Branches: 164 344 47.7 %

           Branch data     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                 :            :         {
      94                 :            :         ASN1_INTEGER version;
      95                 :            :         ASN1_INTEGER ssl_version;
      96                 :            :         ASN1_OCTET_STRING cipher;
      97                 :            :         ASN1_OCTET_STRING comp_id;
      98                 :            :         ASN1_OCTET_STRING master_key;
      99                 :            :         ASN1_OCTET_STRING session_id;
     100                 :            :         ASN1_OCTET_STRING session_id_context;
     101                 :            :         ASN1_OCTET_STRING key_arg;
     102                 :            : #ifndef OPENSSL_NO_KRB5
     103                 :            :         ASN1_OCTET_STRING krb5_princ;
     104                 :            : #endif /* OPENSSL_NO_KRB5 */
     105                 :            :         ASN1_INTEGER time;
     106                 :            :         ASN1_INTEGER timeout;
     107                 :            :         ASN1_INTEGER verify_result;
     108                 :            : #ifndef OPENSSL_NO_TLSEXT
     109                 :            :         ASN1_OCTET_STRING tlsext_hostname;
     110                 :            :         ASN1_INTEGER tlsext_tick_lifetime;
     111                 :            :         ASN1_OCTET_STRING tlsext_tick;
     112                 :            : #endif /* OPENSSL_NO_TLSEXT */
     113                 :            : #ifndef OPENSSL_NO_PSK
     114                 :            :         ASN1_OCTET_STRING psk_identity_hint;
     115                 :            :         ASN1_OCTET_STRING psk_identity;
     116                 :            : #endif /* OPENSSL_NO_PSK */
     117                 :            : #ifndef OPENSSL_NO_SRP
     118                 :            :         ASN1_OCTET_STRING srp_username;
     119                 :            : #endif /* OPENSSL_NO_SRP */
     120                 :            :         } SSL_SESSION_ASN1;
     121                 :            : 
     122                 :       3276 : int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp)
     123                 :            :         {
     124                 :            : #define LSIZE2 (sizeof(long)*2)
     125                 :       3276 :         int v1=0,v2=0,v3=0,v4=0,v5=0,v7=0,v8=0;
     126                 :            :         unsigned char buf[4],ibuf1[LSIZE2],ibuf2[LSIZE2];
     127                 :            :         unsigned char ibuf3[LSIZE2],ibuf4[LSIZE2],ibuf5[LSIZE2];
     128                 :            : #ifndef OPENSSL_NO_TLSEXT
     129                 :       3276 :         int v6=0,v9=0,v10=0;
     130                 :            :         unsigned char ibuf6[LSIZE2];
     131                 :            : #endif
     132                 :            : #ifndef OPENSSL_NO_COMP
     133                 :            :         unsigned char cbuf;
     134                 :       3276 :         int v11=0;
     135                 :            : #endif
     136                 :            : #ifndef OPENSSL_NO_SRP
     137                 :       3276 :         int v12=0;
     138                 :            : #endif
     139                 :            :         long l;
     140                 :            :         SSL_SESSION_ASN1 a;
     141         [ +  - ]:       3276 :         M_ASN1_I2D_vars(in);
     142                 :            : 
     143 [ +  - ][ +  + ]:       3276 :         if ((in == NULL) || ((in->cipher == NULL) && (in->cipher_id == 0)))
                 [ +  - ]
     144                 :            :                 return(0);
     145                 :            : 
     146                 :            :         /* Note that I cheat in the following 2 assignments.  I know
     147                 :            :          * that if the ASN1_INTEGER passed to ASN1_INTEGER_set
     148                 :            :          * is > sizeof(long)+1, the buffer will not be re-OPENSSL_malloc()ed.
     149                 :            :          * This is a bit evil but makes things simple, no dynamic allocation
     150                 :            :          * to clean up :-) */
     151                 :       3276 :         a.version.length=LSIZE2;
     152                 :       3276 :         a.version.type=V_ASN1_INTEGER;
     153                 :       3276 :         a.version.data=ibuf1;
     154                 :       3276 :         ASN1_INTEGER_set(&(a.version),SSL_SESSION_ASN1_VERSION);
     155                 :            : 
     156                 :       3276 :         a.ssl_version.length=LSIZE2;
     157                 :       3276 :         a.ssl_version.type=V_ASN1_INTEGER;
     158                 :       3276 :         a.ssl_version.data=ibuf2;
     159                 :       3276 :         ASN1_INTEGER_set(&(a.ssl_version),in->ssl_version);
     160                 :            : 
     161                 :       3276 :         a.cipher.type=V_ASN1_OCTET_STRING;
     162                 :       3276 :         a.cipher.data=buf;
     163                 :            : 
     164         [ +  + ]:       3276 :         if (in->cipher == NULL)
     165                 :       1644 :                 l=in->cipher_id;
     166                 :            :         else
     167                 :       1632 :                 l=in->cipher->id;
     168         [ +  + ]:       3276 :         if (in->ssl_version == SSL2_VERSION)
     169                 :            :                 {
     170                 :         12 :                 a.cipher.length=3;
     171                 :         12 :                 buf[0]=((unsigned char)(l>>16L))&0xff;
     172                 :         12 :                 buf[1]=((unsigned char)(l>> 8L))&0xff;
     173                 :         12 :                 buf[2]=((unsigned char)(l     ))&0xff;
     174                 :            :                 }
     175                 :            :         else
     176                 :            :                 {
     177                 :       3264 :                 a.cipher.length=2;
     178                 :       3264 :                 buf[0]=((unsigned char)(l>>8L))&0xff;
     179                 :       3264 :                 buf[1]=((unsigned char)(l    ))&0xff;
     180                 :            :                 }
     181                 :            : 
     182                 :            : #ifndef OPENSSL_NO_COMP
     183         [ -  + ]:       3276 :         if (in->compress_meth)
     184                 :            :                 {
     185                 :          0 :                 cbuf = (unsigned char)in->compress_meth;
     186                 :          0 :                 a.comp_id.length = 1;
     187                 :          0 :                 a.comp_id.type = V_ASN1_OCTET_STRING;
     188                 :          0 :                 a.comp_id.data = &cbuf;
     189                 :            :                 }
     190                 :            : #endif
     191                 :            : 
     192                 :       3276 :         a.master_key.length=in->master_key_length;
     193                 :       3276 :         a.master_key.type=V_ASN1_OCTET_STRING;
     194                 :       3276 :         a.master_key.data=in->master_key;
     195                 :            : 
     196                 :       3276 :         a.session_id.length=in->session_id_length;
     197                 :       3276 :         a.session_id.type=V_ASN1_OCTET_STRING;
     198                 :       3276 :         a.session_id.data=in->session_id;
     199                 :            : 
     200                 :       3276 :         a.session_id_context.length=in->sid_ctx_length;
     201                 :       3276 :         a.session_id_context.type=V_ASN1_OCTET_STRING;
     202                 :       3276 :         a.session_id_context.data=in->sid_ctx;
     203                 :            : 
     204                 :       3276 :         a.key_arg.length=in->key_arg_length;
     205                 :       3276 :         a.key_arg.type=V_ASN1_OCTET_STRING;
     206                 :       3276 :         a.key_arg.data=in->key_arg;
     207                 :            : 
     208                 :            : #ifndef OPENSSL_NO_KRB5
     209                 :            :         if (in->krb5_client_princ_len)
     210                 :            :                 {
     211                 :            :                 a.krb5_princ.length=in->krb5_client_princ_len;
     212                 :            :                 a.krb5_princ.type=V_ASN1_OCTET_STRING;
     213                 :            :                 a.krb5_princ.data=in->krb5_client_princ;
     214                 :            :                 }
     215                 :            : #endif /* OPENSSL_NO_KRB5 */
     216                 :            : 
     217         [ +  - ]:       3276 :         if (in->time != 0L)
     218                 :            :                 {
     219                 :       3276 :                 a.time.length=LSIZE2;
     220                 :       3276 :                 a.time.type=V_ASN1_INTEGER;
     221                 :       3276 :                 a.time.data=ibuf3;
     222                 :       3276 :                 ASN1_INTEGER_set(&(a.time),in->time);
     223                 :            :                 }
     224                 :            : 
     225         [ +  - ]:       3276 :         if (in->timeout != 0L)
     226                 :            :                 {
     227                 :       3276 :                 a.timeout.length=LSIZE2;
     228                 :       3276 :                 a.timeout.type=V_ASN1_INTEGER;
     229                 :       3276 :                 a.timeout.data=ibuf4;
     230                 :       3276 :                 ASN1_INTEGER_set(&(a.timeout),in->timeout);
     231                 :            :                 }
     232                 :            : 
     233         [ -  + ]:       3276 :         if (in->verify_result != X509_V_OK)
     234                 :            :                 {
     235                 :          0 :                 a.verify_result.length=LSIZE2;
     236                 :          0 :                 a.verify_result.type=V_ASN1_INTEGER;
     237                 :          0 :                 a.verify_result.data=ibuf5;
     238                 :          0 :                 ASN1_INTEGER_set(&a.verify_result,in->verify_result);
     239                 :            :                 }
     240                 :            : 
     241                 :            : #ifndef OPENSSL_NO_TLSEXT
     242         [ -  + ]:       3276 :         if (in->tlsext_hostname)
     243                 :            :                 {
     244                 :          0 :                 a.tlsext_hostname.length=strlen(in->tlsext_hostname);
     245                 :          0 :                 a.tlsext_hostname.type=V_ASN1_OCTET_STRING;
     246                 :          0 :                 a.tlsext_hostname.data=(unsigned char *)in->tlsext_hostname;
     247                 :            :                 }
     248         [ -  + ]:       3276 :         if (in->tlsext_tick)
     249                 :            :                 {
     250                 :          0 :                 a.tlsext_tick.length= in->tlsext_ticklen;
     251                 :          0 :                 a.tlsext_tick.type=V_ASN1_OCTET_STRING;
     252                 :          0 :                 a.tlsext_tick.data=(unsigned char *)in->tlsext_tick;
     253                 :            :                 }
     254         [ -  + ]:       3276 :         if (in->tlsext_tick_lifetime_hint > 0)
     255                 :            :                 {
     256                 :          0 :                 a.tlsext_tick_lifetime.length=LSIZE2;
     257                 :          0 :                 a.tlsext_tick_lifetime.type=V_ASN1_INTEGER;
     258                 :          0 :                 a.tlsext_tick_lifetime.data=ibuf6;
     259                 :          0 :                 ASN1_INTEGER_set(&a.tlsext_tick_lifetime,in->tlsext_tick_lifetime_hint);
     260                 :            :                 }
     261                 :            : #endif /* OPENSSL_NO_TLSEXT */
     262                 :            : #ifndef OPENSSL_NO_PSK
     263         [ +  + ]:       3276 :         if (in->psk_identity_hint)
     264                 :            :                 {
     265                 :         88 :                 a.psk_identity_hint.length=strlen(in->psk_identity_hint);
     266                 :         88 :                 a.psk_identity_hint.type=V_ASN1_OCTET_STRING;
     267                 :         88 :                 a.psk_identity_hint.data=(unsigned char *)(in->psk_identity_hint);
     268                 :            :                 }
     269         [ +  + ]:       3276 :         if (in->psk_identity)
     270                 :            :                 {
     271                 :         88 :                 a.psk_identity.length=strlen(in->psk_identity);
     272                 :         88 :                 a.psk_identity.type=V_ASN1_OCTET_STRING;
     273                 :         88 :                 a.psk_identity.data=(unsigned char *)(in->psk_identity);
     274                 :            :                 }
     275                 :            : #endif /* OPENSSL_NO_PSK */
     276                 :            : #ifndef OPENSSL_NO_SRP
     277         [ +  + ]:       3276 :         if (in->srp_username)
     278                 :            :                 {
     279                 :         88 :                 a.srp_username.length=strlen(in->srp_username);
     280                 :         88 :                 a.srp_username.type=V_ASN1_OCTET_STRING;
     281                 :         88 :                 a.srp_username.data=(unsigned char *)(in->srp_username);
     282                 :            :                 }
     283                 :            : #endif /* OPENSSL_NO_SRP */
     284                 :            : 
     285                 :       3276 :         M_ASN1_I2D_len(&(a.version),                i2d_ASN1_INTEGER);
     286                 :       3276 :         M_ASN1_I2D_len(&(a.ssl_version),    i2d_ASN1_INTEGER);
     287                 :       3276 :         M_ASN1_I2D_len(&(a.cipher),         i2d_ASN1_OCTET_STRING);
     288                 :       3276 :         M_ASN1_I2D_len(&(a.session_id),             i2d_ASN1_OCTET_STRING);
     289                 :       3276 :         M_ASN1_I2D_len(&(a.master_key),             i2d_ASN1_OCTET_STRING);
     290                 :            : #ifndef OPENSSL_NO_KRB5
     291                 :            :         if (in->krb5_client_princ_len)
     292                 :            :                 M_ASN1_I2D_len(&(a.krb5_princ),     i2d_ASN1_OCTET_STRING);
     293                 :            : #endif /* OPENSSL_NO_KRB5 */
     294         [ -  + ]:       3276 :         if (in->key_arg_length > 0)
     295                 :          0 :                 M_ASN1_I2D_len_IMP_opt(&(a.key_arg),i2d_ASN1_OCTET_STRING);
     296         [ +  - ]:       3276 :         if (in->time != 0L)
     297                 :       3276 :                 M_ASN1_I2D_len_EXP_opt(&(a.time),i2d_ASN1_INTEGER,1,v1);
     298         [ +  - ]:       3276 :         if (in->timeout != 0L)
     299                 :       3276 :                 M_ASN1_I2D_len_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2);
     300         [ +  + ]:       3276 :         if (in->peer != NULL)
     301         [ +  - ]:        232 :                 M_ASN1_I2D_len_EXP_opt(in->peer,i2d_X509,3,v3);
     302                 :       3276 :         M_ASN1_I2D_len_EXP_opt(&a.session_id_context,i2d_ASN1_OCTET_STRING,4,v4);
     303         [ -  + ]:       3276 :         if (in->verify_result != X509_V_OK)
     304                 :          0 :                 M_ASN1_I2D_len_EXP_opt(&(a.verify_result),i2d_ASN1_INTEGER,5,v5);
     305                 :            : 
     306                 :            : #ifndef OPENSSL_NO_TLSEXT
     307         [ -  + ]:       3276 :         if (in->tlsext_tick_lifetime_hint > 0)
     308                 :          0 :                 M_ASN1_I2D_len_EXP_opt(&a.tlsext_tick_lifetime, i2d_ASN1_INTEGER,9,v9);
     309         [ -  + ]:       3276 :         if (in->tlsext_tick)
     310                 :          0 :                 M_ASN1_I2D_len_EXP_opt(&(a.tlsext_tick), i2d_ASN1_OCTET_STRING,10,v10);
     311         [ -  + ]:       3276 :         if (in->tlsext_hostname)
     312                 :          0 :                 M_ASN1_I2D_len_EXP_opt(&(a.tlsext_hostname), i2d_ASN1_OCTET_STRING,6,v6);
     313                 :            : #ifndef OPENSSL_NO_COMP
     314         [ -  + ]:       3276 :         if (in->compress_meth)
     315                 :          0 :                 M_ASN1_I2D_len_EXP_opt(&(a.comp_id), i2d_ASN1_OCTET_STRING,11,v11);
     316                 :            : #endif
     317                 :            : #endif /* OPENSSL_NO_TLSEXT */
     318                 :            : #ifndef OPENSSL_NO_PSK
     319         [ +  + ]:       3276 :         if (in->psk_identity_hint)
     320                 :         88 :                 M_ASN1_I2D_len_EXP_opt(&(a.psk_identity_hint), i2d_ASN1_OCTET_STRING,7,v7);
     321         [ +  + ]:       3276 :         if (in->psk_identity)
     322                 :         88 :                 M_ASN1_I2D_len_EXP_opt(&(a.psk_identity), i2d_ASN1_OCTET_STRING,8,v8);
     323                 :            : #endif /* OPENSSL_NO_PSK */
     324                 :            : #ifndef OPENSSL_NO_SRP
     325         [ +  + ]:       3276 :         if (in->srp_username)
     326                 :         88 :                 M_ASN1_I2D_len_EXP_opt(&(a.srp_username), i2d_ASN1_OCTET_STRING,12,v12);
     327                 :            : #endif /* OPENSSL_NO_SRP */
     328                 :            : 
     329         [ +  + ]:       3276 :         M_ASN1_I2D_seq_total();
     330                 :            : 
     331                 :       1638 :         M_ASN1_I2D_put(&(a.version),                i2d_ASN1_INTEGER);
     332                 :       1638 :         M_ASN1_I2D_put(&(a.ssl_version),    i2d_ASN1_INTEGER);
     333                 :       1638 :         M_ASN1_I2D_put(&(a.cipher),         i2d_ASN1_OCTET_STRING);
     334                 :       1638 :         M_ASN1_I2D_put(&(a.session_id),             i2d_ASN1_OCTET_STRING);
     335                 :       1638 :         M_ASN1_I2D_put(&(a.master_key),             i2d_ASN1_OCTET_STRING);
     336                 :            : #ifndef OPENSSL_NO_KRB5
     337                 :            :         if (in->krb5_client_princ_len)
     338                 :            :                 M_ASN1_I2D_put(&(a.krb5_princ),     i2d_ASN1_OCTET_STRING);
     339                 :            : #endif /* OPENSSL_NO_KRB5 */
     340         [ -  + ]:       1638 :         if (in->key_arg_length > 0)
     341                 :          0 :                 M_ASN1_I2D_put_IMP_opt(&(a.key_arg),i2d_ASN1_OCTET_STRING,0);
     342         [ +  - ]:       1638 :         if (in->time != 0L)
     343                 :       1638 :                 M_ASN1_I2D_put_EXP_opt(&(a.time),i2d_ASN1_INTEGER,1,v1);
     344         [ +  - ]:       1638 :         if (in->timeout != 0L)
     345                 :       1638 :                 M_ASN1_I2D_put_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2);
     346         [ +  + ]:       1638 :         if (in->peer != NULL)
     347         [ +  - ]:        116 :                 M_ASN1_I2D_put_EXP_opt(in->peer,i2d_X509,3,v3);
     348                 :       1638 :         M_ASN1_I2D_put_EXP_opt(&a.session_id_context,i2d_ASN1_OCTET_STRING,4,
     349                 :            :                                v4);
     350         [ -  + ]:       1638 :         if (in->verify_result != X509_V_OK)
     351                 :          0 :                 M_ASN1_I2D_put_EXP_opt(&a.verify_result,i2d_ASN1_INTEGER,5,v5);
     352                 :            : #ifndef OPENSSL_NO_TLSEXT
     353         [ -  + ]:       1638 :         if (in->tlsext_hostname)
     354                 :          0 :                 M_ASN1_I2D_put_EXP_opt(&(a.tlsext_hostname), i2d_ASN1_OCTET_STRING,6,v6);
     355                 :            : #endif /* OPENSSL_NO_TLSEXT */
     356                 :            : #ifndef OPENSSL_NO_PSK
     357         [ +  + ]:       1638 :         if (in->psk_identity_hint)
     358                 :         44 :                 M_ASN1_I2D_put_EXP_opt(&(a.psk_identity_hint), i2d_ASN1_OCTET_STRING,7,v7);
     359         [ +  + ]:       1638 :         if (in->psk_identity)
     360                 :         44 :                 M_ASN1_I2D_put_EXP_opt(&(a.psk_identity), i2d_ASN1_OCTET_STRING,8,v8);
     361                 :            : #endif /* OPENSSL_NO_PSK */
     362                 :            : #ifndef OPENSSL_NO_TLSEXT
     363         [ -  + ]:       1638 :         if (in->tlsext_tick_lifetime_hint > 0)
     364                 :          0 :                 M_ASN1_I2D_put_EXP_opt(&a.tlsext_tick_lifetime, i2d_ASN1_INTEGER,9,v9);
     365         [ -  + ]:       1638 :         if (in->tlsext_tick)
     366                 :          0 :                 M_ASN1_I2D_put_EXP_opt(&(a.tlsext_tick), i2d_ASN1_OCTET_STRING,10,v10);
     367                 :            : #endif /* OPENSSL_NO_TLSEXT */
     368                 :            : #ifndef OPENSSL_NO_COMP
     369         [ -  + ]:       1638 :         if (in->compress_meth)
     370                 :          0 :                 M_ASN1_I2D_put_EXP_opt(&(a.comp_id), i2d_ASN1_OCTET_STRING,11,v11);
     371                 :            : #endif
     372                 :            : #ifndef OPENSSL_NO_SRP
     373         [ +  + ]:       1638 :         if (in->srp_username)
     374                 :         44 :                 M_ASN1_I2D_put_EXP_opt(&(a.srp_username), i2d_ASN1_OCTET_STRING,12,v12);
     375                 :            : #endif /* OPENSSL_NO_SRP */
     376                 :       1638 :         M_ASN1_I2D_finish();
     377                 :            :         }
     378                 :            : 
     379                 :        833 : SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp,
     380                 :            :                              long length)
     381                 :            :         {
     382                 :        833 :         int ssl_version=0,i;
     383                 :            :         long id;
     384                 :            :         ASN1_INTEGER ai,*aip;
     385                 :            :         ASN1_OCTET_STRING os,*osp;
     386 [ -  + ][ #  # ]:        833 :         M_ASN1_D2I_vars(a,SSL_SESSION *,SSL_SESSION_new);
                 [ -  + ]
     387                 :            : 
     388                 :        833 :         aip= &ai;
     389                 :        833 :         osp= &os;
     390                 :            : 
     391         [ +  - ]:        833 :         M_ASN1_D2I_Init();
     392         [ -  + ]:        833 :         M_ASN1_D2I_start_sequence();
     393                 :            : 
     394                 :        833 :         ai.data=NULL; ai.length=0;
     395         [ -  + ]:        833 :         M_ASN1_D2I_get_x(ASN1_INTEGER,aip,d2i_ASN1_INTEGER);
     396         [ +  - ]:        833 :         if (ai.data != NULL) { OPENSSL_free(ai.data); ai.data=NULL; ai.length=0; }
     397                 :            : 
     398                 :            :         /* we don't care about the version right now :-) */
     399         [ -  + ]:        833 :         M_ASN1_D2I_get_x(ASN1_INTEGER,aip,d2i_ASN1_INTEGER);
     400                 :        833 :         ssl_version=(int)ASN1_INTEGER_get(aip);
     401                 :        833 :         ret->ssl_version=ssl_version;
     402         [ +  - ]:        833 :         if (ai.data != NULL) { OPENSSL_free(ai.data); ai.data=NULL; ai.length=0; }
     403                 :            : 
     404                 :        833 :         os.data=NULL; os.length=0;
     405         [ -  + ]:        833 :         M_ASN1_D2I_get_x(ASN1_OCTET_STRING,osp,d2i_ASN1_OCTET_STRING);
     406         [ +  + ]:        833 :         if (ssl_version == SSL2_VERSION)
     407                 :            :                 {
     408         [ -  + ]:          6 :                 if (os.length != 3)
     409                 :            :                         {
     410                 :          0 :                         c.error=SSL_R_CIPHER_CODE_WRONG_LENGTH;
     411                 :          0 :                         c.line=__LINE__;
     412                 :          0 :                         goto err;
     413                 :            :                         }
     414                 :          6 :                 id=0x02000000L|
     415                 :         12 :                         ((unsigned long)os.data[0]<<16L)|
     416                 :         12 :                         ((unsigned long)os.data[1]<< 8L)|
     417                 :          6 :                          (unsigned long)os.data[2];
     418                 :            :                 }
     419         [ +  - ]:        827 :         else if ((ssl_version>>8) >= SSL3_VERSION_MAJOR)
     420                 :            :                 {
     421         [ -  + ]:        827 :                 if (os.length != 2)
     422                 :            :                         {
     423                 :          0 :                         c.error=SSL_R_CIPHER_CODE_WRONG_LENGTH;
     424                 :          0 :                         c.line=__LINE__;
     425                 :          0 :                         goto err;
     426                 :            :                         }
     427                 :        827 :                 id=0x03000000L|
     428                 :       1654 :                         ((unsigned long)os.data[0]<<8L)|
     429                 :        827 :                          (unsigned long)os.data[1];
     430                 :            :                 }
     431                 :            :         else
     432                 :            :                 {
     433                 :          0 :                 c.error=SSL_R_UNKNOWN_SSL_VERSION;
     434                 :          0 :                 c.line=__LINE__;
     435                 :          0 :                 goto err;
     436                 :            :                 }
     437                 :            :         
     438                 :        833 :         ret->cipher=NULL;
     439                 :        833 :         ret->cipher_id=id;
     440                 :            : 
     441         [ -  + ]:        833 :         M_ASN1_D2I_get_x(ASN1_OCTET_STRING,osp,d2i_ASN1_OCTET_STRING);
     442                 :            :         if ((ssl_version>>8) >= SSL3_VERSION_MAJOR)
     443                 :            :                 i=SSL3_MAX_SSL_SESSION_ID_LENGTH;
     444                 :            :         else /* if (ssl_version>>8 == SSL2_VERSION_MAJOR) */
     445                 :            :                 i=SSL2_MAX_SSL_SESSION_ID_LENGTH;
     446                 :            : 
     447         [ -  + ]:        833 :         if (os.length > i)
     448                 :          0 :                 os.length = i;
     449         [ -  + ]:        833 :         if (os.length > (int)sizeof(ret->session_id)) /* can't happen */
     450                 :          0 :                 os.length = sizeof(ret->session_id);
     451                 :            : 
     452                 :        833 :         ret->session_id_length=os.length;
     453         [ -  + ]:        833 :         OPENSSL_assert(os.length <= (int)sizeof(ret->session_id));
     454                 :        833 :         memcpy(ret->session_id,os.data,os.length);
     455                 :            : 
     456         [ -  + ]:        833 :         M_ASN1_D2I_get_x(ASN1_OCTET_STRING,osp,d2i_ASN1_OCTET_STRING);
     457         [ -  + ]:        833 :         if (os.length > SSL_MAX_MASTER_KEY_LENGTH)
     458                 :          0 :                 ret->master_key_length=SSL_MAX_MASTER_KEY_LENGTH;
     459                 :            :         else
     460                 :        833 :                 ret->master_key_length=os.length;
     461                 :        833 :         memcpy(ret->master_key,os.data,ret->master_key_length);
     462                 :            : 
     463                 :        833 :         os.length=0;
     464                 :            : 
     465                 :            : #ifndef OPENSSL_NO_KRB5
     466                 :            :         os.length=0;
     467                 :            :         M_ASN1_D2I_get_opt(osp,d2i_ASN1_OCTET_STRING,V_ASN1_OCTET_STRING);
     468                 :            :         if (os.data)
     469                 :            :                 {
     470                 :            :                 if (os.length > SSL_MAX_KRB5_PRINCIPAL_LENGTH)
     471                 :            :                         ret->krb5_client_princ_len=0;
     472                 :            :                 else
     473                 :            :                         ret->krb5_client_princ_len=os.length;
     474                 :            :                 memcpy(ret->krb5_client_princ,os.data,ret->krb5_client_princ_len);
     475                 :            :                 OPENSSL_free(os.data);
     476                 :            :                 os.data = NULL;
     477                 :            :                 os.length = 0;
     478                 :            :                 }
     479                 :            :         else
     480                 :            :                 ret->krb5_client_princ_len=0;
     481                 :            : #endif /* OPENSSL_NO_KRB5 */
     482                 :            : 
     483 [ +  - ][ -  + ]:        833 :         M_ASN1_D2I_get_IMP_opt(osp,d2i_ASN1_OCTET_STRING,0,V_ASN1_OCTET_STRING);
                 [ #  # ]
     484         [ -  + ]:        833 :         if (os.length > SSL_MAX_KEY_ARG_LENGTH)
     485                 :          0 :                 ret->key_arg_length=SSL_MAX_KEY_ARG_LENGTH;
     486                 :            :         else
     487                 :        833 :                 ret->key_arg_length=os.length;
     488                 :        833 :         memcpy(ret->key_arg,os.data,ret->key_arg_length);
     489         [ +  - ]:        833 :         if (os.data != NULL) OPENSSL_free(os.data);
     490                 :            : 
     491                 :        833 :         ai.length=0;
     492 [ +  - ][ +  - ]:        833 :         M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,1);
         [ -  + ][ -  + ]
         [ -  + ][ -  + ]
                 [ #  # ]
     493         [ +  - ]:        833 :         if (ai.data != NULL)
     494                 :            :                 {
     495                 :        833 :                 ret->time=ASN1_INTEGER_get(aip);
     496                 :        833 :                 OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
     497                 :            :                 }
     498                 :            :         else
     499                 :          0 :                 ret->time=(unsigned long)time(NULL);
     500                 :            : 
     501                 :        833 :         ai.length=0;
     502 [ +  - ][ +  - ]:        833 :         M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,2);
         [ -  + ][ -  + ]
         [ -  + ][ -  + ]
                 [ #  # ]
     503         [ +  - ]:        833 :         if (ai.data != NULL)
     504                 :            :                 {
     505                 :        833 :                 ret->timeout=ASN1_INTEGER_get(aip);
     506                 :        833 :                 OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
     507                 :            :                 }
     508                 :            :         else
     509                 :          0 :                 ret->timeout=3;
     510                 :            : 
     511         [ -  + ]:        833 :         if (ret->peer != NULL)
     512                 :            :                 {
     513                 :          0 :                 X509_free(ret->peer);
     514                 :          0 :                 ret->peer=NULL;
     515                 :            :                 }
     516 [ +  - ][ +  + ]:        833 :         M_ASN1_D2I_get_EXP_opt(ret->peer,d2i_X509,3);
         [ -  + ][ -  + ]
         [ -  + ][ -  + ]
                 [ #  # ]
     517                 :            : 
     518                 :        833 :         os.length=0;
     519                 :        833 :         os.data=NULL;
     520 [ +  - ][ +  - ]:        833 :         M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,4);
         [ -  + ][ -  + ]
         [ -  + ][ -  + ]
                 [ #  # ]
     521                 :            : 
     522         [ +  - ]:        833 :         if(os.data != NULL)
     523                 :            :             {
     524         [ -  + ]:        833 :             if (os.length > SSL_MAX_SID_CTX_LENGTH)
     525                 :            :                 {
     526                 :          0 :                 c.error=SSL_R_BAD_LENGTH;
     527                 :          0 :                 c.line=__LINE__;
     528                 :          0 :                 goto err;
     529                 :            :                 }
     530                 :            :             else
     531                 :            :                 {
     532                 :        833 :                 ret->sid_ctx_length=os.length;
     533                 :        833 :                 memcpy(ret->sid_ctx,os.data,os.length);
     534                 :            :                 }
     535                 :        833 :             OPENSSL_free(os.data); os.data=NULL; os.length=0;
     536                 :            :             }
     537                 :            :         else
     538                 :          0 :             ret->sid_ctx_length=0;
     539                 :            : 
     540                 :        833 :         ai.length=0;
     541 [ +  + ][ -  + ]:        833 :         M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,5);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     542         [ -  + ]:        833 :         if (ai.data != NULL)
     543                 :            :                 {
     544                 :          0 :                 ret->verify_result=ASN1_INTEGER_get(aip);
     545                 :          0 :                 OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
     546                 :            :                 }
     547                 :            :         else
     548                 :        833 :                 ret->verify_result=X509_V_OK;
     549                 :            : 
     550                 :            : #ifndef OPENSSL_NO_TLSEXT
     551                 :        833 :         os.length=0;
     552                 :        833 :         os.data=NULL;
     553 [ +  + ][ -  + ]:        833 :         M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,6);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     554         [ -  + ]:        833 :         if (os.data)
     555                 :            :                 {
     556                 :          0 :                 ret->tlsext_hostname = BUF_strndup((char *)os.data, os.length);
     557                 :          0 :                 OPENSSL_free(os.data);
     558                 :          0 :                 os.data = NULL;
     559                 :          0 :                 os.length = 0;
     560                 :            :                 }
     561                 :            :         else
     562                 :        833 :                 ret->tlsext_hostname=NULL;
     563                 :            : #endif /* OPENSSL_NO_TLSEXT */
     564                 :            : 
     565                 :            : #ifndef OPENSSL_NO_PSK
     566                 :        833 :         os.length=0;
     567                 :        833 :         os.data=NULL;
     568 [ +  + ][ +  + ]:        833 :         M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,7);
         [ -  + ][ -  + ]
         [ -  + ][ -  + ]
                 [ #  # ]
     569         [ +  + ]:        833 :         if (os.data)
     570                 :            :                 {
     571                 :         22 :                 ret->psk_identity_hint = BUF_strndup((char *)os.data, os.length);
     572                 :         22 :                 OPENSSL_free(os.data);
     573                 :         22 :                 os.data = NULL;
     574                 :         22 :                 os.length = 0;
     575                 :            :                 }
     576                 :            :         else
     577                 :        811 :                 ret->psk_identity_hint=NULL;
     578                 :            : 
     579                 :        833 :         os.length=0;
     580                 :        833 :         os.data=NULL;
     581 [ +  + ][ +  + ]:        833 :         M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,8);
         [ -  + ][ -  + ]
         [ -  + ][ -  + ]
                 [ #  # ]
     582         [ +  + ]:        833 :         if (os.data)
     583                 :            :                 {
     584                 :         22 :                 ret->psk_identity = BUF_strndup((char *)os.data, os.length);
     585                 :         22 :                 OPENSSL_free(os.data);
     586                 :         22 :                 os.data = NULL;
     587                 :         22 :                 os.length = 0;
     588                 :            :                 }
     589                 :            :         else
     590                 :        811 :                 ret->psk_identity=NULL;
     591                 :            : #endif /* OPENSSL_NO_PSK */
     592                 :            : 
     593                 :            : #ifndef OPENSSL_NO_TLSEXT
     594                 :        833 :         ai.length=0;
     595 [ +  + ][ -  + ]:        833 :         M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,9);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     596         [ -  + ]:        833 :         if (ai.data != NULL)
     597                 :            :                 {
     598                 :          0 :                 ret->tlsext_tick_lifetime_hint=ASN1_INTEGER_get(aip);
     599                 :          0 :                 OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
     600                 :            :                 }
     601 [ -  + ][ #  # ]:        833 :         else if (ret->tlsext_ticklen && ret->session_id_length)
     602                 :          0 :                 ret->tlsext_tick_lifetime_hint = -1;
     603                 :            :         else
     604                 :        833 :                 ret->tlsext_tick_lifetime_hint=0;
     605                 :        833 :         os.length=0;
     606                 :        833 :         os.data=NULL;
     607 [ +  + ][ -  + ]:        833 :         M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,10);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     608         [ -  + ]:        833 :         if (os.data)
     609                 :            :                 {
     610                 :          0 :                 ret->tlsext_tick = os.data;
     611                 :          0 :                 ret->tlsext_ticklen = os.length;
     612                 :          0 :                 os.data = NULL;
     613                 :          0 :                 os.length = 0;
     614                 :            :                 }
     615                 :            :         else
     616                 :        833 :                 ret->tlsext_tick=NULL;
     617                 :            : #endif /* OPENSSL_NO_TLSEXT */
     618                 :            : #ifndef OPENSSL_NO_COMP
     619                 :        833 :         os.length=0;
     620                 :        833 :         os.data=NULL;
     621 [ +  + ][ -  + ]:        833 :         M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,11);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     622         [ -  + ]:        833 :         if (os.data)
     623                 :            :                 {
     624                 :          0 :                 ret->compress_meth = os.data[0];
     625                 :          0 :                 OPENSSL_free(os.data);
     626                 :          0 :                 os.data = NULL;
     627                 :            :                 }
     628                 :            : #endif
     629                 :            : 
     630                 :            : #ifndef OPENSSL_NO_SRP
     631                 :        833 :         os.length=0;
     632                 :        833 :         os.data=NULL;
     633 [ +  + ][ +  - ]:        833 :         M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,12);
         [ -  + ][ -  + ]
         [ -  + ][ -  + ]
                 [ #  # ]
     634         [ +  + ]:        833 :         if (os.data)
     635                 :            :                 {
     636                 :         22 :                 ret->srp_username = BUF_strndup((char *)os.data, os.length);
     637                 :         22 :                 OPENSSL_free(os.data);
     638                 :         22 :                 os.data = NULL;
     639                 :         22 :                 os.length = 0;
     640                 :            :                 }
     641                 :            :         else
     642                 :        811 :                 ret->srp_username=NULL;
     643                 :            : #endif /* OPENSSL_NO_SRP */
     644                 :            : 
     645 [ -  + ][ -  + ]:        833 :         M_ASN1_D2I_Finish(a,SSL_SESSION_free,SSL_F_D2I_SSL_SESSION);
         [ #  # ][ #  # ]
                 [ #  # ]
     646                 :            :         }

Generated by: LCOV version 1.9