LCOV - code coverage report
Current view: top level - third_party/openssl/crypto/x509 - x509_obj.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 40 68 58.8 %
Date: 2015-10-10 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /* crypto/x509/x509_obj.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/lhash.h>
      62             : #include <openssl/objects.h>
      63             : #include <openssl/x509.h>
      64             : #include <openssl/buffer.h>
      65             : 
      66        1681 : char *X509_NAME_oneline(X509_NAME *a, char *buf, int len)
      67             : {
      68             :     X509_NAME_ENTRY *ne;
      69             :     int i;
      70             :     int n, lold, l, l1, l2, num, j, type;
      71             :     const char *s;
      72             :     char *p;
      73             :     unsigned char *q;
      74             :     BUF_MEM *b = NULL;
      75             :     static const char hex[17] = "0123456789ABCDEF";
      76             :     int gs_doit[4];
      77             :     char tmp_buf[80];
      78             : #ifdef CHARSET_EBCDIC
      79             :     char ebcdic_buf[1024];
      80             : #endif
      81             : 
      82        1681 :     if (buf == NULL) {
      83        1681 :         if ((b = BUF_MEM_new()) == NULL)
      84             :             goto err;
      85        1681 :         if (!BUF_MEM_grow(b, 200))
      86             :             goto err;
      87        1681 :         b->data[0] = '\0';
      88             :         len = 200;
      89             :     }
      90        1681 :     if (a == NULL) {
      91           0 :         if (b) {
      92           0 :             buf = b->data;
      93           0 :             OPENSSL_free(b);
      94             :         }
      95           0 :         strncpy(buf, "NO X509_NAME", len);
      96           0 :         buf[len - 1] = '\0';
      97           0 :         return buf;
      98             :     }
      99             : 
     100             :     len--;                      /* space for '\0' */
     101             :     l = 0;
     102        7969 :     for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) {
     103        7969 :         ne = sk_X509_NAME_ENTRY_value(a->entries, i);
     104        7969 :         n = OBJ_obj2nid(ne->object);
     105        7969 :         if ((n == NID_undef) || ((s = OBJ_nid2sn(n)) == NULL)) {
     106           0 :             i2t_ASN1_OBJECT(tmp_buf, sizeof(tmp_buf), ne->object);
     107             :             s = tmp_buf;
     108             :         }
     109        7969 :         l1 = strlen(s);
     110             : 
     111        7969 :         type = ne->value->type;
     112        7969 :         num = ne->value->length;
     113        7969 :         q = ne->value->data;
     114             : #ifdef CHARSET_EBCDIC
     115             :         if (type == V_ASN1_GENERALSTRING ||
     116             :             type == V_ASN1_VISIBLESTRING ||
     117             :             type == V_ASN1_PRINTABLESTRING ||
     118             :             type == V_ASN1_TELETEXSTRING ||
     119             :             type == V_ASN1_VISIBLESTRING || type == V_ASN1_IA5STRING) {
     120             :             ascii2ebcdic(ebcdic_buf, q, (num > sizeof ebcdic_buf)
     121             :                          ? sizeof ebcdic_buf : num);
     122             :             q = ebcdic_buf;
     123             :         }
     124             : #endif
     125             : 
     126        7969 :         if ((type == V_ASN1_GENERALSTRING) && ((num % 4) == 0)) {
     127           0 :             gs_doit[0] = gs_doit[1] = gs_doit[2] = gs_doit[3] = 0;
     128           0 :             for (j = 0; j < num; j++)
     129           0 :                 if (q[j] != 0)
     130           0 :                     gs_doit[j & 3] = 1;
     131             : 
     132           0 :             if (gs_doit[0] | gs_doit[1] | gs_doit[2])
     133           0 :                 gs_doit[0] = gs_doit[1] = gs_doit[2] = gs_doit[3] = 1;
     134             :             else {
     135           0 :                 gs_doit[0] = gs_doit[1] = gs_doit[2] = 0;
     136           0 :                 gs_doit[3] = 1;
     137             :             }
     138             :         } else
     139        7969 :             gs_doit[0] = gs_doit[1] = gs_doit[2] = gs_doit[3] = 1;
     140             : 
     141       82303 :         for (l2 = j = 0; j < num; j++) {
     142       74334 :             if (!gs_doit[j & 3])
     143           0 :                 continue;
     144       74334 :             l2++;
     145             : #ifndef CHARSET_EBCDIC
     146       74334 :             if ((q[j] < ' ') || (q[j] > '~'))
     147           0 :                 l2 += 3;
     148             : #else
     149             :             if ((os_toascii[q[j]] < os_toascii[' ']) ||
     150             :                 (os_toascii[q[j]] > os_toascii['~']))
     151             :                 l2 += 3;
     152             : #endif
     153             :         }
     154             : 
     155             :         lold = l;
     156        7969 :         l += 1 + l1 + 1 + l2;
     157        7969 :         if (b != NULL) {
     158        7969 :             if (!BUF_MEM_grow(b, l + 1))
     159             :                 goto err;
     160        7969 :             p = &(b->data[lold]);
     161           0 :         } else if (l > len) {
     162             :             break;
     163             :         } else
     164           0 :             p = &(buf[lold]);
     165        7969 :         *(p++) = '/';
     166        7969 :         memcpy(p, s, (unsigned int)l1);
     167        7969 :         p += l1;
     168        7969 :         *(p++) = '=';
     169             : 
     170             : #ifndef CHARSET_EBCDIC          /* q was assigned above already. */
     171        7969 :         q = ne->value->data;
     172             : #endif
     173             : 
     174       82303 :         for (j = 0; j < num; j++) {
     175       74334 :             if (!gs_doit[j & 3])
     176           0 :                 continue;
     177             : #ifndef CHARSET_EBCDIC
     178       74334 :             n = q[j];
     179       74334 :             if ((n < ' ') || (n > '~')) {
     180           0 :                 *(p++) = '\\';
     181           0 :                 *(p++) = 'x';
     182           0 :                 *(p++) = hex[(n >> 4) & 0x0f];
     183           0 :                 *(p++) = hex[n & 0x0f];
     184             :             } else
     185       74334 :                 *(p++) = n;
     186             : #else
     187             :             n = os_toascii[q[j]];
     188             :             if ((n < os_toascii[' ']) || (n > os_toascii['~'])) {
     189             :                 *(p++) = '\\';
     190             :                 *(p++) = 'x';
     191             :                 *(p++) = hex[(n >> 4) & 0x0f];
     192             :                 *(p++) = hex[n & 0x0f];
     193             :             } else
     194             :                 *(p++) = q[j];
     195             : #endif
     196             :         }
     197        7969 :         *p = '\0';
     198             :     }
     199        1681 :     if (b != NULL) {
     200        1681 :         p = b->data;
     201        1681 :         OPENSSL_free(b);
     202             :     } else
     203             :         p = buf;
     204        1681 :     if (i == 0)
     205           0 :         *p = '\0';
     206        1681 :     return (p);
     207             :  err:
     208           0 :     X509err(X509_F_X509_NAME_ONELINE, ERR_R_MALLOC_FAILURE);
     209           0 :     if (b != NULL)
     210           0 :         BUF_MEM_free(b);
     211             :     return (NULL);
     212             : }

Generated by: LCOV version 1.10