PinPadClass.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /////////////////////////////////////////////////////////////////////////////////
  2. /// Copyright (c) 2012 China Merchants Bank, all rights reserved ///
  3. /// Adapter Interface for PinPad. ///
  4. /// ///
  5. ////////////////////////////////////////////////////////////////////////////////
  6. #ifndef __PIN_PAD_CLASS_H
  7. #define __PIN_PAD_CLASS_H
  8. #pragma once
  9. #include "DeviceBaseClass.h"
  10. /** define specified device adapter interface file version*/
  11. /** once the change cannot compact with before one, CMBer must update this version node and reset the minor-version node*/
  12. #define PINPAD_INTERFACE_FILE_VERSION_MAJOR 1
  13. /** any change but not effect compatibility with elder one, CMBer should update this verion node*/
  14. #define PINPAD_INTERFACE_FILE_VERSION_MINOR 0
  15. #define PINPAD_INTERFACE_FILE_VERSION_STRING \
  16. DEVICE_ADAPTER_CLASS_STRINGFY(PINPAD_INTERFACE_FILE_VERSION_MAJOR, PINPAD_INTERFACE_FILE_VERSION_MINOR)
  17. #define PINPAD_ADAPTER_CLASS_ID \
  18. DEVICE_ADAPTER_CLASS_COMBINE(PINPAD_INTERFACE_FILE_VERSION_MAJOR)
  19. const int MAX_PIN_READ_SIZE = 256;
  20. const int MAX_PIN_BLOCK_SIZE = 256;
  21. const int MAX_MASTER_KEY_SIZE = 128;
  22. const int MAX_WORKING_KEY_SIZE = 128;
  23. const int MAX_ACCOUNT_LEN = 32;
  24. const int MAX_EN_DECRYPT_DATA_SIZE = 512;
  25. struct PinPadInitParam
  26. {
  27. DWORD dwPort;
  28. DWORD dwBaudRate;
  29. };
  30. struct PinReadData
  31. {
  32. DWORD dwSize;
  33. BYTE data[MAX_PIN_READ_SIZE];
  34. };
  35. struct MasterKeyParam
  36. {
  37. int smFlag; //0:3des,1:sm
  38. DWORD dwSN; //master key serial number:0,1,2,...
  39. BYTE key[MAX_MASTER_KEY_SIZE]; //key value
  40. };
  41. struct WorkKeyParam
  42. {
  43. int smFlag; //0:3des,1:sm
  44. DWORD dwMasterSN; //master key serial number:0,1,2,...
  45. DWORD dwWorkingSN; //working key serial number:0,1,2,...
  46. BYTE key[MAX_WORKING_KEY_SIZE]; //key value
  47. };
  48. struct PinBlock
  49. {
  50. DWORD dwSize;
  51. BYTE data[MAX_PIN_BLOCK_SIZE];
  52. };
  53. struct AccountInfo
  54. {
  55. DWORD dwAccLen;
  56. BYTE account[MAX_ACCOUNT_LEN];
  57. };
  58. struct EnDecryptInfo
  59. {
  60. DWORD dwSize;
  61. BYTE data[MAX_EN_DECRYPT_DATA_SIZE]; //en/decrypt data
  62. };
  63. //parameter type to set device
  64. enum SetParamTypeEnum
  65. {
  66. EPP_PT_SET_ENCRYPT_METHOD, //data encrypt/decrypt method
  67. EPP_PT_SET_MAC_ALGORITH, //mac algorithm
  68. EPP_PT_SET_PIN_ALGORITH, //pin encrypt/decrypt algorithm
  69. EPP_PT_SET_ECB_CBC_MODE, //encrypt/decrypt mode
  70. };
  71. //parameter value to set device
  72. enum SetParamValueEnum
  73. {
  74. ////values for EPP_PT_SET_ENCRYPT_METHOD
  75. EPP_ALGO_METHOD_DES,
  76. EPP_ALGO_METHOD_3DES,
  77. EPP_ALGO_METHOD_DES_TMK,
  78. EPP_ALGO_METHOD_3DES_TMK,
  79. //values for EPP_PT_SET_MAC_ALGORITH
  80. EPP_MAC_ALGO_ASNIX99,
  81. EPP_MAC_ALGO_PBOC,
  82. EPP_MAC_ALGO_UNIONPAY,
  83. //values for EPP_PT_SET_PIN_ALGORITH
  84. EPP_PIN_ALGO_ISO9564_1_ANSI,//ANSIx9.8
  85. EPP_PIN_ALGO_IBM3624,
  86. //values for EPP_PT_SET_ECB_CBC_MODE
  87. //设置加密方式,这里仅为了兼容,保留,设置ECB/CBC请使用 EPP_ALGO_MODE_ECB, EPP_ALGO_MODE_CBC,
  88. EPP_ALGO_MODE_DEC_ECB,
  89. EPP_ALGO_MODE_DEC_CBC,
  90. EPP_ALGO_MODE_3DEC_ECB,
  91. EPP_ALGO_MODE_3DEC_CBC,
  92. EPP_ALGO_METHOD_SM4,
  93. EPP_PIN_ALGO_SM4,
  94. EPP_ALGO_MODE_ECB,
  95. EPP_ALGO_MODE_CBC,
  96. };
  97. class PinPadClass : public DeviceBaseClass
  98. {
  99. public:
  100. //
  101. // Open device.
  102. // Arguments:
  103. // - dwPort[in] com port number
  104. // - dwBaudRate[in] Baud rate
  105. //
  106. virtual ErrorCodeEnum DevOpen(DWORD dwPort, DWORD dwBaudRate) = 0;
  107. //
  108. // Get input key value.
  109. // Monitor pinpad key press,if any key pressed,set [ch] value and return Error_Succeed.
  110. // If none was pressed ,return Error_DevCommFailed.
  111. //
  112. // Two input mode:plain text,pin(encrypted)
  113. // 1.In any mode,press key "*,#,blank,cancel,clear,confirm",set ch value
  114. // "0x2a,0x23,0x20,0x1b,0x08,0x0d" respectively
  115. // 2.In plain text input mode,press key 0~9,.,00,set ch 0x30~0x39,0x2e,0x4f respectively
  116. // 3.In pin input mode,press any key of 0~9,set ch 0x3f,else('.','00') set ch 0x3d
  117. // 4."clear" means clear all the input
  118. //
  119. virtual ErrorCodeEnum KeyRead(BYTE &ch) = 0;
  120. //
  121. // Set pinpad parameter.
  122. //
  123. virtual ErrorCodeEnum SetParam(SetParamTypeEnum eType,SetParamValueEnum eValue) = 0;
  124. //
  125. // Set account number.
  126. // Arguments:
  127. // - accInfo.account:(ASCII)account value
  128. // ex:card no "62260755",the accInfo.account should be 0x3632323630373535
  129. //
  130. virtual ErrorCodeEnum SetAccNo(AccountInfo accInfo) = 0;
  131. //
  132. // Load master key. (in plain text)
  133. // [key]:byte value in string type. ex. 0x123456FF --> "123456FF"
  134. //
  135. virtual ErrorCodeEnum LoadMasterKey(MasterKeyParam masterKey) = 0;
  136. //
  137. // Load working key. (encrypted data)
  138. // Use the according master key to decrypt the key,then load result into pinpad
  139. // [key]:byte value in string type. ex. 0x123456FF --> "123456FF"
  140. //
  141. virtual ErrorCodeEnum LoadWorkingKey(WorkKeyParam wkKey) = 0;
  142. //
  143. // Active a working key as current working key.
  144. // Arguments:
  145. // - dwMkSN:master key serial number
  146. // - dwWkSN:working key serial number
  147. // - ActiveWorkingKey(主密钥序号,99)表示激活“主密钥序号”的主密钥作为当前工作密钥
  148. //
  149. virtual ErrorCodeEnum ActiveWorkingKey(DWORD dwMkSN,DWORD dwWkSN) = 0;
  150. //
  151. // Start key press(pin mode).
  152. // byLen:输入密码长度,键盘检测到用户输入byLen位有效!!长度时自动结束输入,计算pinblock
  153. //
  154. virtual ErrorCodeEnum StartPinInput(BYTE byLen) = 0;
  155. //
  156. // Start key press(pin mode).
  157. // byLen:输入密码长度,键盘检测到用户输入确认键后结束输入,计算pinblock
  158. //
  159. virtual ErrorCodeEnum StartPinInputConfirm(BYTE byLen) = 0;
  160. //
  161. // Start key press(plain text mode).
  162. //
  163. virtual ErrorCodeEnum StartPlainInput() = 0;
  164. //
  165. // Close pinpad input.
  166. //
  167. virtual ErrorCodeEnum StopInput() = 0;
  168. //
  169. // Get pin block.
  170. // At the end of pin input, to get pin text.
  171. //
  172. virtual ErrorCodeEnum GetPinBlock(PinBlock &block) = 0;
  173. //
  174. // Encrypt data.
  175. // Arguments:
  176. // - srcInfo.data:source plain text data
  177. // (byte value in string type. ex. 0x123456FF --> "123456FF")
  178. // - destInfo.data:destination encrypted data
  179. //
  180. virtual ErrorCodeEnum EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo) = 0;
  181. //
  182. // Encrypt data(MAC)
  183. // Arguments:
  184. // - srcInfo.data:source plain text data
  185. // (byte value in string type. ex. 0x123456FF --> "123456FF")
  186. // - destInfo.data:destination encrypted data
  187. //
  188. virtual ErrorCodeEnum MacEncrypt(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo) = 0;
  189. //
  190. // Get the encrypt method supported.
  191. // return value:
  192. // 0x1:3des only; 0x2:sm4 only; 0x3:both 3des and sm4
  193. //
  194. virtual int GetEncryptFunc() = 0;
  195. };
  196. #endif // __PIN_PAD_CLASS_H