83 lines
2.5 KiB
C
83 lines
2.5 KiB
C
#ifndef _VOLUME_H_
|
|
#define _VOLUME_H_
|
|
|
|
#include "defines.h"
|
|
|
|
#define DC_VOLUME_SIGN 0x50524344
|
|
|
|
// Header key derivation
|
|
#define PKCS5_SALT_SIZE 64
|
|
|
|
// Master key + secondary key (LRW mode)
|
|
#define DISKKEY_SIZE 256
|
|
#define MAX_KEY_SIZE (32*3)
|
|
#define PKCS_DERIVE_MAX (MAX_KEY_SIZE*2)
|
|
|
|
#define SECTOR_SIZE 512
|
|
#define MAX_SECTOR_SIZE 2048
|
|
#define CD_SECTOR_SIZE 2048
|
|
|
|
#define MIN_PASSWORD 1 // Minimum password length
|
|
#define MAX_PASSWORD 128 // Maximum password length
|
|
|
|
#define DC_HDR_VERSION 1
|
|
|
|
#define VF_NONE 0x00
|
|
#define VF_TMP_MODE 0x01 /* temporary encryption mode */
|
|
#define VF_REENCRYPT 0x02 /* volume re-encryption in progress */
|
|
#define VF_STORAGE_FILE 0x04 /* redirected area are placed in file */
|
|
#define VF_NO_REDIR 0x08 /* redirection area is not present */
|
|
#define VF_EXTENDED 0x10 /* this volume placed on extended partition */
|
|
|
|
#define ENC_BLOCK_SIZE (1280 * 1024)
|
|
|
|
#pragma pack (push, 1)
|
|
|
|
typedef struct _dc_pass {
|
|
int size; // in bytes
|
|
wchar_t pass[MAX_PASSWORD];
|
|
} dc_pass;
|
|
|
|
typedef struct _dc_header {
|
|
u8 salt[PKCS5_SALT_SIZE]; /* pkcs5.2 salt */
|
|
u32 sign; /* signature 'DCRP' */
|
|
u32 hdr_crc; /* crc32 of decrypted volume header */
|
|
u16 version; /* volume format version */
|
|
u32 flags; /* volume flags */
|
|
u32 disk_id; /* unigue volume identifier */
|
|
int alg_1; /* crypt algo 1 */
|
|
u8 key_1[DISKKEY_SIZE]; /* crypt key 1 */
|
|
int alg_2; /* crypt algo 2 */
|
|
u8 key_2[DISKKEY_SIZE]; /* crypt key 2 */
|
|
|
|
#pragma warning(disable:4201)
|
|
union {
|
|
u64 stor_off; /* redirection area offset */
|
|
u64 data_off; /* volume data offset, if redirection area is not used */
|
|
};
|
|
#pragma warning(default:4201)
|
|
u64 use_size; /* user available volume size */
|
|
u64 tmp_size; /* temporary part size */
|
|
u8 tmp_wp_mode; /* data wipe mode */
|
|
|
|
u8 reserved[1422 - 1];
|
|
|
|
} dc_header;
|
|
|
|
#define IS_INVALID_VOL_FLAGS(_f) ( ((_f) & VF_NO_REDIR) && \
|
|
((_f) & (VF_TMP_MODE | VF_REENCRYPT | VF_STORAGE_FILE)) )
|
|
|
|
#define IS_INVALID_SECTOR_SIZE(_s) ( ((_s) % SECTOR_SIZE) || \
|
|
((_s) > MAX_SECTOR_SIZE) || (sizeof(dc_header) % (_s)) )
|
|
|
|
|
|
#define DC_AREA_SIZE (2 * 1024)
|
|
#define DC_AREA_SECTORS (DC_AREA_SIZE / SECTOR_SIZE)
|
|
#define DC_ENCRYPTEDDATASIZE (DC_AREA_SIZE - PKCS5_SALT_SIZE)
|
|
#define DC_CRC_AREA_SIZE (DC_ENCRYPTEDDATASIZE - 8)
|
|
|
|
|
|
#pragma pack (pop)
|
|
|
|
|
|
#endif |