LCOV - code coverage report
Current view: top level - asn1 - asn1_lib.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 156 222 70.3 %
Date: 2014-08-02 Functions: 19 26 73.1 %
Branches: 74 140 52.9 %

           Branch data     Line data    Source code
       1                 :            : /* crypto/asn1/asn1_lib.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                 :            : #include <stdio.h>
      60                 :            : #include <limits.h>
      61                 :            : #include "cryptlib.h"
      62                 :            : #include <openssl/asn1.h>
      63                 :            : #include <openssl/asn1_mac.h>
      64                 :            : 
      65                 :            : static int asn1_get_length(const unsigned char **pp,int *inf,long *rl,int max);
      66                 :            : static void asn1_put_length(unsigned char **pp, int length);
      67                 :            : const char ASN1_version[]="ASN.1" OPENSSL_VERSION_PTEXT;
      68                 :            : 
      69                 :          0 : static int _asn1_check_infinite_end(const unsigned char **p, long len)
      70                 :            :         {
      71                 :            :         /* If there is 0 or 1 byte left, the length check should pick
      72                 :            :          * things up */
      73         [ #  # ]:          0 :         if (len <= 0)
      74                 :            :                 return(1);
      75 [ #  # ][ #  # ]:          0 :         else if ((len >= 2) && ((*p)[0] == 0) && ((*p)[1] == 0))
                 [ #  # ]
      76                 :            :                 {
      77                 :          0 :                 (*p)+=2;
      78                 :          0 :                 return(1);
      79                 :            :                 }
      80                 :            :         return(0);
      81                 :            :         }
      82                 :            : 
      83                 :          0 : int ASN1_check_infinite_end(unsigned char **p, long len)
      84                 :            :         {
      85                 :          0 :         return _asn1_check_infinite_end((const unsigned char **)p, len);
      86                 :            :         }
      87                 :            : 
      88                 :          0 : int ASN1_const_check_infinite_end(const unsigned char **p, long len)
      89                 :            :         {
      90                 :          0 :         return _asn1_check_infinite_end(p, len);
      91                 :            :         }
      92                 :            : 
      93                 :            : 
      94                 :     492792 : int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag,
      95                 :            :         int *pclass, long omax)
      96                 :            :         {
      97                 :            :         int i,ret;
      98                 :            :         long l;
      99                 :     492792 :         const unsigned char *p= *pp;
     100                 :            :         int tag,xclass,inf;
     101                 :     492792 :         long max=omax;
     102                 :            : 
     103         [ +  - ]:     492792 :         if (!max) goto err;
     104                 :     492792 :         ret=(*p&V_ASN1_CONSTRUCTED);
     105                 :     492792 :         xclass=(*p&V_ASN1_PRIVATE);
     106                 :     492792 :         i= *p&V_ASN1_PRIMITIVE_TAG;
     107         [ -  + ]:     492792 :         if (i == V_ASN1_PRIMITIVE_TAG)
     108                 :            :                 {               /* high-tag */
     109                 :          0 :                 p++;
     110         [ #  # ]:          0 :                 if (--max == 0) goto err;
     111                 :            :                 l=0;
     112         [ #  # ]:          0 :                 while (*p&0x80)
     113                 :            :                         {
     114                 :          0 :                         l<<=7L;
     115                 :          0 :                         l|= *(p++)&0x7f;
     116         [ #  # ]:          0 :                         if (--max == 0) goto err;
     117         [ #  # ]:          0 :                         if (l > (INT_MAX >> 7L)) goto err;
     118                 :            :                         }
     119                 :          0 :                 l<<=7L;
     120                 :          0 :                 l|= *(p++)&0x7f;
     121                 :          0 :                 tag=(int)l;
     122         [ #  # ]:          0 :                 if (--max == 0) goto err;
     123                 :            :                 }
     124                 :            :         else
     125                 :            :                 { 
     126                 :     492792 :                 tag=i;
     127                 :     492792 :                 p++;
     128         [ +  - ]:     492792 :                 if (--max == 0) goto err;
     129                 :            :                 }
     130                 :     492792 :         *ptag=tag;
     131                 :     492792 :         *pclass=xclass;
     132         [ +  - ]:     492792 :         if (!asn1_get_length(&p,&inf,plength,(int)max)) goto err;
     133                 :            : 
     134 [ +  + ][ +  - ]:     492792 :         if (inf && !(ret & V_ASN1_CONSTRUCTED))
     135                 :            :                 goto err;
     136                 :            : 
     137                 :            : #if 0
     138                 :            :         fprintf(stderr,"p=%d + *plength=%ld > omax=%ld + *pp=%d  (%d > %d)\n", 
     139                 :            :                 (int)p,*plength,omax,(int)*pp,(int)(p+ *plength),
     140                 :            :                 (int)(omax+ *pp));
     141                 :            : 
     142                 :            : #endif
     143         [ +  + ]:     492792 :         if (*plength > (omax - (p - *pp)))
     144                 :            :                 {
     145                 :        416 :                 ASN1err(ASN1_F_ASN1_GET_OBJECT,ASN1_R_TOO_LONG);
     146                 :            :                 /* Set this so that even if things are not long enough
     147                 :            :                  * the values are set correctly */
     148                 :        416 :                 ret|=0x80;
     149                 :            :                 }
     150                 :     492792 :         *pp=p;
     151                 :     492792 :         return(ret|inf);
     152                 :            : err:
     153                 :          0 :         ASN1err(ASN1_F_ASN1_GET_OBJECT,ASN1_R_HEADER_TOO_LONG);
     154                 :          0 :         return(0x80);
     155                 :            :         }
     156                 :            : 
     157                 :     492792 : static int asn1_get_length(const unsigned char **pp, int *inf, long *rl, int max)
     158                 :            :         {
     159                 :     492792 :         const unsigned char *p= *pp;
     160                 :     492792 :         unsigned long ret=0;
     161                 :            :         unsigned int i;
     162                 :            : 
     163         [ +  - ]:     492792 :         if (max-- < 1) return(0);
     164         [ +  + ]:     492792 :         if (*p == 0x80)
     165                 :            :                 {
     166                 :        421 :                 *inf=1;
     167                 :        421 :                 ret=0;
     168                 :        421 :                 p++;
     169                 :            :                 }
     170                 :            :         else
     171                 :            :                 {
     172                 :     492371 :                 *inf=0;
     173                 :     492371 :                 i= *p&0x7f;
     174         [ +  + ]:     492371 :                 if (*(p++) & 0x80)
     175                 :            :                         {
     176         [ +  - ]:      46941 :                         if (max < (int)i)
     177                 :            :                                 return 0;
     178                 :            :                         /* Skip leading zeroes */
     179 [ +  - ][ -  + ]:      46941 :                         while (i && *p == 0)
     180                 :            :                                 {
     181                 :          0 :                                 p++;
     182                 :          0 :                                 i--;
     183                 :            :                                 }
     184         [ +  - ]:      46941 :                         if (i > sizeof(long))
     185                 :            :                                 return 0;
     186         [ +  + ]:     111513 :                         while (i-- > 0)
     187                 :            :                                 {
     188                 :      64572 :                                 ret<<=8L;
     189                 :      64572 :                                 ret|= *(p++);
     190                 :            :                                 }
     191                 :            :                         }
     192                 :            :                 else
     193                 :     445430 :                         ret=i;
     194                 :            :                 }
     195         [ +  - ]:     492792 :         if (ret > LONG_MAX)
     196                 :            :                 return 0;
     197                 :     492792 :         *pp=p;
     198                 :     492792 :         *rl=(long)ret;
     199                 :     492792 :         return(1);
     200                 :            :         }
     201                 :            : 
     202                 :            : /* class 0 is constructed
     203                 :            :  * constructed == 2 for indefinite length constructed */
     204                 :     270312 : void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag,
     205                 :            :              int xclass)
     206                 :            :         {
     207                 :     270312 :         unsigned char *p= *pp;
     208                 :            :         int i, ttag;
     209                 :            : 
     210         [ +  + ]:     270312 :         i=(constructed)?V_ASN1_CONSTRUCTED:0;
     211                 :     270312 :         i|=(xclass&V_ASN1_PRIVATE);
     212         [ +  - ]:     270312 :         if (tag < 31)
     213                 :     270312 :                 *(p++)=i|(tag&V_ASN1_PRIMITIVE_TAG);
     214                 :            :         else
     215                 :            :                 {
     216                 :          0 :                 *(p++)=i|V_ASN1_PRIMITIVE_TAG;
     217         [ #  # ]:          0 :                 for(i = 0, ttag = tag; ttag > 0; i++) ttag >>=7;
     218                 :            :                 ttag = i;
     219         [ #  # ]:          0 :                 while(i-- > 0)
     220                 :            :                         {
     221                 :          0 :                         p[i] = tag & 0x7f;
     222         [ #  # ]:          0 :                         if(i != (ttag - 1)) p[i] |= 0x80;
     223                 :          0 :                         tag >>= 7;
     224                 :            :                         }
     225                 :          0 :                 p += ttag;
     226                 :            :                 }
     227         [ +  + ]:     270312 :         if (constructed == 2)
     228                 :        460 :                 *(p++)=0x80;
     229                 :            :         else
     230                 :     269852 :                 asn1_put_length(&p,length);
     231                 :     270312 :         *pp=p;
     232                 :     270312 :         }
     233                 :            : 
     234                 :        460 : int ASN1_put_eoc(unsigned char **pp)
     235                 :            :         {
     236                 :        460 :         unsigned char *p = *pp;
     237                 :        460 :         *p++ = 0;
     238                 :        460 :         *p++ = 0;
     239                 :        460 :         *pp = p;
     240                 :        460 :         return 2;
     241                 :            :         }
     242                 :            : 
     243                 :     269852 : static void asn1_put_length(unsigned char **pp, int length)
     244                 :            :         {
     245                 :     269852 :         unsigned char *p= *pp;
     246                 :            :         int i,l;
     247         [ +  + ]:     269852 :         if (length <= 127)
     248                 :     255837 :                 *(p++)=(unsigned char)length;
     249                 :            :         else
     250                 :            :                 {
     251                 :            :                 l=length;
     252         [ +  + ]:      35734 :                 for (i=0; l > 0; i++)
     253                 :      21719 :                         l>>=8;
     254                 :      14015 :                 *(p++)=i|0x80;
     255                 :      14015 :                 l=i;
     256         [ +  + ]:      35734 :                 while (i-- > 0)
     257                 :            :                         {
     258                 :      21719 :                         p[i]=length&0xff;
     259                 :      21719 :                         length>>=8;
     260                 :            :                         }
     261                 :      14015 :                 p+=l;
     262                 :            :                 }
     263                 :     269852 :         *pp=p;
     264                 :     269852 :         }
     265                 :            : 
     266                 :     891693 : int ASN1_object_size(int constructed, int length, int tag)
     267                 :            :         {
     268                 :            :         int ret;
     269                 :            : 
     270                 :     891693 :         ret=length;
     271                 :     891693 :         ret++;
     272         [ -  + ]:     891693 :         if (tag >= 31)
     273                 :            :                 {
     274         [ #  # ]:          0 :                 while (tag > 0)
     275                 :            :                         {
     276                 :          0 :                         tag>>=7;
     277                 :          0 :                         ret++;
     278                 :            :                         }
     279                 :            :                 }
     280         [ +  + ]:     891693 :         if (constructed == 2)
     281                 :       1936 :                 return ret + 3;
     282                 :     889757 :         ret++;
     283         [ +  + ]:     889757 :         if (length > 127)
     284                 :            :                 {
     285         [ +  + ]:     100633 :                 while (length > 0)
     286                 :            :                         {
     287                 :      60141 :                         length>>=8;
     288                 :      60141 :                         ret++;
     289                 :            :                         }
     290                 :            :                 }
     291                 :     889757 :         return(ret);
     292                 :            :         }
     293                 :            : 
     294                 :        833 : static int _asn1_Finish(ASN1_const_CTX *c)
     295                 :            :         {
     296 [ -  + ][ #  # ]:        833 :         if ((c->inf == (1|V_ASN1_CONSTRUCTED)) && (!c->eos))
     297                 :            :                 {
     298         [ #  # ]:          0 :                 if (!ASN1_const_check_infinite_end(&c->p,c->slen))
     299                 :            :                         {
     300                 :          0 :                         c->error=ERR_R_MISSING_ASN1_EOS;
     301                 :          0 :                         return(0);
     302                 :            :                         }
     303                 :            :                 }
     304 [ -  + ][ #  # ]:        833 :         if (    ((c->slen != 0) && !(c->inf & 1)) ||
                 [ -  + ]
     305         [ #  # ]:          0 :                 ((c->slen < 0) && (c->inf & 1)))
     306                 :            :                 {
     307                 :          0 :                 c->error=ERR_R_ASN1_LENGTH_MISMATCH;
     308                 :          0 :                 return(0);
     309                 :            :                 }
     310                 :            :         return(1);
     311                 :            :         }
     312                 :            : 
     313                 :          0 : int asn1_Finish(ASN1_CTX *c)
     314                 :            :         {
     315                 :          0 :         return _asn1_Finish((ASN1_const_CTX *)c);
     316                 :            :         }
     317                 :            : 
     318                 :        833 : int asn1_const_Finish(ASN1_const_CTX *c)
     319                 :            :         {
     320                 :        833 :         return _asn1_Finish(c);
     321                 :            :         }
     322                 :            : 
     323                 :        835 : int asn1_GetSequence(ASN1_const_CTX *c, long *length)
     324                 :            :         {
     325                 :            :         const unsigned char *q;
     326                 :            : 
     327                 :        835 :         q=c->p;
     328                 :        835 :         c->inf=ASN1_get_object(&(c->p),&(c->slen),&(c->tag),&(c->xclass),
     329                 :            :                 *length);
     330         [ -  + ]:        835 :         if (c->inf & 0x80)
     331                 :            :                 {
     332                 :          0 :                 c->error=ERR_R_BAD_GET_ASN1_OBJECT_CALL;
     333                 :          0 :                 return(0);
     334                 :            :                 }
     335         [ -  + ]:        835 :         if (c->tag != V_ASN1_SEQUENCE)
     336                 :            :                 {
     337                 :          0 :                 c->error=ERR_R_EXPECTING_AN_ASN1_SEQUENCE;
     338                 :          0 :                 return(0);
     339                 :            :                 }
     340                 :        835 :         (*length)-=(c->p-q);
     341 [ +  - ][ -  + ]:        835 :         if (c->max && (*length < 0))
     342                 :            :                 {
     343                 :          0 :                 c->error=ERR_R_ASN1_LENGTH_MISMATCH;
     344                 :          0 :                 return(0);
     345                 :            :                 }
     346         [ -  + ]:        835 :         if (c->inf == (1|V_ASN1_CONSTRUCTED))
     347                 :          0 :                 c->slen= *length+ *(c->pp)-c->p;
     348                 :        835 :         c->eos=0;
     349                 :        835 :         return(1);
     350                 :            :         }
     351                 :            : 
     352                 :      17192 : int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str)
     353                 :            :         {
     354         [ +  - ]:      17192 :         if (str == NULL)
     355                 :            :                 return 0;
     356                 :      17192 :         dst->type = str->type;
     357         [ +  - ]:      17192 :         if (!ASN1_STRING_set(dst,str->data,str->length))
     358                 :            :                 return 0;
     359                 :      17192 :         dst->flags = str->flags;
     360                 :      17192 :         return 1;
     361                 :            :         }
     362                 :            : 
     363                 :      17107 : ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *str)
     364                 :            :         {
     365                 :            :         ASN1_STRING *ret;
     366         [ +  - ]:      17107 :         if (!str)
     367                 :            :                  return NULL;
     368                 :      17107 :         ret=ASN1_STRING_new();
     369         [ +  - ]:      17107 :         if (!ret)
     370                 :            :                 return NULL;
     371         [ -  + ]:      17107 :         if (!ASN1_STRING_copy(ret,str))
     372                 :            :                 {
     373                 :          0 :                 ASN1_STRING_free(ret);
     374                 :          0 :                 return NULL;
     375                 :            :                 }
     376                 :            :         return ret;
     377                 :            :         }
     378                 :            : 
     379                 :     202512 : int ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len)
     380                 :            :         {
     381                 :            :         unsigned char *c;
     382                 :     202512 :         const char *data=_data;
     383                 :            : 
     384         [ +  + ]:     202512 :         if (len < 0)
     385                 :            :                 {
     386         [ +  - ]:         86 :                 if (data == NULL)
     387                 :            :                         return(0);
     388                 :            :                 else
     389                 :         86 :                         len=strlen(data);
     390                 :            :                 }
     391 [ +  + ][ -  + ]:     202512 :         if ((str->length < len) || (str->data == NULL))
     392                 :            :                 {
     393                 :     201679 :                 c=str->data;
     394         [ +  + ]:     201679 :                 if (c == NULL)
     395                 :     200846 :                         str->data=OPENSSL_malloc(len+1);
     396                 :            :                 else
     397                 :        833 :                         str->data=OPENSSL_realloc(c,len+1);
     398                 :            : 
     399         [ -  + ]:     201679 :                 if (str->data == NULL)
     400                 :            :                         {
     401                 :          0 :                         ASN1err(ASN1_F_ASN1_STRING_SET,ERR_R_MALLOC_FAILURE);
     402                 :          0 :                         str->data=c;
     403                 :          0 :                         return(0);
     404                 :            :                         }
     405                 :            :                 }
     406                 :     202512 :         str->length=len;
     407         [ +  + ]:     202512 :         if (data != NULL)
     408                 :            :                 {
     409                 :     202509 :                 memcpy(str->data,data,len);
     410                 :            :                 /* an allowance for strings :-) */
     411                 :     202509 :                 str->data[len]='\0';
     412                 :            :                 }
     413                 :            :         return(1);
     414                 :            :         }
     415                 :            : 
     416                 :        155 : void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len)
     417                 :            :         {
     418         [ -  + ]:        155 :         if (str->data)
     419                 :          0 :                 OPENSSL_free(str->data);
     420                 :        155 :         str->data = data;
     421                 :        155 :         str->length = len;
     422                 :        155 :         }
     423                 :            : 
     424                 :      17143 : ASN1_STRING *ASN1_STRING_new(void)
     425                 :            :         {
     426                 :      17143 :         return(ASN1_STRING_type_new(V_ASN1_OCTET_STRING));
     427                 :            :         }
     428                 :            : 
     429                 :            : 
     430                 :     203850 : ASN1_STRING *ASN1_STRING_type_new(int type)
     431                 :            :         {
     432                 :            :         ASN1_STRING *ret;
     433                 :            : 
     434                 :     203850 :         ret=(ASN1_STRING *)OPENSSL_malloc(sizeof(ASN1_STRING));
     435         [ -  + ]:     203850 :         if (ret == NULL)
     436                 :            :                 {
     437                 :          0 :                 ASN1err(ASN1_F_ASN1_STRING_TYPE_NEW,ERR_R_MALLOC_FAILURE);
     438                 :          0 :                 return(NULL);
     439                 :            :                 }
     440                 :     203850 :         ret->length=0;
     441                 :     203850 :         ret->type=type;
     442                 :     203850 :         ret->data=NULL;
     443                 :     203850 :         ret->flags=0;
     444                 :     203850 :         return(ret);
     445                 :            :         }
     446                 :            : 
     447                 :     203853 : void ASN1_STRING_free(ASN1_STRING *a)
     448                 :            :         {
     449         [ +  + ]:     203853 :         if (a == NULL) return;
     450 [ +  + ][ +  + ]:     203850 :         if (a->data && !(a->flags & ASN1_STRING_FLAG_NDEF))
     451                 :     201540 :                 OPENSSL_free(a->data);
     452                 :     203850 :         OPENSSL_free(a);
     453                 :            :         }
     454                 :            : 
     455                 :       4938 : int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b)
     456                 :            :         {
     457                 :            :         int i;
     458                 :            : 
     459                 :       4938 :         i=(a->length-b->length);
     460         [ +  - ]:       4938 :         if (i == 0)
     461                 :            :                 {
     462                 :       4938 :                 i=memcmp(a->data,b->data,a->length);
     463         [ +  + ]:       4938 :                 if (i == 0)
     464                 :       4818 :                         return(a->type-b->type);
     465                 :            :                 else
     466                 :            :                         return(i);
     467                 :            :                 }
     468                 :            :         else
     469                 :            :                 return(i);
     470                 :            :         }
     471                 :            : 
     472                 :          0 : void asn1_add_error(const unsigned char *address, int offset)
     473                 :            :         {
     474                 :            :         char buf1[DECIMAL_SIZE(address)+1],buf2[DECIMAL_SIZE(offset)+1];
     475                 :            : 
     476                 :          0 :         BIO_snprintf(buf1,sizeof buf1,"%lu",(unsigned long)address);
     477                 :          0 :         BIO_snprintf(buf2,sizeof buf2,"%d",offset);
     478                 :          0 :         ERR_add_error_data(4,"address=",buf1," offset=",buf2);
     479                 :          0 :         }
     480                 :            : 
     481                 :         17 : int ASN1_STRING_length(const ASN1_STRING *x)
     482                 :         17 : { return M_ASN1_STRING_length(x); }
     483                 :            : 
     484                 :          0 : void ASN1_STRING_length_set(ASN1_STRING *x, int len)
     485                 :          0 : { M_ASN1_STRING_length_set(x, len); return; }
     486                 :            : 
     487                 :          0 : int ASN1_STRING_type(ASN1_STRING *x)
     488                 :          0 : { return M_ASN1_STRING_type(x); }
     489                 :            : 
     490                 :         17 : unsigned char * ASN1_STRING_data(ASN1_STRING *x)
     491                 :         17 : { return M_ASN1_STRING_data(x); }

Generated by: LCOV version 1.9