MuscleCardAttributeCoder.cpp [plain text]
#include "MuscleCardAttributeCoder.h"
#include "MetaAttribute.h"
#include "MetaRecord.h"
#include "TokenRecord.h"
#include "KeyRecord.h"
#include "Msc/MscToken.h"
#include "Msc/MscObject.h"
#include <Security/SecKeychainItem.h>
#include <security_cdsa_utilities/cssmkey.h>
using namespace Tokend;
#pragma mark ---------------- Muscle/P11 specific Coder methods --------------
KeyExtractableAttributeCoder::~KeyExtractableAttributeCoder() {}
void KeyExtractableAttributeCoder::decode(Tokend::TokenContext *tokenContext,
const Tokend::MetaAttribute &metaAttribute, Tokend::Record &record)
{
KeyRecord &keyRecord = dynamic_cast<KeyRecord &>(record);
bool value = keyRecord.key().acl().read() != MSC_AUT_NONE;
record.attributeAtIndex(metaAttribute.attributeIndex(), new Attribute(value));
}
KeySensitiveAttributeCoder::~KeySensitiveAttributeCoder() {}
void KeySensitiveAttributeCoder::decode(Tokend::TokenContext *tokenContext, const Tokend::MetaAttribute &metaAttribute,
Tokend::Record &record)
{
KeyRecord &keyRecord = dynamic_cast<KeyRecord &>(record);
bool value = keyRecord.key().acl().read() == MSC_AUT_NONE;
record.attributeAtIndex(metaAttribute.attributeIndex(), new Attribute(value));
}
KeyModifiableAttributeCoder::~KeyModifiableAttributeCoder() {}
void KeyModifiableAttributeCoder::decode(Tokend::TokenContext *tokenContext,
const Tokend::MetaAttribute &metaAttribute, Tokend::Record &record)
{
KeyRecord &keyRecord = dynamic_cast<KeyRecord &>(record);
bool value = keyRecord.key().acl().write() != MSC_AUT_NONE;
record.attributeAtIndex(metaAttribute.attributeIndex(), new Attribute(value));
}
KeyPrivateAttributeCoder::~KeyPrivateAttributeCoder() {}
void KeyPrivateAttributeCoder::decode(Tokend::TokenContext *tokenContext,
const Tokend::MetaAttribute &metaAttribute, Tokend::Record &record)
{
KeyRecord &keyRecord = dynamic_cast<KeyRecord &>(record);
bool value = keyRecord.key().acl().use() != MSC_AUT_ALL;
record.attributeAtIndex(metaAttribute.attributeIndex(), new Attribute(value));
}
KeyDirectionAttributeCoder::~KeyDirectionAttributeCoder() {}
void KeyDirectionAttributeCoder::decode(Tokend::TokenContext *tokenContext,
const Tokend::MetaAttribute &metaAttribute, Tokend::Record &record)
{
KeyRecord &keyRecord = dynamic_cast<KeyRecord &>(record);
bool value = (keyRecord.key().policy().direction() & mMask);
record.attributeAtIndex(metaAttribute.attributeIndex(), new Attribute(value));
}
KeySizeAttributeCoder::~KeySizeAttributeCoder() {}
void KeySizeAttributeCoder::decode(Tokend::TokenContext *tokenContext,
const Tokend::MetaAttribute &metaAttribute, Tokend::Record &record)
{
uint32 keySize = dynamic_cast<KeyRecord &>(record).key().size();
record.attributeAtIndex(metaAttribute.attributeIndex(), new Attribute(keySize));
}
KeyAlgorithmAttributeCoder::~KeyAlgorithmAttributeCoder() {}
void KeyAlgorithmAttributeCoder::decode(Tokend::TokenContext *tokenContext,
const Tokend::MetaAttribute &metaAttribute, Tokend::Record &record)
{
uint32_t keyType = dynamic_cast<KeyRecord &>(record).key().type();
uint32 algID;
switch (keyType)
{
case MSC_KEY_RSA_PRIVATE:
case MSC_KEY_RSA_PRIVATE_CRT:
case MSC_KEY_RSA_PUBLIC:
algID = CSSM_ALGID_RSA;
break;
case MSC_KEY_DSA_PRIVATE:
case MSC_KEY_DSA_PUBLIC:
algID = CSSM_ALGID_DSA;
break;
case MSC_KEY_DES:
algID = CSSM_ALGID_DES;
break;
case MSC_KEY_3DES:
algID = CSSM_ALGID_3DES;
break;
case MSC_KEY_3DES3:
algID = CSSM_ALGID_3DES_3KEY_EDE;
break;
default:
secdebug("coder", "unknown MSC_KEY_TYPE: %02X r: %p rid: %08X aid: %u", keyType,
&record, metaAttribute.metaRecord().relationId(), metaAttribute.attributeId());
algID = CSSM_ALGID_CUSTOM;
break;
}
record.attributeAtIndex(metaAttribute.attributeIndex(), new Attribute(algID));
}
KeyNameAttributeCoder::~KeyNameAttributeCoder() {}
void KeyNameAttributeCoder::decode(Tokend::TokenContext *tokenContext,
const Tokend::MetaAttribute &metaAttribute, Tokend::Record &record)
{
MSCUChar8 keyNumber = dynamic_cast<KeyRecord &>(record).key().number();
char buf[5];
int used = snprintf(buf, 5, "K%u", keyNumber);
record.attributeAtIndex(metaAttribute.attributeIndex(), new Attribute(buf, used));
}
ObjectIDAttributeCoder::~ObjectIDAttributeCoder()
{
}
void ObjectIDAttributeCoder::decode(TokenContext *tokenContext, const MetaAttribute &metaAttribute, Record &record)
{
TokenRecord &tokenRecord = dynamic_cast<TokenRecord &>(record);
record.attributeAtIndex(metaAttribute.attributeIndex(), new Attribute(tokenRecord.objid()));
}
MscDataAttributeCoder::~MscDataAttributeCoder()
{
}
void MscDataAttributeCoder::decode(TokenContext *tokenContext, const MetaAttribute &metaAttribute, Record &record)
{
TokenRecord &trec = dynamic_cast<TokenRecord &>(record);
MscToken &tok = dynamic_cast<MscToken &>(*tokenContext);
MscObject &obj = tok.getObject(trec.objid());
secdebug("dcoder", "getting object %s of size %d", trec.objid().c_str(), obj.size());
record.attributeAtIndex(metaAttribute.attributeIndex(), new Attribute(obj.data(), obj.size()));
}