VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Common/TLVParser.h
blob: b989ca41add701761d0c6e1f76a117321390a173 (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
#ifndef TC_HEADER_Common_TLVPARSER
#define TC_HEADER_Common_TLVPARSER

#include "Platform/PlatformBase.h"
#include "Tcdefs.h"

namespace VeraCrypt
{
	struct TLVNode
	{
		uint16 Tag;							/*	T 	*/
		uint16 Length;						/*	L 	*/
		shared_ptr<vector<byte>> Value;		/*	V 	*/
		byte TagSize;
		byte LengthSize;
		uint16 MoreFlag;					/* Used In Sub */
		uint16 SubFlag;						/* Does it have sub-nodes? */
		shared_ptr<vector<shared_ptr<TLVNode>>> Subs;

		TLVNode() : Tag(0), Length(0), TagSize(0), LengthSize(0), MoreFlag(0), SubFlag(0)
		{
			Value = make_shared<vector<byte>>();
			Subs = make_shared<vector<shared_ptr<TLVNode>>>();
		}

		~TLVNode()
		{
			burn(Value->data(), Value->size());
		}
	};

	class TLVParser
	{
	private :

		/* TLV node structure creation */
		static shared_ptr<TLVNode> TLV_CreateNode();

		/* Check if the bit is correct */
		static uint16 CheckBit(byte value, int bit);

		/* Parsing one TLV node */
		static shared_ptr<TLVNode> TLV_Parse_One(byte* buf, size_t size);

		/* Parsing all TLV nodes */
		static int TLV_Parse_SubNodes(shared_ptr<TLVNode> parent);

		/* Parsing all sub-nodes (in width not in depth) of a given parent node */
		static int TLV_Parse_All(shared_ptr<TLVNode> parent);

		/* Recursive function to parse all nodes starting from a root parent node */
		static void TLV_Parse_Sub(shared_ptr<TLVNode> parent);

	public:

		/* Parsing TLV from a buffer and constructing TLV structure */
		static shared_ptr<TLVNode> TLV_Parse(byte* buf, size_t size);

		/* Finding a TLV node with a particular tag */
		static shared_ptr<TLVNode> TLV_Find(shared_ptr<TLVNode> node, uint16 tag);
	};

	/* The definition of the exception class related to the TLV parsing */
	class TLVException
	{
	public:
		TLVException(std::string errormessage): m_errormessage(errormessage){}

		/* Get the error message */
		inline std::string ErrorMessage() const
		{
			return m_errormessage;
		}

	protected:
		std::string m_errormessage;
	};
}

#endif //TC_HEADER_Common_TLVPARSER
l repair = false); bool CheckVolumePathNotEmpty () const; void DismountVolume (shared_ptr <VolumeInfo> volume = shared_ptr <VolumeInfo> ()); const UserPreferences &GetPreferences () const { return Gui->GetPreferences(); } shared_ptr <VolumeInfo> GetSelectedVolume () const; shared_ptr <VolumePath> GetSelectedVolumePath () const { return make_shared <VolumePath> (wstring (VolumePathComboBox->GetValue())); } void InitControls (); void InitEvents (); void InitMessageFilter (); void InitPreferences (); void InitTaskBarIcon (); bool IsFreeSlotSelected () const { return SlotListCtrl->GetSelectedItemCount() == 1 && Gui->GetListCtrlSubItemText (SlotListCtrl, SelectedItemIndex, ColumnPath).empty(); } bool IsMountedSlotSelected () const { return SlotListCtrl->GetSelectedItemCount() == 1 && !Gui->GetListCtrlSubItemText (SlotListCtrl, SelectedItemIndex, ColumnPath).empty(); } void LoadFavoriteVolumes (); void LoadPreferences (); void MountAllDevices (); void MountAllFavorites (); void MountVolume (); void OnAboutMenuItemSelected (wxCommandEvent& event); void OnQuit(wxCommandEvent& event) { Close(true); } void OnActivate (wxActivateEvent& event); void OnAddAllMountedToFavoritesMenuItemSelected (wxCommandEvent& event); void OnAddToFavoritesMenuItemSelected (wxCommandEvent& event); void OnBackupVolumeHeadersMenuItemSelected (wxCommandEvent& event); void OnBeginnersTutorialMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"tutorial"); } void OnBenchmarkMenuItemSelected (wxCommandEvent& event); void OnChangeKeyfilesMenuItemSelected (wxCommandEvent& event) { ChangePassword (ChangePasswordDialog::Mode::ChangeKeyfiles); } void OnChangePasswordMenuItemSelected (wxCommandEvent& event) { ChangePassword (); } void OnChangePkcs5PrfMenuItemSelected (wxCommandEvent& event) { ChangePassword (ChangePasswordDialog::Mode::ChangePkcs5Prf); } void OnCheckFilesystemMenuItemSelected( wxCommandEvent& event ) { CheckFilesystem (); } void OnClearSlotSelectionMenuItemSelected (wxCommandEvent& event); void OnClose (wxCloseEvent& event); void OnCloseAllSecurityTokenSessionsMenuItemSelected (wxCommandEvent& event); void OnDonateMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"donate"); } void OnContactMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"contact"); } void OnCreateKeyfileMenuItemSelected (wxCommandEvent& event) { #ifdef TC_MACOSX if (Gui->IsInBackgroundMode()) Gui->SetBackgroundMode (false); #endif Gui->CreateKeyfile(); } void OnCreateVolumeButtonClick (wxCommandEvent& event); void OnDefaultKeyfilesMenuItemSelected (wxCommandEvent& event); void OnDefaultMountParametersMenuItemSelected( wxCommandEvent& event ); void OnDismountAllButtonClick (wxCommandEvent& event); void OnDismountVolumeMenuItemSelected (wxCommandEvent& event) { DismountVolume(); } void OnDownloadsMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"downloads"); } void OnEncryptionTestMenuItemSelected (wxCommandEvent& event); void OnExitButtonClick (wxCommandEvent& event); void OnFavoriteVolumeMenuItemSelected (wxCommandEvent& event); void OnFaqMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"faq"); } void OnHiddenVolumeProtectionTriggered (shared_ptr <VolumeInfo> protectedVolume); void OnHotkey (wxKeyEvent& event); void OnHotkeysMenuItemSelected (wxCommandEvent& event); void OnLegalNoticesMenuItemSelected (wxCommandEvent& event); void OnListChanged (); void OnListItemActivated (wxListEvent& event); void OnListItemDeleted (long itemIndex); void OnListItemDeselected (wxListEvent& event); void OnListItemInserted (long itemIndex); void OnListItemRightClick (wxListEvent& event); void OnListItemSelected (wxListEvent& event); void OnListItemSelectionChanged (); void OnLogoBitmapClick (wxMouseEvent &event) { wxCommandEvent ev; OnAboutMenuItemSelected (ev); } void OnManageSecurityTokenKeyfilesMenuItemSelected (wxCommandEvent& event); void OnMountAllDevicesButtonClick (wxCommandEvent& event); void OnMountAllFavoritesMenuItemSelected (wxCommandEvent& event); void OnMountVolumeMenuItemSelected (wxCommandEvent& event) { MountVolume(); } void OnNewsMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"news"); } void OnNoHistoryCheckBoxClick (wxCommandEvent& event); void OnOnlineHelpMenuItemSelected (wxCommandEvent& event) { Gui->OpenOnlineHelp (this); } void OnOpenVolumeMenuItemSelected (wxCommandEvent& event) { OpenSelectedVolume(); } void OnOpenVolumeSystemRequest (wxCommandEvent& event); void OnOpenVolumeSystemRequestEvent (EventArgs &args); void OnOrganizeFavoritesMenuItemSelected (wxCommandEvent& event); void OnPreferencesMenuItemSelected (wxCommandEvent& event); void OnPreferencesUpdated (wxCommandEvent& event); void OnPreferencesUpdatedEvent (EventArgs &args) { wxQueueEvent (this, new wxCommandEvent( wxEVT_COMMAND_PREF_UPDATED,0)); } void OnRemoveKeyfilesMenuItemSelected (wxCommandEvent& event) { ChangePassword (ChangePasswordDialog::Mode::RemoveAllKeyfiles); } void OnRepairFilesystemMenuItemSelected( wxCommandEvent& event ) { CheckFilesystem (true); } void OnRestoreVolumeHeaderMenuItemSelected (wxCommandEvent& event); void OnSecurityTokenPreferencesMenuItemSelected (wxCommandEvent& event); void OnSelectDeviceAndMountMenuItemSelected (wxCommandEvent& event); void OnSelectDeviceButtonClick (wxCommandEvent& event); void OnSelectFileAndMountMenuItemSelected (wxCommandEvent& event); void OnSelectFileButtonClick (wxCommandEvent& event); void OnTimer (); void OnVersionHistoryMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"history"); } void OnVolumePropertiesButtonClick (wxCommandEvent& event); void OnVolumeToolsButtonClick (wxCommandEvent& event); void OnVolumeButtonClick (wxCommandEvent& event); void OnUpdateVolumeList (wxCommandEvent& event) { UpdateVolumeList(); } void OnVolumeDismounted (EventArgs &args) { wxQueueEvent (this, new wxCommandEvent( wxEVT_COMMAND_UPDATE_VOLUME_LIST,0)); } void OnVolumeMounted (EventArgs &args) { wxQueueEvent (this, new wxCommandEvent( wxEVT_COMMAND_UPDATE_VOLUME_LIST,0)); } void OnUserGuideMenuItemSelected (wxCommandEvent& event) { Gui->OpenUserGuide (this); } void OnWebsiteMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"website"); } void OnWipeCacheButtonClick (wxCommandEvent& event); void OrganizeFavorites (const FavoriteVolumeList &favorites, size_t newItemCount = 0); void OpenSelectedVolume () const; void SavePreferences () const; long SlotNumberToItemIndex (uint32 slotNumber) const; void SetVolumePath (const VolumePath &path) { VolumePathComboBox->SetValue (wstring (path)); } void ShowTaskBarIcon (bool show = true); void UpdateControls (); void UpdateVolumeList (); void UpdateWipeCacheButton (); void WipeCache (); struct VolumeActivityMapEntry { VolumeActivityMapEntry () { } VolumeActivityMapEntry (const VolumeInfo &volume, wxLongLong lastActivityTime) : LastActivityTime (lastActivityTime), SerialInstanceNumber (volume.SerialInstanceNumber), TotalDataRead (volume.TotalDataRead), TotalDataWritten (volume.TotalDataWritten) { } wxLongLong LastActivityTime; uint64 SerialInstanceNumber; uint64 TotalDataRead; uint64 TotalDataWritten; }; map <int, FavoriteVolume> FavoriteVolumesMenuMap; bool ListItemRightClickEventPending; VolumeInfoList MountedVolumes; auto_ptr <wxTaskBarIcon> mTaskBarIcon; auto_ptr <wxTimer> mTimer; long SelectedItemIndex; VolumeSlotNumber SelectedSlotNumber; int ShowRequestFifo; map <wstring, VolumeActivityMapEntry> VolumeActivityMap; }; } #endif // TC_HEADER_Main_Forms_MainFrame