|
|
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: #include "TCdefs.h" ! 5: ! 6: #include <fcntl.h> ! 7: #include <sys/types.h> ! 8: #include <sys/stat.h> ! 9: #include <io.h> ! 10: #include <time.h> ! 11: ! 12: #include "crypto.h" ! 13: #include "random.h" ! 14: #include "endian.h" ! 15: #include "fat.h" ! 16: #include "volumes.h" ! 17: ! 18: #include "pkcs5.h" ! 19: #include "crc.h" ! 20: ! 21: void _cdecl ! 22: EncryptSector8 (unsigned long *data, ! 23: unsigned __int64 secNo, ! 24: unsigned long noSectors, ! 25: unsigned char *ks, ! 26: unsigned char *iv, ! 27: int cipher) ! 28: { ! 29: unsigned long sectorIV[2]; ! 30: unsigned long *IV = (unsigned long *) iv; ! 31: unsigned __int64 *IV64 = (unsigned __int64 *) iv; ! 32: unsigned long x1, x2; ! 33: unsigned long j; ! 34: ! 35: while (noSectors--) ! 36: { ! 37: // Sector encryption is implemented by making IV unique for each ! 38: // sector and obfuscating cipher text ! 39: IV64[0] ^= secNo; ! 40: IV64[1] ^= secNo; ! 41: IV64[2] ^= secNo; ! 42: ! 43: sectorIV[0] = IV[0]; ! 44: sectorIV[1] = IV[1]; ! 45: ! 46: x1 = crc32long ( &IV[2] ) ^ crc32long ( &IV[5] ); ! 47: x2 = crc32long ( &IV[3] ) ^ crc32long ( &IV[4] ); ! 48: ! 49: IV64[0] ^= secNo; ! 50: IV64[1] ^= secNo; ! 51: IV64[2] ^= secNo; ! 52: ! 53: // CBC encrypt the entire sector ! 54: for (j = 0; j < 64; j++) ! 55: { ! 56: // CBC ! 57: data[0] ^= sectorIV[0]; ! 58: data[1] ^= sectorIV[1]; ! 59: ! 60: encipher_block (cipher, data, ks); ! 61: ! 62: sectorIV[0] = data[0]; ! 63: sectorIV[1] = data[1]; ! 64: ! 65: // Cipher text XOR ! 66: data[0] ^= x1; ! 67: data[1] ^= x2; ! 68: ! 69: data += 2; ! 70: } ! 71: ! 72: secNo++; ! 73: } ! 74: } ! 75: ! 76: void ! 77: _cdecl ! 78: DecryptSector8 (unsigned long *data, ! 79: unsigned __int64 secNo, ! 80: unsigned long noSectors, ! 81: unsigned char *ks, ! 82: unsigned char *iv, ! 83: int cipher) ! 84: { ! 85: unsigned long sectorIV[2]; ! 86: unsigned long *IV = (unsigned long *) iv; ! 87: unsigned __int64 *IV64 = (unsigned __int64 *) iv; ! 88: unsigned long x1, x2; ! 89: int j; ! 90: ! 91: while (noSectors--) ! 92: { ! 93: IV64[0] ^= secNo; ! 94: IV64[1] ^= secNo; ! 95: IV64[2] ^= secNo; ! 96: ! 97: sectorIV[0] = IV[0]; ! 98: sectorIV[1] = IV[1]; ! 99: ! 100: x1 = crc32long ( &IV[2] ) ^ crc32long ( &IV[5] ); ! 101: x2 = crc32long ( &IV[3] ) ^ crc32long ( &IV[4] ); ! 102: ! 103: IV64[0] ^= secNo; ! 104: IV64[1] ^= secNo; ! 105: IV64[2] ^= secNo; ! 106: ! 107: // CBC decrypt the sector ! 108: for (j = 0; j < 64; j++) ! 109: { ! 110: unsigned long a, b; ! 111: ! 112: // Cipher text XOR ! 113: data[0] ^= x1; ! 114: data[1] ^= x2; ! 115: ! 116: // CBC ! 117: a = data[0]; ! 118: b = data[1]; ! 119: ! 120: decipher_block (cipher, data, ks); ! 121: ! 122: data[0] ^= sectorIV[0]; ! 123: data[1] ^= sectorIV[1]; ! 124: ! 125: sectorIV[0] = a; ! 126: sectorIV[1] = b; ! 127: ! 128: data += 2; ! 129: } ! 130: ! 131: secNo++; ! 132: } ! 133: } ! 134: ! 135: // EncryptBuffer ! 136: // ! 137: // Encrypts data in buffer ! 138: // Returns number of bytes encrypted ! 139: // ! 140: // len = length of data in bytes ! 141: int _cdecl ! 142: EncryptBuffer (unsigned char *buf, ! 143: unsigned long len, ! 144: unsigned char *ks, ! 145: unsigned char *iv, ! 146: int cipher) ! 147: { ! 148: unsigned long *data = (unsigned long *) buf; ! 149: unsigned long *IV = (unsigned long *) iv; ! 150: unsigned long bufIV[2]; ! 151: unsigned long j; ! 152: ! 153: len /= get_block_size (cipher); ! 154: ! 155: bufIV[0] = IV[0]; ! 156: bufIV[1] = IV[1]; ! 157: ! 158: if (get_block_size (cipher) == 8) ! 159: { ! 160: /* CBC encrypt the buffer */ ! 161: for (j = 0; j < len; j++) ! 162: { ! 163: // CBC ! 164: data[0] ^= bufIV[0]; ! 165: data[1] ^= bufIV[1]; ! 166: ! 167: encipher_block (cipher, data, ks); ! 168: ! 169: bufIV[0] = data[0]; ! 170: bufIV[1] = data[1]; ! 171: ! 172: // Cipher text XOR ! 173: data[0] ^= IV[2]; ! 174: data[1] ^= IV[3]; ! 175: ! 176: data += 2; ! 177: } ! 178: } ! 179: else ! 180: return 0; ! 181: ! 182: return len; ! 183: } ! 184: ! 185: // DecryptBuffer ! 186: // ! 187: // Decrypts data in buffer ! 188: // Returns number of bytes encrypted ! 189: // ! 190: // len = length of data in bytes ! 191: ! 192: int _cdecl ! 193: DecryptBuffer (unsigned char *buf, ! 194: unsigned long len, ! 195: unsigned char *ks, ! 196: unsigned char *iv, ! 197: int cipher) ! 198: { ! 199: unsigned long *data = (unsigned long *)buf; ! 200: unsigned long *IV = (unsigned long *) iv; ! 201: unsigned long bufIV[2]; ! 202: unsigned long j; ! 203: ! 204: len /= get_block_size (cipher); ! 205: ! 206: bufIV[0] = IV[0]; ! 207: bufIV[1] = IV[1]; ! 208: ! 209: if (get_block_size (cipher) == 8) ! 210: { ! 211: /* CBC encrypt the buffer */ ! 212: for (j = 0; j < len; j++) ! 213: { ! 214: unsigned long a, b; ! 215: ! 216: // Cipher text XOR ! 217: data[0] ^= IV[2]; ! 218: data[1] ^= IV[3]; ! 219: ! 220: // CBC ! 221: a = data[0]; ! 222: b = data[1]; ! 223: ! 224: decipher_block (cipher, data, ks); ! 225: ! 226: data[0] ^= bufIV[0]; ! 227: data[1] ^= bufIV[1]; ! 228: ! 229: bufIV[0] = a; ! 230: bufIV[1] = b; ! 231: ! 232: data += 2; ! 233: } ! 234: } ! 235: else ! 236: return 0; ! 237: ! 238: return len; ! 239: } ! 240: ! 241: // Volume header structure: ! 242: // ! 243: // Offset Length Description ! 244: // ------------------------------------------ ! 245: // Unencrypted: ! 246: // 0 64 Key salt ! 247: // Encrypted: ! 248: // 64 4 Magic 'TRUE' ! 249: // 68 2 Header version ! 250: // 70 2 Required program version ! 251: // 72 4 CRC32 of disk IV and key ! 252: // 76 8 Volume creation time ! 253: // 84 8 Header creation time ! 254: // 92 164 unused ! 255: // 256 32 Disk IV ! 256: // 288 224 Disk key ! 257: ! 258: int ! 259: VolumeReadHeader (char *encryptedHeader, char *lpszPassword, PCRYPTO_INFO * retInfo) ! 260: { ! 261: char header[SECTOR_SIZE]; ! 262: unsigned char *input = (unsigned char *) header; ! 263: KEY_INFO keyInfo; ! 264: PCRYPTO_INFO cryptoInfo; ! 265: int nStatus = 0, nKeyLen; ! 266: char dk[DISKKEY_SIZE]; ! 267: int pkcs5; ! 268: int headerVersion, requiredVersion; ! 269: ! 270: cryptoInfo = *retInfo = crypto_open (); ! 271: if (cryptoInfo == NULL) ! 272: return ERR_OUTOFMEMORY; ! 273: ! 274: crypto_loadkey (&keyInfo, lpszPassword, strlen (lpszPassword)); ! 275: ! 276: // PKCS5 is used to derive header key and IV from user password ! 277: memcpy (keyInfo.key_salt, encryptedHeader + HEADER_USERKEY_SALT, USERKEY_SALT_SIZE); ! 278: keyInfo.noIterations = USERKEY_ITERATIONS; ! 279: pkcs5 = SHA1; ! 280: ! 281: if (pkcs5 == SHA1) ! 282: { ! 283: derive_sha_key (keyInfo.userKey, keyInfo.keyLength, keyInfo.key_salt, ! 284: USERKEY_SALT_SIZE, keyInfo.noIterations, dk, DISK_IV_SIZE + MAX_CIPHER_KEY); ! 285: } ! 286: // IV for header decryption ! 287: memcpy (cryptoInfo->iv, dk, DISK_IV_SIZE); ! 288: ! 289: // Test all available ciphers ! 290: for (cryptoInfo->cipher = 1; cryptoInfo->cipher <= LAST_CIPHER_ID; cryptoInfo->cipher++) ! 291: { ! 292: // Copy header for decryption ! 293: memcpy (header, encryptedHeader, SECTOR_SIZE); ! 294: input = header; ! 295: ! 296: // Try to decrypt header ! 297: init_cipher (cryptoInfo->cipher, dk + DISK_IV_SIZE, cryptoInfo->ks); ! 298: ! 299: DecryptBuffer (header + HEADER_ENCRYPTEDDATA, HEADER_ENCRYPTEDDATASIZE, ! 300: cryptoInfo->ks, cryptoInfo->iv, cryptoInfo->cipher); ! 301: ! 302: input += HEADER_ENCRYPTEDDATA; ! 303: ! 304: // Magic ! 305: if (mgetLong (input) != 'TRUE') ! 306: continue; ! 307: ! 308: // Header version ! 309: headerVersion = mgetWord (input); ! 310: ! 311: // Required program version ! 312: requiredVersion = mgetWord (input); ! 313: ! 314: // Check CRC of disk IV and key ! 315: if (mgetLong (input) != crc32 (header + HEADER_DISKKEY, DISKKEY_SIZE)) ! 316: continue; ! 317: ! 318: // Volume creation time ! 319: ((unsigned long *)(&cryptoInfo->volume_creation_time))[1] = mgetLong (input); ! 320: ((unsigned long *)(&cryptoInfo->volume_creation_time))[0] = mgetLong (input); ! 321: ! 322: // Header creation time ! 323: ((unsigned long *)(&cryptoInfo->header_creation_time))[1] = mgetLong (input); ! 324: ((unsigned long *)(&cryptoInfo->header_creation_time))[0] = mgetLong (input); ! 325: ! 326: // Password and cipher OK ! 327: ! 328: // Check the version required to handle this volume ! 329: if (requiredVersion > VERSION_NUM) ! 330: return ERR_NEW_VERSION_REQUIRED; ! 331: ! 332: // Disk key ! 333: nKeyLen = DISKKEY_SIZE; ! 334: memcpy (keyInfo.key, header + HEADER_DISKKEY, nKeyLen); ! 335: ! 336: memcpy (cryptoInfo->master_decrypted_key, keyInfo.key, nKeyLen); ! 337: memcpy (cryptoInfo->key_salt, keyInfo.key_salt, USERKEY_SALT_SIZE); ! 338: cryptoInfo->pkcs5 = pkcs5; ! 339: cryptoInfo->noIterations = keyInfo.noIterations; ! 340: ! 341: // Init with decrypted master disk key for sector decryption ! 342: init_cipher (cryptoInfo->cipher, keyInfo.key + DISK_IV_SIZE, cryptoInfo->ks); ! 343: ! 344: // Disk IV ! 345: memcpy (cryptoInfo->iv, keyInfo.key, DISK_IV_SIZE); ! 346: ! 347: /* Clear out the temp. key buffer */ ! 348: burn (dk, sizeof(dk)); ! 349: ! 350: cryptoInfo->encrypt_sector = &EncryptSector8; ! 351: cryptoInfo->decrypt_sector = &DecryptSector8; ! 352: ! 353: return 0; ! 354: } ! 355: ! 356: crypto_close(cryptoInfo); ! 357: burn (&keyInfo, sizeof (keyInfo)); ! 358: return ERR_PASSWORD_WRONG; ! 359: } ! 360: ! 361: #ifndef DEVICE_DRIVER ! 362: ! 363: #ifdef VOLFORMAT ! 364: extern HWND hDiskKey; ! 365: extern HWND hKeySalt; ! 366: #endif ! 367: ! 368: // VolumeWriteHeader: ! 369: // Creates volume header in memory ! 370: int ! 371: VolumeWriteHeader (char *header, int cipher, char *lpszPassword, ! 372: int pkcs5, char *masterKey, unsigned __int64 volumeCreationTime, PCRYPTO_INFO * retInfo ) ! 373: { ! 374: unsigned char *p = (unsigned char *) header; ! 375: KEY_INFO keyInfo; ! 376: ! 377: int nUserKeyLen = strlen(lpszPassword); ! 378: PCRYPTO_INFO cryptoInfo = crypto_open (); ! 379: char dk[DISKKEY_SIZE]; ! 380: int x; ! 381: ! 382: if (cryptoInfo == NULL) ! 383: return ERR_OUTOFMEMORY; ! 384: ! 385: memset (header, 0, SECTOR_SIZE); ! 386: ! 387: //// Encryption setup ! 388: ! 389: // User key ! 390: memcpy (keyInfo.userKey, lpszPassword, nUserKeyLen); ! 391: keyInfo.keyLength = nUserKeyLen; ! 392: keyInfo.noIterations = USERKEY_ITERATIONS; ! 393: ! 394: // User selected encryption algorithm ! 395: cryptoInfo->cipher = cipher; ! 396: ! 397: // Salt for header key derivation ! 398: RandgetBytes (keyInfo.key_salt, USERKEY_SALT_SIZE); ! 399: ! 400: // PKCS5 is used to derive header key and IV from user password ! 401: if (pkcs5 == SHA1) ! 402: { ! 403: derive_sha_key (keyInfo.userKey, keyInfo.keyLength, keyInfo.key_salt, ! 404: USERKEY_SALT_SIZE, keyInfo.noIterations, dk, DISK_IV_SIZE + MAX_CIPHER_KEY ); ! 405: } ! 406: ! 407: // Generate disk key and IV ! 408: if(masterKey == 0) ! 409: RandgetBytes (keyInfo.key, DISKKEY_SIZE); ! 410: else ! 411: memcpy(keyInfo.key, masterKey, DISKKEY_SIZE); ! 412: ! 413: ! 414: //// Header setup ! 415: ! 416: // Salt ! 417: mputBytes (p, keyInfo.key_salt, USERKEY_SALT_SIZE); ! 418: ! 419: // Magic ! 420: mputLong (p, 'TRUE'); ! 421: ! 422: // Header version ! 423: mputWord (p, 0x0001); ! 424: ! 425: // Required program version to handle this volume ! 426: mputWord (p, VOLUME_VERSION_NUM); ! 427: ! 428: // CRC of disk key ! 429: x = crc32(keyInfo.key, DISKKEY_SIZE); ! 430: mputLong (p, x); ! 431: ! 432: // Time ! 433: { ! 434: SYSTEMTIME st; ! 435: FILETIME ft; ! 436: ! 437: // Volume creation time ! 438: if (volumeCreationTime == 0) ! 439: { ! 440: GetLocalTime (&st); ! 441: SystemTimeToFileTime (&st, &ft); ! 442: } ! 443: else ! 444: { ! 445: ft.dwHighDateTime = (DWORD)(volumeCreationTime >> 32); ! 446: ft.dwLowDateTime = (DWORD)volumeCreationTime; ! 447: } ! 448: mputLong (p, ft.dwHighDateTime); ! 449: mputLong (p, ft.dwLowDateTime); ! 450: ! 451: // Password change time ! 452: GetLocalTime (&st); ! 453: SystemTimeToFileTime (&st, &ft); ! 454: mputLong (p, ft.dwHighDateTime); ! 455: mputLong (p, ft.dwLowDateTime); ! 456: } ! 457: ! 458: // Disk key and IV ! 459: memcpy (header + HEADER_DISKKEY, keyInfo.key, DISKKEY_SIZE); ! 460: ! 461: ! 462: //// Header encryption ! 463: ! 464: memcpy (cryptoInfo->iv, dk, DISK_IV_SIZE); ! 465: init_cipher (cryptoInfo->cipher, dk + DISK_IV_SIZE, cryptoInfo->ks); ! 466: ! 467: EncryptBuffer (header + HEADER_ENCRYPTEDDATA, HEADER_ENCRYPTEDDATASIZE, ! 468: cryptoInfo->ks, cryptoInfo->iv, cryptoInfo->cipher); ! 469: ! 470: ! 471: //// cryptoInfo setup for further use (disk format) ! 472: ! 473: // Init with master disk key for sector decryption ! 474: init_cipher (cryptoInfo->cipher, keyInfo.key + DISK_IV_SIZE, cryptoInfo->ks); ! 475: ! 476: // Disk IV ! 477: memcpy (cryptoInfo->iv, keyInfo.key, DISK_IV_SIZE); ! 478: ! 479: // Clear out the temp. key buffer ! 480: burn (dk, sizeof(dk)); ! 481: ! 482: if (get_block_size(cipher) == 8) ! 483: { ! 484: cryptoInfo->encrypt_sector = &EncryptSector8; ! 485: cryptoInfo->decrypt_sector = &DecryptSector8; ! 486: } ! 487: ! 488: #ifdef VOLFORMAT ! 489: { ! 490: char tmp[64]; ! 491: BOOL dots3 = FALSE; ! 492: int i, j; ! 493: ! 494: j = get_key_size (cipher); ! 495: ! 496: if (j > 21) ! 497: { ! 498: dots3 = TRUE; ! 499: j = 21; ! 500: } ! 501: ! 502: tmp[0] = 0; ! 503: for (i = 0; i < j; i++) ! 504: { ! 505: char tmp2[8] = ! 506: {0}; ! 507: sprintf (tmp2, "%02X", (int) (unsigned char) keyInfo.key[i + DISK_IV_SIZE]); ! 508: strcat (tmp, tmp2); ! 509: } ! 510: ! 511: if (dots3 == TRUE) ! 512: { ! 513: strcat (tmp, "..."); ! 514: } ! 515: ! 516: ! 517: SetWindowText (hDiskKey, tmp); ! 518: ! 519: tmp[0] = 0; ! 520: for (i = 0; i < 20; i++) ! 521: { ! 522: char tmp2[8]; ! 523: sprintf (tmp2, "%02X", (int) (unsigned char) keyInfo.key_salt[i]); ! 524: strcat (tmp, tmp2); ! 525: } ! 526: ! 527: SetWindowText (hKeySalt, tmp); ! 528: } ! 529: #endif ! 530: ! 531: burn (&keyInfo, sizeof (keyInfo)); ! 532: ! 533: *retInfo = cryptoInfo; ! 534: return 0; ! 535: } ! 536: ! 537: ! 538: #endif /* !NT4_DRIVER */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.