security/nss/lib/pkcs12/p12tmpl.c

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/security/nss/lib/pkcs12/p12tmpl.c	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,291 @@
     1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.7 +
     1.8 +#include "plarena.h"
     1.9 +#include "secitem.h"
    1.10 +#include "secoid.h"
    1.11 +#include "seccomon.h"
    1.12 +#include "secport.h"
    1.13 +#include "cert.h"
    1.14 +#include "secpkcs7.h"
    1.15 +#include "secasn1.h"
    1.16 +#include "p12t.h"
    1.17 +
    1.18 +SEC_ASN1_MKSUB(SEC_AnyTemplate)
    1.19 +SEC_ASN1_MKSUB(sgn_DigestInfoTemplate)
    1.20 +
    1.21 +static const SEC_ASN1Template *
    1.22 +sec_pkcs12_choose_safe_bag_type(void *src_or_dest, PRBool encoding)
    1.23 +{
    1.24 +    const SEC_ASN1Template *theTemplate;
    1.25 +    sec_PKCS12SafeBag *safeBag;
    1.26 +    SECOidData *oiddata;
    1.27 +
    1.28 +    if (src_or_dest == NULL) {
    1.29 +	return NULL;
    1.30 +    }
    1.31 +
    1.32 +    safeBag = (sec_PKCS12SafeBag*)src_or_dest;
    1.33 +
    1.34 +    oiddata = SECOID_FindOID(&safeBag->safeBagType);
    1.35 +    if(oiddata == NULL) {
    1.36 +	return SEC_ASN1_GET(SEC_AnyTemplate);
    1.37 +    }
    1.38 +
    1.39 +    switch (oiddata->offset) {
    1.40 +	default:
    1.41 +	    theTemplate = SEC_ASN1_GET(SEC_AnyTemplate);
    1.42 +	    break;
    1.43 +	case SEC_OID_PKCS12_V1_KEY_BAG_ID:
    1.44 +	    theTemplate = SEC_ASN1_GET(SECKEY_PointerToPrivateKeyInfoTemplate);
    1.45 +	    break;
    1.46 +	case SEC_OID_PKCS12_V1_CERT_BAG_ID:
    1.47 +	    theTemplate = sec_PKCS12PointerToCertBagTemplate;
    1.48 +	    break;
    1.49 +	case SEC_OID_PKCS12_V1_CRL_BAG_ID:
    1.50 +	    theTemplate = sec_PKCS12PointerToCRLBagTemplate;
    1.51 +	    break;
    1.52 +        case SEC_OID_PKCS12_V1_SECRET_BAG_ID:
    1.53 +	    theTemplate = sec_PKCS12PointerToSecretBagTemplate;
    1.54 +	    break;
    1.55 +	case SEC_OID_PKCS12_V1_PKCS8_SHROUDED_KEY_BAG_ID:
    1.56 +	    theTemplate = 
    1.57 +	        SEC_ASN1_GET(SECKEY_PointerToEncryptedPrivateKeyInfoTemplate);
    1.58 +	    break;
    1.59 +	case SEC_OID_PKCS12_V1_SAFE_CONTENTS_BAG_ID:
    1.60 +	    if(encoding) {
    1.61 +		theTemplate = sec_PKCS12PointerToSafeContentsTemplate;
    1.62 +	    } else {
    1.63 +		theTemplate = SEC_ASN1_GET(SEC_PointerToAnyTemplate);
    1.64 +	    }
    1.65 +	    break;
    1.66 +    }
    1.67 +    return theTemplate;
    1.68 +}
    1.69 +
    1.70 +static const SEC_ASN1Template *
    1.71 +sec_pkcs12_choose_crl_bag_type(void *src_or_dest, PRBool encoding)
    1.72 +{
    1.73 +    const SEC_ASN1Template *theTemplate;
    1.74 +    sec_PKCS12CRLBag *crlbag;
    1.75 +    SECOidData *oiddata;
    1.76 +
    1.77 +    if (src_or_dest == NULL) {
    1.78 +	return NULL;
    1.79 +    }
    1.80 +
    1.81 +    crlbag = (sec_PKCS12CRLBag*)src_or_dest;
    1.82 +
    1.83 +    oiddata = SECOID_FindOID(&crlbag->bagID);
    1.84 +    if(oiddata == NULL) {
    1.85 +	return SEC_ASN1_GET(SEC_AnyTemplate);
    1.86 +    }
    1.87 +
    1.88 +    switch (oiddata->offset) {
    1.89 +	default:
    1.90 +	    theTemplate = SEC_ASN1_GET(SEC_AnyTemplate);
    1.91 +	    break;
    1.92 +	case SEC_OID_PKCS9_X509_CRL:
    1.93 +	    theTemplate = SEC_ASN1_GET(SEC_OctetStringTemplate);
    1.94 +	    break;
    1.95 +    }
    1.96 +    return theTemplate;
    1.97 +}
    1.98 +
    1.99 +static const SEC_ASN1Template *
   1.100 +sec_pkcs12_choose_cert_bag_type(void *src_or_dest, PRBool encoding)
   1.101 +{
   1.102 +    const SEC_ASN1Template *theTemplate;
   1.103 +    sec_PKCS12CertBag *certbag;
   1.104 +    SECOidData *oiddata;
   1.105 +
   1.106 +    if (src_or_dest == NULL) {
   1.107 +	return NULL;
   1.108 +    }
   1.109 +
   1.110 +    certbag = (sec_PKCS12CertBag*)src_or_dest;
   1.111 +
   1.112 +    oiddata = SECOID_FindOID(&certbag->bagID);
   1.113 +    if(oiddata == NULL) {
   1.114 +	return SEC_ASN1_GET(SEC_AnyTemplate);
   1.115 +    }
   1.116 +
   1.117 +    switch (oiddata->offset) {
   1.118 +	default:
   1.119 +	    theTemplate = SEC_ASN1_GET(SEC_AnyTemplate);
   1.120 +	    break;
   1.121 +	case SEC_OID_PKCS9_X509_CERT:
   1.122 +	    theTemplate = SEC_ASN1_GET(SEC_OctetStringTemplate);
   1.123 +	    break;
   1.124 +	case SEC_OID_PKCS9_SDSI_CERT:
   1.125 +	    theTemplate = SEC_ASN1_GET(SEC_IA5StringTemplate);
   1.126 +	    break;
   1.127 +    }
   1.128 +    return theTemplate;
   1.129 +}
   1.130 +
   1.131 +static const SEC_ASN1Template *
   1.132 +sec_pkcs12_choose_attr_type(void *src_or_dest, PRBool encoding)
   1.133 +{
   1.134 +    const SEC_ASN1Template *theTemplate;
   1.135 +    sec_PKCS12Attribute *attr;
   1.136 +    SECOidData *oiddata;
   1.137 +
   1.138 +    if (src_or_dest == NULL) {
   1.139 +	return NULL;
   1.140 +    }
   1.141 +
   1.142 +    attr = (sec_PKCS12Attribute*)src_or_dest;
   1.143 +
   1.144 +    oiddata = SECOID_FindOID(&attr->attrType);
   1.145 +    if(oiddata == NULL) {
   1.146 +	return SEC_ASN1_GET(SEC_AnyTemplate);
   1.147 +    }
   1.148 +
   1.149 +    switch (oiddata->offset) {
   1.150 +	default:
   1.151 +	    theTemplate = SEC_ASN1_GET(SEC_AnyTemplate);
   1.152 +	    break;
   1.153 +	case SEC_OID_PKCS9_FRIENDLY_NAME:
   1.154 +	    theTemplate = SEC_ASN1_GET(SEC_BMPStringTemplate);
   1.155 +	    break;
   1.156 +	case SEC_OID_PKCS9_LOCAL_KEY_ID:
   1.157 +	    theTemplate = SEC_ASN1_GET(SEC_OctetStringTemplate);
   1.158 +	    break;
   1.159 +	case SEC_OID_PKCS12_KEY_USAGE:
   1.160 +	    theTemplate = SEC_ASN1_GET(SEC_BitStringTemplate);
   1.161 +	    break;
   1.162 +    }
   1.163 +
   1.164 +    return theTemplate;
   1.165 +}
   1.166 +
   1.167 +
   1.168 +const SEC_ASN1Template sec_PKCS12PointerToContentInfoTemplate[] = {
   1.169 +    { SEC_ASN1_POINTER | SEC_ASN1_MAY_STREAM, 0, sec_PKCS7ContentInfoTemplate }
   1.170 +};
   1.171 +
   1.172 +static const SEC_ASN1TemplateChooserPtr sec_pkcs12_crl_bag_chooser =
   1.173 +    sec_pkcs12_choose_crl_bag_type;
   1.174 +
   1.175 +static const SEC_ASN1TemplateChooserPtr sec_pkcs12_cert_bag_chooser =
   1.176 +    sec_pkcs12_choose_cert_bag_type;
   1.177 +
   1.178 +static const SEC_ASN1TemplateChooserPtr sec_pkcs12_safe_bag_chooser =
   1.179 +    sec_pkcs12_choose_safe_bag_type;
   1.180 +
   1.181 +static const SEC_ASN1TemplateChooserPtr sec_pkcs12_attr_chooser =
   1.182 +    sec_pkcs12_choose_attr_type;
   1.183 +
   1.184 +const SEC_ASN1Template sec_PKCS12PointerToCertBagTemplate[] = {
   1.185 +    { SEC_ASN1_POINTER, 0, sec_PKCS12CertBagTemplate }
   1.186 +};
   1.187 +
   1.188 +const SEC_ASN1Template sec_PKCS12PointerToCRLBagTemplate[] = {
   1.189 +    { SEC_ASN1_POINTER, 0, sec_PKCS12CRLBagTemplate }
   1.190 +};
   1.191 +
   1.192 +const SEC_ASN1Template sec_PKCS12PointerToSecretBagTemplate[] = {
   1.193 +    { SEC_ASN1_POINTER, 0, sec_PKCS12SecretBagTemplate }
   1.194 +};
   1.195 +
   1.196 +const SEC_ASN1Template sec_PKCS12PointerToSafeContentsTemplate[] = {
   1.197 +    { SEC_ASN1_POINTER, 0, sec_PKCS12SafeContentsTemplate }
   1.198 +};
   1.199 +
   1.200 +const SEC_ASN1Template sec_PKCS12PFXItemTemplate[] = {
   1.201 +    { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM, 0, NULL, 
   1.202 +	sizeof(sec_PKCS12PFXItem) },
   1.203 +    { SEC_ASN1_OPTIONAL | SEC_ASN1_INTEGER, 
   1.204 +	offsetof(sec_PKCS12PFXItem, version) },
   1.205 +    { SEC_ASN1_ANY | SEC_ASN1_MAY_STREAM, 
   1.206 +	offsetof(sec_PKCS12PFXItem, encodedAuthSafe) },
   1.207 +    { SEC_ASN1_ANY | SEC_ASN1_MAY_STREAM,
   1.208 +	offsetof(sec_PKCS12PFXItem, encodedMacData) },
   1.209 +    { 0 }
   1.210 +};
   1.211 +
   1.212 +const SEC_ASN1Template sec_PKCS12MacDataTemplate[] = {
   1.213 +    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12MacData) },
   1.214 +    { SEC_ASN1_INLINE | SEC_ASN1_XTRN , offsetof(sec_PKCS12MacData, safeMac),
   1.215 +	SEC_ASN1_SUB(sgn_DigestInfoTemplate) },
   1.216 +    { SEC_ASN1_OCTET_STRING, offsetof(sec_PKCS12MacData, macSalt) },
   1.217 +    { SEC_ASN1_OPTIONAL | SEC_ASN1_INTEGER, offsetof(sec_PKCS12MacData, iter) },
   1.218 +    { 0 }
   1.219 +};
   1.220 +
   1.221 +const SEC_ASN1Template sec_PKCS12AuthenticatedSafeTemplate[] = {
   1.222 +    { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM | SEC_ASN1_XTRN , 
   1.223 +	offsetof(sec_PKCS12AuthenticatedSafe, encodedSafes), 
   1.224 +	SEC_ASN1_SUB(SEC_AnyTemplate) }
   1.225 +};
   1.226 +
   1.227 +const SEC_ASN1Template sec_PKCS12SafeBagTemplate[] = {
   1.228 +    { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM, 0, NULL, 
   1.229 +	sizeof(sec_PKCS12SafeBag) },
   1.230 +    { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12SafeBag, safeBagType) },
   1.231 +    { SEC_ASN1_EXPLICIT | SEC_ASN1_DYNAMIC | SEC_ASN1_CONSTRUCTED |
   1.232 +	SEC_ASN1_MAY_STREAM | SEC_ASN1_CONTEXT_SPECIFIC | 0, 
   1.233 +	offsetof(sec_PKCS12SafeBag, safeBagContent), 
   1.234 +	&sec_pkcs12_safe_bag_chooser },
   1.235 +    { SEC_ASN1_SET_OF | SEC_ASN1_OPTIONAL, offsetof(sec_PKCS12SafeBag, attribs),
   1.236 +	sec_PKCS12AttributeTemplate },
   1.237 +    { 0 }
   1.238 +};
   1.239 +
   1.240 +const SEC_ASN1Template sec_PKCS12SafeContentsTemplate[] = {
   1.241 +    { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM, 
   1.242 +	offsetof(sec_PKCS12SafeContents, safeBags),
   1.243 +	sec_PKCS12SafeBagTemplate }
   1.244 +};
   1.245 +
   1.246 +const SEC_ASN1Template sec_PKCS12SequenceOfAnyTemplate[] = {
   1.247 +    { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM | SEC_ASN1_XTRN , 0,
   1.248 +	SEC_ASN1_SUB(SEC_AnyTemplate) }
   1.249 +};
   1.250 +
   1.251 +const SEC_ASN1Template sec_PKCS12NestedSafeContentsDecodeTemplate[] = {
   1.252 +    { SEC_ASN1_EXPLICIT | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | 0,
   1.253 +	offsetof(sec_PKCS12SafeContents, encodedSafeBags),
   1.254 +	sec_PKCS12SequenceOfAnyTemplate }
   1.255 +};
   1.256 +
   1.257 +const SEC_ASN1Template sec_PKCS12SafeContentsDecodeTemplate[] = {
   1.258 +    { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM | SEC_ASN1_XTRN , 
   1.259 +	offsetof(sec_PKCS12SafeContents, encodedSafeBags),
   1.260 +	SEC_ASN1_SUB(SEC_AnyTemplate) }
   1.261 +};
   1.262 +
   1.263 +const SEC_ASN1Template sec_PKCS12CRLBagTemplate[] = {
   1.264 +    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12CRLBag) },
   1.265 +    { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12CRLBag, bagID) },
   1.266 +    { SEC_ASN1_DYNAMIC | SEC_ASN1_POINTER, 
   1.267 +	offsetof(sec_PKCS12CRLBag, value), &sec_pkcs12_crl_bag_chooser },
   1.268 +    { 0 }
   1.269 +};
   1.270 +
   1.271 +const SEC_ASN1Template sec_PKCS12CertBagTemplate[] = {
   1.272 +    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12CertBag) },
   1.273 +    { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12CertBag, bagID) },
   1.274 +    { SEC_ASN1_DYNAMIC | SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED |
   1.275 +	SEC_ASN1_CONTEXT_SPECIFIC | 0,
   1.276 +	offsetof(sec_PKCS12CertBag, value), &sec_pkcs12_cert_bag_chooser },
   1.277 +    { 0 }
   1.278 +};
   1.279 +
   1.280 +const SEC_ASN1Template sec_PKCS12SecretBagTemplate[] = {
   1.281 +    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12SecretBag) },
   1.282 +    { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12SecretBag, secretType) },
   1.283 +    { SEC_ASN1_ANY, offsetof(sec_PKCS12SecretBag, secretContent) },
   1.284 +    { 0 }
   1.285 +};
   1.286 +
   1.287 +const SEC_ASN1Template sec_PKCS12AttributeTemplate[] = {
   1.288 +    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12Attribute) },
   1.289 +    { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12Attribute, attrType) },
   1.290 +    { SEC_ASN1_SET_OF | SEC_ASN1_DYNAMIC, 
   1.291 +	offsetof(sec_PKCS12Attribute, attrValue),
   1.292 +	&sec_pkcs12_attr_chooser },
   1.293 +    { 0 }
   1.294 +};

mercurial