> For the complete documentation index, see [llms.txt](https://sandbox-docs.verifone.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sandbox-docs.verifone.com/adk-5.0-programmers-guide/sdi_8h_source.md).

# sdi.h

[Go to the documentation of this file.](/adk-5.0-programmers-guide/readme/files/dir_20ccae320a59b06ef6618c5b737d5c02/dir_5e53e51918e971c6ecb7778a0c977255/dir_e180e45849113f6ee3b1d48173f5e474/sdi_8h.md)

```cpp
 1 // -*- Mode: C++; -*-
 2 #ifndef SDI_H_20190919
 3 #define SDI_H_20190919
 4 
 7 #include <vector>
 8 #include <map>
 9 #include <string>
 10 #include <stdio.h>
 11 #include <stdarg.h>
 12 #if defined _WIN32
 13 // Need this for conflicting includes for pthread on Windows
 14 #define HAVE_STRUCT_TIMESPEC
 15 #endif
 16 #if __cplusplus>=201103
 17 # include <thread>
 18 # include <mutex>
 19 # include <condition_variable>
 20 #else
 21 # include <pthread.h>
 22 #endif
 23 #include <stdint.h>
 24 
 25 #include "tlv.h"
 26 #include "bcd.h"
 27 #include "sdi_emv.h"
 28 #include "sdi_enum.h"
 29 
 30 #if defined _WIN32 && defined VFI_SDICLIENT_EXPORT
 31 # define DllSpec __declspec(dllexport)
 32 #elif defined __GNUC__ && defined VFI_SDICLIENT_EXPORT
 33 # define DllSpec __attribute__((visibility ("default")))
 34 #else
 35 # define DllSpec
 36 #endif
 37 
 38 namespace vfiipc {
 39 class IPC;
 40 }
 41 
 42 namespace vfisdi {
 43 
 45 class DllSpec SDIClient {
 46 
 47  // disable copying
 48  SDIClient(const SDIClient &);
 49  void operator=(const SDIClient &);
 50 
 51  public:
 52 
 54  typedef std::vector<unsigned char> bytevector;
 55 
 57  enum ProtocolType {
 58  PROTOCOL_B,
 59  PROTOCOL_C
 60  };
 61 
 63  static bool isGenericError(int r) { return -1000<r; }
 65  static bool isSystemError(int r) { return ERR_SYSTEM_BASE-1000<r && r<=ERR_SYSTEM_BASE; }
 67  static bool isCardreaderError(int r) { return ERR_CARDREADER_BASE-1000<r && r<=ERR_CARDREADER_BASE; }
 69  static bool isDisplayError(int r) { return ERR_DISPLAY_BASE-1000<r && r<=ERR_DISPLAY_BASE; }
 71  static bool isPrinterError(int r) { return ERR_PRINTER_BASE-1000<r && r<=ERR_PRINTER_BASE; }
 73  static bool isPluginError(int r) { return ERR_PLUGIN_BASE-1000<r && r<=ERR_PLUGIN_BASE; }
 75  static bool isVCLError(int r) { return ERR_VCL_BASE-1000<r && r<=ERR_VCL_BASE; }
 77  static bool isEMVError(int r) { return ERR_EMV_BASE-1000<r && r<=ERR_EMV_BASE; }
 79  static bool isPEDError(int r) { return ERR_PED_BASE-1000<r && r<=ERR_PED_BASE; }
 81  static bool isNFCError(int r) { return ERR_NFC_BASE-1000<r && r<=ERR_NFC_BASE; }
 83  static bool isVASError(int r) { return ERR_VAS_BASE-1000<r && r<=ERR_VAS_BASE; }
 85  static bool isDataError(int r) { return ERR_DATA_BASE-1000<r && r<=ERR_DATA_BASE; }
 87  static bool isSECError(int r) { return ERR_SEC_BASE-1000<r && r<=ERR_SEC_BASE; }
 88 
 89 
 91  struct TouchButton {
 92  int x;
 93  int y;
 94  int w;
 95  int h;
 96  char c;
 97 #if __cplusplus>=201103
 98  TouchButton(int x=0, int y=0, int w=0, int h=0, char c=0)
 99  : x(x), y(y), w(w), h(h), c(c) {}
 100 #endif
 101  };
 102 
 104  struct CAPKeyInfo {
 105  Array<5> rid;
 106  unsigned char index;
 107  unsigned char keyLength;
 108  };
 109 
 115  typedef void (*LogCallback)(void *data, const char *file, int line, const char *format, va_list ap);
 116 
 117  protected:
 118  enum { STX=0x02, ETX=0x03 };
 119 
 120  struct PrivateData;
 121 
 122  PrivateData *p;
 123 
 124  void logError(const char *file, int line, const char *format, ...);
 125  void logDebug(const char *file, int line, const char *format, ...);
 126 
 127  // send/receive/close without locking
 128  int sendMessage_nolock(unsigned short cmd, unsigned short p1p2, const bytevector &data);
 129  int sendReply_nolock(unsigned short cmd, const bytevector &data);
 130  void close_nolock();
 131 
 132  static int getResult(unsigned short sw12);
 133  static int getResult(unsigned short sw12, const bytevector &reply, int error_offset);
 134  static int getResult(unsigned short sw12, TLV &t, int error_offset);
 135 
 136 #if __cplusplus<201103
 137  static void *reader_thread(void *data);
 138 #endif
 139  void reader_thread();
 140 
 141  // internal EMV functions
 142  int emvXExit(unsigned short cmd, unsigned options=0);
 143  int emvXSetTermData(unsigned short cmd, const EMVConf &emv);
 144  int emvXGetTermData(unsigned short cmd, EMVConf &emv);
 145  int emvXSetCAPKey(unsigned short cmd,
 146  const Array<5> &rid, unsigned char index,
 147  const bytevector &key, unsigned char exp,
 148  const bytevector &hash=bytevector(),
 149  const bytevector &revocationlist=bytevector());
 150  int emvXClearCAPKey(unsigned short cmd, const Array<5> &rid, unsigned char index);
 151  int emvXClearAllCAPKey(unsigned short cmd);
 152  int emvXGetCAPKeys(unsigned short cmd, std::vector<CAPKeyInfo> &keys);
 153  int emvXApplyConfig(unsigned short cmd, unsigned options);
 154  int emvXAddVirtualMapEntry(unsigned short cmd, int transaction, int currency, unsigned char vterminal);
 155  int emvXClearVirtualMap(unsigned short cmd);
 156  int emvXContinueOnline(EMVTxn &out,
 157  unsigned short cmd,
 158  bool onlineResult,
 159  const Array<2> &authResp,
 160  const EMVTxn &optional);
 161  int emvXEndTransaction(unsigned short cmd, unsigned options);
 162 
 163  int emvCtlsSetAppData(unsigned kernel_id, const bytevector &aid, const EMVConf &emv, unsigned char config_cmd);
 164  int emvCtlsGetAppData(unsigned kernel_id, const bytevector &aid, EMVConf &emv, unsigned char config_cmd);
 165 
 166 
 167 
 168  public:
 173  SDIClient();
 174 
 176  virtual ~SDIClient();
 177 
 179  void setProtocol(ProtocolType proto);
 180 
 181 
 182  void setTrace(void *data, void (*trace_cb)(void *data, const char *format, ...));
 183 
 189  template<typename R, typename T> void setTrace(T *data, R (*trace)(T *data, const char *format, ...)) {
 190  setTrace((void *)data,(void (*)(void *, const char *, ...))trace);
 191  }
 192 
 198  int connect(const char *host, unsigned short port=12000);
 199 
 205  int connect(vfiipc::IPC *link);
 206 
 210  bool connected() const;
 211 
 213  void close();
 214  // group sdisetup
 216 
 220 
 230  int sendMessage(unsigned short cmd, unsigned short p1p2, const bytevector &data);
 231 
 237  int sendMessage(unsigned short cmd, const bytevector &data) { return sendMessage(cmd,0,data); }
 238 
 244  int receiveMessage(unsigned short &sw1sw2, bytevector &data);
 245 
 251  int sendReply(unsigned short cmd, const bytevector &data);
 252 
 261  int sendReceiveMessage(unsigned short cmd, unsigned short p1p2, const bytevector &sdata, unsigned short &sw1sw2, bytevector &rdata);
 262 
 263  int sendReceiveMessage(unsigned short cmd, const bytevector &sdata, unsigned short &sw1sw2, bytevector &rdata) { return sendReceiveMessage(cmd,0,sdata,sw1sw2,rdata); }
 264 
 265  // group sdilowlevel
 267 
 271 
 275 
 283  int sysAbort();
 284 
 291  int sysGetConfig(const bytevector &req, bytevector &out);
 292 
 296  int sysGetCPUID(std::string &id);
 297 
 301  int sysGetSerialNumber(std::string &sn);
 302 
 306  int sysGetBootSoftwareID(std::string &id);
 307 
 311  int sysGetApplicationSoftwareID(std::string &id);
 312 
 316  int sysGetHardwareID(std::string &id);
 317 
 321  int sysGetIFMID(std::string &id);
 322 
 326  int sysGetEMVL2ID(std::string &id);
 327 
 333  int sysGetStatus(const bytevector &req, bytevector &out);
 334 
 344  int sysGetDateTime(unsigned short &year, unsigned char &month, unsigned char &day,
 345  unsigned char &hour, unsigned char &minute, unsigned char &second);
 346 
 350  int sysGetTamperStatus(Array<9> &tamper);
 351 
 357  int sysGetBatteryStatus(unsigned char &charge_level, unsigned char &charge_status);
 358 
 363  int sysGetBatteryVoltage(unsigned short &voltage);
 364 
 369  int sysGetLanguage(enum Language &language);
 370 
 375  int sysGetCVVDeactivation(unsigned char &cfg);
 376 
 381  int sysGetCardEntryMode(unsigned char &mode);
 382 
 392  int sysSetDateTime(unsigned short year, unsigned char month, unsigned char day,
 393  unsigned char hour, unsigned char minute, unsigned char second);
 394 
 399  int sysSetLanguage(enum Language language);
 400 
 405  int sysSetCVVDeactivation(unsigned char deactivate);
 406 
 411  int sysSetCardEntryMode(unsigned char mode);
 412 
 417  int sysSetDisplayBacklight(unsigned char backlight);
 418 
 423  int sysSetDisplayConstrast(unsigned char contrast);
 424 
 430  int sysGetKSN(KSNSelection which, bytevector &out);
 431 
 439  int sysAuthStep1(const Array<16> &hostRandom, Array<32> &serverData, bytevector &ksn);
 440 
 447  int sysAuthStep2(const Array<32> &hostData, Array<32> &serverData);
 448 
 453  int sysSetIdleText(const std::string &text);
 454 
 458  int sysClearIdleText();
 459 
 469  int sysUploadBegin(const std::string &filename,
 470  SYSUploadType type=SYS_UPLOAD_SOFTWARE_UPDATE,
 471  int dest=1);
 472 
 480  int sysUploadData(const void *packet,
 481  unsigned size,
 482  int packet_no,
 483  int dest=1);
 484 
 491  int sysUploadEnd(const bytevector *md5=0,
 492  const bytevector *mac=0,
 493  int dest=1);
 494 
 504  int sysUpload(const std::string &filename,
 505  const bytevector &data,
 506  SYSUploadType type=SYS_UPLOAD_SOFTWARE_UPDATE,
 507  const bytevector *md5=0,
 508  const bytevector *mac=0,
 509  int dest=1);
 510 
 514  int sysShutdown();
 515 
 519  int sysReboot();
 520 
 524  int sysSleep();
 525 
 529  int sysHibernate();
 530 
 534  int sysShowMACDesktop();
 535 
 542  int sysSetPropertyString(int property, const std::string &in, int dest=1);
 543 
 550  int sysSetPropertyInt(int property, int in, int dest=1);
 551 
 558  int sysGetPropertyString(int property, std::string &out, int dest=1);
 559 
 566  int sysGetPropertyInt(int property, int &out, int dest=1);
 567 
 572  int sysInstallSponsorCert(const bytevector &cert);
 573 
 575  struct ComponentVersion {
 576  std::string name;
 577  std::string version;
 578  };
 579 
 585  int sysGetSDIVersion(std::vector<ComponentVersion> &info, unsigned char device=1);
 586 
 587 
 592  int sysInstallUpdate(SYSUpdateType type);
 593 
 599  int sysInstallResult(std::string &result, unsigned char device=1);
 600 
 605  int sysEnableEPP(bool enable);
 606 
 610  int sysFactoryReset();
 611 
 617  int sysReadCert(const std::string &name, bytevector &cert);
 618 
 625  int sysSetCurrencyDisplay(enum Currency currency, enum CurrencyDisplay display);
 626  // group sdisystem
 628 
 632 
 646  int displayText(int template_id, const std::string &data_name, const std::string &data_value, int timeout=0, bool confirm=false, bool beep=false, int dest=1);
 647 
 661  int displayText(int template_id,
 662  unsigned dialog_opt,
 663  const std::map<std::string, std::string> &value,
 664  const std::map<std::string, std::string> &key_actions,
 665  const char *header_text=0,
 666  const char *enter_text=0,
 667  const char *clear_text=0,
 668  const char *cancel_text=0,
 669  int timeout=0,
 670  int dest=1);
 671 
 672 
 681  int displayText(const std::string &data_value, int timeout=0, bool confirm=false, bool beep=false, int dest=1)
 682  { return displayText(1,"text",data_value,timeout,confirm,beep,dest); }
 683 
 684 
 696  int displayInput(std::string &out, InputType type, Language language=LANGUAGE_NO_LANGUAGE,
 697  char maskchar=0, const std::string &altformat="",
 698  int timeout=0, bool beep=false, int dest=1);
 699 
 712  int displayInputTipWithAmount(std::string &out, Language language,
 713  const BCD<6> &amount, Currency currency,
 714  char maskchar=0, const std::string &altformat="",
 715  int timeout=0, bool beep=false, int dest=1);
 716 
 717 
 718 
 719 
 730  int displayMenu(const std::string &prompt, const std::vector<std::string> &entries,int timeout=0, bool beep=false, int dest=1);
 731 
 732 
 753  int displayMenu(unsigned dialog_opt,
 754  const std::string &prompt,
 755  const std::vector<std::string> &entries,
 756  int preselect,
 757  const std::map<std::string, std::string> &key_actions,
 758  const char *header_text=0,
 759  const char *enter_text=0,
 760  const char *cancel_text=0,
 761  const char *up_text=0,
 762  const char *down_text=0,
 763  int timeout=0,
 764  int dest=1);
 765 
 766 
 784  int displayCardRequest(unsigned char tec,
 785  unsigned char mode,
 786  const BCD<6> amount,
 787  int currency,
 788  int dest=1);
 789 
 800  int displayCardRequest(unsigned char tec, unsigned char mode, int dest=1)
 801  { return displayCardRequest(tec,mode,0,-1,dest); }
 802 
 821  int displayCardRequest(unsigned char tec,
 822  unsigned char mode,
 823  const BCD<6> amount,
 824  int currency,
 825  enum EMVTransaction txn,
 826  int dest=1);
 827 
 839  int displayCardRequest(unsigned char tec, unsigned char mode, enum EMVTransaction txn, int dest=1)
 840  { return displayCardRequest(tec,mode,0,-1,txn,dest); }
 841 
 842 
 844  enum IdleScreenMode {
 845  IDLE_HOTKEY_ADMIN=0,
 846  IDLE_NO_ADMIN=1,
 847  IDEL_SHOW_ADMIN=2,
 848  };
 849 
 855  int displayIdleScreen(int dest=1);
 856 
 864  int displayIdleScreenMode(enum IdleScreenMode mode, int dest=1);
 865 
 874  int displaySignatureCapture(std::string &outformat, bytevector &outdata,
 875  Language lang, unsigned short timeout=0, int dest=1);
 876 
 884  int displayLEDs(bool on);
 885 
 898  int displayDialog(const std::string &filename, std::map<std::string,std::string> &value, Language lang=LANGUAGE_NO_LANGUAGE, bool beep=false, int dest=1);
 899 
 913  int displayDialog(unsigned dialog_opt,
 914  const std::string &filename,
 915  std::map<std::string,std::string> &value,
 916  Language lang=LANGUAGE_NO_LANGUAGE,
 917  int dest=1);
 918 
 924  int displayGetAsyncResult(enum DialogAsyncStatus &status, int dest=1);
 925  // group sdidisplay
 927 
 931 
 940  int printSetPropertyString(int property, const std::string &in);
 941 
 947  int printSetPropertyInt(int property, int in);
 948 
 954  int printGetPropertyString(int property, std::string &out);
 955 
 961  int printGetPropertyInt(int property, int &out);
 962 
 968  int printHTML(const std::string &html, bool landscape=false);
 969 
 977  int printBitmap(int width, int height, const void *bitmap, unsigned size);
 978 
 985  int printBitmap(int width, int height, const bytevector &bitmap) {
 986  return bitmap.empty() ? OK : printBitmap(width,height,&bitmap[0],(unsigned int)bitmap.size());
 987  }
 988  // group sdiprinter
 990 
 994 
 998  struct PluginResult;
 999 
 1008  int msrRead(bytevector &pan, std::string &name, std::string &service, std::string &track2, int timeout_sec);
 1009 
 1019  int msrRead(bytevector &pan, std::string &name, std::string &service, std::string &track2, Array<3> &track_status, int timeout_sec);
 1020 
 1033  int msrRead(bytevector &pan, std::string &name, std::string &service, std::string &track2, Array<3> &track_status, bytevector &card_token, int timeout_sec, int removal_timeout_ms=-1);
 1034 
 1048  int msrRead(bytevector &pan, std::string &name, std::string &service, std::string &track2, Array<3> &track_status, bytevector &card_token,
 1049  std::vector<PluginResult> &plugin_result,
 1050  int timeout_sec, int removal_timeout_ms=-1);
 1051 
 1066  int msrRead(bytevector &pan, std::string &name, std::string &service, std::string &track1, std::string &track2, Array<3> &track_status, bytevector &card_token,
 1067  std::vector<PluginResult> &plugin_result,
 1068  int timeout_sec, int removal_timeout_ms=-1);
 1069 
 1075  int msrCardDataEntry(std::string &out, const std::vector<TouchButton> &btn=std::vector<TouchButton>());
 1076 
 1085  int msrCardDataEntry(std::string &out, bytevector &card_token, unsigned flags,
 1086  const std::string &format=std::string(),
 1087  const std::vector<TouchButton> &btn=std::vector<TouchButton>());
 1088 
 1098  int msrCardDataEntry(std::string &out, bytevector &card_token,
 1099  std::vector<PluginResult> &plugin_result,
 1100  unsigned flags,
 1101  const std::string &format=std::string(),
 1102  const std::vector<TouchButton> &btn=std::vector<TouchButton>());
 1103 
 1114  int msrCardDataEntry(std::string &out, bytevector &card_token,
 1115  std::vector<PluginResult> &plugin_result,
 1116  unsigned flags,
 1117  int timeout,
 1118  const std::string &format=std::string(),
 1119  const std::vector<TouchButton> &btn=std::vector<TouchButton>());
 1120 
 1125  int msrSetOptions(unsigned options);
 1126 
 1134  int msrLED(unsigned led1, unsigned led2, unsigned led3, unsigned timeout=0);
 1135 
 1147  int msrSetSensitivity(unsigned char sensitivity, int dest=1);
 1148  // group sdimsr
 1150 
 1154 
 1159  struct TECOptions {
 1160  unsigned short tec_start;
 1161  unsigned char ctOptions;
 1162  unsigned char ctlsOptions;
 1163  unsigned short msrAfterCTLSTimeout;
 1164  unsigned short msrAfterInsertTimeout;
 1165  unsigned short paymentTimeout;
 1166  unsigned nfcTechnology;
 1167  };
 1168 
 1190  int crdDetect(unsigned char tec,
 1191  const TECOptions &options,
 1192  bool allow_cancel,
 1193  unsigned timeout_ms,
 1194  unsigned char &tec_out,
 1195  EMVTxn &emv_out,
 1196  const bytevector &appid=bytevector(),
 1197  unsigned char syncCard=0,
 1198  unsigned char manual_mode=0,
 1199  const std::string &format="",
 1200  bytevector *plugin_result=0
 1201  );
 1202 
 1204  struct PluginResult {
 1205  short id;
 1206  unsigned short responseCode;
 1207  bytevector responseData;
 1208  };
 1209 
 1233  int crdDetect(unsigned char tec,
 1234  const TECOptions &options,
 1235  bool allow_cancel,
 1236  unsigned timeout_ms,
 1237  unsigned char &tec_out,
 1238  EMVTxn &emv_out,
 1239  std::vector<PluginResult> &plugin_result,
 1240  const bytevector &appid=bytevector(),
 1241  unsigned char syncCard=0,
 1242  unsigned char manual_mode=0,
 1243  const std::string &format="",
 1244  int removal_timeout_ms=-1
 1245  );
 1246 
 1251  int crdWaitForRemoval(unsigned short timeout=0);
 1252 
 1266  int crdStartDetect(unsigned char tec,
 1267  const TECOptions &options,
 1268  unsigned timeout,
 1269  bool use_cb=false,
 1270  const bytevector &appid=bytevector(),
 1271  unsigned char syncCard=0);
 1272 
 1288  int crdStartDetect(unsigned char tec,
 1289  const TECOptions &options,
 1290  unsigned timeout,
 1291  bool use_cb,
 1292  const bytevector &appid,
 1293  unsigned char syncCard,
 1294  int removal_timeout_ms=-1);
 1295 
 1302  int crdPollDetect(unsigned char &tec_out,
 1303  EMVTxn &emv_out,
 1304  bytevector *plugin_result=0);
 1305 
 1311  int crdStopDetect();
 1312 
 1324  int crdAddTechnology(unsigned char tec,
 1325  const TECOptions &options,
 1326  const bytevector &appid=bytevector(),
 1327  unsigned char syncCard=0);
 1328 
 1337  int crdRemoveTechnology(unsigned char tec);
 1338 
 1339 
 1344  int crdProvideCallbackResponse(EMVTxn &in);
 1345  // group sdicrd
 1347 
 1351 
 1366  int pedGetPIN(const std::vector<TouchButton> &btn=std::vector<TouchButton>(),
 1367  bool bypass=false,
 1368  int timeout=300,
 1369  int navigator_mode=0,
 1370  int min_digits=4,
 1371  int max_digits=12,
 1372  Language lang=LANGUAGE_NO_LANGUAGE);
 1373 
 1391  int pedGetPIN(unsigned pin_options,
 1392  const BCD<6> amount=0,
 1393  int currency=-1,
 1394  const char *applabel=0,
 1395  const char *headline=0,
 1396  unsigned pwd_char=0,
 1397  const std::vector<TouchButton> &btn=std::vector<TouchButton>(),
 1398  unsigned bypass=BYPASS_DISABLED,
 1399  int timeout=300,
 1400  int interchar_timeout=0,
 1401  int min_digits=4,
 1402  int max_digits=12,
 1403  Language lang=LANGUAGE_NO_LANGUAGE);
 1404 
 1423  int pedGetPIN(unsigned pin_options,
 1424  const BCD<6> amount,
 1425  int currency,
 1426  const char *applabel,
 1427  const char *headline,
 1428  unsigned pwd_char,
 1429  const std::vector<TouchButton> &btn,
 1430  unsigned bypass,
 1431  int timeout,
 1432  int interchar_timeout,
 1433  int min_digits,
 1434  int max_digits,
 1435  Language lang,
 1436  unsigned char *bypass_key);
 1437 
 1446  int pedGetPIN(bool bypass=false,
 1447  int timeout=300,
 1448  int min_digits=4,
 1449  int max_digits=12,
 1450  Language lang=LANGUAGE_NO_LANGUAGE)
 1451  {
 1452  return pedGetPIN(std::vector<TouchButton>(),bypass,timeout,0,min_digits,max_digits,lang);
 1453  }
 1454 
 1459  int pedSetPINTimeout(unsigned short timeout_sec);
 1460 
 1463  void pedConfirmKey();
 1464 
 1465 
 1476  int pedStartPIN(const std::vector<TouchButton> &btn=std::vector<TouchButton>(),
 1477  int bypass_key=0,
 1478  int navigator_mode=0,
 1479  int minlen=4,
 1480  int maxlen=12,
 1481  bool clear_all=false,
 1482  bool auto_enter=false);
 1483 
 1484 
 1508  int pedPollPIN(PINStatus &pin, int &digits, int &status);
 1509 
 1512  int pedStopPIN();
 1513 
 1517  int pedSetPINInputParameter(bool clear_all);
 1518 
 1531  int pedSetPINInputParameter(unsigned pin_options,
 1532  const char *headline=0,
 1533  unsigned pwd_char=0,
 1534  unsigned bypass=BYPASS_DISABLED,
 1535  int interchar_timeout=0,
 1536  int min_digits=4,
 1537  int max_digits=12,
 1538  int dest=1);
 1539  // group sdiped
 1541 
 1545 
 1553  int secOpen(unsigned &handle, const std::string &hostname);
 1554 
 1558  int secClose(unsigned handle);
 1559 
 1567  int secEncrypt(unsigned handle, const bytevector &in, bytevector &out, bytevector *iv=0, bytevector *ksn=0);
 1568 
 1576  int secDecrypt(unsigned handle, const bytevector &in, bytevector &out, const bytevector *iv=0, bytevector *ksn=0);
 1577 
 1585  int secSign(unsigned handle, const bytevector &in, bytevector &out, bytevector *iv=0, bytevector *ksn=0);
 1586 
 1594  int secVerify(unsigned handle, const bytevector &in, const bytevector &sig, const bytevector *iv=0, bytevector *ksn=0);
 1595 
 1610  int secUpdateKey(unsigned handle, unsigned char keyType, const bytevector &key, bytevector *prop=0, const unsigned char *as2805=0, bytevector *key_kcv=0);
 1611 
 1627  int secUpdateKey(unsigned handle, unsigned char keyType, const bytevector &key, bytevector *prop, const unsigned char *as2805, bytevector *key_kcv, const bytevector *iv);
 1628 
 1634  int secSetKeySetID(unsigned handle, unsigned id, unsigned master_id=0);
 1635 
 1643  int secGetEncryptedPIN(unsigned handle,unsigned char fmt, bytevector &pinblock, bytevector &ksn, bool zero_pin=false);
 1644 
 1649  int secGetKeyInventory(unsigned handle, std::string &json);
 1650 
 1657  int secGetKeyData(unsigned handle, unsigned char keyType, bytevector &out, bool kek_flag=false);
 1658 
 1663  int secGetStatus(unsigned handle, std::string &json);
 1664 
 1669  int secGetStatus(const std::string &hostname, std::string &json);
 1670 
 1674  int secGetStatus(std::string &json) {
 1675  return secGetStatus("",json);
 1676  }
 1677 
 1681  int secGetVersions(std::string &version);
 1682  // group sdisec
 1684 
 1688 
 1706  int dataGetEncData(unsigned handle,
 1707  const bytevector &taglist,
 1708  const bytevector &appdata,
 1709  unsigned options,
 1710  bool useStoredTX,
 1711  bytevector &out,
 1712  bytevector *iv=0,
 1713  bytevector *ksn=0);
 1714 
 1737  int dataGetEncData(unsigned handle,
 1738  const bytevector &taglist,
 1739  const bytevector &appdata,
 1740  unsigned options,
 1741  bool useStoredTX,
 1742  bytevector &out,
 1743  bytevector *iv,
 1744  bytevector *ksn,
 1745  bool incrementKSN,
 1746  unsigned keysetID=0,
 1747  unsigned masterKeysetID=0);
 1748 
 1749 
 1751  struct PlaceHolder {
 1752  bytevector taglist;
 1753  bytevector appdata;
 1754  unsigned options;
 1755 #if __cplusplus >= 201103
 1756  PlaceHolder(const bytevector &taglist_, const bytevector &appdata_, unsigned options_)
 1757  : taglist(taglist_),
 1758  appdata(appdata_),
 1759  options(options_) {}
 1760  PlaceHolder() = default;
 1761 #endif
 1762  };
 1763 
 1778  int dataGetEncMsgData(unsigned handle,
 1779  const bytevector &msgtemplate,
 1780  const std::vector<PlaceHolder> &placeholder,
 1781  bool useStoredTX,
 1782  bytevector &out,
 1783  bytevector *iv=0,
 1784  bytevector *ksn=0);
 1806  int dataGetEncMsgData(unsigned handle,
 1807  const bytevector &msgtemplate,
 1808  const std::vector<PlaceHolder> &placeholder,
 1809  bool useStoredTX,
 1810  bytevector &out,
 1811  bytevector *iv,
 1812  bytevector *ksn,
 1813  bool incrementKSN,
 1814  unsigned keysetID=0,
 1815  unsigned masterKeysetID=0);
 1816 
 1826  int dataFetchTxnTags(const std::vector<unsigned> &taglist, bytevector &out, unsigned char mode=0, bool cleartext_date=false);
 1827 
 1838  int dataFetchTxnTags(const std::vector<unsigned> &taglist, bytevector &out,
 1839  unsigned char mode, bool cleartext_date,
 1840  unsigned options);
 1841 
 1844  int dataClearDataStore();
 1845 
 1855  int dataGetMsgSignature(unsigned handle,
 1856  const bytevector &msgtemplate,
 1857  const std::vector<PlaceHolder> &placeholder,
 1858  bool useStoredTX,
 1859  bytevector &out,
 1860  bytevector *iv=0,
 1861  bytevector *ksn=0);
 1862 
 1879  int dataGetMsgSignature(unsigned handle,
 1880  const bytevector &msgtemplate,
 1881  const std::vector<PlaceHolder> &placeholder,
 1882  bool useStoredTX,
 1883  bytevector &out,
 1884  bytevector *iv,
 1885  bytevector *ksn,
 1886  bool incrementKSN,
 1887  unsigned keysetID=0,
 1888  unsigned masterKeysetID=0);
 1889 
 1891  struct Matching {
 1892  std::string record;
 1893  unsigned char expirationCheck;
 1894  unsigned char luhnCheck;
 1895  unsigned char activationCheck;
 1896  };
 1897 
 1904  int dataPerformValidationChecks(const Array<3> &date, Matching &match, std::vector<Matching> *additional=0);
 1905 
 1913  int dataPerformValidationChecks(const Array<3> &date, const bytevector &iin, Matching &match, std::vector<Matching> *additional=0);
 1914 
 1918  int dataGetValidationInfo(std::string &out);
 1919 
 1925  int dataGetEncTxnData(const std::vector<unsigned> &taglist, bytevector &encrypted);
 1926 
 1927 
 1931  int dataSetEncTxnData(const bytevector &encrypted);
 1932 
 1935  int dataEndEncTxnData();
 1936 
 1940  int dataGetEmvInfo(EMVConf &emv);
 1941  // group sdidata
 1943 
 1947 
 1956  int vclRegistartSRED(bytevector &track1, bytevector &track2, bytevector &track3);
 1957 
 1961  int vclStatusRequest(bytevector &status);
 1962 
 1968  int vclAdvanceDDK(bytevector &track1, bytevector &track2, bytevector &track3);
 1969 
 1976  int vclRequestEParms(bytevector &eparms);
 1977 
 1986  int vclGetDiagnostic(unsigned format, unsigned page, std::string &diag);
 1987 
 1991  int vclGetKeyStatus(unsigned char &status);
 1992 
 1998  int vclOverrideMessageQuery(bytevector &track1, bytevector &track2, bytevector &track3);
 1999 
 2003  int vclKSNRequest(std::string &ksn);
 2004 
 2008  int vclKmailinRequest();
 2009  // group sdivcl
 2011 
 2015 
 2025  int emvCtInit(int aidCount=0, unsigned options=0);
 2026 
 2031  int emvCtExit(unsigned options=0);
 2032 
 2037  int emvCtSetTermData(const EMVConf &emv);
 2038 
 2043  int emvCtGetTermData(EMVConf &emv);
 2044 
 2050  int emvCtSetAppData(const bytevector &aid, const EMVConf &emv);
 2051 
 2056  int emvCtClearAppData(const bytevector &aid);
 2057 
 2061  int emvCtClearAllAppData();
 2062 
 2069  int emvCtSetTempAppData(const EMVConf &emv);
 2070 
 2076  int emvCtGetAppData(const bytevector &aid, EMVConf &emv);
 2077 
 2083  int emvCtGetAppData(bool first, EMVConf &emv);
 2084 
 2085 
 2095  int emvCtSetCAPKey(const Array<5> &rid, unsigned char index,
 2096  const bytevector &key, unsigned char exp,
 2097  const bytevector &hash=bytevector(),
 2098  const bytevector &revocationlist=bytevector());
 2099 
 2105  int emvCtClearCAPKey(const Array<5> &rid, unsigned char index);
 2106 
 2110  int emvCtClearAllCAPKey();
 2111 
 2116  int emvCtGetCAPKeys(std::vector<CAPKeyInfo> &keys);
 2117 
 2122  int emvCtApplyConfig(unsigned options=0);
 2123 
 2134  int emvCtAddVirtualMapEntry(int transaction, int currency, unsigned char vterminal);
 2135 
 2139  int emvCtClearVirtualMap();
 2140 
 2147  int emvCtSmartDetect(int timeout_ms);
 2148 
 2153  int emvCtActivate(bytevector *atr=0);
 2154 
 2160  int emvCtActivate(unsigned options, bytevector *atr=0);
 2161 
 2165  int emvCtDeactivate();
 2166 
 2171  int emvCtDeactivate(unsigned options);
 2172 
 2183  int emvCtStartTransaction(EMVTxn &out,
 2184  EMVTransaction type,
 2185  const BCD<6> amount,
 2186  const Array<3> &date,
 2187  const Array<3> &time,
 2188  const BCD<4> &counter,
 2189  const EMVTxn &optional=EMVTxn());
 2190 
 2196  int emvCtContinueOffline(EMVTxn &out, const EMVTxn &optional=EMVTxn());
 2197 
 2198 
 2206  int emvCtContinueOnline(EMVTxn &out,
 2207  bool onlineResult,
 2208  const Array<2> &authResp=Array<2>(),
 2209  const EMVTxn &optional=EMVTxn());
 2210 
 2220  int emvCtUpdateTxnTags(unsigned options, const EMVTxn &config);
 2221 
 2226  int emvCtEndTransaction(unsigned options=0);
 2227 
 2229  struct CTCandidateData {
 2230  unsigned char api;
 2231  unsigned char codeTableIndex;
 2232  unsigned char iin[4];
 2233  std::string iban;
 2234  std::string bic;
 2235  unsigned char country2[2];
 2236  unsigned char country3[3];
 2237  unsigned char aidLen;
 2238  bytevector asf;
 2239  bytevector selData;
 2240  };
 2241 
 2242 
 2248  int emvCtGetCandidateData(std::vector<CTCandidateData> &out);
 2249 
 2254  int emvCtSendOfflinePIN(unsigned short &chipresult);
 2255 
 2256  struct CTCandidate {
 2257  bytevector aid;
 2258  unsigned char api;
 2259  std::string text;
 2260  std::string text2;
 2261  unsigned char codeTableIndex;
 2264  unsigned char languagePref;
 2265  };
 2266 
 2267 
 2269  struct AdditionalCardTag {
 2270  unsigned tag;
 2271  EMVType type;
 2272  unsigned char minLen;
 2273  unsigned char maxLen;
 2274 #if __cplusplus >= 201103
 2275  AdditionalCardTag(unsigned tag_,
 2276  EMVType type_,
 2277  unsigned char minLen_,
 2278  unsigned char maxLen_)
 2279  : tag(tag_), type(type_), minLen(minLen_), maxLen(maxLen_) {}
 2280  AdditionalCardTag() = default;
 2281 #endif
 2282  };
 2283 
 2293  int emvCtCheckSupportedAID(const bytevector &aid,
 2294  unsigned char asi,
 2295  const std::string &defaultLabel,
 2296  std::vector<CTCandidate> &candlist,
 2297  unsigned short *sw12=0,
 2298  const std::vector<AdditionalCardTag> *adtCrdTags=0);
 2299 
 2304  int emvCtLED(bool ledState);
 2305 
 2312  int emvCtSendReceive(unsigned options, const bytevector &in, bytevector &out);
 2313  // group sdiemvct
 2315 
 2317 
 2327  int emvCtlsInit(int aidCount=0, unsigned options=0);
 2328 
 2333  int emvCtlsExit(unsigned options=0);
 2334 
 2339  int emvCtlsSetTermData(const EMVConf &emv);
 2340 
 2345  int emvCtlsGetTermData(EMVConf &emv);
 2346 
 2347 
 2354  int emvCtlsSetAppData(unsigned kernel_id, const bytevector &aid, const EMVConf &emv);
 2355 
 2361  int emvCtlsClearAppData(unsigned kernel_id, const bytevector &aid);
 2362 
 2366  int emvCtlsClearAllAppData();
 2367 
 2374  int emvCtlsSetTempAppData(unsigned kernel_id, const bytevector &aid, const EMVConf &emv);
 2375 
 2376 
 2383  int emvCtlsGetAppData(unsigned kernel_id, const bytevector &aid, EMVConf &emv);
 2384 
 2390  int emvCtlsGetAppData(bool first, EMVConf &emv);
 2391 
 2392 
 2402  int emvCtlsSetCAPKey(const Array<5> &rid, unsigned char index,
 2403  const bytevector &key, unsigned char exp,
 2404  const bytevector &hash=bytevector(),
 2405  const bytevector &revocationlist=bytevector());
 2406 
 2412  int emvCtlsClearCAPKey(const Array<5> &rid, unsigned char index);
 2413 
 2417  int emvCtlsClearAllCAPKey();
 2418 
 2423  int emvCtlsGetCAPKeys(std::vector<CAPKeyInfo> &keys);
 2424 
 2433  int emvCtlsApplyConfig(unsigned options=7);
 2434 
 2443  int emvCtlsAddVirtualMapEntry(int transaction, int currency, unsigned char vterminal);
 2444 
 2448  int emvCtlsClearVirtualMap();
 2449 
 2460  int emvCtlsSetupTransaction(EMVTxn &out,
 2461  EMVTransaction type,
 2462  const BCD<6> amount,
 2463  const Array<3> &date,
 2464  const Array<3> &time,
 2465  const BCD<4> &counter,
 2466  const EMVTxn &optional=EMVTxn());
 2467 
 2473  int emvCtlsContinueOffline(EMVTxn &out, unsigned options=0);
 2474 
 2482  int emvCtlsContinueOnline(EMVTxn &out,
 2483  bool onlineResult,
 2484  const Array<2> &authResp=Array<2>(),
 2485  const EMVTxn &optional=EMVTxn());
 2486 
 2491  int emvCtlsEndTransaction(unsigned options=0);
 2492 
 2494  struct CTLSCandidateData {
 2495  unsigned char api;
 2496  unsigned char iin[4];
 2497  std::string iban;
 2498  std::string bic;
 2499  unsigned char country2[2];
 2500  unsigned char country3[3];
 2501  unsigned char aidLen;
 2502  bytevector selData;
 2503  bytevector discData;
 2504  };
 2505 
 2506 
 2512  int emvCtlsGetCandidateData(std::vector<CTLSCandidateData> &out);
 2513 
 2517  int emvCtlsBreak();
 2518 
 2519 
 2525  int emvCtlsSmartReset(unsigned char readeropt=0, bytevector *atr=0);
 2526 
 2531  int emvCtlsSmartPowerOff(unsigned char options);
 2532 
 2536  int emvCtlsCardRemoval(unsigned timeout_ms);
 2537 
 2538 
 2545  int emvCtlsTransparentCommand(const bytevector &in, bytevector &out);
 2546 
 2552  int emvCtlsTransparentSend(const bytevector &in);
 2553 
 2559  int emvCtlsTransparentReceive(bytevector &out);
 2560 
 2565  int emvCtlsLEDMode(unsigned char mode);
 2566 
 2573  int emvCtlsLED(int led, unsigned char state);
 2574 
 2580  int emvCtlsSendReceive(const bytevector &in, bytevector &out);
 2581  // group sdiemvctls
 2583 
 2587 
 2595  int nfcInit(unsigned char conn_type);
 2596 
 2601  int nfcPing(bytevector &raw);
 2602 
 2607  int nfcGetVersion(std::string &version);
 2608 
 2612  int nfcConfigInit();
 2613 
 2617  int nfcOpen();
 2618 
 2622  int nfcClose();
 2623 
 2627  int nfcFieldOn();
 2628 
 2632  int nfcFieldOff();
 2633 
 2635  struct NFCCardCount {
 2636  unsigned char totalCount;
 2637  unsigned char cardACount;
 2638  unsigned char cardBCount;
 2639  unsigned char cardFCount;
 2640  };
 2641 
 2643  struct NFCCard {
 2644  unsigned char type;
 2645  bytevector info;
 2646  };
 2647 
 2649  struct NFCCardExt {
 2650  unsigned char type;
 2651  unsigned char SAK;
 2652  unsigned short ATQ;
 2653  unsigned typeFull;
 2654  bytevector info;
 2655  bytevector RFU;
 2656  };
 2657 
 2668  int nfcFieldPolling(unsigned tech_bm,
 2669  unsigned timeout,
 2670  const bytevector &in,
 2671  unsigned char &return_code,
 2672  NFCCardCount &card_count,
 2673  bytevector &out,
 2674  std::vector<NFCCard> &cards);
 2675 
 2686  int nfcFieldPollingExt(unsigned tech_bm,
 2687  unsigned timeout,
 2688  const bytevector &in,
 2689  unsigned char &return_code,
 2690  NFCCardCount &card_count,
 2691  bytevector &out,
 2692  std::vector<NFCCardExt> &cards);
 2693 
 2697  int nfcFieldCancelPolling();
 2698 
 2704  int nfcFieldActivation(unsigned modulation, const bytevector &info);
 2705 
 2710  int nfcFtechBaud(unsigned char baud);
 2711 
 2718  int nfcMifareAuthenticate(unsigned char blocknum,
 2719  unsigned char keytype,
 2720  const bytevector &key);
 2721 
 2729  int nfcMifareRead(unsigned char type,
 2730  unsigned char startblock,
 2731  unsigned char blockcount,
 2732  bytevector &out);
 2733 
 2741  int nfcMifareWrite(unsigned char type,
 2742  unsigned char startblock,
 2743  unsigned char blockcount,
 2744  const bytevector &in);
 2745 
 2751  int nfcMifareIncrement(unsigned char block, unsigned char value);
 2752 
 2758  int nfcMifareDecrement(unsigned char block, unsigned char value);
 2759 
 2765  int nfcMifareIncrementOnly(unsigned char block, unsigned char value);
 2766 
 2772  int nfcMifareDecrementOnly(unsigned char block, unsigned char value);
 2773 
 2778  int nfcMifareRestore(unsigned char block);
 2779 
 2784  int nfcMifareTransfer(unsigned char block);
 2785 
 2792  int nfcFelicaSendReceive(unsigned timeout, const bytevector &in, bytevector &out);
 2793 
 2794 
 2806  int nfcFelicaPolling(unsigned poll_timeout,
 2807  unsigned recv_timeout,
 2808  unsigned short system_code,
 2809  unsigned char req_code,
 2810  unsigned char time_slot,
 2811  Array<8> &uid,
 2812  Array<8> &pad,
 2813  unsigned short &system_code_out);
 2814 
 2821  int nfcApduSendReceive(const bytevector &in, bytevector &out, unsigned short &cardsw1sw2);
 2822 
 2829  int nfcTxRx(unsigned card_type, const bytevector &in, bytevector &out);
 2830  // group sdinfc
 2832 
 2836 
 2844  int vasSetTerminalConfig(const std::string &config);
 2845 
 2851  int vasGetTerminalConfig(const std::string &appid, std::string &config);
 2852 
 2858  int vasGetConfig(const std::string &appid, std::string &config);
 2859 
 2866  int vasActivate(const std::string &appid, const std::string &config, std::string &data);
 2867 
 2871  int vasCancel();
 2872 
 2878  int vasUpdateConfig(const std::string &appid, const std::string &config);
 2879 
 2884  int vasCancelConfig(const std::string &appid);
 2885 
 2891  int vasPreload(const std::string &appid, const std::string &config);
 2892 
 2897  int vasCancelPreload(const std::string &appid);
 2898 
 2905  int vasDecrypt(const std::string &appid, const std::string &cipher, std::string &plain);
 2906 
 2913  int vasAction(const std::string &appid, const std::string &in, std::string &out);
 2914 
 2915  // group sdinfc
 2920 
 2929  void setLogCallbacks(void *data, LogCallback error, LogCallback debug);
 2930  // group sdisetup
 2932 
 2936 
 2944  void setCallbackData(void *d);
 2945 
 2956  void setStatusCallback(void (*cb)(void *data, int digits, std::string &display));
 2957 
 2975  void setControlCallback(int (*cb)(void *data, TLV &t));
 2976 
 2988  void setNotifyCallback(void (*cb)(void *data, TLV &t));
 2989 
 3007  void setNavigatorCallback(void (*cb)(void *data, int status));
 3008 
 3009 
 3022  void setCardDetectCallback(void (*cb)(void *data, int retcode, unsigned char tec_out,
 3023  EMVTxn &emv_out, bytevector &plugin_result));
 3024 
 3025 
 3037  void setEMVCallback(void (*cb)(void *data, unsigned type, EMVTxn &in, EMVTxn &out));
 3038 
 3039 
 3050  void setAsyncCardDetectEmvCallback(void (*cb)(void *data, unsigned type, EMVTxn &in));
 3051 
 3058  void setCardRemovalCallback(void (*cb)(void *data));
 3059 
 3065  void setDisconnectCallback(void (*cb)(void *data));
 3066  // group sdicallback
 3068 
 3069 
 3073 
 3084  int pluginCmd(unsigned char plugin, unsigned char cmd, bytevector &in, bytevector &out);
 3085  // group sdiplugin
 3087 
 3088 
 3089 };
 3090 
 3091 } // namespace vfisdi
 3092 
 3093 #undef DllSpec
 3094 
 3095 #endif
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://sandbox-docs.verifone.com/adk-5.0-programmers-guide/sdi_8h_source.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
