LINUX.ORG.RU

История изменений

Исправление 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 }

Высосал всё из пальца, ага.

КЭП намекает, что радужные таблицы можно делать не только с хешами, но и с ключами для шифрования.