#include "pkcs8.h"
#include "AppleCSPUtils.h"
#include "AppleCSPKeys.h"
#include <SecurityNssAsn1/keyTemplates.h>
#include <SecurityNssAsn1/SecNssCoder.h>
#include <SecurityNssAsn1/nssUtils.h>
#include "AppleCSPSession.h"
#include <Security/cssmapple.h>
void AppleCSPSession::pkcs8InferKeyHeader(
CssmKey &key)
{
NSS_PrivateKeyInfo privKeyInfo;
SecNssCoder coder;
CSSM_DATA &keyData = key.KeyData;
memset(&privKeyInfo, 0, sizeof(privKeyInfo));
if(coder.decodeItem(keyData, NSS_PrivateKeyInfoTemplate,
&privKeyInfo)) {
errorLog0("pkcs8InferKeyHeader decode error\n");
CssmError::throwMe(CSSMERR_CSP_INVALID_KEY);
}
CSSM_KEYHEADER &hdr = key.KeyHeader;
if(!cssmOidToAlg(&privKeyInfo.algorithm.algorithm,
&hdr.AlgorithmId)) {
errorLog0("pkcs8InferKeyHeader unknown algorithm\n");
CssmError::throwMe(CSSMERR_CSP_INVALID_ALGORITHM);
}
switch(hdr.AlgorithmId) {
case CSSM_ALGID_RSA:
hdr.Format = CSSM_KEYBLOB_RAW_FORMAT_PKCS8;
break;
case CSSM_ALGID_DSA:
hdr.Format = CSSM_KEYBLOB_RAW_FORMAT_FIPS186;
break;
default:
hdr.Format = CSSM_KEYBLOB_RAW_FORMAT_NONE;
break;
}
CSPKeyInfoProvider *provider = infoProvider(key);
if(provider == NULL) {
errorLog0("pkcs8InferKeyHeader no info provider\n");
return;
}
CSSM_KEY_SIZE keySize;
provider->QueryKeySizeInBits(keySize);
hdr.LogicalKeySizeInBits = keySize.LogicalKeySizeInBits;
delete provider;
}
CSSM_KEYBLOB_FORMAT pkcs8RawKeyFormat(
CSSM_ALGORITHMS keyAlg)
{
switch(keyAlg) {
case CSSM_ALGID_RSA:
return CSSM_KEYBLOB_RAW_FORMAT_PKCS8;
case CSSM_ALGID_DSA:
return CSSM_KEYBLOB_RAW_FORMAT_FIPS186;
default:
return CSSM_KEYBLOB_RAW_FORMAT_NONE;
}
}