LCOV - code coverage report
Current view: top level - asn1 - a_strnid.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 27 82 32.9 %
Date: 2014-08-02 Functions: 7 13 53.8 %
Branches: 11 54 20.4 %

           Branch data     Line data    Source code
       1                 :            : /* a_strnid.c */
       2                 :            : /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
       3                 :            :  * project 1999.
       4                 :            :  */
       5                 :            : /* ====================================================================
       6                 :            :  * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
       7                 :            :  *
       8                 :            :  * Redistribution and use in source and binary forms, with or without
       9                 :            :  * modification, are permitted provided that the following conditions
      10                 :            :  * are met:
      11                 :            :  *
      12                 :            :  * 1. Redistributions of source code must retain the above copyright
      13                 :            :  *    notice, this list of conditions and the following disclaimer. 
      14                 :            :  *
      15                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      16                 :            :  *    notice, this list of conditions and the following disclaimer in
      17                 :            :  *    the documentation and/or other materials provided with the
      18                 :            :  *    distribution.
      19                 :            :  *
      20                 :            :  * 3. All advertising materials mentioning features or use of this
      21                 :            :  *    software must display the following acknowledgment:
      22                 :            :  *    "This product includes software developed by the OpenSSL Project
      23                 :            :  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
      24                 :            :  *
      25                 :            :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      26                 :            :  *    endorse or promote products derived from this software without
      27                 :            :  *    prior written permission. For written permission, please contact
      28                 :            :  *    licensing@OpenSSL.org.
      29                 :            :  *
      30                 :            :  * 5. Products derived from this software may not be called "OpenSSL"
      31                 :            :  *    nor may "OpenSSL" appear in their names without prior written
      32                 :            :  *    permission of the OpenSSL Project.
      33                 :            :  *
      34                 :            :  * 6. Redistributions of any form whatsoever must retain the following
      35                 :            :  *    acknowledgment:
      36                 :            :  *    "This product includes software developed by the OpenSSL Project
      37                 :            :  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
      38                 :            :  *
      39                 :            :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      40                 :            :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      41                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      42                 :            :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      43                 :            :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      44                 :            :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      45                 :            :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      46                 :            :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      47                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
      48                 :            :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      49                 :            :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
      50                 :            :  * OF THE POSSIBILITY OF SUCH DAMAGE.
      51                 :            :  * ====================================================================
      52                 :            :  *
      53                 :            :  * This product includes cryptographic software written by Eric Young
      54                 :            :  * (eay@cryptsoft.com).  This product includes software written by Tim
      55                 :            :  * Hudson (tjh@cryptsoft.com).
      56                 :            :  *
      57                 :            :  */
      58                 :            : 
      59                 :            : #include <stdio.h>
      60                 :            : #include <ctype.h>
      61                 :            : #include "cryptlib.h"
      62                 :            : #include <openssl/asn1.h>
      63                 :            : #include <openssl/objects.h>
      64                 :            : 
      65                 :            : 
      66                 :            : static STACK_OF(ASN1_STRING_TABLE) *stable = NULL;
      67                 :            : static void st_free(ASN1_STRING_TABLE *tbl);
      68                 :            : static int sk_table_cmp(const ASN1_STRING_TABLE * const *a,
      69                 :            :                         const ASN1_STRING_TABLE * const *b);
      70                 :            : 
      71                 :            : 
      72                 :            : /* This is the global mask for the mbstring functions: this is use to
      73                 :            :  * mask out certain types (such as BMPString and UTF8String) because
      74                 :            :  * certain software (e.g. Netscape) has problems with them.
      75                 :            :  */
      76                 :            : 
      77                 :            : static unsigned long global_mask = B_ASN1_UTF8STRING;
      78                 :            : 
      79                 :         19 : void ASN1_STRING_set_default_mask(unsigned long mask)
      80                 :            : {
      81                 :         19 :         global_mask = mask;
      82                 :         19 : }
      83                 :            : 
      84                 :          0 : unsigned long ASN1_STRING_get_default_mask(void)
      85                 :            : {
      86                 :          0 :         return global_mask;
      87                 :            : }
      88                 :            : 
      89                 :            : /* This function sets the default to various "flavours" of configuration.
      90                 :            :  * based on an ASCII string. Currently this is:
      91                 :            :  * MASK:XXXX : a numerical mask value.
      92                 :            :  * nobmp : Don't use BMPStrings (just Printable, T61).
      93                 :            :  * pkix : PKIX recommendation in RFC2459.
      94                 :            :  * utf8only : only use UTF8Strings (RFC2459 recommendation for 2004).
      95                 :            :  * default:   the default value, Printable, T61, BMP.
      96                 :            :  */
      97                 :            : 
      98                 :         19 : int ASN1_STRING_set_default_mask_asc(const char *p)
      99                 :            : {
     100                 :            :         unsigned long mask;
     101                 :            :         char *end;
     102         [ -  + ]:         19 :         if(!strncmp(p, "MASK:", 5)) {
     103         [ #  # ]:          0 :                 if(!p[5]) return 0;
     104                 :          0 :                 mask = strtoul(p + 5, &end, 0);
     105         [ #  # ]:          0 :                 if(*end) return 0;
     106         [ +  + ]:         19 :         } else if(!strcmp(p, "nombstr"))
     107                 :            :                          mask = ~((unsigned long)(B_ASN1_BMPSTRING|B_ASN1_UTF8STRING));
     108         [ +  - ]:         16 :         else if(!strcmp(p, "pkix"))
     109                 :            :                         mask = ~((unsigned long)B_ASN1_T61STRING);
     110         [ -  + ]:         16 :         else if(!strcmp(p, "utf8only")) mask = B_ASN1_UTF8STRING;
     111         [ #  # ]:          0 :         else if(!strcmp(p, "default"))
     112                 :            :             mask = 0xFFFFFFFFL;
     113                 :            :         else return 0;
     114                 :         19 :         ASN1_STRING_set_default_mask(mask);
     115                 :         19 :         return 1;
     116                 :            : }
     117                 :            : 
     118                 :            : /* The following function generates an ASN1_STRING based on limits in a table.
     119                 :            :  * Frequently the types and length of an ASN1_STRING are restricted by a 
     120                 :            :  * corresponding OID. For example certificates and certificate requests.
     121                 :            :  */
     122                 :            : 
     123                 :        648 : ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, const unsigned char *in,
     124                 :            :                                         int inlen, int inform, int nid)
     125                 :            : {
     126                 :            :         ASN1_STRING_TABLE *tbl;
     127                 :        648 :         ASN1_STRING *str = NULL;
     128                 :            :         unsigned long mask;
     129                 :            :         int ret;
     130         [ -  + ]:        648 :         if(!out) out = &str;
     131                 :        648 :         tbl = ASN1_STRING_TABLE_get(nid);
     132         [ +  - ]:        648 :         if(tbl) {
     133                 :        648 :                 mask = tbl->mask;
     134         [ +  + ]:        648 :                 if(!(tbl->flags & STABLE_NO_MASK)) mask &= global_mask;
     135                 :        648 :                 ret = ASN1_mbstring_ncopy(out, in, inlen, inform, mask,
     136                 :            :                                         tbl->minsize, tbl->maxsize);
     137                 :          0 :         } else ret = ASN1_mbstring_copy(out, in, inlen, inform, DIRSTRING_TYPE & global_mask);
     138         [ +  - ]:        648 :         if(ret <= 0) return NULL;
     139                 :        648 :         return *out;
     140                 :            : }
     141                 :            : 
     142                 :            : /* Now the tables and helper functions for the string table:
     143                 :            :  */
     144                 :            : 
     145                 :            : /* size limits: this stuff is taken straight from RFC3280 */
     146                 :            : 
     147                 :            : #define ub_name                         32768
     148                 :            : #define ub_common_name                  64
     149                 :            : #define ub_locality_name                128
     150                 :            : #define ub_state_name                   128
     151                 :            : #define ub_organization_name            64
     152                 :            : #define ub_organization_unit_name       64
     153                 :            : #define ub_title                        64
     154                 :            : #define ub_email_address                128
     155                 :            : #define ub_serial_number                64
     156                 :            : 
     157                 :            : 
     158                 :            : /* This table must be kept in NID order */
     159                 :            : 
     160                 :            : static const ASN1_STRING_TABLE tbl_standard[] = {
     161                 :            : {NID_commonName,                1, ub_common_name, DIRSTRING_TYPE, 0},
     162                 :            : {NID_countryName,               2, 2, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK},
     163                 :            : {NID_localityName,              1, ub_locality_name, DIRSTRING_TYPE, 0},
     164                 :            : {NID_stateOrProvinceName,       1, ub_state_name, DIRSTRING_TYPE, 0},
     165                 :            : {NID_organizationName,          1, ub_organization_name, DIRSTRING_TYPE, 0},
     166                 :            : {NID_organizationalUnitName,    1, ub_organization_unit_name, DIRSTRING_TYPE, 0},
     167                 :            : {NID_pkcs9_emailAddress,        1, ub_email_address, B_ASN1_IA5STRING, STABLE_NO_MASK},
     168                 :            : {NID_pkcs9_unstructuredName,    1, -1, PKCS9STRING_TYPE, 0},
     169                 :            : {NID_pkcs9_challengePassword,   1, -1, PKCS9STRING_TYPE, 0},
     170                 :            : {NID_pkcs9_unstructuredAddress, 1, -1, DIRSTRING_TYPE, 0},
     171                 :            : {NID_givenName,                 1, ub_name, DIRSTRING_TYPE, 0},
     172                 :            : {NID_surname,                   1, ub_name, DIRSTRING_TYPE, 0},
     173                 :            : {NID_initials,                  1, ub_name, DIRSTRING_TYPE, 0},
     174                 :            : {NID_serialNumber,              1, ub_serial_number, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK},
     175                 :            : {NID_friendlyName,              -1, -1, B_ASN1_BMPSTRING, STABLE_NO_MASK},
     176                 :            : {NID_name,                      1, ub_name, DIRSTRING_TYPE, 0},
     177                 :            : {NID_dnQualifier,               -1, -1, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK},
     178                 :            : {NID_domainComponent,           1, -1, B_ASN1_IA5STRING, STABLE_NO_MASK},
     179                 :            : {NID_ms_csp_name,               -1, -1, B_ASN1_BMPSTRING, STABLE_NO_MASK}
     180                 :            : };
     181                 :            : 
     182                 :          0 : static int sk_table_cmp(const ASN1_STRING_TABLE * const *a,
     183                 :            :                         const ASN1_STRING_TABLE * const *b)
     184                 :            : {
     185                 :          0 :         return (*a)->nid - (*b)->nid;
     186                 :            : }
     187                 :            : 
     188                 :            : DECLARE_OBJ_BSEARCH_CMP_FN(ASN1_STRING_TABLE, ASN1_STRING_TABLE, table);
     189                 :            : 
     190                 :       5772 : static int table_cmp(const ASN1_STRING_TABLE *a, const ASN1_STRING_TABLE *b)
     191                 :            : {
     192                 :       2886 :         return a->nid - b->nid;
     193                 :            : }
     194                 :            : 
     195                 :       7068 : IMPLEMENT_OBJ_BSEARCH_CMP_FN(ASN1_STRING_TABLE, ASN1_STRING_TABLE, table);
     196                 :            : 
     197                 :        648 : ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid)
     198                 :            :         {
     199                 :            :         int idx;
     200                 :            :         ASN1_STRING_TABLE fnd;
     201                 :        648 :         fnd.nid = nid;
     202         [ -  + ]:        648 :         if (stable)
     203                 :            :                 {
     204                 :          0 :                 idx = sk_ASN1_STRING_TABLE_find(stable, &fnd);
     205         [ #  # ]:          0 :                 if (idx >= 0)
     206                 :          0 :                         return sk_ASN1_STRING_TABLE_value(stable, idx);
     207                 :            :                 }
     208                 :        648 :         return OBJ_bsearch_table(&fnd, tbl_standard, 
     209                 :            :                            sizeof(tbl_standard)/sizeof(ASN1_STRING_TABLE));
     210                 :            :         }
     211                 :            : 
     212                 :            : /* Return a string table pointer which can be modified: either directly
     213                 :            :  * from table or a copy of an internal value added to the table.
     214                 :            :  */
     215                 :            : 
     216                 :          0 : static ASN1_STRING_TABLE *stable_get(int nid)
     217                 :            :         {
     218                 :            :         ASN1_STRING_TABLE *tmp, *rv;
     219                 :            :         /* Always need a string table so allocate one if NULL */
     220         [ #  # ]:          0 :         if(!stable)
     221                 :            :                 {
     222                 :          0 :                 stable = sk_ASN1_STRING_TABLE_new(sk_table_cmp);
     223         [ #  # ]:          0 :                 if (!stable)
     224                 :            :                         return NULL;
     225                 :            :                 }
     226                 :          0 :         tmp = ASN1_STRING_TABLE_get(nid);
     227 [ #  # ][ #  # ]:          0 :         if (tmp && tmp->flags & STABLE_FLAGS_MALLOC)
     228                 :            :                 return tmp;
     229                 :          0 :         rv = OPENSSL_malloc(sizeof(ASN1_STRING_TABLE));
     230         [ #  # ]:          0 :         if (!rv)
     231                 :            :                 return NULL;
     232         [ #  # ]:          0 :         if (!sk_ASN1_STRING_TABLE_push(stable, rv))
     233                 :            :                 {
     234                 :          0 :                 OPENSSL_free(rv);
     235                 :          0 :                 return NULL;
     236                 :            :                 }
     237         [ #  # ]:          0 :         if (tmp)
     238                 :            :                 {
     239                 :          0 :                 rv->nid = tmp->nid;
     240                 :          0 :                 rv->minsize = tmp->minsize;
     241                 :          0 :                 rv->maxsize = tmp->maxsize;
     242                 :          0 :                 rv->mask = tmp->mask;
     243                 :          0 :                 rv->flags = tmp->flags | STABLE_FLAGS_MALLOC;
     244                 :            :                 }
     245                 :            :         else
     246                 :            :                 {
     247                 :          0 :                 rv->minsize = -1;
     248                 :          0 :                 rv->maxsize = -1;
     249                 :          0 :                 rv->mask = 0;
     250                 :          0 :                 rv->flags = STABLE_FLAGS_MALLOC;
     251                 :            :                 }
     252                 :          0 :         return rv;
     253                 :            :         }
     254                 :            : 
     255                 :          0 : int ASN1_STRING_TABLE_add(int nid,
     256                 :            :                  long minsize, long maxsize, unsigned long mask,
     257                 :            :                                 unsigned long flags)
     258                 :            :         {
     259                 :            :         ASN1_STRING_TABLE *tmp;
     260                 :          0 :         tmp = stable_get(nid);
     261         [ #  # ]:          0 :         if (!tmp)
     262                 :            :                 {
     263                 :          0 :                 ASN1err(ASN1_F_ASN1_STRING_TABLE_ADD, ERR_R_MALLOC_FAILURE);
     264                 :          0 :                 return 0;
     265                 :            :                 }
     266         [ #  # ]:          0 :         if (minsize >= 0)
     267                 :          0 :                 tmp->minsize = minsize;
     268         [ #  # ]:          0 :         if (maxsize >= 0)
     269                 :          0 :                 tmp->maxsize = maxsize;
     270         [ #  # ]:          0 :         if (mask)
     271                 :          0 :                 tmp->mask = mask;
     272         [ #  # ]:          0 :         if (flags)
     273                 :          0 :                 tmp->flags = STABLE_FLAGS_MALLOC | flags;
     274                 :            :         return 1;
     275                 :            :         }
     276                 :            : 
     277                 :          0 : void ASN1_STRING_TABLE_cleanup(void)
     278                 :            : {
     279                 :            :         STACK_OF(ASN1_STRING_TABLE) *tmp;
     280                 :          0 :         tmp = stable;
     281         [ #  # ]:          0 :         if(!tmp) return;
     282                 :          0 :         stable = NULL;
     283                 :          0 :         sk_ASN1_STRING_TABLE_pop_free(tmp, st_free);
     284                 :            : }
     285                 :            : 
     286                 :          0 : static void st_free(ASN1_STRING_TABLE *tbl)
     287                 :            : {
     288         [ #  # ]:          0 :         if(tbl->flags & STABLE_FLAGS_MALLOC) OPENSSL_free(tbl);
     289                 :          0 : }
     290                 :            : 
     291                 :            : 
     292                 :            : IMPLEMENT_STACK_OF(ASN1_STRING_TABLE)
     293                 :            : 
     294                 :            : #ifdef STRING_TABLE_TEST
     295                 :            : 
     296                 :            : main()
     297                 :            : {
     298                 :            :         ASN1_STRING_TABLE *tmp;
     299                 :            :         int i, last_nid = -1;
     300                 :            : 
     301                 :            :         for (tmp = tbl_standard, i = 0;
     302                 :            :                 i < sizeof(tbl_standard)/sizeof(ASN1_STRING_TABLE); i++, tmp++)
     303                 :            :                 {
     304                 :            :                         if (tmp->nid < last_nid)
     305                 :            :                                 {
     306                 :            :                                 last_nid = 0;
     307                 :            :                                 break;
     308                 :            :                                 }
     309                 :            :                         last_nid = tmp->nid;
     310                 :            :                 }
     311                 :            : 
     312                 :            :         if (last_nid != 0)
     313                 :            :                 {
     314                 :            :                 printf("Table order OK\n");
     315                 :            :                 exit(0);
     316                 :            :                 }
     317                 :            : 
     318                 :            :         for (tmp = tbl_standard, i = 0;
     319                 :            :                 i < sizeof(tbl_standard)/sizeof(ASN1_STRING_TABLE); i++, tmp++)
     320                 :            :                         printf("Index %d, NID %d, Name=%s\n", i, tmp->nid,
     321                 :            :                                                         OBJ_nid2ln(tmp->nid));
     322                 :            : 
     323                 :            : }
     324                 :            : 
     325                 :            : #endif

Generated by: LCOV version 1.9