История изменений
Исправление ASM, (текущая версия) :
Пруфлинк?
e4crypt.c:
574 key.mode = EXT4_ENCRYPTION_MODE_AES_256_XTS;
575 memcpy(key.raw, salt->key, EXT4_MAX_KEY_SIZE);
576 key.size = EXT4_MAX_KEY_SIZE;
707 for (j = 0, salt = salt_list; j < num_salt; j++, salt++) {
708 pbkdf2_sha512(in_passphrase, salt,
709 EXT4_PBKDF2_ITERATIONS, salt->key);
710 generate_key_ref_str(salt);
711 insert_key_into_keyring(keyring, salt);
712 }
406 static void pbkdf2_sha512(const char *passphrase, struct salt *salt,
407 unsigned int count,
408 unsigned char derived_key[EXT4_MAX_KEY_SIZE])
409 {
410 size_t passphrase_size = strlen(passphrase);
411 unsigned char buf[SHA512_LENGTH + EXT4_MAX_PASSPHRASE_SIZE] = {0};
412 unsigned char tempbuf[SHA512_LENGTH] = {0};
413 char final[SHA512_LENGTH] = {0};
414 unsigned char saltbuf[EXT4_MAX_SALT_SIZE + EXT4_MAX_PASSPHRASE_SIZE] = {0};
415 int actual_buf_len = SHA512_LENGTH + passphrase_size;
416 int actual_saltbuf_len = EXT4_MAX_SALT_SIZE + passphrase_size;
417 unsigned int x, y;
418 __u32 *final_u32 = (__u32 *)final;
419 __u32 *temp_u32 = (__u32 *)tempbuf;
420
421 if (passphrase_size > EXT4_MAX_PASSPHRASE_SIZE) {
422 printf("Passphrase size is %zd; max is %d.\n", passphrase_size,
423 EXT4_MAX_PASSPHRASE_SIZE);
424 exit(1);
425 }
426 if (salt->salt_len > EXT4_MAX_SALT_SIZE) {
427 printf("Salt size is %zd; max is %d.\n", salt->salt_len,
428 EXT4_MAX_SALT_SIZE);
429 exit(1);
430 }
431 assert(EXT4_MAX_KEY_SIZE <= SHA512_LENGTH);
432
433 memcpy(saltbuf, salt->salt, salt->salt_len);
434 memcpy(&saltbuf[EXT4_MAX_SALT_SIZE], passphrase, passphrase_size);
435
436 memcpy(&buf[SHA512_LENGTH], passphrase, passphrase_size);
437
438 for (x = 0; x < count; ++x) {
439 if (x == 0) {
440 ext2fs_sha512(saltbuf, actual_saltbuf_len, tempbuf);
441 } else {
442 /*
443 * buf: [previous hash || passphrase]
444 */
445 memcpy(buf, tempbuf, SHA512_LENGTH);
446 ext2fs_sha512(buf, actual_buf_len, tempbuf);
447 }
448 for (y = 0; y < (sizeof(final) / sizeof(*final_u32)); ++y)
449 final_u32[y] = final_u32[y] ^ temp_u32[y];
450 }
451 memcpy(derived_key, final, EXT4_MAX_KEY_SIZE);
452 }
Высосал всё из пальца, ага.
КЭП намекает, что радужные таблицы можно делать не только с хешами, но и с ключами для шифрования.
Но для защиты от них достаточно соли размером байта в 4, т.к. это увеличит размер и так не маленькой таблицы в 4 млрд раз. Нафига было делать 16 байт совершенно не ясно.
Исходная версия ASM, :
Пруфлинк?
e4crypt.c:
574 key.mode = EXT4_ENCRYPTION_MODE_AES_256_XTS;
575 memcpy(key.raw, salt->key, EXT4_MAX_KEY_SIZE);
576 key.size = EXT4_MAX_KEY_SIZE;
707 for (j = 0, salt = salt_list; j < num_salt; j++, salt++) {
708 pbkdf2_sha512(in_passphrase, salt,
709 EXT4_PBKDF2_ITERATIONS, salt->key);
710 generate_key_ref_str(salt);
711 insert_key_into_keyring(keyring, salt);
712 }
406 static void pbkdf2_sha512(const char *passphrase, struct salt *salt,
407 unsigned int count,
408 unsigned char derived_key[EXT4_MAX_KEY_SIZE])
409 {
410 size_t passphrase_size = strlen(passphrase);
411 unsigned char buf[SHA512_LENGTH + EXT4_MAX_PASSPHRASE_SIZE] = {0};
412 unsigned char tempbuf[SHA512_LENGTH] = {0};
413 char final[SHA512_LENGTH] = {0};
414 unsigned char saltbuf[EXT4_MAX_SALT_SIZE + EXT4_MAX_PASSPHRASE_SIZE] = {0};
415 int actual_buf_len = SHA512_LENGTH + passphrase_size;
416 int actual_saltbuf_len = EXT4_MAX_SALT_SIZE + passphrase_size;
417 unsigned int x, y;
418 __u32 *final_u32 = (__u32 *)final;
419 __u32 *temp_u32 = (__u32 *)tempbuf;
420
421 if (passphrase_size > EXT4_MAX_PASSPHRASE_SIZE) {
422 printf("Passphrase size is %zd; max is %d.\n", passphrase_size,
423 EXT4_MAX_PASSPHRASE_SIZE);
424 exit(1);
425 }
426 if (salt->salt_len > EXT4_MAX_SALT_SIZE) {
427 printf("Salt size is %zd; max is %d.\n", salt->salt_len,
428 EXT4_MAX_SALT_SIZE);
429 exit(1);
430 }
431 assert(EXT4_MAX_KEY_SIZE <= SHA512_LENGTH);
432
433 memcpy(saltbuf, salt->salt, salt->salt_len);
434 memcpy(&saltbuf[EXT4_MAX_SALT_SIZE], passphrase, passphrase_size);
435
436 memcpy(&buf[SHA512_LENGTH], passphrase, passphrase_size);
437
438 for (x = 0; x < count; ++x) {
439 if (x == 0) {
440 ext2fs_sha512(saltbuf, actual_saltbuf_len, tempbuf);
441 } else {
442 /*
443 * buf: [previous hash || passphrase]
444 */
445 memcpy(buf, tempbuf, SHA512_LENGTH);
446 ext2fs_sha512(buf, actual_buf_len, tempbuf);
447 }
448 for (y = 0; y < (sizeof(final) / sizeof(*final_u32)); ++y)
449 final_u32[y] = final_u32[y] ^ temp_u32[y];
450 }
451 memcpy(derived_key, final, EXT4_MAX_KEY_SIZE);
452 }
Высосал всё из пальца, ага.
КЭП намекает, что радужные таблицы можно делать не только с хешами, но и с ключами для шифрования.