/* * 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; } } }