VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Platform/SystemException.h
blob: 4a1dc2d199b5ddce705d6234bb8830a3104f80b0 (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
/*
 Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.

 Governed by the TrueCrypt License 3.0 the full text of which is contained in
 the file License.txt included in TrueCrypt binary and source code distribution
 packages.
*/

#ifndef TC_HEADER_Platform_SystemException
#define TC_HEADER_Platform_SystemException

#include "PlatformBase.h"
#include "Exception.h"

namespace VeraCrypt
{
	class SystemException : public Exception
	{
	public:
		SystemException ();
		SystemException (const string &message);
		SystemException (const string &message, const string &subject);
		SystemException (const string &message, const wstring &subject);
		SystemException (const string &message, int64 errorCode)
			: Exception (message), ErrorCode (errorCode) { }
		virtual ~SystemException () throw () { }

		TC_SERIALIZABLE_EXCEPTION (SystemException);

		int64 GetErrorCode () const { return ErrorCode; }
		bool IsError () const;
		wstring SystemText () const;

	protected:
		int64 ErrorCode;
	};

#undef TC_EXCEPTION_SET
#define TC_EXCEPTION_SET \
	TC_EXCEPTION_NODECL (SystemException);
}

#define throw_sys_if(condition) do { if (condition) throw SystemException (SRC_POS); } while (false)
#define throw_sys_sub_if(condition,subject) do { if (condition) throw SystemException (SRC_POS, (subject)); } while (false)

#endif // TC_HEADER_Platform_SystemException
"> #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