| 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 |