#ifndef _TOKEND_PKCS11OBJECT_H_
#define _TOKEND_PKCS11OBJECT_H_
#include <stdint.h>
#include <map>
#include <security_utilities/debugging.h>
namespace Tokend
{
class PKCS11Object
{
public:
PKCS11Object(const void *inData, size_t inSize);
bool attributeValueAsBool(uint32_t attributeId) const;
uint32_t attributeValueAsUint32(uint32_t attributeId) const;
void PKCS11Object::attributeValueAsData(uint32_t attributeId,
const uint8_t *&data, size_t &size) const;
private:
struct PKCS11ObjectHeader
{
uint8_t oh_type;
uint8_t oh_id[2];
uint8_t oh_next_id[2];
uint8_t oa_size[2];
uint8_t oh_data[0];
size_t size() const { return (oa_size[0] << 8) + oa_size[1]; }
const uint8_t *data() const { return oh_data; }
};
struct PKCS11Attribute
{
uint8_t oa_id[4]; uint8_t oa_size[2]; uint8_t oa_data[0];
uint32_t attributeId() const { return (oa_id[0] << 24)
+ (oa_id[1] << 16) + (oa_id[2] << 8) + oa_id[3]; }
size_t size() const { return (oa_size[0] << 8) + oa_size[1]; }
const uint8_t *data() const { return oa_data; }
};
const PKCS11Attribute *attribute(uint32_t attributeId) const;
#if defined(DEBUGDUMP)
void debugDump(const PKCS11Attribute &attribute);
static const char *attributeName(uint32_t attributeId);
#endif
typedef std::map<uint32_t, const PKCS11Attribute *> AttributeMap;
AttributeMap mAttributeMap;
};
}
#endif