Annotation of truecrypt/common/crypto.h, revision 1.1.1.2

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);

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.