LCOV - code coverage report
Current view: top level - third_party/openssl/crypto/asn1 - asn1_par.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 0 143 0.0 %
Date: 2015-10-10 Functions: 0 5 0.0 %

          Line data    Source code
       1             : /* crypto/asn1/asn1_par.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 "cryptlib.h"
      61             : #include <openssl/buffer.h>
      62             : #include <openssl/objects.h>
      63             : #include <openssl/asn1.h>
      64             : 
      65             : static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed,
      66             :                            int indent);
      67             : static int asn1_parse2(BIO *bp, const unsigned char **pp, long length,
      68             :                        int offset, int depth, int indent, int dump);
      69           0 : static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed,
      70             :                            int indent)
      71             : {
      72             :     static const char fmt[] = "%-18s";
      73             :     char str[128];
      74             :     const char *p;
      75             : 
      76           0 :     if (constructed & V_ASN1_CONSTRUCTED)
      77             :         p = "cons: ";
      78             :     else
      79             :         p = "prim: ";
      80           0 :     if (BIO_write(bp, p, 6) < 6)
      81             :         goto err;
      82           0 :     BIO_indent(bp, indent, 128);
      83             : 
      84             :     p = str;
      85           0 :     if ((xclass & V_ASN1_PRIVATE) == V_ASN1_PRIVATE)
      86           0 :         BIO_snprintf(str, sizeof str, "priv [ %d ] ", tag);
      87           0 :     else if ((xclass & V_ASN1_CONTEXT_SPECIFIC) == V_ASN1_CONTEXT_SPECIFIC)
      88           0 :         BIO_snprintf(str, sizeof str, "cont [ %d ]", tag);
      89           0 :     else if ((xclass & V_ASN1_APPLICATION) == V_ASN1_APPLICATION)
      90           0 :         BIO_snprintf(str, sizeof str, "appl [ %d ]", tag);
      91           0 :     else if (tag > 30)
      92           0 :         BIO_snprintf(str, sizeof str, "<ASN1 %d>", tag);
      93             :     else
      94             :         p = ASN1_tag2str(tag);
      95             : 
      96           0 :     if (BIO_printf(bp, fmt, p) <= 0)
      97             :         goto err;
      98             :     return (1);
      99             :  err:
     100             :     return (0);
     101             : }
     102             : 
     103           0 : int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent)
     104             : {
     105           0 :     return (asn1_parse2(bp, &pp, len, 0, 0, indent, 0));
     106             : }
     107             : 
     108           0 : int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent,
     109             :                     int dump)
     110             : {
     111           0 :     return (asn1_parse2(bp, &pp, len, 0, 0, indent, dump));
     112             : }
     113             : 
     114           0 : static int asn1_parse2(BIO *bp, const unsigned char **pp, long length,
     115             :                        int offset, int depth, int indent, int dump)
     116             : {
     117             :     const unsigned char *p, *ep, *tot, *op, *opp;
     118             :     long len;
     119             :     int tag, xclass, ret = 0;
     120             :     int nl, hl, j, r;
     121           0 :     ASN1_OBJECT *o = NULL;
     122             :     ASN1_OCTET_STRING *os = NULL;
     123             :     /* ASN1_BMPSTRING *bmp=NULL; */
     124             :     int dump_indent;
     125             : 
     126             : #if 0
     127             :     dump_indent = indent;
     128             : #else
     129             :     dump_indent = 6;            /* Because we know BIO_dump_indent() */
     130             : #endif
     131           0 :     p = *pp;
     132           0 :     tot = p + length;
     133           0 :     op = p - 1;
     134           0 :     while ((p < tot) && (op < p)) {
     135             :         op = p;
     136           0 :         j = ASN1_get_object(&p, &len, &tag, &xclass, length);
     137             : #ifdef LINT
     138             :         j = j;
     139             : #endif
     140           0 :         if (j & 0x80) {
     141           0 :             if (BIO_write(bp, "Error in encoding\n", 18) <= 0)
     142             :                 goto end;
     143             :             ret = 0;
     144             :             goto end;
     145             :         }
     146           0 :         hl = (p - op);
     147           0 :         length -= hl;
     148             :         /*
     149             :          * if j == 0x21 it is a constructed indefinite length object
     150             :          */
     151           0 :         if (BIO_printf(bp, "%5ld:", (long)offset + (long)(op - *pp))
     152             :             <= 0)
     153             :             goto end;
     154             : 
     155           0 :         if (j != (V_ASN1_CONSTRUCTED | 1)) {
     156           0 :             if (BIO_printf(bp, "d=%-2d hl=%ld l=%4ld ",
     157             :                            depth, (long)hl, len) <= 0)
     158             :                 goto end;
     159             :         } else {
     160           0 :             if (BIO_printf(bp, "d=%-2d hl=%ld l=inf  ", depth, (long)hl) <= 0)
     161             :                 goto end;
     162             :         }
     163           0 :         if (!asn1_print_info(bp, tag, xclass, j, (indent) ? depth : 0))
     164             :             goto end;
     165           0 :         if (j & V_ASN1_CONSTRUCTED) {
     166           0 :             ep = p + len;
     167           0 :             if (BIO_write(bp, "\n", 1) <= 0)
     168             :                 goto end;
     169           0 :             if (len > length) {
     170           0 :                 BIO_printf(bp, "length is greater than %ld\n", length);
     171             :                 ret = 0;
     172           0 :                 goto end;
     173             :             }
     174           0 :             if ((j == 0x21) && (len == 0)) {
     175             :                 for (;;) {
     176           0 :                     r = asn1_parse2(bp, &p, (long)(tot - p),
     177           0 :                                     offset + (p - *pp), depth + 1,
     178             :                                     indent, dump);
     179           0 :                     if (r == 0) {
     180             :                         ret = 0;
     181             :                         goto end;
     182             :                     }
     183           0 :                     if ((r == 2) || (p >= tot))
     184             :                         break;
     185             :                 }
     186             :             } else
     187           0 :                 while (p < ep) {
     188           0 :                     r = asn1_parse2(bp, &p, (long)len,
     189           0 :                                     offset + (p - *pp), depth + 1,
     190             :                                     indent, dump);
     191           0 :                     if (r == 0) {
     192             :                         ret = 0;
     193             :                         goto end;
     194             :                     }
     195             :                 }
     196           0 :         } else if (xclass != 0) {
     197           0 :             p += len;
     198           0 :             if (BIO_write(bp, "\n", 1) <= 0)
     199             :                 goto end;
     200             :         } else {
     201             :             nl = 0;
     202           0 :             if ((tag == V_ASN1_PRINTABLESTRING) ||
     203           0 :                 (tag == V_ASN1_T61STRING) ||
     204           0 :                 (tag == V_ASN1_IA5STRING) ||
     205           0 :                 (tag == V_ASN1_VISIBLESTRING) ||
     206           0 :                 (tag == V_ASN1_NUMERICSTRING) ||
     207           0 :                 (tag == V_ASN1_UTF8STRING) ||
     208           0 :                 (tag == V_ASN1_UTCTIME) || (tag == V_ASN1_GENERALIZEDTIME)) {
     209           0 :                 if (BIO_write(bp, ":", 1) <= 0)
     210             :                     goto end;
     211           0 :                 if ((len > 0) && BIO_write(bp, (const char *)p, (int)len)
     212           0 :                     != (int)len)
     213             :                     goto end;
     214           0 :             } else if (tag == V_ASN1_OBJECT) {
     215           0 :                 opp = op;
     216           0 :                 if (d2i_ASN1_OBJECT(&o, &opp, len + hl) != NULL) {
     217           0 :                     if (BIO_write(bp, ":", 1) <= 0)
     218             :                         goto end;
     219           0 :                     i2a_ASN1_OBJECT(bp, o);
     220             :                 } else {
     221           0 :                     if (BIO_write(bp, ":BAD OBJECT", 11) <= 0)
     222             :                         goto end;
     223             :                 }
     224           0 :             } else if (tag == V_ASN1_BOOLEAN) {
     225             :                 int ii;
     226             : 
     227           0 :                 opp = op;
     228           0 :                 ii = d2i_ASN1_BOOLEAN(NULL, &opp, len + hl);
     229           0 :                 if (ii < 0) {
     230           0 :                     if (BIO_write(bp, "Bad boolean\n", 12) <= 0)
     231             :                         goto end;
     232             :                 }
     233           0 :                 BIO_printf(bp, ":%d", ii);
     234           0 :             } else if (tag == V_ASN1_BMPSTRING) {
     235             :                 /* do the BMP thang */
     236           0 :             } else if (tag == V_ASN1_OCTET_STRING) {
     237             :                 int i, printable = 1;
     238             : 
     239           0 :                 opp = op;
     240           0 :                 os = d2i_ASN1_OCTET_STRING(NULL, &opp, len + hl);
     241           0 :                 if (os != NULL && os->length > 0) {
     242           0 :                     opp = os->data;
     243             :                     /*
     244             :                      * testing whether the octet string is printable
     245             :                      */
     246           0 :                     for (i = 0; i < os->length; i++) {
     247           0 :                         if (((opp[i] < ' ') &&
     248           0 :                              (opp[i] != '\n') &&
     249           0 :                              (opp[i] != '\r') &&
     250           0 :                              (opp[i] != '\t')) || (opp[i] > '~')) {
     251             :                             printable = 0;
     252             :                             break;
     253             :                         }
     254             :                     }
     255           0 :                     if (printable)
     256             :                         /* printable string */
     257             :                     {
     258           0 :                         if (BIO_write(bp, ":", 1) <= 0)
     259             :                             goto end;
     260           0 :                         if (BIO_write(bp, (const char *)opp, os->length) <= 0)
     261             :                             goto end;
     262           0 :                     } else if (!dump)
     263             :                         /*
     264             :                          * not printable => print octet string as hex dump
     265             :                          */
     266             :                     {
     267           0 :                         if (BIO_write(bp, "[HEX DUMP]:", 11) <= 0)
     268             :                             goto end;
     269           0 :                         for (i = 0; i < os->length; i++) {
     270           0 :                             if (BIO_printf(bp, "%02X", opp[i]) <= 0)
     271             :                                 goto end;
     272             :                         }
     273             :                     } else
     274             :                         /* print the normal dump */
     275             :                     {
     276             :                         if (!nl) {
     277           0 :                             if (BIO_write(bp, "\n", 1) <= 0)
     278             :                                 goto end;
     279             :                         }
     280           0 :                         if (BIO_dump_indent(bp,
     281             :                                             (const char *)opp,
     282           0 :                                             ((dump == -1 || dump >
     283           0 :                                               os->
     284             :                                               length) ? os->length : dump),
     285             :                                             dump_indent) <= 0)
     286             :                             goto end;
     287             :                         nl = 1;
     288             :                     }
     289             :                 }
     290           0 :                 if (os != NULL) {
     291           0 :                     M_ASN1_OCTET_STRING_free(os);
     292             :                     os = NULL;
     293             :                 }
     294           0 :             } else if (tag == V_ASN1_INTEGER) {
     295             :                 ASN1_INTEGER *bs;
     296             :                 int i;
     297             : 
     298           0 :                 opp = op;
     299           0 :                 bs = d2i_ASN1_INTEGER(NULL, &opp, len + hl);
     300           0 :                 if (bs != NULL) {
     301           0 :                     if (BIO_write(bp, ":", 1) <= 0)
     302             :                         goto end;
     303           0 :                     if (bs->type == V_ASN1_NEG_INTEGER)
     304           0 :                         if (BIO_write(bp, "-", 1) <= 0)
     305             :                             goto end;
     306           0 :                     for (i = 0; i < bs->length; i++) {
     307           0 :                         if (BIO_printf(bp, "%02X", bs->data[i]) <= 0)
     308             :                             goto end;
     309             :                     }
     310           0 :                     if (bs->length == 0) {
     311           0 :                         if (BIO_write(bp, "00", 2) <= 0)
     312             :                             goto end;
     313             :                     }
     314             :                 } else {
     315           0 :                     if (BIO_write(bp, "BAD INTEGER", 11) <= 0)
     316             :                         goto end;
     317             :                 }
     318           0 :                 M_ASN1_INTEGER_free(bs);
     319           0 :             } else if (tag == V_ASN1_ENUMERATED) {
     320             :                 ASN1_ENUMERATED *bs;
     321             :                 int i;
     322             : 
     323           0 :                 opp = op;
     324           0 :                 bs = d2i_ASN1_ENUMERATED(NULL, &opp, len + hl);
     325           0 :                 if (bs != NULL) {
     326           0 :                     if (BIO_write(bp, ":", 1) <= 0)
     327             :                         goto end;
     328           0 :                     if (bs->type == V_ASN1_NEG_ENUMERATED)
     329           0 :                         if (BIO_write(bp, "-", 1) <= 0)
     330             :                             goto end;
     331           0 :                     for (i = 0; i < bs->length; i++) {
     332           0 :                         if (BIO_printf(bp, "%02X", bs->data[i]) <= 0)
     333             :                             goto end;
     334             :                     }
     335           0 :                     if (bs->length == 0) {
     336           0 :                         if (BIO_write(bp, "00", 2) <= 0)
     337             :                             goto end;
     338             :                     }
     339             :                 } else {
     340           0 :                     if (BIO_write(bp, "BAD ENUMERATED", 14) <= 0)
     341             :                         goto end;
     342             :                 }
     343           0 :                 M_ASN1_ENUMERATED_free(bs);
     344           0 :             } else if (len > 0 && dump) {
     345             :                 if (!nl) {
     346           0 :                     if (BIO_write(bp, "\n", 1) <= 0)
     347             :                         goto end;
     348             :                 }
     349           0 :                 if (BIO_dump_indent(bp, (const char *)p,
     350           0 :                                     ((dump == -1 || dump > len) ? len : dump),
     351             :                                     dump_indent) <= 0)
     352             :                     goto end;
     353             :                 nl = 1;
     354             :             }
     355             : 
     356           0 :             if (!nl) {
     357           0 :                 if (BIO_write(bp, "\n", 1) <= 0)
     358             :                     goto end;
     359             :             }
     360           0 :             p += len;
     361           0 :             if ((tag == V_ASN1_EOC) && (xclass == 0)) {
     362             :                 ret = 2;        /* End of sequence */
     363             :                 goto end;
     364             :             }
     365             :         }
     366           0 :         length -= len;
     367             :     }
     368             :     ret = 1;
     369             :  end:
     370           0 :     if (o != NULL)
     371           0 :         ASN1_OBJECT_free(o);
     372           0 :     if (os != NULL)
     373           0 :         M_ASN1_OCTET_STRING_free(os);
     374           0 :     *pp = p;
     375           0 :     return (ret);
     376             : }
     377             : 
     378           0 : const char *ASN1_tag2str(int tag)
     379             : {
     380             :     static const char *const tag2str[] = {
     381             :         /* 0-4 */
     382             :         "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING",
     383             :         /* 5-9 */
     384             :         "NULL", "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL",
     385             :         /* 10-13 */
     386             :         "ENUMERATED", "<ASN1 11>", "UTF8STRING", "<ASN1 13>",
     387             :         /* 15-17 */
     388             :         "<ASN1 14>", "<ASN1 15>", "SEQUENCE", "SET",
     389             :         /* 18-20 */
     390             :         "NUMERICSTRING", "PRINTABLESTRING", "T61STRING",
     391             :         /* 21-24 */
     392             :         "VIDEOTEXSTRING", "IA5STRING", "UTCTIME", "GENERALIZEDTIME",
     393             :         /* 25-27 */
     394             :         "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING",
     395             :         /* 28-30 */
     396             :         "UNIVERSALSTRING", "<ASN1 29>", "BMPSTRING"
     397             :     };
     398             : 
     399           0 :     if ((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED))
     400           0 :         tag &= ~0x100;
     401             : 
     402           0 :     if (tag < 0 || tag > 30)
     403             :         return "(unknown)";
     404           0 :     return tag2str[tag];
     405             : }

Generated by: LCOV version 1.10