LCOV - code coverage report
Current view: top level - pkcs12 - p12_crt.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 0 118 0.0 %
Date: 2014-08-02 Functions: 0 7 0.0 %
Branches: 0 130 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* p12_crt.c */
       2                 :            : /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
       3                 :            :  * project.
       4                 :            :  */
       5                 :            : /* ====================================================================
       6                 :            :  * Copyright (c) 1999-2002 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 "cryptlib.h"
      61                 :            : #include <openssl/pkcs12.h>
      62                 :            : 
      63                 :            : 
      64                 :            : static int pkcs12_add_bag(STACK_OF(PKCS12_SAFEBAG) **pbags, PKCS12_SAFEBAG *bag);
      65                 :            : 
      66                 :          0 : static int copy_bag_attr(PKCS12_SAFEBAG *bag, EVP_PKEY *pkey, int nid)
      67                 :            :         {
      68                 :            :         int idx;
      69                 :            :         X509_ATTRIBUTE *attr;
      70                 :          0 :         idx = EVP_PKEY_get_attr_by_NID(pkey, nid, -1);
      71         [ #  # ]:          0 :         if (idx < 0)
      72                 :            :                 return 1;
      73                 :          0 :         attr = EVP_PKEY_get_attr(pkey, idx);
      74         [ #  # ]:          0 :         if (!X509at_add1_attr(&bag->attrib, attr))
      75                 :            :                 return 0;
      76                 :          0 :         return 1;
      77                 :            :         }
      78                 :            : 
      79                 :          0 : PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
      80                 :            :              STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, int mac_iter,
      81                 :            :              int keytype)
      82                 :            : {
      83                 :          0 :         PKCS12 *p12 = NULL;
      84                 :          0 :         STACK_OF(PKCS7) *safes = NULL;
      85                 :          0 :         STACK_OF(PKCS12_SAFEBAG) *bags = NULL;
      86                 :          0 :         PKCS12_SAFEBAG *bag = NULL;
      87                 :            :         int i;
      88                 :            :         unsigned char keyid[EVP_MAX_MD_SIZE];
      89                 :          0 :         unsigned int keyidlen = 0;
      90                 :            : 
      91                 :            :         /* Set defaults */
      92         [ #  # ]:          0 :         if (!nid_cert)
      93                 :            : #ifdef OPENSSL_NO_RC2
      94                 :            :                 nid_cert = NID_pbe_WithSHA1And3_Key_TripleDES_CBC;
      95                 :            : #else
      96                 :          0 :                 nid_cert = NID_pbe_WithSHA1And40BitRC2_CBC;
      97                 :            : #endif
      98         [ #  # ]:          0 :         if (!nid_key)
      99                 :          0 :                 nid_key = NID_pbe_WithSHA1And3_Key_TripleDES_CBC;
     100         [ #  # ]:          0 :         if (!iter)
     101                 :          0 :                 iter = PKCS12_DEFAULT_ITER;
     102         [ #  # ]:          0 :         if (!mac_iter)
     103                 :          0 :                 mac_iter = 1;
     104                 :            : 
     105 [ #  # ][ #  # ]:          0 :         if(!pkey && !cert && !ca)
     106                 :            :                 {
     107                 :          0 :                 PKCS12err(PKCS12_F_PKCS12_CREATE,PKCS12_R_INVALID_NULL_ARGUMENT);
     108                 :          0 :                 return NULL;
     109                 :            :                 }
     110                 :            : 
     111         [ #  # ]:          0 :         if (pkey && cert)
     112                 :            :                 {
     113         [ #  # ]:          0 :                 if(!X509_check_private_key(cert, pkey))
     114                 :            :                         return NULL;
     115                 :          0 :                 X509_digest(cert, EVP_sha1(), keyid, &keyidlen);
     116                 :            :                 }
     117                 :            : 
     118         [ #  # ]:          0 :         if (cert)
     119                 :            :                 {
     120                 :          0 :                 bag = PKCS12_add_cert(&bags, cert);
     121 [ #  # ][ #  # ]:          0 :                 if(name && !PKCS12_add_friendlyname(bag, name, -1))
     122                 :            :                         goto err;
     123 [ #  # ][ #  # ]:          0 :                 if(keyidlen && !PKCS12_add_localkeyid(bag, keyid, keyidlen))
     124                 :            :                         goto err;
     125                 :            :                 }
     126                 :            : 
     127                 :            :         /* Add all other certificates */
     128         [ #  # ]:          0 :         for(i = 0; i < sk_X509_num(ca); i++)
     129                 :            :                 {
     130         [ #  # ]:          0 :                 if (!PKCS12_add_cert(&bags, sk_X509_value(ca, i)))
     131                 :            :                         goto err;
     132                 :            :                 }
     133                 :            : 
     134 [ #  # ][ #  # ]:          0 :         if (bags && !PKCS12_add_safe(&safes, bags, nid_cert, iter, pass))
     135                 :            :                         goto err;
     136                 :            : 
     137                 :          0 :         sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free);
     138                 :          0 :         bags = NULL;
     139                 :            : 
     140         [ #  # ]:          0 :         if (pkey)
     141                 :            :                 {
     142                 :          0 :                 bag = PKCS12_add_key(&bags, pkey, keytype, iter, nid_key, pass);
     143                 :            : 
     144         [ #  # ]:          0 :                 if (!bag)
     145                 :            :                         goto err;
     146                 :            : 
     147         [ #  # ]:          0 :                 if (!copy_bag_attr(bag, pkey, NID_ms_csp_name))
     148                 :            :                         goto err;
     149         [ #  # ]:          0 :                 if (!copy_bag_attr(bag, pkey, NID_LocalKeySet))
     150                 :            :                         goto err;
     151                 :            : 
     152 [ #  # ][ #  # ]:          0 :                 if(name && !PKCS12_add_friendlyname(bag, name, -1))
     153                 :            :                         goto err;
     154 [ #  # ][ #  # ]:          0 :                 if(keyidlen && !PKCS12_add_localkeyid(bag, keyid, keyidlen))
     155                 :            :                         goto err;
     156                 :            :                 }
     157                 :            : 
     158 [ #  # ][ #  # ]:          0 :         if (bags && !PKCS12_add_safe(&safes, bags, -1, 0, NULL))
     159                 :            :                         goto err;
     160                 :            : 
     161                 :          0 :         sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free);
     162                 :          0 :         bags = NULL;
     163                 :            : 
     164                 :          0 :         p12 = PKCS12_add_safes(safes, 0);
     165                 :            : 
     166         [ #  # ]:          0 :         if (!p12)
     167                 :            :                 goto err;
     168                 :            : 
     169                 :          0 :         sk_PKCS7_pop_free(safes, PKCS7_free);
     170                 :            : 
     171                 :          0 :         safes = NULL;
     172                 :            : 
     173   [ #  #  #  # ]:          0 :         if ((mac_iter != -1) &&
     174                 :          0 :                 !PKCS12_set_mac(p12, pass, -1, NULL, 0, mac_iter, NULL))
     175                 :            :             goto err;
     176                 :            : 
     177                 :          0 :         return p12;
     178                 :            : 
     179                 :            :         err:
     180                 :            : 
     181         [ #  # ]:          0 :         if (p12)
     182                 :          0 :                 PKCS12_free(p12);
     183         [ #  # ]:          0 :         if (safes)
     184                 :          0 :                 sk_PKCS7_pop_free(safes, PKCS7_free);
     185         [ #  # ]:          0 :         if (bags)
     186                 :          0 :                 sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free);
     187                 :            :         return NULL;
     188                 :            : 
     189                 :            : }
     190                 :            : 
     191                 :          0 : PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert)
     192                 :            :         {
     193                 :          0 :         PKCS12_SAFEBAG *bag = NULL;
     194                 :            :         char *name;
     195                 :          0 :         int namelen = -1;
     196                 :            :         unsigned char *keyid;
     197                 :          0 :         int keyidlen = -1;
     198                 :            : 
     199                 :            :         /* Add user certificate */
     200         [ #  # ]:          0 :         if(!(bag = PKCS12_x5092certbag(cert)))
     201                 :            :                 goto err;
     202                 :            : 
     203                 :            :         /* Use friendlyName and localKeyID in certificate.
     204                 :            :          * (if present)
     205                 :            :          */
     206                 :            : 
     207                 :          0 :         name = (char *)X509_alias_get0(cert, &namelen);
     208                 :            : 
     209 [ #  # ][ #  # ]:          0 :         if(name && !PKCS12_add_friendlyname(bag, name, namelen))
     210                 :            :                 goto err;
     211                 :            : 
     212                 :          0 :         keyid = X509_keyid_get0(cert, &keyidlen);
     213                 :            : 
     214 [ #  # ][ #  # ]:          0 :         if(keyid && !PKCS12_add_localkeyid(bag, keyid, keyidlen))
     215                 :            :                 goto err;
     216                 :            : 
     217         [ #  # ]:          0 :         if (!pkcs12_add_bag(pbags, bag))
     218                 :            :                 goto err;
     219                 :            : 
     220                 :            :         return bag;
     221                 :            : 
     222                 :            :         err:
     223                 :            : 
     224         [ #  # ]:          0 :         if (bag)
     225                 :          0 :                 PKCS12_SAFEBAG_free(bag);
     226                 :            : 
     227                 :            :         return NULL;
     228                 :            : 
     229                 :            :         }
     230                 :            : 
     231                 :          0 : PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, EVP_PKEY *key,
     232                 :            :                                                 int key_usage, int iter,
     233                 :            :                                                 int nid_key, char *pass)
     234                 :            :         {
     235                 :            : 
     236                 :          0 :         PKCS12_SAFEBAG *bag = NULL;
     237                 :          0 :         PKCS8_PRIV_KEY_INFO *p8 = NULL;
     238                 :            : 
     239                 :            :         /* Make a PKCS#8 structure */
     240         [ #  # ]:          0 :         if(!(p8 = EVP_PKEY2PKCS8(key)))
     241                 :            :                 goto err;
     242 [ #  # ][ #  # ]:          0 :         if(key_usage && !PKCS8_add_keyusage(p8, key_usage))
     243                 :            :                 goto err;
     244         [ #  # ]:          0 :         if (nid_key != -1)
     245                 :            :                 {
     246                 :          0 :                 bag = PKCS12_MAKE_SHKEYBAG(nid_key, pass, -1, NULL, 0, iter, p8);
     247                 :          0 :                 PKCS8_PRIV_KEY_INFO_free(p8);
     248                 :            :                 }
     249                 :            :         else
     250                 :          0 :                 bag = PKCS12_MAKE_KEYBAG(p8);
     251                 :            : 
     252         [ #  # ]:          0 :         if(!bag)
     253                 :            :                 goto err;
     254                 :            : 
     255         [ #  # ]:          0 :         if (!pkcs12_add_bag(pbags, bag))
     256                 :            :                 goto err;
     257                 :            : 
     258                 :            :         return bag;
     259                 :            : 
     260                 :            :         err:
     261                 :            : 
     262         [ #  # ]:          0 :         if (bag)
     263                 :          0 :                 PKCS12_SAFEBAG_free(bag);
     264                 :            : 
     265                 :            :         return NULL;
     266                 :            : 
     267                 :            :         }
     268                 :            : 
     269                 :          0 : int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags,
     270                 :            :                                                 int nid_safe, int iter, char *pass)
     271                 :            :         {
     272                 :          0 :         PKCS7 *p7 = NULL;
     273                 :          0 :         int free_safes = 0;
     274                 :            : 
     275         [ #  # ]:          0 :         if (!*psafes)
     276                 :            :                 {
     277                 :          0 :                 *psafes = sk_PKCS7_new_null();
     278         [ #  # ]:          0 :                 if (!*psafes)
     279                 :            :                         return 0;
     280                 :            :                 free_safes = 1;
     281                 :            :                 }
     282                 :            :         else
     283                 :            :                 free_safes = 0;
     284                 :            : 
     285         [ #  # ]:          0 :         if (nid_safe == 0)
     286                 :            : #ifdef OPENSSL_NO_RC2
     287                 :            :                 nid_safe = NID_pbe_WithSHA1And3_Key_TripleDES_CBC;
     288                 :            : #else
     289                 :          0 :                 nid_safe = NID_pbe_WithSHA1And40BitRC2_CBC;
     290                 :            : #endif
     291                 :            : 
     292         [ #  # ]:          0 :         if (nid_safe == -1)
     293                 :          0 :                 p7 = PKCS12_pack_p7data(bags);
     294                 :            :         else
     295                 :          0 :                 p7 = PKCS12_pack_p7encdata(nid_safe, pass, -1, NULL, 0,
     296                 :            :                                           iter, bags);
     297         [ #  # ]:          0 :         if (!p7)
     298                 :            :                 goto err;
     299                 :            : 
     300         [ #  # ]:          0 :         if (!sk_PKCS7_push(*psafes, p7))
     301                 :            :                 goto err;
     302                 :            : 
     303                 :            :         return 1;
     304                 :            : 
     305                 :            :         err:
     306         [ #  # ]:          0 :         if (free_safes)
     307                 :            :                 {
     308                 :          0 :                 sk_PKCS7_free(*psafes);
     309                 :          0 :                 *psafes = NULL;
     310                 :            :                 }
     311                 :            : 
     312         [ #  # ]:          0 :         if (p7)
     313                 :          0 :                 PKCS7_free(p7);
     314                 :            : 
     315                 :            :         return 0;
     316                 :            : 
     317                 :            :         }
     318                 :            : 
     319                 :          0 : static int pkcs12_add_bag(STACK_OF(PKCS12_SAFEBAG) **pbags, PKCS12_SAFEBAG *bag)
     320                 :            :         {
     321                 :            :         int free_bags;
     322         [ #  # ]:          0 :         if (!pbags)
     323                 :            :                 return 1;
     324         [ #  # ]:          0 :         if (!*pbags)
     325                 :            :                 {
     326                 :          0 :                 *pbags = sk_PKCS12_SAFEBAG_new_null();
     327         [ #  # ]:          0 :                 if (!*pbags)
     328                 :            :                         return 0;
     329                 :            :                 free_bags = 1;
     330                 :            :                 }
     331                 :            :         else 
     332                 :            :                 free_bags = 0;
     333                 :            : 
     334         [ #  # ]:          0 :         if (!sk_PKCS12_SAFEBAG_push(*pbags, bag))
     335                 :            :                 {
     336         [ #  # ]:          0 :                 if (free_bags)
     337                 :            :                         {
     338                 :          0 :                         sk_PKCS12_SAFEBAG_free(*pbags);
     339                 :          0 :                         *pbags = NULL;
     340                 :            :                         }
     341                 :            :                 return 0;
     342                 :            :                 }
     343                 :            : 
     344                 :            :         return 1;
     345                 :            : 
     346                 :            :         }
     347                 :            :                 
     348                 :            : 
     349                 :          0 : PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int nid_p7)
     350                 :            :         {
     351                 :            :         PKCS12 *p12;
     352         [ #  # ]:          0 :         if (nid_p7 <= 0)
     353                 :          0 :                 nid_p7 = NID_pkcs7_data;
     354                 :          0 :         p12 = PKCS12_init(nid_p7);
     355                 :            : 
     356         [ #  # ]:          0 :         if (!p12)
     357                 :            :                 return NULL;
     358                 :            : 
     359         [ #  # ]:          0 :         if(!PKCS12_pack_authsafes(p12, safes))
     360                 :            :                 {
     361                 :          0 :                 PKCS12_free(p12);
     362                 :          0 :                 return NULL;
     363                 :            :                 }
     364                 :            : 
     365                 :            :         return p12;
     366                 :            : 
     367                 :            :         }

Generated by: LCOV version 1.9