|
|
1.1 root 1: /* Copyright (C) 2004 TrueCrypt Team, truecrypt.org
2: This product uses components written by Paul Le Roux <[email protected]> */
3:
4:
5: // User text input limits
6: #ifndef _DEBUG
7: #define MIN_PASSWORD 12
8: #else
9: #define MIN_PASSWORD 0
10: #endif
11: #define MAX_PASSWORD 64
12:
13: // User key
14: #define USERKEY_ITERATIONS 2000
15: #define USERKEY_SALT_SIZE 64
16:
17: // Disk key + IV
18: #define DISKKEY_SIZE 256
19: #define DISK_IV_SIZE 32
20:
21: // Volume header byte offsets
22: #define HEADER_USERKEY_SALT 0
23: #define HEADER_ENCRYPTEDDATA USERKEY_SALT_SIZE
24: #define HEADER_DISKKEY 256
25:
26: // Volume header sizes
27: #define HEADER_SIZE 512
28: #define HEADER_ENCRYPTEDDATASIZE (HEADER_SIZE - HEADER_ENCRYPTEDDATA)
29:
30: // PKCS5 PRF hash algorithm ID
31: #define SHA1 1
32: #define RIPEMD160 2
33:
34: /* The encryption algorithm ID */
35: #define NONE 0
36: #define BLOWFISH 1
37: #define CAST 2
38: #define IDEA 3
39: #define TRIPLEDES 4
40: #define DES56 100 // Used only for DES test vectors
41:
42: #define LAST_CIPHER_ID 4 // Last cipher used for volume encryption
43:
44: // Length in bytes of the longest key used by encryption algorithms
45: #define MAX_CIPHER_KEY 56 // Blowfish 448 bits
46:
47: /* Length of scheduled keys */
48: #define IDEA_KS 104
49: #define DES_KS 128
50: #define TRIPLEDES_KS (DES_KS*3)
51: #define BLOWFISH_KS 4168
52: #define CAST_KS 128
53:
54: #define MAX_EXPANDED_KEY 4168
55:
56: #include "des.h"
57: #include "blowfish.h"
58: #include "idea.h"
59: #include "sha.h"
60: #include "sha1.h"
61: #include "cast.h"
62:
63: /* _cdecl is needed here because the device driver defaults to stdcall */
64: typedef void (_cdecl * sector_func) (unsigned long *, unsigned __int64, unsigned long,
65: unsigned char *, unsigned char *, int);
66:
67: typedef struct keyInfo_t
68: {
69: int noIterations; /* No.of times to iterate setup */
70: int keyLength; /* Length of the key */
71: char userKey[MAX_PASSWORD]; /* Max pass, WITHOUT +1 for the NULL */
72: char key_salt[USERKEY_SALT_SIZE]; /* Key setup salt */
73: char key[DISKKEY_SIZE]; /* The keying material itself */
74: } KEY_INFO, *PKEY_INFO;
75:
76: typedef struct CRYPTO_INFO_t
77: {
78: /* cipher information */
79: int cipher;
80: sector_func encrypt_sector;
81: sector_func decrypt_sector;
82: unsigned char iv[DISK_IV_SIZE];
83: unsigned char ks[MAX_EXPANDED_KEY];
84:
85: /* volume information */
86: unsigned char master_decrypted_key[DISKKEY_SIZE];
87: unsigned char key_salt[USERKEY_SALT_SIZE];
88: int noIterations;
89: int pkcs5;
90:
91: unsigned __int64 volume_creation_time;
92: unsigned __int64 header_creation_time;
93: } CRYPTO_INFO, *PCRYPTO_INFO;
94:
95: #define decipher_block(cipher, data, ks) \
96: {\
97: if (cipher == BLOWFISH) BF_decrypt ((void *) data, (void *) ks); \
98: else if (cipher == IDEA) ideaCrypt ((void *) data,(void *) data, (void *) ((char *) ks + IDEA_KS)); \
99: else if (cipher == DES56) des_encrypt ((void *) data, (void *) ks, 0); \
100: else if (cipher == CAST) CAST_ecb_encrypt((void *) data,(void *) data,(void*)ks,0); \
101: else if (cipher == TRIPLEDES) des_ecb3_encrypt ((void *) data,(void *) data, (void *) ks, \
102: (void*)((char*)ks+DES_KS),(void*)((char*)ks+DES_KS*2),0); \
103: }
104:
105: #define encipher_block(cipher, data, ks) \
106: {\
107: if (cipher == BLOWFISH) BF_encrypt ((void *) data, (void *) ks); \
108: else if (cipher == IDEA) ideaCrypt ((void *) data, (void *) data, (void *) ks); \
109: else if (cipher == DES56) des_encrypt ((void *) data, (void *) ks, 1); \
110: else if (cipher == CAST) CAST_ecb_encrypt((void *) data,(void *) data,(void*)ks,1); \
111: else if (cipher == TRIPLEDES) des_ecb3_encrypt ((void *) data,(void *) data, (void *) ks, \
112: (void*)((char*)ks+DES_KS),(void*)((char*)ks+DES_KS*2),1); \
113: }
114:
115: #define init_cipher(cipher, key, ks) \
116: {\
117: if (cipher == BLOWFISH) BF_set_key ((void*)ks, 56, (void*) (key)); \
118: else if (cipher == IDEA) ideaExpandKey ((void*) (key), (void*)ks, (void *) ((char *) ks + IDEA_KS)); \
119: else if (cipher == DES56) des_key_sched ((void*) (key), (void*)ks); \
120: else if (cipher == CAST) CAST_set_key((void*)ks, 16, (void*)(key)); \
121: else if (cipher == TRIPLEDES) { \
122: des_key_sched ((void*) (key), (void*)ks); \
123: des_key_sched ((void*) ((char*)(key)+8), (void*)((char*)ks+DES_KS)); \
124: des_key_sched ((void*) ((char*)(key)+16), (void*)((char*)ks+DES_KS*2)); \
125: } \
126: }
127:
128: #define is_valid_tc_cipher(cipher) \
129: (cipher == BLOWFISH || \
130: cipher == IDEA || \
131: cipher == DES56 || \
132: cipher == CAST || \
133: cipher == TRIPLEDES)
134:
135:
136: PCRYPTO_INFO crypto_open (void);
137: void crypto_loadkey (PKEY_INFO keyInfo, char *lpszUserKey, int nUserKeyLen);
138: void crypto_close (PCRYPTO_INFO cryptoInfo);
139: int get_block_size (int cipher);
140: int get_key_size (int cipher);
141: char * get_cipher_name (int cipher);
142: char * get_hash_name (int pkcs5);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.