diff options
Diffstat (limited to 'src/Boot/Windows/BootCommon.h')
-rw-r--r-- | src/Boot/Windows/BootCommon.h | 134 |
1 files changed, 133 insertions, 1 deletions
diff --git a/src/Boot/Windows/BootCommon.h b/src/Boot/Windows/BootCommon.h index 0d4f710d..ea63c08b 100644 --- a/src/Boot/Windows/BootCommon.h +++ b/src/Boot/Windows/BootCommon.h @@ -3,7 +3,7 @@ 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) + Modifications and additions to the original source code (contained in this file) and all other portions of this file are Copyright (c) 2013-2016 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 @@ -78,5 +78,137 @@ typedef struct #define TC_SET_BOOT_ARGUMENTS_SIGNATURE(SG) do { SG[0] = 'T'; SG[1] = 'R'; SG[2] = 'U'; SG[3] = 'E'; SG[4] = 0x11; SG[5] = 0x23; SG[6] = 0x45; SG[7] = 0x66; } while (FALSE) #define TC_IS_BOOT_ARGUMENTS_SIGNATURE(SG) (SG[0] == 'T' && SG[1] == 'R' && SG[2] == 'U' && SG[3] == 'E' && SG[4] == 0x11 && SG[5] == 0x23 && SG[6] == 0x45 && SG[7] == 0x66) +#if !defined(TC_WINDOWS_BOOT) + +#define DCS_DISK_ENTRY_LIST_HEADER_SIGN SIGNATURE_64 ('D','C','S','D','E','L','S','T') + +#define DE_IDX_CRYPTOHEADER 0 +#define DE_IDX_LIST 1 +#define DE_IDX_DISKID 2 +#define DE_IDX_MAINGPTHDR 3 +#define DE_IDX_MAINGPTENTRYS 4 +#define DE_IDX_ALTGPTHDR 5 +#define DE_IDX_ALTGPTENTRYS 6 +#define DE_IDX_EXEC 7 +#define DE_IDX_PWDCACHE 8 +#define DE_IDX_RND 9 +#define DE_IDX_TOTAL 10 +static_assert(DE_IDX_TOTAL <= 15, "DE_IDX_TOTAL too big"); + +enum DcsDiskEntryTypes { + DE_Unused = 0, + DE_Sectors, + DE_List, + DE_DISKID, + DE_ExecParams, + DE_PwdCache, + DE_Rnd +}; + +#pragma pack(1) +typedef struct _SECREGION_BOOT_PARAMS { + uint64 Ptr; + uint32 Size; + uint32 Crc; +} SECREGION_BOOT_PARAMS; + +typedef struct { + uint32 Data1; + uint16 Data2; + uint16 Data3; + byte Data4[8]; +} DCS_GUID; + +// DE types +typedef struct _DCS_DISK_ENTRY_SECTORS { + uint32 Type; + uint32 Offset; // Offset in memory + uint64 Reserved; + uint64 Start; // Start on disk (byte) + uint64 Length; // length on disk (byte) +} DCS_DISK_ENTRY_SECTORS; +static_assert(sizeof(DCS_DISK_ENTRY_SECTORS) == 32, "Wrong size DCS_DISK_ENTRY_SECTORS"); + +typedef struct _DCS_DISK_ENTRY_PARAMS { + uint32 Type; + uint32 Offset; + uint64 Reserved[2]; + uint64 Length; // size of data +} DCS_DISK_ENTRY_PARAMS; +static_assert(sizeof(DCS_DISK_ENTRY_PARAMS) == 32, "Wrong size DCS_DISK_ENTRY_PARAMS"); + +typedef struct _DCS_DISK_ENTRY_DISKID { + uint32 Type; + uint32 MbrID; + uint64 ReservedDiskId; + DCS_GUID GptID; +} DCS_DISK_ENTRY_DISKID; +static_assert(sizeof(DCS_DISK_ENTRY_DISKID) == 32, "Wrong size DCS_DISK_ENTRY_DISKID"); + +#pragma warning(disable:4201) +typedef struct _DCS_DISK_ENTRY { + union { + struct { + uint32 Type; + uint32 Offset; + byte reserved[16]; + uint64 Length; // size of structure at Offset + }; + DCS_DISK_ENTRY_SECTORS Sectors; + DCS_DISK_ENTRY_DISKID DiskId; + DCS_DISK_ENTRY_PARAMS Prm; + }; +} DCS_DISK_ENTRY; +#pragma warning(default:4201) +static_assert(sizeof(DCS_DISK_ENTRY) == 32, "Wrong size DCS_DISK_ENTRY"); + +// Static compile time checks field offsets +#ifndef FIELD_OFFSET +#define FIELD_OFFSET(t, f) ((UINTN)(&((t*)0)->f)) +#endif +static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Type) == FIELD_OFFSET(DCS_DISK_ENTRY_SECTORS, Type), "Wrong Type offset"); +static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Type) == FIELD_OFFSET(DCS_DISK_ENTRY_DISKID, Type), "Wrong Type offset"); +static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Type) == FIELD_OFFSET(DCS_DISK_ENTRY_PARAMS, Type), "Wrong Type offset"); +static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Length) == FIELD_OFFSET(DCS_DISK_ENTRY_SECTORS, Length), "Wrong Length offset"); +static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Length) == FIELD_OFFSET(DCS_DISK_ENTRY_PARAMS, Length), "Wrong Length offset"); +static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Offset) == FIELD_OFFSET(DCS_DISK_ENTRY_SECTORS, Offset), "Wrong Offset offset"); +static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Offset) == FIELD_OFFSET(DCS_DISK_ENTRY_PARAMS, Offset), "Wrong Offset offset"); + +// DE type specific data +// DE List +typedef struct _DCS_DISK_ENTRY_LIST { + // EFI_TABLE_HEADER + uint64 Signature; + uint32 Revision; + uint32 HeaderSize; //< The size, in bytes, of the entire table including the EFI_TABLE_HEADER. + uint32 CRC32; //< The 32-bit CRC for the entire table. This value is computed by setting this field to 0, and computing the 32-bit CRC for HeaderSize bytes. + uint32 Reserved; //< Reserved field that must be set to 0. + // + uint32 Count; + uint32 DataSize; + // + DCS_DISK_ENTRY DE[15]; +} DCS_DISK_ENTRY_LIST; +static_assert(sizeof(DCS_DISK_ENTRY_LIST) == 512, "Wrong size DCS_DISK_ENTRY_LIST"); + +typedef struct _DCS_DEP_EXEC { + DCS_GUID ExecPartGuid; + uint16 ExecCmd[248]; +} DCS_DEP_EXEC; +static_assert(sizeof(DCS_DEP_EXEC) == 512, "Wrong size DCS_DEP_EXEC"); + +#define DCS_DEP_PWD_CACHE_SIGN SIGNATURE_64 ('P','W','D','C','A','C','H','E') +typedef struct _DCS_DEP_PWD_CACHE { + uint64 Sign; + uint32 CRC; + uint32 Count; + Password Pwd[4]; + int32 Pim[4]; + byte pad[512 - 8 - 4 - 4 - (sizeof(Password) + 4) * 4]; +} DCS_DEP_PWD_CACHE; +static_assert(sizeof(DCS_DEP_PWD_CACHE) == 512, "Wrong size DCS_DEP_PWD_CACHE"); +#pragma pack() + +#endif // #if !defined(TC_WINDOWS_BOOT) #endif // TC_HEADER_Boot_BootCommon |