From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <030f01c53fb4$db070260$9efb7d50@kilgore> From: "boyd, rounin" To: "Fans of the OS Plan 9 from Bell Labs" <9fans@cse.psu.edu> References: Subject: Re: [9fans] crypto question Date: Wed, 13 Apr 2005 01:10:44 +0200 MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=response Content-Transfer-Encoding: 7bit Topicbox-Message-UUID: 36f3b5a6-ead0-11e9-9d60-3106f5b1d025 > I noticed that the libc function encrypt() uses some non-standard form > of cipher chaining. In the normal case one byte from the previous block yeah that sounds right. from: http://www.insultant.net/repo/des.msg sed 's/.//' >9des.c <<'//GO.SYSIN DD 9des.c' -/* - * Plan 9 DES encryption. - */ - -#include "des.h" - -int -encrypt(void *key, void *data, int len) -{ - int n; - int r; - int i; - char *b; - - if (len < DESBLOCKLEN) - return 0; - - deskey(key); - - len -= DESBLOCKLEN; - n = len / 7 + 1; - r = len % 7; - - b = data; - - for (i = 0; i < n; i++) - { - des(b, 0); - b += 7; - } - - if (r) - { - b = data; - des(&b[len], 0); - } - - return 1; -} - -/* - * Plan 9 DES decryption. - */ -int -decrypt(void *key, void *data, int len) -{ - int n; - int r; - int i; - char *b; - - if (len < DESBLOCKLEN) - return 0; - - deskey(key); - - len -= DESBLOCKLEN; - n = len / 7 + 1; - r = len % 7; - - b = data; - - if (r) - des(&b[len], 1); - - b = &b[len - r]; - - for (i = 0; i < n; i++) - { - des(b, 1); - b -= 7; - } - - return 1; -} - -/* - * Convert a Plan 9 key to a DES key. - */ -uchar * -des9key(uchar *key) -{ - int i; - int m1[] = { 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F }; - int m2[] = { 0x00, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80 }; - static uchar nkey[DESKEYPLEN]; - - nkey[0] = key[0] & 0xFE; - - for (i = 1; i < 7; i++) - nkey[i] = (key[i - 1] & m1[i]) << 8 - i | (key[i] & m2[i]) >> i; - - nkey[7] = (key[6] & 0x7F) << 1; - - - return nkey; -} - -/* - * Securenet challenge encryption. - */ -int -netcrypt(void *key, void *data) -{ - uchar b[DESBLOCKLEN]; - - strncpy((char *)b, (char *)data, DESBLOCKLEN); - - if (!encrypt(des9key(key), b, DESBLOCKLEN)) - return 0; - - sprint((char *)data, "%.2ux%.2ux%.2ux%.2ux", b[0], b[1], b[2], b[3]); - return 1; -} - -/* - * Map a hexadecimal string to Securenet decimal string. - */ -void -sechex(char *buf) -{ - char *p; - - for (p = buf; *p != '\0'; p++) - { - switch (*p) - { - case 'A': - case 'B': - case 'C': - case 'a': - case 'b': - case 'c': - *p = '2'; - break; - - case 'D': - case 'E': - case 'F': - case 'd': - case 'e': - case 'f': - *p = '3'; - break; - } - } -} //GO.SYSIN DD 9des.c -- MGRS 31U DQ 52572 12604