#ifndef _PIVTOKEN_H_
#define _PIVTOKEN_H_
#define _USECERTIFICATECOMMONNAME 1
#include <Token.h>
#include "TokenContext.h"
#include "PIVDefines.h"
#include <security_utilities/pcsc++.h>
#include "byte_string.h"
#pragma mark ---------- PIV defines ----------
#define CLA_STANDARD 0x00
#define INS_SELECT_FILE 0xA4
#define INS_VERIFY_APDU 0x20 // SP800731 Section 2.3.3.2.1
#define INS_CHANGE_REFERENCE_DATA 0x24 // [SP800731 7.2.2]
#define TBD_ZERO 0x00
#define TBD_FF 0xFF
#define SELECT_P1_EXPLICIT 0x00
#define SELECT_P1_CHILDDF 0x01
#define SELECT_P1_CHILDEF 0x02
#define SELECT_P1_PARENTDF 0x03
#define SELECT_APPLET PIV_CLA_STANDARD, PIV_INS_SELECT_FILE, 0x04, 0x00 // Select application by AID
#define SELECT_PIV_APPLET_VERS 0x10, 0x00, 0x01, 0x00
#define SELECT_PIV_APPLET_SHORT SELECT_APPLET, 0x07, 0xA0, 0x00, 0x00, 0x03, 0x08, 0x00, 0x00
#define SELECT_PIV_APPLET_LONG SELECT_APPLET, 0x0B, 0xA0, 0x00, 0x00, 0x03, 0x08, 0x00, 0x00, SELECT_PIV_APPLET_VERS
#pragma mark ---------- Object IDs on Token ----------
#define PIV_OBJECT_ID_CARD_CAPABILITY_CONTAINER 0x5F, 0xC1, 0x07
#define PIV_OBJECT_ID_CARDHOLDER_UNIQUEID 0x5F, 0xC1, 0x02
#define PIV_OBJECT_ID_CARDHOLDER_FINGERPRINTS 0x5F, 0xC1, 0x03
#define PIV_OBJECT_ID_PRINTED_INFORMATION 0x5F, 0xC1, 0x09
#define PIV_OBJECT_ID_CARDHOLDER_FACIAL_IMAGE 0x5F, 0xC1, 0x08
#define PIV_OBJECT_ID_X509_CERTIFICATE_PIV_AUTHENTICATION 0x5F, 0xC1, 0x05
#define PIV_OBJECT_ID_X509_CERTIFICATE_DIGITAL_SIGNATURE 0x5F, 0xC1, 0x0A
#define PIV_OBJECT_ID_X509_CERTIFICATE_KEY_MANAGEMENT 0x5F, 0xC1, 0x0B
#define PIV_OBJECT_ID_X509_CERTIFICATE_CARD_AUTHENTICATION 0x5F, 0xC1, 0x01
class PIVSchema;
class PIVCCC;
#pragma mark ---------- The Token Class ----------
class PIVToken : public Tokend::ISO7816Token
{
NOCOPY(PIVToken)
public:
PIVToken();
~PIVToken();
virtual void didDisconnect();
virtual void didEnd();
virtual uint32 probe(SecTokendProbeFlags flags,
char tokenUid[TOKEND_MAX_UID]);
virtual void establish(const CSSM_GUID *guid, uint32 subserviceId,
SecTokendEstablishFlags flags, const char *cacheDirectory,
const char *workDirectory, char mdsDirectory[PATH_MAX],
char printName[PATH_MAX]);
virtual void getOwner(AclOwnerPrototype &owner);
virtual void getAcl(const char *tag, uint32 &count, AclEntryInfo *&acls);
virtual void changePIN(int pinNum,
const unsigned char *oldPin, size_t oldPinLength,
const unsigned char *newPin, size_t newPinLength);
virtual uint32_t pinStatus(int pinNum);
virtual void verifyPIN(int pinNum, const unsigned char *pin, size_t pinLength);
virtual void unverifyPIN(int pinNum);
bool identify();
void select(const unsigned char *applet, size_t appletLength);
void selectDefault();
uint16_t simpleExchangeAPDU(const byte_string &apdu, byte_string &result);
uint16_t exchangeAPDU(const byte_string& apdu, byte_string &result);
uint16_t exchangeChainedAPDU(unsigned char cla, unsigned char ins,
unsigned char p1, unsigned char p2,
const byte_string &data,
byte_string &result);
byte_string buildGetData(const byte_string &oid, int limit = -1) const;
void getDataCore(const byte_string &oid, const char *description, bool isCertificate,
bool allowCaching, byte_string &data);
bool getDataExists(const unsigned char *oid, size_t oidlen, const char *description);
std::string authCertCommonName();
protected:
void populate();
size_t getKeySize(const byte_string &cert) const;
void processCertificateRecord(byte_string &data, const byte_string &oid, const char *description);
void dumpDataRecord(const byte_string &data, const byte_string &oid, const char *extraSuffix = NULL);
static int compressionType(const byte_string &data);
static int uncompressData(byte_string &uncompressedData, const byte_string &compressedData, int compressionType);
enum {
kCompressionNone = 0,
kCompressionZlib = 1,
kCompressionGzip = 2,
kCompressionUnknown = 9
};
size_t transmit(const byte_string &apdu, byte_string &result) {
return transmit(apdu.begin(), apdu.end(), result);
}
size_t transmit(const byte_string::const_iterator &apduBegin, const byte_string::const_iterator &apduEnd, byte_string &result);
public:
const unsigned char *mCurrentApplet;
uint32_t mPinStatus;
AutoAclOwnerPrototype mAclOwner;
AutoAclEntryInfoList mAclEntries;
};
#endif