Sandboxie/SandboxieTools/ImBox/dc/include/volume.h

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