emv_decoder.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #include <stdint.h>
  2. #include <stdbool.h>
  3. #include <string.h>
  4. #define MAX_APDU_LEN 255
  5. #define EMV_TAG_APP_TEMPLATE 0x61
  6. #define EMV_TAG_AID 0x4F
  7. #define EMV_TAG_PRIORITY 0x87
  8. #define EMV_TAG_PDOL 0x9F38
  9. #define EMV_TAG_CARD_NAME 0x50
  10. #define EMV_TAG_FCI 0xBF0C
  11. #define EMV_TAG_LOG_CTRL 0x9F4D
  12. #define EMV_TAG_CARD_NUM 0x57
  13. #define EMV_TAG_PAN 0x5A
  14. #define EMV_TAG_AFL 0x94
  15. typedef struct {
  16. uint16_t tag;
  17. uint8_t data[];
  18. } PDOLValue;
  19. extern const PDOLValue* pdol_values[];
  20. typedef struct {
  21. uint8_t size;
  22. uint8_t data[MAX_APDU_LEN];
  23. } APDU;
  24. typedef struct {
  25. uint8_t priority;
  26. uint8_t aid[16];
  27. uint8_t aid_len;
  28. char name[32];
  29. uint8_t card_number[8];
  30. APDU pdol;
  31. APDU afl;
  32. } EmvApplication;
  33. uint16_t emv_prepare_select_ppse(uint8_t* dest);
  34. bool emv_decode_ppse_response(uint8_t* buff, uint16_t len, EmvApplication* app);
  35. uint16_t emv_prepare_select_app(uint8_t* dest, EmvApplication* app);
  36. bool emv_decode_select_app_response(uint8_t* buff, uint16_t len, EmvApplication* app);
  37. uint16_t emv_prepare_get_proc_opt(uint8_t* dest, EmvApplication* app);
  38. bool emv_decode_get_proc_opt(uint8_t* buff, uint16_t len, EmvApplication* app);
  39. uint16_t emv_prepare_read_sfi_record(uint8_t* dest, uint8_t sfi, uint8_t record_num);
  40. bool emv_decode_read_sfi_record(uint8_t* buff, uint16_t len, EmvApplication* app);