// CryptoCard.h: interface for the CCryptoCard class. // ////////////////////////////////////////////////////////////////////// #if !defined(CRYPTOCARD_H__INCLUDED_) #define CRYPTOCARD_H__INCLUDED_ #include "NoWarning.h" #include "DllSymDefn.h" #include "SmartCard.h" namespace iop { struct CryptoACL { BYTE Level; // ranges from 0 to 15 BYTE CHVnumber; // Number of the CHV is requested, equal to 0 by default BYTE AUTnumber; // Number of the AUT is requested, equal to 0 by default BYTE CHVcounter; BYTE AUTcounter; }; class IOPDLL_API CCryptoCard : public CSmartCard { public: void GetACL(BYTE *bACL); CCryptoCard(const SCARDHANDLE hCardHandle, const char* szReaderName, const SCARDCONTEXT pContext, const DWORD dwMode); virtual ~CCryptoCard(); virtual void DeleteFile(const WORD wFileID); virtual void CreateFile(const FILE_HEADER* pMyFile); virtual void SelectParent(); virtual void Directory (const BYTE bFile_Nb, FILE_HEADER* pMyFile); virtual void Select (const char* szFileFullPath, FILE_HEADER* pMyFile = NULL, const bool fSelectAll = false); virtual void VerifyKey (const BYTE bKeyNumber, const BYTE bKeyLength, const BYTE* bKey); virtual void VerifyCHV (const BYTE bCHVNumber, const BYTE* bCHV); virtual void VerifyTransportKey(const BYTE *bKey); virtual void GetChallenge(const DWORD dwNumberLength, BYTE* bRandomNumber); virtual void ExternalAuth(const KeyType kt, const BYTE bKeyNb, const BYTE bDataLength, const BYTE* bData); virtual void InternalAuth(const KeyType kt, const BYTE bKeyNb, const BYTE bDataLength, const BYTE* bDataIn, BYTE* bDataOut); virtual void ReadPublicKey (CPublicKeyBlob *aKey, const BYTE bKeyNum); virtual void WritePublicKey (const CPublicKeyBlob aKey, const BYTE bKeyNum); virtual void WritePrivateKey(const CPrivateKeyBlob aKey, const BYTE bKeyNum); virtual CPublicKeyBlob GenerateKeyPair(const BYTE *bpPublExp, const WORD wPublExpLen, const BYTE bKeyNum, const KeyType kt); virtual void ChangeACL (const BYTE *bACL); virtual void ChangeCHV (const BYTE bKey_nb, const BYTE *bOldCHV, const BYTE *bNewCHV); virtual void ChangeCHV (const BYTE bKey_nb, const BYTE *bNewCHV); virtual void UnblockCHV (const BYTE bKey_nb, const BYTE *bUnblockPIN, const BYTE *bNewPin); virtual void ChangeUnblockKey (const BYTE bKey_nb, const BYTE *bNewPIN); virtual void ChangeTransportKey(const BYTE *bNewKey); virtual void GetSerial(BYTE* bSerial, size_t &SerialLength); virtual void LogoutAll(); protected: virtual void DefaultDispatchError(ClassByte cb, Instruction ins, StatusWord sw) const; virtual void DispatchError(ClassByte cb, Instruction ins, StatusWord sw) const; virtual void DoReadBlock(WORD wOffset, BYTE *pbBuffer, BYTE bLength); virtual void DoWriteBlock(WORD wOffset, BYTE const *pbBuffer, BYTE cLength); virtual bool SupportLogout(); virtual void Select(const WORD wFileID); void AccessToCryptoACL(bool* fAccessACL, CryptoACL* pCryptoACL); void CryptoToAccessACL(BYTE* bAccessACL, const BYTE bACLNibble, const BYTE bKeyNibble, const BYTE bShift); private: enum // Instruction { insChangeChv = 0x24, insUnblockChv = 0x2C, insKeyGeneration = 0x46, }; BYTE m_bLastACL[4]; }; } #endif // !defined(AFX_CRYPTOCARD_H__INCLUDED_)