| OLD | NEW |
| (Empty) |
| 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/. */ | |
| 4 | |
| 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" | |
| 14 | |
| 15 SEC_ASN1_MKSUB(SEC_AnyTemplate) | |
| 16 SEC_ASN1_MKSUB(sgn_DigestInfoTemplate) | |
| 17 | |
| 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; | |
| 24 | |
| 25 if (src_or_dest == NULL) { | |
| 26 return NULL; | |
| 27 } | |
| 28 | |
| 29 safeBag = (sec_PKCS12SafeBag*)src_or_dest; | |
| 30 | |
| 31 oiddata = SECOID_FindOID(&safeBag->safeBagType); | |
| 32 if(oiddata == NULL) { | |
| 33 return SEC_ASN1_GET(SEC_AnyTemplate); | |
| 34 } | |
| 35 | |
| 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 } | |
| 66 | |
| 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; | |
| 73 | |
| 74 if (src_or_dest == NULL) { | |
| 75 return NULL; | |
| 76 } | |
| 77 | |
| 78 crlbag = (sec_PKCS12CRLBag*)src_or_dest; | |
| 79 | |
| 80 oiddata = SECOID_FindOID(&crlbag->bagID); | |
| 81 if(oiddata == NULL) { | |
| 82 return SEC_ASN1_GET(SEC_AnyTemplate); | |
| 83 } | |
| 84 | |
| 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 } | |
| 95 | |
| 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; | |
| 102 | |
| 103 if (src_or_dest == NULL) { | |
| 104 return NULL; | |
| 105 } | |
| 106 | |
| 107 certbag = (sec_PKCS12CertBag*)src_or_dest; | |
| 108 | |
| 109 oiddata = SECOID_FindOID(&certbag->bagID); | |
| 110 if(oiddata == NULL) { | |
| 111 return SEC_ASN1_GET(SEC_AnyTemplate); | |
| 112 } | |
| 113 | |
| 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 } | |
| 127 | |
| 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; | |
| 134 | |
| 135 if (src_or_dest == NULL) { | |
| 136 return NULL; | |
| 137 } | |
| 138 | |
| 139 attr = (sec_PKCS12Attribute*)src_or_dest; | |
| 140 | |
| 141 oiddata = SECOID_FindOID(&attr->attrType); | |
| 142 if(oiddata == NULL) { | |
| 143 return SEC_ASN1_GET(SEC_AnyTemplate); | |
| 144 } | |
| 145 | |
| 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 } | |
| 160 | |
| 161 return theTemplate; | |
| 162 } | |
| 163 | |
| 164 | |
| 165 const SEC_ASN1Template sec_PKCS12PointerToContentInfoTemplate[] = { | |
| 166 { SEC_ASN1_POINTER | SEC_ASN1_MAY_STREAM, 0, sec_PKCS7ContentInfoTemplate } | |
| 167 }; | |
| 168 | |
| 169 static const SEC_ASN1TemplateChooserPtr sec_pkcs12_crl_bag_chooser = | |
| 170 sec_pkcs12_choose_crl_bag_type; | |
| 171 | |
| 172 static const SEC_ASN1TemplateChooserPtr sec_pkcs12_cert_bag_chooser = | |
| 173 sec_pkcs12_choose_cert_bag_type; | |
| 174 | |
| 175 static const SEC_ASN1TemplateChooserPtr sec_pkcs12_safe_bag_chooser = | |
| 176 sec_pkcs12_choose_safe_bag_type; | |
| 177 | |
| 178 static const SEC_ASN1TemplateChooserPtr sec_pkcs12_attr_chooser = | |
| 179 sec_pkcs12_choose_attr_type; | |
| 180 | |
| 181 const SEC_ASN1Template sec_PKCS12PointerToCertBagTemplate[] = { | |
| 182 { SEC_ASN1_POINTER, 0, sec_PKCS12CertBagTemplate } | |
| 183 }; | |
| 184 | |
| 185 const SEC_ASN1Template sec_PKCS12PointerToCRLBagTemplate[] = { | |
| 186 { SEC_ASN1_POINTER, 0, sec_PKCS12CRLBagTemplate } | |
| 187 }; | |
| 188 | |
| 189 const SEC_ASN1Template sec_PKCS12PointerToSecretBagTemplate[] = { | |
| 190 { SEC_ASN1_POINTER, 0, sec_PKCS12SecretBagTemplate } | |
| 191 }; | |
| 192 | |
| 193 const SEC_ASN1Template sec_PKCS12PointerToSafeContentsTemplate[] = { | |
| 194 { SEC_ASN1_POINTER, 0, sec_PKCS12SafeContentsTemplate } | |
| 195 }; | |
| 196 | |
| 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 }; | |
| 208 | |
| 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 }; | |
| 217 | |
| 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 }; | |
| 223 | |
| 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 }; | |
| 236 | |
| 237 const SEC_ASN1Template sec_PKCS12SafeContentsTemplate[] = { | |
| 238 { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM, | |
| 239 offsetof(sec_PKCS12SafeContents, safeBags), | |
| 240 sec_PKCS12SafeBagTemplate } | |
| 241 }; | |
| 242 | |
| 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 }; | |
| 247 | |
| 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 }; | |
| 253 | |
| 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 }; | |
| 259 | |
| 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 }; | |
| 267 | |
| 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 }; | |
| 276 | |
| 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 }; | |
| 283 | |
| 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 }; | |
| OLD | NEW |