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