|
|
1.1.1.2 ! root 1: /* Copyright (C) 2004 TrueCrypt Foundation 1.1 root 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 1.1.1.2 ! root 37: #define AES 2 ! 38: #define CAST 3 ! 39: #define IDEA 4 ! 40: #define TRIPLEDES 5 1.1 root 41: #define DES56 100 // Used only for DES test vectors 42: 1.1.1.2 ! root 43: #define LAST_CIPHER_ID 5 // Last cipher used for volume encryption 1.1 root 44: 45: // Length in bytes of the longest key used by encryption algorithms 46: #define MAX_CIPHER_KEY 56 // Blowfish 448 bits 47: 48: /* Length of scheduled keys */ 49: #define IDEA_KS 104 50: #define DES_KS 128 51: #define TRIPLEDES_KS (DES_KS*3) 52: #define BLOWFISH_KS 4168 1.1.1.2 ! root 53: #define AES_KS 240 1.1 root 54: #define CAST_KS 128 55: 56: #define MAX_EXPANDED_KEY 4168 57: 58: #include "des.h" 59: #include "blowfish.h" 1.1.1.2 ! root 60: #include "aes.h" 1.1 root 61: #include "idea.h" 62: #include "sha.h" 63: #include "sha1.h" 64: #include "cast.h" 65: 66: /* _cdecl is needed here because the device driver defaults to stdcall */ 67: typedef void (_cdecl * sector_func) (unsigned long *, unsigned __int64, unsigned long, 68: unsigned char *, unsigned char *, int); 69: 70: typedef struct keyInfo_t 71: { 72: int noIterations; /* No.of times to iterate setup */ 73: int keyLength; /* Length of the key */ 74: char userKey[MAX_PASSWORD]; /* Max pass, WITHOUT +1 for the NULL */ 75: char key_salt[USERKEY_SALT_SIZE]; /* Key setup salt */ 76: char key[DISKKEY_SIZE]; /* The keying material itself */ 77: } KEY_INFO, *PKEY_INFO; 78: 79: typedef struct CRYPTO_INFO_t 80: { 81: /* cipher information */ 82: int cipher; 83: sector_func encrypt_sector; 84: sector_func decrypt_sector; 85: unsigned char iv[DISK_IV_SIZE]; 86: unsigned char ks[MAX_EXPANDED_KEY]; 87: 88: /* volume information */ 89: unsigned char master_decrypted_key[DISKKEY_SIZE]; 90: unsigned char key_salt[USERKEY_SALT_SIZE]; 91: int noIterations; 92: int pkcs5; 93: 94: unsigned __int64 volume_creation_time; 95: unsigned __int64 header_creation_time; 96: } CRYPTO_INFO, *PCRYPTO_INFO; 97: 98: #define decipher_block(cipher, data, ks) \ 99: {\ 100: if (cipher == BLOWFISH) BF_decrypt ((void *) data, (void *) ks); \ 1.1.1.2 ! root 101: else if (cipher == AES) aes_decrypt ((void *) data, (void *) data, (void *)((char *)(ks)+sizeof(aes_encrypt_ctx))); \ 1.1 root 102: else if (cipher == IDEA) ideaCrypt ((void *) data,(void *) data, (void *) ((char *) ks + IDEA_KS)); \ 103: else if (cipher == DES56) des_encrypt ((void *) data, (void *) ks, 0); \ 104: else if (cipher == CAST) CAST_ecb_encrypt((void *) data,(void *) data,(void*)ks,0); \ 105: else if (cipher == TRIPLEDES) des_ecb3_encrypt ((void *) data,(void *) data, (void *) ks, \ 106: (void*)((char*)ks+DES_KS),(void*)((char*)ks+DES_KS*2),0); \ 107: } 108: 109: #define encipher_block(cipher, data, ks) \ 110: {\ 111: if (cipher == BLOWFISH) BF_encrypt ((void *) data, (void *) ks); \ 1.1.1.2 ! root 112: else if (cipher == AES) aes_encrypt ((void *) data, (void *) data, (void *) ks); \ 1.1 root 113: else if (cipher == IDEA) ideaCrypt ((void *) data, (void *) data, (void *) ks); \ 114: else if (cipher == DES56) des_encrypt ((void *) data, (void *) ks, 1); \ 115: else if (cipher == CAST) CAST_ecb_encrypt((void *) data,(void *) data,(void*)ks,1); \ 116: else if (cipher == TRIPLEDES) des_ecb3_encrypt ((void *) data,(void *) data, (void *) ks, \ 117: (void*)((char*)ks+DES_KS),(void*)((char*)ks+DES_KS*2),1); \ 118: } 119: 120: #define init_cipher(cipher, key, ks) \ 121: {\ 122: if (cipher == BLOWFISH) BF_set_key ((void*)ks, 56, (void*) (key)); \ 1.1.1.2 ! root 123: else if (cipher == AES) {aes_encrypt_key((void*)(key), 32, (void*)ks); aes_decrypt_key((void*)(key), 32, (void*)((char *)(ks)+sizeof(aes_encrypt_ctx)));} \ 1.1 root 124: else if (cipher == IDEA) ideaExpandKey ((void*) (key), (void*)ks, (void *) ((char *) ks + IDEA_KS)); \ 125: else if (cipher == DES56) des_key_sched ((void*) (key), (void*)ks); \ 126: else if (cipher == CAST) CAST_set_key((void*)ks, 16, (void*)(key)); \ 127: else if (cipher == TRIPLEDES) { \ 128: des_key_sched ((void*) (key), (void*)ks); \ 129: des_key_sched ((void*) ((char*)(key)+8), (void*)((char*)ks+DES_KS)); \ 130: des_key_sched ((void*) ((char*)(key)+16), (void*)((char*)ks+DES_KS*2)); \ 131: } \ 132: } 133: 134: 135: PCRYPTO_INFO crypto_open (void); 136: void crypto_loadkey (PKEY_INFO keyInfo, char *lpszUserKey, int nUserKeyLen); 137: void crypto_close (PCRYPTO_INFO cryptoInfo); 138: int get_block_size (int cipher); 139: int get_key_size (int cipher); 140: char * get_cipher_name (int cipher); 141: 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.