VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Common/EMVCard.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/EMVCard.h')
-rw-r--r--src/Common/EMVCard.h69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/Common/EMVCard.h b/src/Common/EMVCard.h
new file mode 100644
index 00000000..116de705
--- /dev/null
+++ b/src/Common/EMVCard.h
@@ -0,0 +1,69 @@
+#ifndef TC_HEADER_Common_EMVCard
+#define TC_HEADER_Common_EMVCard
+
+#include "Platform/PlatformBase.h"
+#if defined (TC_WINDOWS) && !defined (TC_PROTOTYPE)
+# include "Exception.h"
+#else
+# include "Platform/Exception.h"
+#endif
+
+#include "Token.h"
+#include "SCard.h"
+
+namespace VeraCrypt
+{
+ typedef enum EMVCardType
+ {
+ NONE = 0,
+ AMEX,
+ MASTERCARD,
+ VISA
+ } EMVCardType;
+
+ class EMVCard : public SCard
+ {
+ protected:
+
+ // The following fields will only be empty if the card has not been read yet.
+ // After the card has been read, and if some or all fields cannot be read, the EMVCard
+ // object will be considered invalid and will not be included in the list of available cards
+ // of EMVToken.
+ vector<byte> m_aid;
+ vector<vector<byte>> m_supportedAids;
+ vector<byte> m_iccCert;
+ vector<byte> m_issuerCert;
+ vector<byte> m_cplcData;
+ wstring m_lastPANDigits;
+
+ public:
+
+ // Add other AIDS
+ // https://gist.github.com/pvieito/6224eed92c99b069f6401996c548d0e4
+ // https://ambimat.com/developer-resources/list-of-application-identifiers-aid/
+ const static byte AMEX_AID[7];
+ const static byte MASTERCARD_AID[7];
+ const static byte VISA_AID[7];
+ const static map<EMVCardType, vector<byte>> SUPPORTED_AIDS;
+
+ EMVCard();
+ EMVCard(size_t slotId);
+ EMVCard(const EMVCard& other);
+ EMVCard(EMVCard&& other);
+ EMVCard& operator = (const EMVCard& other);
+ EMVCard& operator = (EMVCard&& other);
+ virtual ~EMVCard();
+
+ void Clear(void);
+
+ // Retrieves the card's AID.
+ // It first checks the card against a list of supported AIDs.
+ // If that fails, it tries getting the AID from the card using PSE
+ vector<byte> GetCardAID(bool forceContactless = false);
+
+ void GetCardContent(vector<byte>& iccCert, vector<byte>& issuerCert, vector<byte>& cplcData);
+ void GetCardPAN(wstring& lastPANDigits);
+ };
+}
+
+#endif // TC_HEADER_Common_EMVCard