#define CVM_TC_ID 0x01 // 持卡人证件验证
//终端所知的(最近一次的)CVM执行结果 #define CVMR_UNKNOWN 0 //未知(例如,签名 #define CVMR_FAILED 1 //失败(例如,脱机PIN) #define CVMR_SUCCESS 2 //成功
//持卡人证件类型
#define CCT_IDCARD 0x00 //身份证 #define CCT_MILITARYOFFICER 0x01 //军官证 #define CCT_PASSPORT 0x02 //护照 #define CCT_ENTERCOUNTRY 0x03 //入境证 #define CCT_TEMPIDCARD 0x04 //临时身份证 #define CCT_OTHER 0x05 //其它证件
#define CVM_TYPE_00 0x00 //CVM 失败处理 #define CVM_TYPE_01 0x01 //卡片执行明文PIN 核对 #define CVM_TYPE_02 0x02 //联机加密PIN 验证 #define CVM_TYPE_03 0x03 //卡片执行明文PIN 核对+签名(纸上) #define CVM_TYPE_1E 0x1E //签名(纸上) #define CVM_TYPE_1F 0x1F //无需CVM
#define AIP_SDA 2 // 支持SDA静态数据认证 #define AIP_DDA 3 // 支持DDA动态数据认证 #define AIP_CARDHOLDER_VERIFY 4 // 支持持卡人认证 #define AIP_RISK_MANAGEMENT 5 // 执行终端风险管理 #define AIP_ISSUER_AUTHENTICATION 6 // 支持发卡行认证 #define AIP_CDA 8 // 支持CDA符合动态数据认证
//下面是终端行为分析的返回数据
#define TERMINAL_ACTION_DECLINED 1 //脱机拒绝 #define TERMINAL_ACTION_ONLINE 2 //联机发送授权请求 #define TERMINAL_ACTION_APPROVED 3 //脱机批准
//GENERATE AC引用控制参数(EMV2000中还有应用授权参考(AAR) ) #define GAC_AAC 0x00 // 应用认证密文(AAC) #define GAC_TC 0x40 // 交易证书(TC) #define GAC_ARQC 0x80 // 授权请求密文(ARQC)
#define PIN_ENTRY_OK 0 #define PIN_ENTRY_NOT_POSSIBLE 1 //要求输入PIN,但密码键盘不存在或工作不正常
#define PIN_NOT_ENTERED 2 //要求输入PIN,密码键盘存在,但未输入PIN
#define PIN_ENTRY_BYPASSED 3 //PIN重试次数超限
//ICC借贷记数据域包含的标签存在性 #define TYPE_MANDATORY 0 #define TYPE_OPTIONAL 1
#define TYPE_RESETRELATEDDATA_BEFORE 1 #define TYPE_RESETRELATEDDATA_AFTER 2
#define TYPE_AIDSELECTED 1
#define TYPE_CALLBACK 1 #define TYPE_CardReader 2 #define TYPE_IDC 3
#define TYPE_ALL_DATA 1 #define TYPE_ONLY_CONSTRUCTEDDATA 2 #define TYPE_EXCEPT_CONSTRUCTEDDATA 3
struct PBOC_C_APDU { char chHeader[4]; char chBody[1+256+1]; };
typedef int (_stdcall *PFCALLBACK)(int _dataLen, BYTE _APDUData[], BYTE _exData[], int *_exdataLen) ;
#pragma pack (pop)
#ifdef __cplusplus } #endif
#endif
// !defined(AFX_GLOBALINFO_H__22678551_34B5_453E_BD7F_6BDD5BE581BB__INCLUDED_)
// TLVEntity.h: interface for the CTLVEntity class. //
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_TLVENTITY_H__529895E3_5EB4_4696_9455_0687582B1195__INCLUDED_) #define AFX_TLVENTITY_H__529895E3_5EB4_4696_9455_0687582B1195__INCLUDED_
#if _MSC_VER > 1000 #pragma once
#endif // _MSC_VER > 1000
#include \
class CTLVEntity {
public: CTLVEntity(); //CTLVEntity(CTLVEntity *pEntity); virtual ~CTLVEntity(); public: int EntityToTLVBuf(TLVDATA *pTlvData, BYTE *pDataBuf); BOOL CanConstructed(); UINT m_nTag; //标签 INT m_nLength; //长度 BYTE *m_pValue; //值 BOOL m_bConstructed; //是否为结构数据对象,否就为基本数据对象 BOOL m_bOptionalStatic; //是否为可选静态 INT m_nMinLen; //最小长度 INT m_nMaxLen; //最大长度 EICDataFormat m_eFormat; //数据格式 BYTE m_ucSource; //数据来源 BYTE m_ucGetData; //是否可被Get Data命令取回数据 UINT m_nTemplate1; UINT m_nTemplate2; CString m_strName; //数据名称
private: void InitEntity(); };
#endif
// !defined(AFX_TLVENTITY_H__529895E3_5EB4_4696_9455_0687582B1195__INCLUDED_)
// TLVEntity.cpp: implementation of the CTLVEntity class. //
//////////////////////////////////////////////////////////////////////
#include \#include \
#ifdef _DEBUG #undef THIS_FILE
static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif
////////////////////////////////////////////////////////////////////// // Construction/Destruction
//////////////////////////////////////////////////////////////////////
CTLVEntity::CTLVEntity() {
InitEntity(); }
// CTLVEntity::CTLVEntity(CTLVEntity *pEntity) // {
// m_nTag = pEntity->m_nTag;
// m_bConstructed = pEntity->m_bConstructed; // m_bOptionalStatic = pEntity->m_bOptionalStatic; // m_nMinLen = pEntity->m_nMinLen; // m_nMaxLen = pEntity->m_nMaxLen; // m_eFormat = pEntity->m_eFormat; // m_ucSource = pEntity->m_ucSource; // m_nTemplate1 = pEntity->m_nTemplate1; // m_nTemplate2 = pEntity->m_nTemplate2; // m_strName = pEntity->m_strName; // m_nLength = 0; // m_pValue = NULL; // }
CTLVEntity::~CTLVEntity() { //这里不能释放内存,需要在map里统一释放 // if (m_pValue != NULL) // free(m_pValue); // m_pValue = NULL; }
void CTLVEntity::InitEntity() { m_nTag = 0; m_bConstructed = TRUE; m_bOptionalStatic = FALSE; m_nMinLen = m_nMaxLen = m_nLength = 0; m_eFormat = IC_FORMAT_B; m_ucSource = IC_SOURCE_ICC; m_nTemplate1 = m_nTemplate2 = 0; m_ucGetData = 0; m_strName.Empty(); m_pValue = NULL; }
BOOL CTLVEntity::CanConstructed() { UINT iTemp;
if (m_nTag >= 256) {
iTemp = (BYTE)(m_nTag / 256); } else {
iTemp = (BYTE)(m_nTag % 256); }
if ((iTemp & 0x20) != 0) {
return TRUE; }
return FALSE; }
//把Entity转化为TLV数据对象集合
int CTLVEntity::EntityToTLVBuf(TLVDATA *pTlvData, BYTE *pDataBuf) { int iOffset = 0; if (pTlvData->nTag >= 256) { pDataBuf[iOffset++] = (BYTE)(pTlvData->nTag / 256); pDataBuf[iOffset++] = (BYTE)(pTlvData->nTag % 256); } else { pDataBuf[iOffset++] = (BYTE)(pTlvData->nTag % 256); } if (pTlvData->nLength >= 0x80) { if (pTlvData->nLength >= 256) { pDataBuf[iOffset++] = 0x82; pDataBuf[iOffset++] = (BYTE)(pTlvData->nLength /256 ); pDataBuf[iOffset++] = (BYTE)(pTlvData->nLength % 256); } else { pDataBuf[iOffset++] = 0x81; pDataBuf[iOffset++] = (BYTE)(pTlvData->nLength % 256); } } else { pDataBuf[iOffset++] = (BYTE)pTlvData->nLength; } memcpy(pDataBuf+iOffset,pTlvData->pValue,pTlvData->nLength); iOffset += pTlvData->nLength; return iOffset; }
// AIDListApp.h: interface for the CAIDListApp class. //
//////////////////////////////////////////////////////////////////////