#include "pkcs12Utils.h"
#include <string.h>
#include <Security/oidsalg.h>
#include <security_asn1/nssUtils.h>
bool p12DataToInt(
const CSSM_DATA &cdata,
uint32 &u)
{
if((cdata.Length == 0) || (cdata.Data == NULL)) {
u = 0;
return true;
}
uint32 len = cdata.Length;
if(len > sizeof(uint32)) {
return false;
}
uint32 rtn = 0;
uint8 *cp = cdata.Data;
for(uint32 i=0; i<len; i++) {
rtn = (rtn << 8) | *cp++;
}
u = rtn;
return true;
}
typedef struct {
const CSSM_OID *oid;
CSSM_ALGORITHMS keyAlg; CSSM_ALGORITHMS encrAlg; CSSM_ALGORITHMS pbeHashAlg; uint32 keySizeInBits;
uint32 blockSizeInBytes; CSSM_PADDING padding; CSSM_ENCRYPT_MODE mode; PKCS_Which pkcs; } PKCSOidInfo;
static const PKCSOidInfo pkcsOidInfos[] = {
{
&CSSMOID_PKCS12_pbeWithSHAAnd128BitRC4,
CSSM_ALGID_RC4,
CSSM_ALGID_RC4,
CSSM_ALGID_SHA1,
128,
0, CSSM_PADDING_NONE,
CSSM_ALGMODE_NONE,
PW_PKCS12
},
{
&CSSMOID_PKCS12_pbeWithSHAAnd40BitRC4,
CSSM_ALGID_RC4,
CSSM_ALGID_RC4,
CSSM_ALGID_SHA1,
40,
0, CSSM_PADDING_NONE,
CSSM_ALGMODE_NONE,
PW_PKCS12
},
{
&CSSMOID_PKCS12_pbeWithSHAAnd3Key3DESCBC,
CSSM_ALGID_3DES_3KEY,
CSSM_ALGID_3DES_3KEY_EDE,
CSSM_ALGID_SHA1,
64 * 3,
8,
CSSM_PADDING_PKCS7,
CSSM_ALGMODE_CBCPadIV8,
PW_PKCS12
},
{
&CSSMOID_PKCS12_pbeWithSHAAnd2Key3DESCBC,
CSSM_ALGID_3DES_2KEY,
CSSM_ALGID_3DES_2KEY_EDE,
CSSM_ALGID_SHA1,
64 * 2,
8,
CSSM_PADDING_PKCS7,
CSSM_ALGMODE_CBCPadIV8,
PW_PKCS12
},
{
&CSSMOID_PKCS12_pbeWithSHAAnd128BitRC2CBC,
CSSM_ALGID_RC2,
CSSM_ALGID_RC2,
CSSM_ALGID_SHA1,
128,
8,
CSSM_PADDING_PKCS7,
CSSM_ALGMODE_CBCPadIV8,
PW_PKCS12
},
{
&CSSMOID_PKCS12_pbewithSHAAnd40BitRC2CBC,
CSSM_ALGID_RC2,
CSSM_ALGID_RC2,
CSSM_ALGID_SHA1,
40,
8,
CSSM_PADDING_PKCS7,
CSSM_ALGMODE_CBCPadIV8,
PW_PKCS12
},
{
&CSSMOID_PKCS5_pbeWithMD2AndDES,
CSSM_ALGID_DES,
CSSM_ALGID_DES,
CSSM_ALGID_MD2,
64,
8,
CSSM_PADDING_PKCS7,
CSSM_ALGMODE_CBCPadIV8,
PW_PKCS5_v1_5
},
{
&CSSMOID_PKCS5_pbeWithMD2AndRC2,
CSSM_ALGID_RC2,
CSSM_ALGID_RC2,
CSSM_ALGID_MD2,
64,
8,
CSSM_PADDING_PKCS7,
CSSM_ALGMODE_CBCPadIV8,
PW_PKCS5_v1_5
},
{
&CSSMOID_PKCS5_pbeWithMD5AndDES,
CSSM_ALGID_DES,
CSSM_ALGID_DES,
CSSM_ALGID_MD5,
64,
8,
CSSM_PADDING_PKCS7,
CSSM_ALGMODE_CBCPadIV8,
PW_PKCS5_v1_5
},
{
&CSSMOID_PKCS5_pbeWithMD5AndRC2,
CSSM_ALGID_RC2,
CSSM_ALGID_RC2,
CSSM_ALGID_MD5,
64,
8,
CSSM_PADDING_PKCS7,
CSSM_ALGMODE_CBCPadIV8,
PW_PKCS5_v1_5
},
{
&CSSMOID_PKCS5_pbeWithSHA1AndDES,
CSSM_ALGID_DES,
CSSM_ALGID_DES,
CSSM_ALGID_SHA1,
64,
8,
CSSM_PADDING_PKCS7,
CSSM_ALGMODE_CBCPadIV8,
PW_PKCS5_v1_5
},
{
&CSSMOID_PKCS5_pbeWithSHA1AndRC2,
CSSM_ALGID_RC2,
CSSM_ALGID_RC2,
CSSM_ALGID_SHA1,
64,
8,
CSSM_PADDING_PKCS7,
CSSM_ALGMODE_CBCPadIV8,
PW_PKCS5_v1_5
},
{
&CSSMOID_PKCS5_PBES2,
CSSM_ALGID_NONE,
CSSM_ALGID_NONE,
CSSM_ALGID_NONE,
0, 0, 0, 0,
PW_PKCS5_v2
}
};
#define NUM_PKCS_OID_INFOS (sizeof(pkcsOidInfos) / sizeof(pkcsOidInfos[1]))
bool pkcsOidToParams(
const CSSM_OID *oid,
CSSM_ALGORITHMS &keyAlg, CSSM_ALGORITHMS &encrAlg, CSSM_ALGORITHMS &pbeHashAlg, uint32 &keySizeInBits,
uint32 &blockSizeInBytes, CSSM_PADDING &padding, CSSM_ENCRYPT_MODE &mode, PKCS_Which &pkcs) {
const PKCSOidInfo *info = pkcsOidInfos;
pkcs = PW_None;
for(unsigned dex=0; dex<NUM_PKCS_OID_INFOS; dex++) {
if(nssCompareCssmData(oid, info->oid)) {
keyAlg = info->keyAlg;
encrAlg = info->encrAlg;
pbeHashAlg = info->pbeHashAlg;
keySizeInBits = info->keySizeInBits;
blockSizeInBytes = info->blockSizeInBytes;
padding = info->padding;
mode = info->mode;
pkcs = info->pkcs;
return true;
}
info++;
}
return false;
}
typedef struct {
unsigned value;
const char *name;
} p12NameValuePair;
#define NVP(attr) {attr, #attr}
#define NVP_END {0, NULL}
static const p12NameValuePair p7CITypeNames[] =
{
NVP(CT_None),
NVP(CT_Data),
NVP(CT_SignedData),
NVP(CT_EnvData),
NVP(CT_SignedEnvData),
NVP(CT_DigestData),
NVP(CT_EncryptedData),
NVP_END
};
static const p12NameValuePair p12BagTypeNames[] =
{
NVP(BT_None),
NVP(BT_KeyBag),
NVP(BT_ShroudedKeyBag),
NVP(BT_CertBag),
NVP(BT_CrlBag),
NVP(BT_SecretBag),
NVP(BT_SafeContentsBag),
NVP_END
};
static const char *typeToStr(
unsigned type,
const p12NameValuePair *table)
{
while(table->name) {
if(table->value == type) {
return table->name;
}
table++;
}
return "Unknown";
}
const char *p12BagTypeStr(
NSS_P12_SB_Type type)
{
return typeToStr(type, p12BagTypeNames);
}
const char *p7ContentInfoTypeStr(
NSS_P7_CI_Type type)
{
return typeToStr(type, p7CITypeNames);
}