security/nss/lib/pkcs12/p12tmpl.c

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 #include "plarena.h"
     6 #include "secitem.h"
     7 #include "secoid.h"
     8 #include "seccomon.h"
     9 #include "secport.h"
    10 #include "cert.h"
    11 #include "secpkcs7.h"
    12 #include "secasn1.h"
    13 #include "p12t.h"
    15 SEC_ASN1_MKSUB(SEC_AnyTemplate)
    16 SEC_ASN1_MKSUB(sgn_DigestInfoTemplate)
    18 static const SEC_ASN1Template *
    19 sec_pkcs12_choose_safe_bag_type(void *src_or_dest, PRBool encoding)
    20 {
    21     const SEC_ASN1Template *theTemplate;
    22     sec_PKCS12SafeBag *safeBag;
    23     SECOidData *oiddata;
    25     if (src_or_dest == NULL) {
    26 	return NULL;
    27     }
    29     safeBag = (sec_PKCS12SafeBag*)src_or_dest;
    31     oiddata = SECOID_FindOID(&safeBag->safeBagType);
    32     if(oiddata == NULL) {
    33 	return SEC_ASN1_GET(SEC_AnyTemplate);
    34     }
    36     switch (oiddata->offset) {
    37 	default:
    38 	    theTemplate = SEC_ASN1_GET(SEC_AnyTemplate);
    39 	    break;
    40 	case SEC_OID_PKCS12_V1_KEY_BAG_ID:
    41 	    theTemplate = SEC_ASN1_GET(SECKEY_PointerToPrivateKeyInfoTemplate);
    42 	    break;
    43 	case SEC_OID_PKCS12_V1_CERT_BAG_ID:
    44 	    theTemplate = sec_PKCS12PointerToCertBagTemplate;
    45 	    break;
    46 	case SEC_OID_PKCS12_V1_CRL_BAG_ID:
    47 	    theTemplate = sec_PKCS12PointerToCRLBagTemplate;
    48 	    break;
    49         case SEC_OID_PKCS12_V1_SECRET_BAG_ID:
    50 	    theTemplate = sec_PKCS12PointerToSecretBagTemplate;
    51 	    break;
    52 	case SEC_OID_PKCS12_V1_PKCS8_SHROUDED_KEY_BAG_ID:
    53 	    theTemplate = 
    54 	        SEC_ASN1_GET(SECKEY_PointerToEncryptedPrivateKeyInfoTemplate);
    55 	    break;
    56 	case SEC_OID_PKCS12_V1_SAFE_CONTENTS_BAG_ID:
    57 	    if(encoding) {
    58 		theTemplate = sec_PKCS12PointerToSafeContentsTemplate;
    59 	    } else {
    60 		theTemplate = SEC_ASN1_GET(SEC_PointerToAnyTemplate);
    61 	    }
    62 	    break;
    63     }
    64     return theTemplate;
    65 }
    67 static const SEC_ASN1Template *
    68 sec_pkcs12_choose_crl_bag_type(void *src_or_dest, PRBool encoding)
    69 {
    70     const SEC_ASN1Template *theTemplate;
    71     sec_PKCS12CRLBag *crlbag;
    72     SECOidData *oiddata;
    74     if (src_or_dest == NULL) {
    75 	return NULL;
    76     }
    78     crlbag = (sec_PKCS12CRLBag*)src_or_dest;
    80     oiddata = SECOID_FindOID(&crlbag->bagID);
    81     if(oiddata == NULL) {
    82 	return SEC_ASN1_GET(SEC_AnyTemplate);
    83     }
    85     switch (oiddata->offset) {
    86 	default:
    87 	    theTemplate = SEC_ASN1_GET(SEC_AnyTemplate);
    88 	    break;
    89 	case SEC_OID_PKCS9_X509_CRL:
    90 	    theTemplate = SEC_ASN1_GET(SEC_OctetStringTemplate);
    91 	    break;
    92     }
    93     return theTemplate;
    94 }
    96 static const SEC_ASN1Template *
    97 sec_pkcs12_choose_cert_bag_type(void *src_or_dest, PRBool encoding)
    98 {
    99     const SEC_ASN1Template *theTemplate;
   100     sec_PKCS12CertBag *certbag;
   101     SECOidData *oiddata;
   103     if (src_or_dest == NULL) {
   104 	return NULL;
   105     }
   107     certbag = (sec_PKCS12CertBag*)src_or_dest;
   109     oiddata = SECOID_FindOID(&certbag->bagID);
   110     if(oiddata == NULL) {
   111 	return SEC_ASN1_GET(SEC_AnyTemplate);
   112     }
   114     switch (oiddata->offset) {
   115 	default:
   116 	    theTemplate = SEC_ASN1_GET(SEC_AnyTemplate);
   117 	    break;
   118 	case SEC_OID_PKCS9_X509_CERT:
   119 	    theTemplate = SEC_ASN1_GET(SEC_OctetStringTemplate);
   120 	    break;
   121 	case SEC_OID_PKCS9_SDSI_CERT:
   122 	    theTemplate = SEC_ASN1_GET(SEC_IA5StringTemplate);
   123 	    break;
   124     }
   125     return theTemplate;
   126 }
   128 static const SEC_ASN1Template *
   129 sec_pkcs12_choose_attr_type(void *src_or_dest, PRBool encoding)
   130 {
   131     const SEC_ASN1Template *theTemplate;
   132     sec_PKCS12Attribute *attr;
   133     SECOidData *oiddata;
   135     if (src_or_dest == NULL) {
   136 	return NULL;
   137     }
   139     attr = (sec_PKCS12Attribute*)src_or_dest;
   141     oiddata = SECOID_FindOID(&attr->attrType);
   142     if(oiddata == NULL) {
   143 	return SEC_ASN1_GET(SEC_AnyTemplate);
   144     }
   146     switch (oiddata->offset) {
   147 	default:
   148 	    theTemplate = SEC_ASN1_GET(SEC_AnyTemplate);
   149 	    break;
   150 	case SEC_OID_PKCS9_FRIENDLY_NAME:
   151 	    theTemplate = SEC_ASN1_GET(SEC_BMPStringTemplate);
   152 	    break;
   153 	case SEC_OID_PKCS9_LOCAL_KEY_ID:
   154 	    theTemplate = SEC_ASN1_GET(SEC_OctetStringTemplate);
   155 	    break;
   156 	case SEC_OID_PKCS12_KEY_USAGE:
   157 	    theTemplate = SEC_ASN1_GET(SEC_BitStringTemplate);
   158 	    break;
   159     }
   161     return theTemplate;
   162 }
   165 const SEC_ASN1Template sec_PKCS12PointerToContentInfoTemplate[] = {
   166     { SEC_ASN1_POINTER | SEC_ASN1_MAY_STREAM, 0, sec_PKCS7ContentInfoTemplate }
   167 };
   169 static const SEC_ASN1TemplateChooserPtr sec_pkcs12_crl_bag_chooser =
   170     sec_pkcs12_choose_crl_bag_type;
   172 static const SEC_ASN1TemplateChooserPtr sec_pkcs12_cert_bag_chooser =
   173     sec_pkcs12_choose_cert_bag_type;
   175 static const SEC_ASN1TemplateChooserPtr sec_pkcs12_safe_bag_chooser =
   176     sec_pkcs12_choose_safe_bag_type;
   178 static const SEC_ASN1TemplateChooserPtr sec_pkcs12_attr_chooser =
   179     sec_pkcs12_choose_attr_type;
   181 const SEC_ASN1Template sec_PKCS12PointerToCertBagTemplate[] = {
   182     { SEC_ASN1_POINTER, 0, sec_PKCS12CertBagTemplate }
   183 };
   185 const SEC_ASN1Template sec_PKCS12PointerToCRLBagTemplate[] = {
   186     { SEC_ASN1_POINTER, 0, sec_PKCS12CRLBagTemplate }
   187 };
   189 const SEC_ASN1Template sec_PKCS12PointerToSecretBagTemplate[] = {
   190     { SEC_ASN1_POINTER, 0, sec_PKCS12SecretBagTemplate }
   191 };
   193 const SEC_ASN1Template sec_PKCS12PointerToSafeContentsTemplate[] = {
   194     { SEC_ASN1_POINTER, 0, sec_PKCS12SafeContentsTemplate }
   195 };
   197 const SEC_ASN1Template sec_PKCS12PFXItemTemplate[] = {
   198     { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM, 0, NULL, 
   199 	sizeof(sec_PKCS12PFXItem) },
   200     { SEC_ASN1_OPTIONAL | SEC_ASN1_INTEGER, 
   201 	offsetof(sec_PKCS12PFXItem, version) },
   202     { SEC_ASN1_ANY | SEC_ASN1_MAY_STREAM, 
   203 	offsetof(sec_PKCS12PFXItem, encodedAuthSafe) },
   204     { SEC_ASN1_ANY | SEC_ASN1_MAY_STREAM,
   205 	offsetof(sec_PKCS12PFXItem, encodedMacData) },
   206     { 0 }
   207 };
   209 const SEC_ASN1Template sec_PKCS12MacDataTemplate[] = {
   210     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12MacData) },
   211     { SEC_ASN1_INLINE | SEC_ASN1_XTRN , offsetof(sec_PKCS12MacData, safeMac),
   212 	SEC_ASN1_SUB(sgn_DigestInfoTemplate) },
   213     { SEC_ASN1_OCTET_STRING, offsetof(sec_PKCS12MacData, macSalt) },
   214     { SEC_ASN1_OPTIONAL | SEC_ASN1_INTEGER, offsetof(sec_PKCS12MacData, iter) },
   215     { 0 }
   216 };
   218 const SEC_ASN1Template sec_PKCS12AuthenticatedSafeTemplate[] = {
   219     { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM | SEC_ASN1_XTRN , 
   220 	offsetof(sec_PKCS12AuthenticatedSafe, encodedSafes), 
   221 	SEC_ASN1_SUB(SEC_AnyTemplate) }
   222 };
   224 const SEC_ASN1Template sec_PKCS12SafeBagTemplate[] = {
   225     { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM, 0, NULL, 
   226 	sizeof(sec_PKCS12SafeBag) },
   227     { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12SafeBag, safeBagType) },
   228     { SEC_ASN1_EXPLICIT | SEC_ASN1_DYNAMIC | SEC_ASN1_CONSTRUCTED |
   229 	SEC_ASN1_MAY_STREAM | SEC_ASN1_CONTEXT_SPECIFIC | 0, 
   230 	offsetof(sec_PKCS12SafeBag, safeBagContent), 
   231 	&sec_pkcs12_safe_bag_chooser },
   232     { SEC_ASN1_SET_OF | SEC_ASN1_OPTIONAL, offsetof(sec_PKCS12SafeBag, attribs),
   233 	sec_PKCS12AttributeTemplate },
   234     { 0 }
   235 };
   237 const SEC_ASN1Template sec_PKCS12SafeContentsTemplate[] = {
   238     { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM, 
   239 	offsetof(sec_PKCS12SafeContents, safeBags),
   240 	sec_PKCS12SafeBagTemplate }
   241 };
   243 const SEC_ASN1Template sec_PKCS12SequenceOfAnyTemplate[] = {
   244     { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM | SEC_ASN1_XTRN , 0,
   245 	SEC_ASN1_SUB(SEC_AnyTemplate) }
   246 };
   248 const SEC_ASN1Template sec_PKCS12NestedSafeContentsDecodeTemplate[] = {
   249     { SEC_ASN1_EXPLICIT | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | 0,
   250 	offsetof(sec_PKCS12SafeContents, encodedSafeBags),
   251 	sec_PKCS12SequenceOfAnyTemplate }
   252 };
   254 const SEC_ASN1Template sec_PKCS12SafeContentsDecodeTemplate[] = {
   255     { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM | SEC_ASN1_XTRN , 
   256 	offsetof(sec_PKCS12SafeContents, encodedSafeBags),
   257 	SEC_ASN1_SUB(SEC_AnyTemplate) }
   258 };
   260 const SEC_ASN1Template sec_PKCS12CRLBagTemplate[] = {
   261     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12CRLBag) },
   262     { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12CRLBag, bagID) },
   263     { SEC_ASN1_DYNAMIC | SEC_ASN1_POINTER, 
   264 	offsetof(sec_PKCS12CRLBag, value), &sec_pkcs12_crl_bag_chooser },
   265     { 0 }
   266 };
   268 const SEC_ASN1Template sec_PKCS12CertBagTemplate[] = {
   269     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12CertBag) },
   270     { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12CertBag, bagID) },
   271     { SEC_ASN1_DYNAMIC | SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED |
   272 	SEC_ASN1_CONTEXT_SPECIFIC | 0,
   273 	offsetof(sec_PKCS12CertBag, value), &sec_pkcs12_cert_bag_chooser },
   274     { 0 }
   275 };
   277 const SEC_ASN1Template sec_PKCS12SecretBagTemplate[] = {
   278     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12SecretBag) },
   279     { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12SecretBag, secretType) },
   280     { SEC_ASN1_ANY, offsetof(sec_PKCS12SecretBag, secretContent) },
   281     { 0 }
   282 };
   284 const SEC_ASN1Template sec_PKCS12AttributeTemplate[] = {
   285     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12Attribute) },
   286     { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12Attribute, attrType) },
   287     { SEC_ASN1_SET_OF | SEC_ASN1_DYNAMIC, 
   288 	offsetof(sec_PKCS12Attribute, attrValue),
   289 	&sec_pkcs12_attr_chooser },
   290     { 0 }
   291 };

mercurial