/* Derived from source code of TrueCrypt 7.1a, which is Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed by the TrueCrypt License 3.0. Modifications and additions to the original source code (contained in this file) and all other portions of this file are Copyright (c) 2013-2017 IDRIX and are governed by the Apache License 2.0 the full text of which is contained in the file License.txt included in VeraCrypt binary and source code distribution packages. */ #ifndef TC_HEADER_Main_Forms_PasswordPanel #define TC_HEADER_Main_Forms_PasswordPanel #include "Forms.h" #include "Platform/Functor.h" #include "Main/Main.h" namespace VeraCrypt { class VolumePasswordPanel : public VolumePasswordPanelBase { public: VolumePasswordPanel (wxWindow* parent, MountOptions* options, shared_ptr password, bool disableTruecryptMode, shared_ptr keyfiles, bool enableCache = false, bool enablePassword = true, bool enableKeyfiles = true, bool enableConfirmation = false, bool enablePkcs5Prf = false, bool isMountPassword = false, const wxString &passwordLabel = wxString()); virtual ~VolumePasswordPanel (); void AddKeyfile (shared_ptr keyfile); shared_ptr GetKeyfiles () const { return UseKeyfilesCheckBox->IsChecked() ? Keyfiles : shared_ptr (); } shared_ptr GetPassword (bool bForceLegacyPassword = false) const; shared_ptr GetPkcs5Kdf (bool &bUnsupportedKdf) const; shared_ptr GetPkcs5Kdf (bool bTrueCryptMode, bool &bUnsupportedKdf) const; int GetVolumePim () const; bool GetTrueCryptMode () const; void SetTrueCryptMode (bool trueCryptMode); int GetHeaderWipeCount () const; void SetCacheCheckBoxValidator (const wxGenericValidator &validator) { CacheCheckBox->SetValidator (validator); } void SetFocusToPasswordTextCtrl () { PasswordTextCtrl->SetSelection (-1, -1); PasswordTextCtrl->SetFocus(); } void SetFocusToPimTextCtrl () { VolumePimTextCtrl->SetSelection (-1, -1); VolumePimTextCtrl->SetFocus(); } void SetVolumePim (int pim); bool PasswordsMatch () const; void EnableUsePim () { PimCheckBox->Enable (true); PimCheckBox->Show (true); } bool IsUsePimChecked () const { return PimCheckBox->GetValue (); } void SetUsePimChecked (bool checked) const { PimCheckBox->SetValue (checked); } bool UpdatePimHelpText (bool pimChanged); Event UpdateEvent; protected: void SetPimValidator (); void DisplayPassword (bool display, wxTextCtrl **textCtrl, int row); shared_ptr GetPassword (wxTextCtrl *textCtrl, bool bLegacyPassword = false) const; void OnAddKeyfileDirMenuItemSelected (wxCommandEvent& event); void OnAddKeyfilesMenuItemSelected (wxCommandEvent& event); void OnAddSecurityTokenSignatureMenuItemSelected (wxCommandEvent& event); void OnDisplayPasswordCheckBoxClick (wxCommandEvent& event); void OnKeyfilesButtonClick (wxCommandEvent& event); void OnKeyfilesButtonRightClick (wxMouseEvent& event); void OnKeyfilesButtonRightDown (wxMouseEvent& event); void OnTextChanged (wxCommandEvent& event) { OnUpdate(); } void OnPimChanged (wxCommandEvent& event) { OnUpdate(); } void OnUsePimCheckBoxClick( wxCommandEvent& event ); void OnUpdate () { UpdateEvent.Raise(); } void OnUseKeyfilesCheckBoxClick (wxCommandEvent& event) { OnUpdate(); } void WipeTextCtrl (wxTextCtrl *textCtrl); void OnTrueCryptModeChecked( wxCommandEvent& event ); shared_ptr Keyfiles; shared_ptr UpdateCallback; bool EnablePimEntry; }; } #endif // TC_HEADER_Main_Forms_PasswordPanel /a> 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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
/*
 Derived from source code of TrueCrypt 7.1a, which is
 Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed
 by the TrueCrypt License 3.0.

 Modifications and additions to the original source code (contained in this file)
 and all other portions of this file are Copyright (c) 2013-2017 IDRIX
 and are governed by the Apache License 2.0 the full text of which is
 contained in the file License.txt included in VeraCrypt binary and source
 code distribution packages.
*/

#ifndef TC_HEADER_Volume_VolumeHeader
#define TC_HEADER_Volume_VolumeHeader

#include "Common/Tcdefs.h"
#include "Common/Volumes.h"
#include "Platform/Platform.h"
#include "Volume/EncryptionAlgorithm.h"
#include "Volume/EncryptionMode.h"
#include "Volume/Keyfile.h"
#include "Volume/VolumePassword.h"
#include "Volume/Pkcs5Kdf.h"
#include "Version.h"


