ncpl_crypt.c revision 84213
1/* 2 * Routines in this file based on the work of Volker Lendecke, 3 * Adapted for ncplib by Boris Popov 4 * Please note that ncpl_crypt.c file should be indentical to this one 5 */ 6 7#include <sys/cdefs.h> 8__FBSDID("$FreeBSD: head/lib/libncp/ncpl_crypt.c 84213 2001-09-30 22:01:19Z dillon $"); 9 10#include <sys/param.h> 11#include <sys/errno.h> 12#include <sys/malloc.h> 13#include <string.h> 14 15/*$********************************************************* 16 $* 17 $* This code has been taken from DDJ 11/93, from an 18 $* article by Pawel Szczerbina. 19 $* 20 $* Password encryption routines follow. 21 $* Converted to C from Barry Nance's Pascal 22 $* prog published in the March -93 issue of Byte. 23 $* 24 $* Adapted to be useable for ncpfs by 25 $* Volker Lendecke <lendecke@namu01.gwdg.de> in 26 $* October 1995. 27 $* 28 $********************************************************* */ 29 30 31 32typedef unsigned char buf32[32]; 33 34static unsigned char encrypttable[256] = { 350x7, 0x8, 0x0, 0x8, 0x6, 0x4, 0xE, 0x4, 0x5, 0xC, 0x1, 0x7, 0xB, 0xF, 0xA, 0x8, 360xF, 0x8, 0xC, 0xC, 0x9, 0x4, 0x1, 0xE, 0x4, 0x6, 0x2, 0x4, 0x0, 0xA, 0xB, 0x9, 370x2, 0xF, 0xB, 0x1, 0xD, 0x2, 0x1, 0x9, 0x5, 0xE, 0x7, 0x0, 0x0, 0x2, 0x6, 0x6, 380x0, 0x7, 0x3, 0x8, 0x2, 0x9, 0x3, 0xF, 0x7, 0xF, 0xC, 0xF, 0x6, 0x4, 0xA, 0x0, 390x2, 0x3, 0xA, 0xB, 0xD, 0x8, 0x3, 0xA, 0x1, 0x7, 0xC, 0xF, 0x1, 0x8, 0x9, 0xD, 400x9, 0x1, 0x9, 0x4, 0xE, 0x4, 0xC, 0x5, 0x5, 0xC, 0x8, 0xB, 0x2, 0x3, 0x9, 0xE, 410x7, 0x7, 0x6, 0x9, 0xE, 0xF, 0xC, 0x8, 0xD, 0x1, 0xA, 0x6, 0xE, 0xD, 0x0, 0x7, 420x7, 0xA, 0x0, 0x1, 0xF, 0x5, 0x4, 0xB, 0x7, 0xB, 0xE, 0xC, 0x9, 0x5, 0xD, 0x1, 430xB, 0xD, 0x1, 0x3, 0x5, 0xD, 0xE, 0x6, 0x3, 0x0, 0xB, 0xB, 0xF, 0x3, 0x6, 0x4, 440x9, 0xD, 0xA, 0x3, 0x1, 0x4, 0x9, 0x4, 0x8, 0x3, 0xB, 0xE, 0x5, 0x0, 0x5, 0x2, 450xC, 0xB, 0xD, 0x5, 0xD, 0x5, 0xD, 0x2, 0xD, 0x9, 0xA, 0xC, 0xA, 0x0, 0xB, 0x3, 460x5, 0x3, 0x6, 0x9, 0x5, 0x1, 0xE, 0xE, 0x0, 0xE, 0x8, 0x2, 0xD, 0x2, 0x2, 0x0, 470x4, 0xF, 0x8, 0x5, 0x9, 0x6, 0x8, 0x6, 0xB, 0xA, 0xB, 0xF, 0x0, 0x7, 0x2, 0x8, 480xC, 0x7, 0x3, 0xA, 0x1, 0x4, 0x2, 0x5, 0xF, 0x7, 0xA, 0xC, 0xE, 0x5, 0x9, 0x3, 490xE, 0x7, 0x1, 0x2, 0xE, 0x1, 0xF, 0x4, 0xA, 0x6, 0xC, 0x6, 0xF, 0x4, 0x3, 0x0, 500xC, 0x0, 0x3, 0x6, 0xF, 0x8, 0x7, 0xB, 0x2, 0xD, 0xC, 0x6, 0xA, 0xA, 0x8, 0xD 51}; 52 53static buf32 encryptkeys = { 54 0x48, 0x93, 0x46, 0x67, 0x98, 0x3D, 0xE6, 0x8D, 55 0xB7, 0x10, 0x7A, 0x26, 0x5A, 0xB9, 0xB1, 0x35, 56 0x6B, 0x0F, 0xD5, 0x70, 0xAE, 0xFB, 0xAD, 0x11, 57 0xF4, 0x47, 0xDC, 0xA7, 0xEC, 0xCF, 0x50, 0xC0 58}; 59 60/* 61 * Create table-based 16-bytes hash from a 32-bytes array 62 */ 63static void 64nw_hash(buf32 temp, unsigned char *target) { 65 short sum; 66 unsigned char b3; 67 int s, b2, i; 68 69 sum = 0; 70 71 for (b2 = 0; b2 <= 1; ++b2) { 72 for (s = 0; s <= 31; ++s) { 73 b3 = (temp[s] + sum) ^ (temp[(s + sum) & 31] - encryptkeys[s]); 74 sum += b3; 75 temp[s] = b3; 76 } 77 } 78 79 for (i = 0; i <= 15; ++i) { 80 target[i] = encrypttable[temp[2 * i]] 81 | (encrypttable[temp[2 * i + 1]] << 4); 82 } 83} 84 85 86/* 87 * Create a 16-bytes pattern from given buffer based on a four bytes key 88 */ 89void 90nw_keyhash(const u_char *key, const u_char *buf, int buflen, u_char *target) { 91 int b2, d, s; 92 buf32 temp; 93 94 while (buflen > 0 && buf[buflen - 1] == 0) 95 buflen--; 96 97 bzero(temp, sizeof(temp)); 98 99 d = 0; 100 while (buflen >= 32) { 101 for (s = 0; s <= 31; ++s) 102 temp[s] ^= buf[d++]; 103 buflen -= 32; 104 } 105 b2 = d; 106 if (buflen > 0) { 107 for (s = 0; s <= 31; ++s) { 108 if (d + buflen == b2) { 109 temp[s] ^= encryptkeys[s]; 110 b2 = d; 111 } else 112 temp[s] ^= buf[b2++]; 113 } 114 } 115 for (s = 0; s <= 31; ++s) 116 temp[s] ^= key[s & 3]; 117 118 nw_hash(temp, target); 119} 120 121/* 122 * Create an 8-bytes pattern from an 8-bytes key and 16-bytes of data 123 */ 124void 125nw_encrypt(const u_char *fra, const u_char *buf, u_char *target) { 126 buf32 k; 127 int s; 128 129 nw_keyhash(fra, buf, 16, k); 130 nw_keyhash(fra + 4, buf, 16, k + 16); 131 132 for (s = 0; s < 16; s++) 133 k[s] ^= k[31 - s]; 134 135 for (s = 0; s < 8; s++) 136 *target++ = k[s] ^ k[15 - s]; 137} 138 139 140