_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : Solar Designer 2:5020/400 10 Oct 98 12:18:38
Subj : Re: losetup & DES
________________________________________________________________________________
From: Solar Designer <solar@cannabis.dataforce.net>
Alex Korchmar <alx@corbina.net> wrote:
> P.S. можешь поискать loopencrypt - он заменяет изрядный кусок loop.c, добавляя
> idea помимо des'а. Правда, по-моему, тоже с багами.
> Вдобавок, это был патч к очень старому ядру, к новому он прикладывается
> только с ручной правкой, да еще и не собирается модулем.
Все немного проще. Берется мой _мелкий_ патч для loop.c, а из Berkeley'вых
патчей берется только часть собственно с куском от libdes (там это в
отдельном diff'е, под еще 2.0.11, но т.к. он только создает новые файлы,
то без проблем apply'ится на новые ядра). Далее, losetup и mount можно не
трогать, а можно и пропатчить, чтобы IV не спрашивали (просто загнать его
в 0 и все, толку-то мало), и таймаут забытый от времен flock'а снять перед
запросом пароля. Получается вполне нормальная реализация DES в CBC режиме.
- --- loop.c.orig Wed Apr 22 02:42:31 1998
+++ loop.c Wed May 6 21:23:58 1998
@@ -98,22 +98,22 @@
x1 = lo->lo_des_init[1];
while (size) {
if (cmd == READ) {
- tmp[0] = (p0 = ((unsigned long *) raw_buf)[0])^x0;
- tmp[1] = (p1 = ((unsigned long *) raw_buf)[1])^x1;
- des_ecb_encrypt((des_cblock *) tmp,(des_cblock *)
- loop_buf,lo->lo_des_key,DES_ENCRYPT);
- x0 = p0^((unsigned long *) loop_buf)[0];
- x1 = p1^((unsigned long *) loop_buf)[1];
+ p0 = ((unsigned long *) raw_buf)[0];
+ p1 = ((unsigned long *) raw_buf)[1];
+ des_ecb_encrypt((des_cblock *) raw_buf,(des_cblock *)
+ loop_buf,lo->lo_des_key,DES_DECRYPT);
+ ((unsigned long *) loop_buf)[0] ^= x0;
+ ((unsigned long *) loop_buf)[1] ^= x1;
+ x0 = p0;
+ x1 = p1;
}
else {
- p0 = ((unsigned long *) loop_buf)[0];
- p1 = ((unsigned long *) loop_buf)[1];
- des_ecb_encrypt((des_cblock *) loop_buf,(des_cblock *)
- raw_buf,lo->lo_des_key,DES_DECRYPT);
- ((unsigned long *) raw_buf)[0] ^= x0;
- ((unsigned long *) raw_buf)[1] ^= x1;
- x0 = p0^((unsigned long *) raw_buf)[0];
- x1 = p1^((unsigned long *) raw_buf)[1];
+ tmp[0] = (p0 = ((unsigned long *) loop_buf)[0])^x0;
+ tmp[1] = (p1 = ((unsigned long *) loop_buf)[1])^x1;
+ des_ecb_encrypt((des_cblock *) tmp,(des_cblock *)
+ raw_buf,lo->lo_des_key,DES_ENCRYPT);
+ x0 = ((unsigned long *) raw_buf)[0];
+ x1 = ((unsigned long *) raw_buf)[1];
}
size -= 8;
raw_buf += 8;
@@ -372,8 +372,28 @@
case LO_CRYPT_DES:
if (info.lo_encrypt_key_size != 8)
return -EINVAL;
- des_set_key((des_cblock *) lo->lo_encrypt_key,
- lo->lo_des_key);
+ {
+ char key[8];
+ char *ptr;
+ int i, value, count;
+
+ ptr = info.lo_encrypt_key;
+ for (i = 0; i < 8; i++) {
+ if ((key[i] = value = *ptr)) ptr++;
+
+ count = 0;
+ if (value)
+ do {
+ count++;
+ } while ((value &= value - 1));
+
+ if (count & 1)
+ key[i] &= ~0x80;
+ else
+ key[i] |= 0x80;
+ }
+ des_set_key((des_cblock *) key, lo->lo_des_key);
+ }
memcpy(lo->lo_des_init,info.lo_init,8);
break;
#endif