emv.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #pragma once
  2. #include <furi_hal_nfc.h>
  3. #define MAX_APDU_LEN 255
  4. #define EMV_TAG_APP_TEMPLATE 0x61
  5. #define EMV_TAG_AID 0x4F
  6. #define EMV_TAG_PRIORITY 0x87
  7. #define EMV_TAG_PDOL 0x9F38
  8. #define EMV_TAG_CARD_NAME 0x50
  9. #define EMV_TAG_FCI 0xBF0C
  10. #define EMV_TAG_LOG_CTRL 0x9F4D
  11. #define EMV_TAG_CARD_NUM 0x57
  12. #define EMV_TAG_PAN 0x5A
  13. #define EMV_TAG_AFL 0x94
  14. #define EMV_TAG_EXP_DATE 0x5F24
  15. #define EMV_TAG_COUNTRY_CODE 0x5F28
  16. #define EMV_TAG_CURRENCY_CODE 0x9F42
  17. #define EMV_TAG_CARDHOLDER_NAME 0x5F20
  18. typedef struct {
  19. char name[32];
  20. uint8_t aid[16];
  21. uint16_t aid_len;
  22. uint8_t number[10];
  23. uint8_t number_len;
  24. uint8_t exp_mon;
  25. uint8_t exp_year;
  26. uint16_t country_code;
  27. uint16_t currency_code;
  28. } EmvData;
  29. typedef struct {
  30. uint16_t tag;
  31. uint8_t data[];
  32. } PDOLValue;
  33. typedef struct {
  34. uint8_t size;
  35. uint8_t data[MAX_APDU_LEN];
  36. } APDU;
  37. typedef struct {
  38. uint8_t priority;
  39. uint8_t aid[16];
  40. uint8_t aid_len;
  41. char name[32];
  42. bool name_found;
  43. uint8_t card_number[10];
  44. uint8_t card_number_len;
  45. uint8_t exp_month;
  46. uint8_t exp_year;
  47. uint16_t country_code;
  48. uint16_t currency_code;
  49. APDU pdol;
  50. APDU afl;
  51. } EmvApplication;
  52. /** Read bank card data
  53. * @note Search EMV Application, start it, try to read AID, PAN, card name,
  54. * expiration date, currency and country codes
  55. *
  56. * @param tx_rx FuriHalNfcTxRxContext instance
  57. * @param emv_app EmvApplication instance
  58. *
  59. * @return true on success
  60. */
  61. bool emv_read_bank_card(FuriHalNfcTxRxContext* tx_rx, EmvApplication* emv_app);
  62. /** Search for EMV Application
  63. *
  64. * @param tx_rx FuriHalNfcTxRxContext instance
  65. * @param emv_app EmvApplication instance
  66. *
  67. * @return true on success
  68. */
  69. bool emv_search_application(FuriHalNfcTxRxContext* tx_rx, EmvApplication* emv_app);
  70. /** Emulate bank card
  71. * @note Answer to application selection and PDOL
  72. *
  73. * @param tx_rx FuriHalNfcTxRxContext instance
  74. *
  75. * @return true on success
  76. */
  77. bool emv_card_emulation(FuriHalNfcTxRxContext* tx_rx);