MuscleCardSchema.cpp [plain text]
#include "MuscleCardSchema.h"
#include "MetaAttribute.h"
#include "MetaRecord.h"
#include <PCSC/musclecard.h>
#include <Security/SecCertificate.h>
#include <Security/SecKeychainItem.h>
#include <Security/SecKey.h>
using namespace Tokend;
MuscleCardSchema::MuscleCardSchema() :
mEncryptCoder(MSC_KEYPOLICY_DIR_ENCRYPT),
mDecryptCoder(MSC_KEYPOLICY_DIR_DECRYPT),
mSignCoder(MSC_KEYPOLICY_DIR_SIGN),
mVerifyCoder(MSC_KEYPOLICY_DIR_VERIFY)
{
}
MuscleCardSchema::~MuscleCardSchema()
{
}
Tokend::Relation *MuscleCardSchema::createKeyRelation(CSSM_DB_RECORDTYPE keyType)
{
Relation *rn = createStandardRelation(keyType);
MetaRecord &mr = rn->metaRecord();
mr.keyHandleFactory(&mMuscleCardKeyHandleFactory);
mr.attributeCoder(kSecKeyPrintName, &mKeyNameCoder);
mr.attributeCoder(kSecKeyKeyType, &mKeyAlgorithmCoder);
mr.attributeCoder(kSecKeyKeySizeInBits, &mKeySizeCoder);
mr.attributeCoder(kSecKeyEffectiveKeySize, &mKeySizeCoder);
mr.attributeCoder(kSecKeyExtractable, &mKeyExtractableCoder);
mr.attributeCoder(kSecKeySensitive, &mKeySensitiveCoder);
mr.attributeCoder(kSecKeyModifiable, &mKeyModifiableCoder);
mr.attributeCoder(kSecKeyPrivate, &mKeyPrivateCoder);
mr.attributeCoder(kSecKeyNeverExtractable, &mFalseCoder);
mr.attributeCoder(kSecKeyAlwaysSensitive, &mFalseCoder);
mr.attributeCoder(kSecKeyEncrypt, &mEncryptCoder);
mr.attributeCoder(kSecKeyDecrypt, &mDecryptCoder);
mr.attributeCoder(kSecKeyWrap, &mEncryptCoder);
mr.attributeCoder(kSecKeyUnwrap, &mDecryptCoder);
mr.attributeCoder(kSecKeySign, &mSignCoder);
mr.attributeCoder(kSecKeyVerify, &mVerifyCoder);
mr.attributeCoder(kSecKeyDerive, &mFalseCoder);
mr.attributeCoder(kSecKeySignRecover, &mFalseCoder);
mr.attributeCoder(kSecKeyVerifyRecover, &mFalseCoder);
return rn;
}
void MuscleCardSchema::create()
{
Schema::create();
createKeyRelation(CSSM_DL_DB_RECORD_PRIVATE_KEY);
Relation *rn_publ = createKeyRelation(CSSM_DL_DB_RECORD_PUBLIC_KEY);
Relation *rn_symm = createKeyRelation(CSSM_DL_DB_RECORD_SYMMETRIC_KEY);
Relation *rn_ce = createStandardRelation(CSSM_DL_DB_RECORD_X509_CERTIFICATE);
rn_publ->metaRecord().attributeCoder(kSecKeyLabel, &mZeroCoder);
rn_symm->metaRecord().attributeCoder(kSecKeyLabel, &mKeyNameCoder);
MetaRecord &mr_cert = rn_ce->metaRecord();
mr_cert.attributeCoderForData(&mMscDataAttributeCoder);
Relation *rn_gen = createStandardRelation(CSSM_DL_DB_RECORD_GENERIC);
MetaRecord &mr_gen = rn_gen->metaRecord();
mr_gen.attributeCoderForData(&mMscDataAttributeCoder);
mr_gen.attributeCoder(kSecLabelItemAttr, &mObjectIDCoder);
}