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
6 * $FreeBSD: src/lib/libncp/ncpl_crypt.c,v 1.1 1999/10/12 11:56:39 bp Exp $
7 * $DragonFly: src/lib/libncp/ncpl_crypt.c,v 1.2 2003/06/17 04:26:50 dillon Exp $
10 #include <sys/errno.h>
11 #include <sys/malloc.h>
14 /*$*********************************************************
16 $* This code has been taken from DDJ 11/93, from an
17 $* article by Pawel Szczerbina.
19 $* Password encryption routines follow.
20 $* Converted to C from Barry Nance's Pascal
21 $* prog published in the March -93 issue of Byte.
23 $* Adapted to be useable for ncpfs by
24 $* Volker Lendecke <lendecke@namu01.gwdg.de> in
27 $********************************************************* */
31 typedef unsigned char buf32
[32];
33 static unsigned char encrypttable
[256] = {
34 0x7, 0x8, 0x0, 0x8, 0x6, 0x4, 0xE, 0x4, 0x5, 0xC, 0x1, 0x7, 0xB, 0xF, 0xA, 0x8,
35 0xF, 0x8, 0xC, 0xC, 0x9, 0x4, 0x1, 0xE, 0x4, 0x6, 0x2, 0x4, 0x0, 0xA, 0xB, 0x9,
36 0x2, 0xF, 0xB, 0x1, 0xD, 0x2, 0x1, 0x9, 0x5, 0xE, 0x7, 0x0, 0x0, 0x2, 0x6, 0x6,
37 0x0, 0x7, 0x3, 0x8, 0x2, 0x9, 0x3, 0xF, 0x7, 0xF, 0xC, 0xF, 0x6, 0x4, 0xA, 0x0,
38 0x2, 0x3, 0xA, 0xB, 0xD, 0x8, 0x3, 0xA, 0x1, 0x7, 0xC, 0xF, 0x1, 0x8, 0x9, 0xD,
39 0x9, 0x1, 0x9, 0x4, 0xE, 0x4, 0xC, 0x5, 0x5, 0xC, 0x8, 0xB, 0x2, 0x3, 0x9, 0xE,
40 0x7, 0x7, 0x6, 0x9, 0xE, 0xF, 0xC, 0x8, 0xD, 0x1, 0xA, 0x6, 0xE, 0xD, 0x0, 0x7,
41 0x7, 0xA, 0x0, 0x1, 0xF, 0x5, 0x4, 0xB, 0x7, 0xB, 0xE, 0xC, 0x9, 0x5, 0xD, 0x1,
42 0xB, 0xD, 0x1, 0x3, 0x5, 0xD, 0xE, 0x6, 0x3, 0x0, 0xB, 0xB, 0xF, 0x3, 0x6, 0x4,
43 0x9, 0xD, 0xA, 0x3, 0x1, 0x4, 0x9, 0x4, 0x8, 0x3, 0xB, 0xE, 0x5, 0x0, 0x5, 0x2,
44 0xC, 0xB, 0xD, 0x5, 0xD, 0x5, 0xD, 0x2, 0xD, 0x9, 0xA, 0xC, 0xA, 0x0, 0xB, 0x3,
45 0x5, 0x3, 0x6, 0x9, 0x5, 0x1, 0xE, 0xE, 0x0, 0xE, 0x8, 0x2, 0xD, 0x2, 0x2, 0x0,
46 0x4, 0xF, 0x8, 0x5, 0x9, 0x6, 0x8, 0x6, 0xB, 0xA, 0xB, 0xF, 0x0, 0x7, 0x2, 0x8,
47 0xC, 0x7, 0x3, 0xA, 0x1, 0x4, 0x2, 0x5, 0xF, 0x7, 0xA, 0xC, 0xE, 0x5, 0x9, 0x3,
48 0xE, 0x7, 0x1, 0x2, 0xE, 0x1, 0xF, 0x4, 0xA, 0x6, 0xC, 0x6, 0xF, 0x4, 0x3, 0x0,
49 0xC, 0x0, 0x3, 0x6, 0xF, 0x8, 0x7, 0xB, 0x2, 0xD, 0xC, 0x6, 0xA, 0xA, 0x8, 0xD
52 static buf32 encryptkeys
= {
53 0x48, 0x93, 0x46, 0x67, 0x98, 0x3D, 0xE6, 0x8D,
54 0xB7, 0x10, 0x7A, 0x26, 0x5A, 0xB9, 0xB1, 0x35,
55 0x6B, 0x0F, 0xD5, 0x70, 0xAE, 0xFB, 0xAD, 0x11,
56 0xF4, 0x47, 0xDC, 0xA7, 0xEC, 0xCF, 0x50, 0xC0
60 * Create table-based 16-bytes hash from a 32-bytes array
63 nw_hash(buf32 temp
, unsigned char *target
) {
70 for (b2
= 0; b2
<= 1; ++b2
) {
71 for (s
= 0; s
<= 31; ++s
) {
72 b3
= (temp
[s
] + sum
) ^ (temp
[(s
+ sum
) & 31] - encryptkeys
[s
]);
78 for (i
= 0; i
<= 15; ++i
) {
79 target
[i
] = encrypttable
[temp
[2 * i
]]
80 | (encrypttable
[temp
[2 * i
+ 1]] << 4);
86 * Create a 16-bytes pattern from given buffer based on a four bytes key
89 nw_keyhash(const u_char
*key
, const u_char
*buf
, int buflen
, u_char
*target
) {
93 while (buflen
> 0 && buf
[buflen
- 1] == 0)
96 bzero(temp
, sizeof(temp
));
99 while (buflen
>= 32) {
100 for (s
= 0; s
<= 31; ++s
)
106 for (s
= 0; s
<= 31; ++s
) {
107 if (d
+ buflen
== b2
) {
108 temp
[s
] ^= encryptkeys
[s
];
111 temp
[s
] ^= buf
[b2
++];
114 for (s
= 0; s
<= 31; ++s
)
115 temp
[s
] ^= key
[s
& 3];
117 nw_hash(temp
, target
);
121 * Create an 8-bytes pattern from an 8-bytes key and 16-bytes of data
124 nw_encrypt(const u_char
*fra
, const u_char
*buf
, u_char
*target
) {
128 nw_keyhash(fra
, buf
, 16, k
);
129 nw_keyhash(fra
+ 4, buf
, 16, k
+ 16);
131 for (s
= 0; s
< 16; s
++)
134 for (s
= 0; s
< 8; s
++)
135 *target
++ = k
[s
] ^ k
[15 - s
];