www.pudn.com > agsm2-1.2_src.zip > PcScCtrl.h
// PcScCtrl.h: interface for the CPcScCtrl class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_PCSCCTRL_H__FFD62D79_494C_4D1D_B292_B50AF2408C04__INCLUDED_) #define AFX_PCSCCTRL_H__FFD62D79_494C_4D1D_B292_B50AF2408C04__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include#define IOCTL_USCR_GET_CONFIG_DESCRIPTOR SCARD_CTL_CODE( 0x800 ) #define IOCTL_USCR_RESET_DEVICE SCARD_CTL_CODE( 0x801 ) #define IOCTL_USCR_RESET_PIPE SCARD_CTL_CODE( 0x802 ) #define IOCTL_USCR_CCID SCARD_CTL_CODE( 0x803 ) #define PC_to_RDR_RunBuiltInFunctions 0x4f #define PC_to_RDR_IccPowerOn 0x62 #define PC_to_RDR_IccPowerOff 0x63 #define PC_to_RDR_GetSlotStatus 0x65 #define PC_to_RDR_XfrBlock 0x6F #define PC_to_RDR_GetResponse 0x70 #define PC_to_RDR_GetParameters 0x6C #define PC_to_RDR_ResetParameters 0x6D #define PC_to_RDR_SetParameters 0x61 typedef struct _tagSW1SW2{ BYTE MASK[2]; BYTE SW[2]; TCHAR *text; } SW1SW2; const SW1SW2 C_response[]= { //Response to commands which are correctly executed { { 0xff, 0xff }, { 0x90, 0x00 } , _T("Ok") }, { { 0xff, 0x00 }, { 0x9f, 0x00 } , _T("%d response bytes available") }, //Memory management { { 0xff, 0x00 }, { 0x92, 0x00 } , _T("Update successful but after using an internal retry routin %d times") }, { { 0xff, 0xff }, { 0x92, 0x40 } , _T("memory problem") }, //Referencing management { { 0xff, 0xff }, { 0x94, 0x00 } , _T("no EF selected") }, { { 0xff, 0xff }, { 0x94, 0x02 } , _T("out of range(invalid address)") }, { { 0xff, 0xff }, { 0x94, 0x04 } , _T("file ID or pattern not found") }, { { 0xff, 0xff }, { 0x94, 0x08 } , _T("file is inconsistent with the command") }, //Security management { { 0xff, 0xff }, { 0x98, 0x02 } , _T("no CHV initialised") }, { { 0xff, 0xff }, { 0x98, 0x04 } , _T("access condition not fulfilled,authentication failed at least one attempt left") }, { { 0xff, 0xff }, { 0x98, 0x08 } , _T("in contradiction with CHV status") }, { { 0xff, 0xff }, { 0x98, 0x10 } , _T("in contradiction with invalidation stats") }, { { 0xff, 0xff }, { 0x98, 0x40 } , _T("unsuccessful CHV verification,no attempt left. CHV blocked") }, { { 0xff, 0xff }, { 0x98, 0x50 } , _T("increase cannot be performed,Max value reached") }, { { 0xff, 0x00 }, { 0x61, 0x00 } , _T("%d response bytes available") }, { { 0xff, 0xff }, { 0x62, 0x81 } , _T("returned data may be corrupt") }, { { 0xff, 0xff }, { 0x62, 0x82 } , _T("EOF reached prematurely") }, { { 0xff, 0xff }, { 0x62, 0x83 } , _T("selected file invalid") }, { { 0xff, 0xff }, { 0x62, 0x84 } , _T("FCI not formated") }, { { 0xff, 0x00 }, { 0x62, 0x00 } , _T("nvmem unchanged") }, { { 0xff, 0x00 }, { 0x63, 0x00 } , _T("nvmem changed") }, { { 0xff, 0x00 }, { 0x63, 0x81 } , _T("file filled up by last write") }, { { 0xff, 0xf0 }, { 0x63, 0xc0 } , _T("Counter=%1.1X") }, { { 0xff, 0xff }, { 0x64, 0x00 } , _T("nvmem unchanged") }, { { 0xff, 0x00 }, { 0x64, 0x00 } , _T("nvmem unchanged - RFU") }, { { 0xff, 0xff }, { 0x65, 0x00 } , _T("nvmem changed") }, { { 0xff, 0xff }, { 0x65, 0x81 } , _T("nvmem changed - memory failure") }, { { 0xff, 0x00 }, { 0x65, 0x00 } , _T("nvmem changed - unknown?") }, { { 0xff, 0x00 }, { 0x66, 0x00 } , _T("security related %d") }, { { 0xff, 0xff }, { 0x67, 0x00 } , _T("wrong length") }, { { 0xff, 0x00 }, { 0x67, 0x00 } , _T("wrong length - %d expected") }, { { 0xff, 0xff }, { 0x68, 0x81 } , _T("wrong cla - logical channel not supported") }, { { 0xff, 0xff }, { 0x68, 0x82 } , _T("wrong cla - secure messaging not supported") }, { { 0xff, 0x00 }, { 0x68, 0x00 } , _T("cla not supported") }, { { 0xff, 0xff }, { 0x69, 0x81 } , _T("command incompatible with file structure") }, { { 0xff, 0xff }, { 0x69, 0x82 } , _T("security status not satisfied") }, { { 0xff, 0xff }, { 0x69, 0x83 } , _T("authentication method blocked") }, { { 0xff, 0xff }, { 0x69, 0x84 } , _T("referenced data invalid") }, { { 0xff, 0xff }, { 0x69, 0x85 } , _T("conditions of use not satisfied") }, { { 0xff, 0xff }, { 0x69, 0x86 } , _T("command not allowed - no current EF") }, { { 0xff, 0xff }, { 0x69, 0x87 } , _T("expected SM data objects missing") }, { { 0xff, 0xff }, { 0x69, 0x88 } , _T("SM data objects incorrect") }, { { 0xff, 0x00 }, { 0x69, 0x00 } , _T("command not allowed") }, { { 0xff, 0xff }, { 0x6a, 0x80 } , _T("P1-P2: incorrect parameters in data field") }, { { 0xff, 0xff }, { 0x6a, 0x81 } , _T("P1-P2: function not supported") }, { { 0xff, 0xff }, { 0x6a, 0x82 } , _T("P1-P2: file not found") }, { { 0xff, 0xff }, { 0x6a, 0x83 } , _T("P1-P2: record not found") }, { { 0xff, 0xff }, { 0x6a, 0x84 } , _T("P1-P2: not enough memory space in file") }, { { 0xff, 0xff }, { 0x6a, 0x85 } , _T("P1-P2: Lc inconsistent with TLV") }, { { 0xff, 0xff }, { 0x6a, 0x86 } , _T("P1-P2 incorrect") }, { { 0xff, 0xff }, { 0x6a, 0x87 } , _T("P1-P2 inconsistent with Lc") }, { { 0xff, 0xff }, { 0x6a, 0x88 } , _T("Referenced data not found") }, { { 0xff, 0x00 }, { 0x6a, 0x00 } , _T("P1-P2 invalid") }, { { 0xff, 0x00 }, { 0x6b, 0x00 } , _T("P1-P2 invalid") }, { { 0xff, 0x00 }, { 0x6c, 0x00 } , _T("wrong length - %d expected") }, { { 0xff, 0x00 }, { 0x6d, 0x00 } , _T("INS code not supported or invalid") }, { { 0xff, 0x00 }, { 0x6e, 0x00 } , _T("CLA %02X not supported") }, { { 0xff, 0x00 }, { 0x6f, 0x00 } , _T("no precise diagnosis") }, { { 0x00, 0x00 }, { 0x00, 0x00 } , _T("Unknown response") } }; typedef struct _tagIso7816Cmd{ BYTE Klass; BYTE Select; BYTE Status; BYTE ReadBinary; BYTE UpdateBinary; BYTE ReadRecord; BYTE UpdateRecord; BYTE Seek; BYTE Increase; BYTE VerifyChv; BYTE ChangeChv; BYTE DisableChv; BYTE EnableChv; BYTE UnblockChv; BYTE Invalidate; BYTE Rehabilitate; BYTE RunGsmAlgorithm; BYTE Sleep; BYTE GetResponse; } ISO7816_CMD; typedef struct _tagCmdApdu{ BYTE klass; BYTE inc; BYTE p1; BYTE p2; BYTE p3; BYTE data[256]; }CMDAPDU; typedef struct _tagResApdu{ LPBYTE data; DWORD len; }RESAPDU; enum ReadRecMode{ RRM_NextRecord=2, RRM_PreviousRecord, RRM_Absolute }; enum StructOfFile{ EF_TRANSPARENT, EF_LINERFIXED, EF_RFU, EF_CYCLIC }; class CPcScCtrl { public: LONG DoAPDU(LPBYTE cmdAPDU,DWORD len,LPBYTE resAPDU,DWORD &reslen); LONG ListReaders(); CPcScCtrl(); virtual ~CPcScCtrl(); public: void SetCLA(UCHAR cla); LONG DisconnectCurCard(); LONG ConnectCurCard(); LONG SCardSetAttrib(DWORD dwAttrId,LPCBYTE pbAttr,DWORD cbAttrLen); LONG SCardGetAttrib(DWORD dwAttrId, LPBYTE pbAttr,LPDWORD pcbAttrLen); LONG SCardStatus(LPTSTR szReaderName,LPDWORD pcchReaderLen,LPDWORD pdwState,LPDWORD pdwProtocol,LPBYTE pbAtr,LPDWORD pcbAtrLen); LONG SCardControl(DWORD dwControlCode, LPCVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned ); CString GetCardState(); LONG Select(ULONG id,RESAPDU &resApdu,UCHAR P1=0, UCHAR P2=0); CString FormatErrMsg(BYTE errseq[2]); CString FormatErrMsg(LONG errcode); LONG GetResponse(RESAPDU &resApdu); LONG RunGsmAlgorithm(LPBYTE data,UCHAR len,RESAPDU &resApdu); LONG Rehabilitate(); LONG Invalidate(); LONG EnableChv(UCHAR ChvNo,LPBYTE data,UCHAR len=8); LONG DisableChv(UCHAR ChvNo,LPBYTE data,UCHAR len=8); LONG UnblockChv(UCHAR ChvNo,LPBYTE data,UCHAR len=16); LONG ChangeChv(UCHAR ChvNo,LPBYTE data,UCHAR len=16); LONG VerifyChv(UCHAR ChvNo, LPBYTE data, UCHAR len); LONG Increase(LPBYTE data, UCHAR len,RESAPDU &resApdu); LONG Seek(UCHAR mode, LPBYTE patten, UCHAR len,RESAPDU &resApdu); LONG UpdateRecord(UCHAR RecNo, UCHAR mode, LPBYTE Rec, UCHAR len); LONG ReadRecord(UCHAR RecNo, UCHAR mode, RESAPDU &resApdu); LONG UpdateBinary(UCHAR OffHi,UCHAR OffLo,LPBYTE data,UCHAR len); LONG ReadBinary(UCHAR OffHi, UCHAR OffLo, RESAPDU &resApdu); LONG Status(RESAPDU &resApdu); LONG Select(UCHAR id[],RESAPDU &resApdu,UCHAR P1=0, UCHAR P2=0); INT GetCurReader(); LONG SetCurReader(INT n); DWORD TrackingCard(DWORD dwCurrentState = SCARD_STATE_UNAWARE); BOOL m_bGetRes; CStringArray m_asReaderNames; private: ULONG m_LastError; LONG DoChv(UCHAR cmd,UCHAR ChvNo,LPBYTE data,UCHAR len); LONG SCListReaders (IN SCARDCONTEXT hContext, IN LPCTSTR lpmszReaderGroups,OUT LPTSTR * lplpmszReaderNames); LONG SCFree (IN LPVOID lpMemory); LPVOID SCMalloc (IN DWORD dwSize); SCARDCONTEXT hContext; SCARDHANDLE hCard; INT m_nCurReader; protected: LONG EstablishContext(); }; #endif // !defined(AFX_PCSCCTRL_H__FFD62D79_494C_4D1D_B292_B50AF2408C04__INCLUDED_)