www.pudn.com > truecrypt.zip > CRYPTO.H


/* Copyright (C) 2004 TrueCrypt Team, truecrypt.org 
   This product uses components written by Paul Le Roux  */ 
 
 
// User text input limits 
#ifndef _DEBUG 
#define MIN_PASSWORD		12 
#else 
#define MIN_PASSWORD		0 
#endif 
#define MAX_PASSWORD		64		  
 
// User key 
#define USERKEY_ITERATIONS	2000 
#define USERKEY_SALT_SIZE	64 
 
// Disk key + IV 
#define DISKKEY_SIZE		256 
#define DISK_IV_SIZE		32 
 
// Volume header byte offsets 
#define	HEADER_USERKEY_SALT		0 
#define HEADER_ENCRYPTEDDATA	USERKEY_SALT_SIZE 
#define	HEADER_DISKKEY			256 
 
// Volume header sizes 
#define HEADER_SIZE					512 
#define HEADER_ENCRYPTEDDATASIZE	(HEADER_SIZE - HEADER_ENCRYPTEDDATA) 
 
// PKCS5 PRF hash algorithm ID 
#define	SHA1				1 
#define	RIPEMD160			2 
 
/* The encryption algorithm ID  */ 
#define NONE				0 
#define BLOWFISH			1 
#define CAST				2 
#define IDEA				3 
#define TRIPLEDES			4 
#define DES56				100			// Used only for DES test vectors 
 
#define LAST_CIPHER_ID		4			// Last cipher used for volume encryption 
 
// Length in bytes of the longest key used by encryption algorithms 
#define	MAX_CIPHER_KEY		56			// Blowfish 448 bits 
 
/* Length of scheduled keys */ 
#define IDEA_KS				104 
#define DES_KS				128 
#define TRIPLEDES_KS		(DES_KS*3) 
#define BLOWFISH_KS			4168 
#define CAST_KS				128 
 
#define MAX_EXPANDED_KEY		4168 
 
#include "des.h" 
#include "blowfish.h" 
#include "idea.h" 
#include "sha.h" 
#include "sha1.h" 
#include "cast.h" 
 
/* _cdecl is needed here because the device driver defaults to stdcall */ 
typedef void (_cdecl * sector_func) (unsigned long *, unsigned __int64, unsigned long, 
				     unsigned char *, unsigned char *, int); 
 
typedef struct keyInfo_t 
{ 
	int noIterations;					/* No.of times to iterate setup */ 
	int keyLength;						/* Length of the key */ 
	char userKey[MAX_PASSWORD];			/* Max pass, WITHOUT +1 for the NULL */ 
	char key_salt[USERKEY_SALT_SIZE];	/* Key setup salt */ 
	char key[DISKKEY_SIZE];				/* The keying material itself */ 
} KEY_INFO, *PKEY_INFO; 
 
typedef struct CRYPTO_INFO_t 
{ 
	/* cipher information */ 
	int cipher; 
	sector_func encrypt_sector; 
	sector_func decrypt_sector; 
	unsigned char iv[DISK_IV_SIZE]; 
	unsigned char ks[MAX_EXPANDED_KEY]; 
 
	/* volume information */ 
	unsigned char master_decrypted_key[DISKKEY_SIZE]; 
	unsigned char key_salt[USERKEY_SALT_SIZE]; 
	int noIterations; 
	int pkcs5; 
 
	unsigned __int64 volume_creation_time; 
	unsigned __int64 header_creation_time; 
} CRYPTO_INFO, *PCRYPTO_INFO; 
 
#define decipher_block(cipher, data, ks) \ 
{\ 
	if (cipher == BLOWFISH) BF_decrypt ((void *) data, (void *) ks); \ 
	else if (cipher == IDEA) ideaCrypt ((void *) data,(void *)  data, (void *) ((char *) ks + IDEA_KS)); \ 
	else if (cipher == DES56) des_encrypt ((void *) data, (void *) ks, 0); \ 
	else if (cipher == CAST) CAST_ecb_encrypt((void *) data,(void *) data,(void*)ks,0);  \ 
	else if (cipher == TRIPLEDES) des_ecb3_encrypt ((void *) data,(void *) data, (void *) ks, \ 
		(void*)((char*)ks+DES_KS),(void*)((char*)ks+DES_KS*2),0); \ 
} 
 
#define encipher_block(cipher, data, ks) \ 
{\ 
	if (cipher == BLOWFISH) BF_encrypt ((void *) data, (void *) ks); \ 
	else if (cipher == IDEA) ideaCrypt ((void *) data, (void *) data, (void *) ks); \ 
	else if (cipher == DES56) des_encrypt ((void *) data, (void *) ks, 1); \ 
	else if (cipher == CAST) CAST_ecb_encrypt((void *) data,(void *) data,(void*)ks,1);  \ 
	else if (cipher == TRIPLEDES) des_ecb3_encrypt ((void *) data,(void *) data, (void *) ks, \ 
		(void*)((char*)ks+DES_KS),(void*)((char*)ks+DES_KS*2),1); \ 
} 
 
#define init_cipher(cipher, key, ks) \ 
{\ 
	if (cipher == BLOWFISH) BF_set_key ((void*)ks, 56, (void*) (key)); \ 
	else if (cipher == IDEA) ideaExpandKey ((void*) (key), (void*)ks, (void *) ((char *) ks + IDEA_KS)); \ 
	else if (cipher == DES56) des_key_sched ((void*) (key), (void*)ks); \ 
	else if (cipher == CAST) CAST_set_key((void*)ks, 16, (void*)(key)); \ 
	else if (cipher == TRIPLEDES) {  \ 
		des_key_sched ((void*) (key), (void*)ks); \ 
		des_key_sched ((void*) ((char*)(key)+8), (void*)((char*)ks+DES_KS)); \ 
		des_key_sched ((void*) ((char*)(key)+16), (void*)((char*)ks+DES_KS*2)); \ 
	} \ 
} 
 
#define is_valid_tc_cipher(cipher) \ 
	(cipher == BLOWFISH || \ 
	 cipher == IDEA || \ 
	cipher == DES56 || \ 
	cipher == CAST || \ 
	cipher == TRIPLEDES) 
 
 
PCRYPTO_INFO crypto_open (void); 
void crypto_loadkey (PKEY_INFO keyInfo, char *lpszUserKey, int nUserKeyLen); 
void crypto_close (PCRYPTO_INFO cryptoInfo); 
int get_block_size (int cipher); 
int get_key_size (int cipher); 
char * get_cipher_name (int cipher); 
char * get_hash_name (int pkcs5);