VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Common/CommandAPDU.h
blob: 98825faaccf307a31f0289bf3b1a5e916c513180 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#ifndef TC_HEADER_Common_CommandAPDU
#define TC_HEADER_Common_CommandAPDU

#include "Platform/PlatformBase.h"
#include <stdarg.h>

namespace VeraCrypt
{
	inline const std::string vformat(const char* zcFormat, ...)
	{
		if (zcFormat)
		{
			va_list vaArgs;
			va_start(vaArgs, zcFormat);

			const int iLen = vsnprintf(NULL, 0, zcFormat, vaArgs);
			va_end(vaArgs);

			if (iLen)
			{
				std::vector<char> zc((size_t)iLen + 1);
				va_start(vaArgs, zcFormat);
				vsnprintf(zc.data(), zc.size(), zcFormat, vaArgs);
				va_end(vaArgs);

				return std::string(zc.data(), iLen);
			}
		}
	
		return "";
	}

	class CommandAPDU 
	{
	protected:

		vector<byte> m_apdu;
		uint32 m_nc;
		uint32 m_ne;
		uint32 m_dataOffset;
		bool m_isExtendedAPDU;
		std::string m_parsingErrorStr;
		bool m_parsedSuccessfully;

		void parse();
		void init(byte cla, byte ins, byte p1, byte p2, const byte* data, uint32 dataOffset, uint32 dataLength, uint32 ne);
		void setHeader(byte cla, byte ins, byte p1, byte p2);

	public:

		void clear();

		CommandAPDU();

		CommandAPDU(byte cla, byte ins, byte p1, byte p2, const byte* data, uint32 dataOffset, uint32 dataLength, uint32 ne);

		CommandAPDU(byte cla, byte ins, byte p1, byte p2);

		CommandAPDU(byte cla, byte ins, byte p1, byte p2, uint32 ne);

		CommandAPDU(byte cla, byte ins, byte p1, byte p2, const vector<byte>& data);

		CommandAPDU(byte cla, byte ins, byte p1, byte p2, const byte* data, uint32 dataOffset, uint32 dataLength);

		CommandAPDU(byte cla, byte ins, byte p1, byte p2, const vector<byte>& data, uint32 ne);

		CommandAPDU(const vector<byte>& apdu);

		byte getCLA();

		byte getINS();

		byte getP1();

		byte getP2();

		uint32 getNc();

		const vector<byte> getData();

		uint32 getNe();

		const vector<byte> getAPDU();

		bool isValid();

		std::string getErrorStr();

		bool isExtended();
	};
};

#endif // TC_HEADER_Common_CommandAPDU