]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - lib/libncp/ncpl_crypt.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / lib / libncp / ncpl_crypt.c
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$");
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
32 typedef unsigned char buf32[32];
33
34 static unsigned char encrypttable[256] = {
35 0x7, 0x8, 0x0, 0x8, 0x6, 0x4, 0xE, 0x4, 0x5, 0xC, 0x1, 0x7, 0xB, 0xF, 0xA, 0x8,
36 0xF, 0x8, 0xC, 0xC, 0x9, 0x4, 0x1, 0xE, 0x4, 0x6, 0x2, 0x4, 0x0, 0xA, 0xB, 0x9,
37 0x2, 0xF, 0xB, 0x1, 0xD, 0x2, 0x1, 0x9, 0x5, 0xE, 0x7, 0x0, 0x0, 0x2, 0x6, 0x6,
38 0x0, 0x7, 0x3, 0x8, 0x2, 0x9, 0x3, 0xF, 0x7, 0xF, 0xC, 0xF, 0x6, 0x4, 0xA, 0x0,
39 0x2, 0x3, 0xA, 0xB, 0xD, 0x8, 0x3, 0xA, 0x1, 0x7, 0xC, 0xF, 0x1, 0x8, 0x9, 0xD,
40 0x9, 0x1, 0x9, 0x4, 0xE, 0x4, 0xC, 0x5, 0x5, 0xC, 0x8, 0xB, 0x2, 0x3, 0x9, 0xE,
41 0x7, 0x7, 0x6, 0x9, 0xE, 0xF, 0xC, 0x8, 0xD, 0x1, 0xA, 0x6, 0xE, 0xD, 0x0, 0x7,
42 0x7, 0xA, 0x0, 0x1, 0xF, 0x5, 0x4, 0xB, 0x7, 0xB, 0xE, 0xC, 0x9, 0x5, 0xD, 0x1,
43 0xB, 0xD, 0x1, 0x3, 0x5, 0xD, 0xE, 0x6, 0x3, 0x0, 0xB, 0xB, 0xF, 0x3, 0x6, 0x4,
44 0x9, 0xD, 0xA, 0x3, 0x1, 0x4, 0x9, 0x4, 0x8, 0x3, 0xB, 0xE, 0x5, 0x0, 0x5, 0x2,
45 0xC, 0xB, 0xD, 0x5, 0xD, 0x5, 0xD, 0x2, 0xD, 0x9, 0xA, 0xC, 0xA, 0x0, 0xB, 0x3,
46 0x5, 0x3, 0x6, 0x9, 0x5, 0x1, 0xE, 0xE, 0x0, 0xE, 0x8, 0x2, 0xD, 0x2, 0x2, 0x0,
47 0x4, 0xF, 0x8, 0x5, 0x9, 0x6, 0x8, 0x6, 0xB, 0xA, 0xB, 0xF, 0x0, 0x7, 0x2, 0x8,
48 0xC, 0x7, 0x3, 0xA, 0x1, 0x4, 0x2, 0x5, 0xF, 0x7, 0xA, 0xC, 0xE, 0x5, 0x9, 0x3,
49 0xE, 0x7, 0x1, 0x2, 0xE, 0x1, 0xF, 0x4, 0xA, 0x6, 0xC, 0x6, 0xF, 0x4, 0x3, 0x0,
50 0xC, 0x0, 0x3, 0x6, 0xF, 0x8, 0x7, 0xB, 0x2, 0xD, 0xC, 0x6, 0xA, 0xA, 0x8, 0xD
51 };
52
53 static 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  */
63 static void
64 nw_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  */
89 void
90 nw_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  */
124 void
125 nw_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