1 //-----------------------------------------------------------------------------
2 // Copyright (C) 2017 Merlok
4 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
5 // at your option, any later version. See the LICENSE.txt file for the text of
7 //-----------------------------------------------------------------------------
8 // EMV core functionality
9 //-----------------------------------------------------------------------------
19 // maximum APDU lengths. Long APDUs not yet supported/needed
20 #define APDU_DATA_LEN 255
21 #define APDU_COMMAND_LEN (4 + 1 + APDU_DATA_LEN + 1)
22 #define APDU_RESPONSE_LEN (256 + 2)
29 enum TransactionType
{
31 TT_VSDC
, // not standart for contactless!!!!
35 extern char *TransactionTypeStr
[];
48 extern enum CardPSVendor
GetCardPSVendor(uint8_t * AID
, size_t AIDlen
);
50 extern void DropFieldEx(EMVCommandChannel channel
);
52 extern bool TLVPrintFromBuffer(uint8_t *data
, int datalen
);
53 extern void TLVPrintFromTLV(struct tlvdb
*tlv
);
54 extern void TLVPrintFromTLVLev(struct tlvdb
*tlv
, int level
);
55 extern void TLVPrintAIDlistFromSelectTLV(struct tlvdb
*tlv
);
57 extern struct tlvdb
*GetPANFromTrack2(const struct tlv
*track2
);
58 extern struct tlvdb
*GetdCVVRawFromTrack2(const struct tlv
*track2
);
60 extern void SetAPDULogging(bool logging
);
63 extern int EMVExchangeEx(EMVCommandChannel channel
, bool ActivateField
, bool LeaveFieldON
, uint8_t *apdu
, int apdu_len
, uint8_t *Result
, size_t MaxResultLen
, size_t *ResultLen
, uint16_t *sw
, struct tlvdb
*tlv
);
66 extern int EMVSearchPSE(EMVCommandChannel channel
, bool ActivateField
, bool LeaveFieldON
, uint8_t PSENum
, bool decodeTLV
, struct tlvdb
*tlv
);
67 extern int EMVSearch(EMVCommandChannel channel
, bool ActivateField
, bool LeaveFieldON
, bool decodeTLV
, struct tlvdb
*tlv
);
68 extern int EMVSelectPSE(EMVCommandChannel channel
, bool ActivateField
, bool LeaveFieldON
, uint8_t PSENum
, uint8_t *Result
, size_t MaxResultLen
, size_t *ResultLen
, uint16_t *sw
);
69 extern int EMVSelect(EMVCommandChannel channel
, bool ActivateField
, bool LeaveFieldON
, uint8_t *AID
, size_t AIDLen
, uint8_t *Result
, size_t MaxResultLen
, size_t *ResultLen
, uint16_t *sw
, struct tlvdb
*tlv
);
71 extern int EMVSelectApplication(struct tlvdb
*tlv
, uint8_t *AID
, size_t *AIDlen
);
72 // Get Processing Options
73 extern int EMVGPO(EMVCommandChannel channel
, bool LeaveFieldON
, uint8_t *PDOL
, size_t PDOLLen
, uint8_t *Result
, size_t MaxResultLen
, size_t *ResultLen
, uint16_t *sw
, struct tlvdb
*tlv
);
74 extern int EMVReadRecord(EMVCommandChannel channel
, bool LeaveFieldON
, uint8_t SFI
, uint8_t SFIrec
, uint8_t *Result
, size_t MaxResultLen
, size_t *ResultLen
, uint16_t *sw
, struct tlvdb
*tlv
);
76 extern int EMVGenerateChallenge(EMVCommandChannel channel
, bool LeaveFieldON
, uint8_t *Result
, size_t MaxResultLen
, size_t *ResultLen
, uint16_t *sw
, struct tlvdb
*tlv
);
77 extern int EMVAC(EMVCommandChannel channel
, bool LeaveFieldON
, uint8_t RefControl
, uint8_t *CDOL
, size_t CDOLLen
, uint8_t *Result
, size_t MaxResultLen
, size_t *ResultLen
, uint16_t *sw
, struct tlvdb
*tlv
);
79 extern int EMVInternalAuthenticate(EMVCommandChannel channel
, bool LeaveFieldON
, uint8_t *DDOL
, size_t DDOLLen
, uint8_t *Result
, size_t MaxResultLen
, size_t *ResultLen
, uint16_t *sw
, struct tlvdb
*tlv
);
81 int MSCComputeCryptoChecksum(EMVCommandChannel channel
, bool LeaveFieldON
, uint8_t *UDOL
, uint8_t UDOLlen
, uint8_t *Result
, size_t MaxResultLen
, size_t *ResultLen
, uint16_t *sw
, struct tlvdb
*tlv
);
83 extern int trSDA(struct tlvdb
*tlv
);
84 extern int trDDA(EMVCommandChannel channel
, bool decodeTLV
, struct tlvdb
*tlv
);
85 extern int trCDA(struct tlvdb
*tlv
, struct tlvdb
*ac_tlv
, struct tlv
*pdol_data_tlv
, struct tlv
*ac_data_tlv
);
87 extern int RecoveryCertificates(struct tlvdb
*tlvRoot
, json_t
*root
);
89 extern struct emv_pk
*get_ca_pk(struct tlvdb
*db
);