]>
Commit | Line | Data |
---|---|---|
63f791d3 GK |
1 | /* |
2 | * UFC-crypt: ultra fast crypt(3) implementation | |
3 | * | |
568035b7 | 4 | * Copyright (C) 1991-2013 Free Software Foundation, Inc. |
63f791d3 GK |
5 | * |
6 | * This library is free software; you can redistribute it and/or | |
cc7375ce | 7 | * modify it under the terms of the GNU Lesser General Public |
63f791d3 | 8 | * License as published by the Free Software Foundation; either |
cc7375ce | 9 | * version 2.1 of the License, or (at your option) any later version. |
63f791d3 GK |
10 | * |
11 | * This library is distributed in the hope that it will be useful, | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
cc7375ce | 14 | * Lesser General Public License for more details. |
63f791d3 | 15 | * |
cc7375ce | 16 | * You should have received a copy of the GNU Lesser General Public |
63f791d3 | 17 | * License along with this library; see the file COPYING.LIB. If not, |
59ba27a6 | 18 | * see <http://www.gnu.org/licenses/>. |
63f791d3 GK |
19 | * |
20 | * @(#)crypt.c 2.25 12/20/96 | |
21 | * | |
22 | * Semiportable C version | |
23 | * | |
24 | */ | |
25 | ||
26 | #include "ufc-crypt.h" | |
27 | #include "crypt.h" | |
28 | #include "crypt-private.h" | |
29 | ||
30 | #ifdef _UFC_32_ | |
31 | ||
32 | /* | |
33 | * 32 bit version | |
34 | */ | |
35 | ||
36 | #define SBA(sb, v) (*(long32*)((char*)(sb)+(v))) | |
37 | ||
38 | void | |
39 | _ufc_doit_r(itr, __data, res) | |
40 | ufc_long itr, *res; | |
41 | struct crypt_data * __restrict __data; | |
42 | { | |
43 | int i; | |
44 | long32 s, *k; | |
45 | long32 *sb01 = (long32*)__data->sb0; | |
46 | long32 *sb23 = (long32*)__data->sb2; | |
47 | long32 l1, l2, r1, r2; | |
48 | ||
49 | l1 = (long32)res[0]; l2 = (long32)res[1]; | |
50 | r1 = (long32)res[2]; r2 = (long32)res[3]; | |
51 | ||
52 | while(itr--) { | |
53 | k = (long32*)__data->keysched; | |
54 | for(i=8; i--; ) { | |
55 | s = *k++ ^ r1; | |
56 | l1 ^= SBA(sb01, s & 0xffff); l2 ^= SBA(sb01, (s & 0xffff)+4); | |
57 | l1 ^= SBA(sb01, s >>= 16 ); l2 ^= SBA(sb01, (s )+4); | |
58 | s = *k++ ^ r2; | |
59 | l1 ^= SBA(sb23, s & 0xffff); l2 ^= SBA(sb23, (s & 0xffff)+4); | |
60 | l1 ^= SBA(sb23, s >>= 16 ); l2 ^= SBA(sb23, (s )+4); | |
61 | ||
62 | s = *k++ ^ l1; | |
63 | r1 ^= SBA(sb01, s & 0xffff); r2 ^= SBA(sb01, (s & 0xffff)+4); | |
64 | r1 ^= SBA(sb01, s >>= 16 ); r2 ^= SBA(sb01, (s )+4); | |
65 | s = *k++ ^ l2; | |
66 | r1 ^= SBA(sb23, s & 0xffff); r2 ^= SBA(sb23, (s & 0xffff)+4); | |
67 | r1 ^= SBA(sb23, s >>= 16 ); r2 ^= SBA(sb23, (s )+4); | |
68 | } | |
69 | s=l1; l1=r1; r1=s; s=l2; l2=r2; r2=s; | |
70 | } | |
71 | res[0] = l1; res[1] = l2; res[2] = r1; res[3] = r2; | |
72 | } | |
73 | ||
74 | #endif | |
75 | ||
76 | #ifdef _UFC_64_ | |
77 | ||
78 | /* | |
79 | * 64 bit version | |
80 | */ | |
81 | ||
82 | #define SBA(sb, v) (*(long64*)((char*)(sb)+(v))) | |
83 | ||
84 | void | |
85 | _ufc_doit_r(itr, __data, res) | |
86 | ufc_long itr, *res; | |
87 | struct crypt_data * __restrict __data; | |
88 | { | |
89 | int i; | |
90 | long64 l, r, s, *k; | |
91 | register long64 *sb01 = (long64*)__data->sb0; | |
92 | register long64 *sb23 = (long64*)__data->sb2; | |
93 | ||
94 | l = (((long64)res[0]) << 32) | ((long64)res[1]); | |
95 | r = (((long64)res[2]) << 32) | ((long64)res[3]); | |
96 | ||
97 | while(itr--) { | |
98 | k = (long64*)__data->keysched; | |
99 | for(i=8; i--; ) { | |
100 | s = *k++ ^ r; | |
101 | l ^= SBA(sb23, (s ) & 0xffff); | |
102 | l ^= SBA(sb23, (s >>= 16) & 0xffff); | |
103 | l ^= SBA(sb01, (s >>= 16) & 0xffff); | |
104 | l ^= SBA(sb01, (s >>= 16) ); | |
105 | ||
106 | s = *k++ ^ l; | |
107 | r ^= SBA(sb23, (s ) & 0xffff); | |
108 | r ^= SBA(sb23, (s >>= 16) & 0xffff); | |
109 | r ^= SBA(sb01, (s >>= 16) & 0xffff); | |
110 | r ^= SBA(sb01, (s >>= 16) ); | |
111 | } | |
112 | s=l; l=r; r=s; | |
113 | } | |
114 | ||
115 | res[0] = l >> 32; res[1] = l & 0xffffffff; | |
116 | res[2] = r >> 32; res[3] = r & 0xffffffff; | |
117 | } | |
118 | ||
119 | #endif |