pkcs12Templates.cpp [plain text]
#include "pkcs12Templates.h"
#include "pkcs12Utils.h"
#include <security_asn1/nssUtils.h>
#include <Security/SecAsn1Templates.h>
#include <Security/oidsattr.h>
const SecAsn1Template NSS_P12_MacDataTemplate[] = {
{ SEC_ASN1_SEQUENCE,
0, NULL, sizeof(NSS_P12_MacData) },
{ SEC_ASN1_INLINE,
offsetof(NSS_P12_MacData,mac),
NSS_P7_DigestInfoTemplate },
{ SEC_ASN1_OCTET_STRING,
offsetof(NSS_P12_MacData,macSalt) },
{ SEC_ASN1_INTEGER | SEC_ASN1_OPTIONAL,
offsetof(NSS_P12_MacData,iterations) },
{ 0, }
};
const SecAsn1Template pointerToMacDataTemplate[] = {
{ SEC_ASN1_POINTER, 0, NSS_P12_MacDataTemplate }
};
const SecAsn1Template NSS_P12_RawPFXTemplate[] = {
{ SEC_ASN1_SEQUENCE,
0, NULL, sizeof(NSS_P12_RawPFX) },
{ SEC_ASN1_INTEGER,
offsetof(NSS_P12_RawPFX,version) },
{ SEC_ASN1_INLINE,
offsetof(NSS_P12_RawPFX, authSafe),
NSS_P7_RawContentInfoTemplate },
{ SEC_ASN1_POINTER | SEC_ASN1_OPTIONAL,
offsetof(NSS_P12_RawPFX, macData),
NSS_P12_MacDataTemplate },
{ 0, }
};
extern const SecAsn1Template NSS_P12_DecodedPFXTemplate[] = {
{ SEC_ASN1_SEQUENCE,
0, NULL, sizeof(NSS_P12_DecodedPFX) },
{ SEC_ASN1_INTEGER,
offsetof(NSS_P12_DecodedPFX,version) },
{ SEC_ASN1_INLINE,
offsetof(NSS_P12_DecodedPFX, authSafe),
NSS_P7_DecodedContentInfoTemplate },
{ SEC_ASN1_POINTER | SEC_ASN1_OPTIONAL,
offsetof(NSS_P12_DecodedPFX, macData),
NSS_P12_MacDataTemplate },
{ 0, }
};
const SecAsn1Template NSS_P12_AuthenticatedSafeTemplate[] = {
{ SEC_ASN1_SEQUENCE_OF,
offsetof(NSS_P12_AuthenticatedSafe, info),
NSS_P7_DecodedContentInfoTemplate,
sizeof(NSS_P12_AuthenticatedSafe) }
};
const SecAsn1Template NSS_P12_PtrToShroudedKeyBagTemplate[] = {
{ SEC_ASN1_POINTER, 0, kSecAsn1EncryptedPrivateKeyInfoTemplate }
};
static const SecAsn1Template * NSS_P12_CertBagChooser(
void *arg, Boolean enc,
const char *buf, void *dest) {
NSS_P12_CertBag *bag = (NSS_P12_CertBag *)arg;
const SecAsn1Template *templ = NULL;
NSS_P12_CertBagType type = CT_Unknown;
CSSM_OID *oid = &bag->bagType;
if(nssCompareCssmData(oid, &CSSMOID_PKCS9_X509Certificate)) {
templ = kSecAsn1OctetStringTemplate;
type = CT_X509;
}
else if(nssCompareCssmData(oid, &CSSMOID_PKCS9_SdsiCertificate)) {
templ = kSecAsn1IA5StringTemplate;
type = CT_SDSI;
}
else {
templ = kSecAsn1AnyTemplate;
}
if(!enc) {
bag->type = type;
}
return templ;
}
static const SecAsn1TemplateChooserPtr NSS_P12_CertBagChooserPtr =
NSS_P12_CertBagChooser;
const SecAsn1Template NSS_P12_CertBagTemplate[] = {
{ SEC_ASN1_SEQUENCE,
0, NULL, sizeof(NSS_P12_CertBag) },
{ SEC_ASN1_OBJECT_ID,
offsetof(NSS_P12_CertBag,bagType) },
{ SEC_ASN1_DYNAMIC | SEC_ASN1_CONTEXT_SPECIFIC |
SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | 0,
offsetof(NSS_P12_CertBag, certValue),
&NSS_P12_CertBagChooserPtr },
{ 0, }
};
const SecAsn1Template NSS_P12_PtrToCertBagTemplate[] = {
{ SEC_ASN1_POINTER, 0, NSS_P12_CertBagTemplate }
};
static const SecAsn1Template * NSS_P12_CrlBagChooser(
void *arg, Boolean enc,
const char *buf, void *dest) {
NSS_P12_CrlBag *bag = (NSS_P12_CrlBag *)arg;
const SecAsn1Template *templ = NULL;
NSS_P12_CrlBagType type = CRT_Unknown;
CSSM_OID *oid = &bag->bagType;
if(nssCompareCssmData(oid, &CSSMOID_PKCS9_X509Crl)) {
templ = kSecAsn1OctetStringTemplate;
type = CRT_X509;
}
else {
templ = kSecAsn1AnyTemplate;
}
if(!enc) {
bag->type = type;
}
return templ;
}
static const SecAsn1TemplateChooserPtr NSS_P12_CrlBagChooserPtr =
NSS_P12_CrlBagChooser;
const SecAsn1Template NSS_P12_CrlBagTemplate[] = {
{ SEC_ASN1_SEQUENCE,
0, NULL, sizeof(NSS_P12_CrlBag) },
{ SEC_ASN1_OBJECT_ID,
offsetof(NSS_P12_CrlBag,bagType) },
{ SEC_ASN1_DYNAMIC | SEC_ASN1_CONTEXT_SPECIFIC |
SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | 0,
offsetof(NSS_P12_CrlBag, crlValue),
&NSS_P12_CrlBagChooserPtr },
{ 0, }
};
const SecAsn1Template NSS_P12_PtrToCrlBagTemplate[] = {
{ SEC_ASN1_POINTER, 0, NSS_P12_CrlBagTemplate }
};
#define NSS_P12_PtrToKeyBagTemplate kSecAsn1PointerToAnyTemplate
#define NSS_P12_PtrToSecretBagTemplate kSecAsn1PointerToAnyTemplate
#define NSS_P12_PtrToSafeContentsBagTemplate kSecAsn1PointerToAnyTemplate
static const SecAsn1Template * NSS_P12_SafeBagChooser(
void *arg, Boolean enc,
const char *buf, void *dest) {
NSS_P12_SafeBag *bag = (NSS_P12_SafeBag *)arg;
const SecAsn1Template *templ = NULL;
NSS_P12_SB_Type type = BT_None;
CSSM_OID *oid = &bag->bagId;
if(nssCompareCssmData(oid, &CSSMOID_PKCS12_keyBag)) {
templ = NSS_P12_PtrToKeyBagTemplate;
type = BT_KeyBag;
}
else if(nssCompareCssmData(oid, &CSSMOID_PKCS12_shroudedKeyBag)) {
templ = NSS_P12_PtrToShroudedKeyBagTemplate;
type = BT_ShroudedKeyBag;
}
else if(nssCompareCssmData(oid, &CSSMOID_PKCS12_certBag)) {
templ = NSS_P12_PtrToCertBagTemplate;
type = BT_CertBag;
}
else if(nssCompareCssmData(oid, &CSSMOID_PKCS12_crlBag)) {
templ = NSS_P12_PtrToCrlBagTemplate;
type = BT_CrlBag;
}
else if(nssCompareCssmData(oid, &CSSMOID_PKCS12_secretBag)) {
templ = NSS_P12_PtrToSecretBagTemplate;
type = BT_SecretBag;
}
else if(nssCompareCssmData(oid, &CSSMOID_PKCS12_safeContentsBag)) {
templ = NSS_P12_PtrToSafeContentsBagTemplate;
type = BT_SafeContentsBag;
}
else {
templ = kSecAsn1PointerToAnyTemplate;
}
if(!enc) {
bag->type = type;
}
return templ;
}
static const SecAsn1TemplateChooserPtr NSS_P12_SafeBagChooserPtr =
NSS_P12_SafeBagChooser;
const SecAsn1Template NSS_P12_SafeBagTemplate[] = {
{ SEC_ASN1_SEQUENCE,
0, NULL, sizeof(NSS_P12_SafeBag) },
{ SEC_ASN1_OBJECT_ID,
offsetof(NSS_P12_SafeBag,bagId) },
{ SEC_ASN1_DYNAMIC | SEC_ASN1_CONSTRUCTED |
SEC_ASN1_EXPLICIT | SEC_ASN1_CONTEXT_SPECIFIC | 0,
offsetof(NSS_P12_SafeBag,bagValue),
&NSS_P12_SafeBagChooserPtr },
{ SEC_ASN1_OPTIONAL | SEC_ASN1_SET_OF,
offsetof(NSS_P12_SafeBag,bagAttrs),
kSecAsn1AttributeTemplate },
{ 0 }
};
const SecAsn1Template NSS_P12_SafeContentsTemplate[] = {
{ SEC_ASN1_SEQUENCE_OF,
offsetof(NSS_P12_SafeContents, bags),
NSS_P12_SafeBagTemplate,
sizeof(NSS_P12_SafeContents) }
};
const SecAsn1Template NSS_P12_PBE_ParamsTemplate[] = {
{ SEC_ASN1_SEQUENCE,
0, NULL, sizeof(NSS_P12_PBE_Params) },
{ SEC_ASN1_OCTET_STRING,
offsetof(NSS_P12_PBE_Params,salt) },
{ SEC_ASN1_INTEGER,
offsetof(NSS_P12_PBE_Params,iterations) },
{ 0 }
};