// For specifications of the volume header see Common/Volumes.c

namespace VeraCrypt
{
	typedef uint64 VolumeTime;

	struct VolumeType
	{
		enum Enum
		{
			Unknown,
			Normal,
			Hidden
		};
	};

	struct VolumeHeaderCreationOptions
	{
		ConstBufferPtr DataKey;
		shared_ptr <EncryptionAlgorithm> EA;
		shared_ptr <Pkcs5Kdf> Kdf;
		ConstBufferPtr HeaderKey;
		ConstBufferPtr Salt;
		uint32 SectorSize;
		uint64 VolumeDataSize;
		uint64 VolumeDataStart;
		VolumeType::Enum Type;
	};

	class VolumeHeader
	{
	public:
		VolumeHeader (uint32 HeaderSize);
		virtual ~VolumeHeader ();

		void Create (const BufferPtr &headerBuffer, VolumeHeaderCreationOptions &options);
		bool Decrypt (const ConstBufferPtr &encryptedData, const VolumePassword &password, int pim, shared_ptr <Pkcs5Kdf> kdf, bool truecryptMode, const Pkcs5KdfList &keyDerivationFunctions, const EncryptionAlgorithmList &encryptionAlgorithms, const EncryptionModeList &encryptionModes);
		void EncryptNew (const BufferPtr &newHeaderBuffer, const ConstBufferPtr &newSalt, const ConstBufferPtr &newHeaderKey, shared_ptr <Pkcs5Kdf> newPkcs5Kdf);
		uint64 GetEncryptedAreaStart () const { return EncryptedAreaStart; }
		uint64 GetEncryptedAreaLength () const { return EncryptedAreaLength; }
		shared_ptr <EncryptionAlgorithm> GetEncryptionAlgorithm () const { return EA; }
		uint32 GetFlags () const { return Flags; }
		VolumeTime GetHeaderCreationTime () const { return HeaderCreationTime; }
		uint64 GetHiddenVolumeDataSize () const { return HiddenVolumeDataSize; }
		static size_t GetLargestSerializedKeySize ();
		shared_ptr <Pkcs5Kdf> GetPkcs5Kdf () const { return Pkcs5; }
		uint16 GetRequiredMinProgramVersion () const { return RequiredMinProgramVersion; }
		size_t GetSectorSize () const { return SectorSize; }
		static uint32 GetSaltSize () { return SaltSize; }
		uint64 GetVolumeDataSize () const { return VolumeDataSize; }
		VolumeTime GetVolumeCreationTime () const { return VolumeCreationTime; }
		void SetSize (uint32 headerSize);

	protected:
		bool Deserialize (const ConstBufferPtr &header, shared_ptr <EncryptionAlgorithm> &ea, shared_ptr <EncryptionMode> &mode, bool truecryptMode);
		template <typename T> T DeserializeEntry (const ConstBufferPtr &header, size_t &offset) const;
		template <typename T> T DeserializeEntryAt (const ConstBufferPtr &header, const size_t &offset) const;
		void Init ();
		void Serialize (const BufferPtr &header) const;
		template <typename T> void SerializeEntry (const T &entry, const BufferPtr &header, size_t &offset) const;

		uint32 HeaderSize;

		static const uint16 CurrentHeaderVersion = VOLUME_HEADER_VERSION;
		static const uint16 CurrentRequiredMinProgramVersion = TC_VOLUME_MIN_REQUIRED_PROGRAM_VERSION;
		static const uint16 MinAllowedHeaderVersion = 1;

		static const int SaltOffset = 0;
		static const uint32 SaltSize = 64;

		static const int EncryptedHeaderDataOffset = SaltOffset + SaltSize;
		uint32 EncryptedHeaderDataSize;

		static const uint32 LegacyEncryptionModeKeyAreaSize = 32;
		static const int DataKeyAreaMaxSize = 256;
		static const uint32 DataAreaKeyOffset = DataKeyAreaMaxSize - EncryptedHeaderDataOffset;

		shared_ptr <EncryptionAlgorithm> EA;
		shared_ptr <Pkcs5Kdf> Pkcs5;

		uint16 HeaderVersion;
		uint16 RequiredMinProgramVersion;
		uint32 VolumeKeyAreaCrc32;

		VolumeTime VolumeCreationTime;
		VolumeTime HeaderCreationTime;

		VolumeType::Enum mVolumeType;
		uint64 HiddenVolumeDataSize;
		uint64 VolumeDataSize;
		uint64 EncryptedAreaStart;
		uint64 EncryptedAreaLength;
		uint32 Flags;
		uint32 SectorSize;

		SecureBuffer DataAreaKey;

	private:
		VolumeHeader (const VolumeHeader &);
		VolumeHeader &operator= (const VolumeHeader &);
	};
}

#endif // TC_HEADER_Volume_VolumeHeader