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 +};