Print this page
first pass
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/common/crypto/des/des_impl.c
+++ new/usr/src/common/crypto/des/des_impl.c
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21 /*
22 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 23 * Use is subject to license terms.
24 24 */
25 25
26 26 #include <sys/types.h>
27 27 #include <sys/systm.h>
28 28 #include <sys/ddi.h>
29 29 #include <sys/sysmacros.h>
30 30 #include <sys/strsun.h>
31 31 #include <sys/crypto/spi.h>
32 32 #include <modes/modes.h>
33 33 #include <sys/crypto/common.h>
34 34 #include "des_impl.h"
↓ open down ↓ |
34 lines elided |
↑ open up ↑ |
35 35 #ifndef _KERNEL
36 36 #include <strings.h>
37 37 #include <stdlib.h>
38 38 #endif /* !_KERNEL */
39 39
40 40 #if defined(__i386) || defined(__amd64)
41 41 #include <sys/byteorder.h>
42 42 #define UNALIGNED_POINTERS_PERMITTED
43 43 #endif
44 44
45 -/* EXPORT DELETE START */
46 -
47 45 typedef struct keysched_s {
48 46 uint64_t ksch_encrypt[16];
49 47 uint64_t ksch_decrypt[16];
50 48 } keysched_t;
51 49
52 50 typedef struct keysched3_s {
53 51 uint64_t ksch_encrypt[48];
54 52 uint64_t ksch_decrypt[48];
55 53 } keysched3_t;
56 54
57 55 static void fix_des_parity(uint64_t *);
58 56
59 57 #ifndef sun4u
60 58
61 59 static const uint64_t sbox_table[8][64]=
62 60 {
63 61 /* BEGIN CSTYLED */
64 62 {
65 63 0x0000140140020000ULL, 0x0000000000000000ULL, 0x0000000140000000ULL, 0x0000140140020020ULL,
66 64 0x0000140140000020ULL, 0x0000000140020020ULL, 0x0000000000000020ULL, 0x0000000140000000ULL,
67 65 0x0000000000020000ULL, 0x0000140140020000ULL, 0x0000140140020020ULL, 0x0000000000020000ULL,
68 66 0x0000140000020020ULL, 0x0000140140000020ULL, 0x0000140000000000ULL, 0x0000000000000020ULL,
69 67 0x0000000000020020ULL, 0x0000140000020000ULL, 0x0000140000020000ULL, 0x0000000140020000ULL,
70 68 0x0000000140020000ULL, 0x0000140140000000ULL, 0x0000140140000000ULL, 0x0000140000020020ULL,
71 69 0x0000000140000020ULL, 0x0000140000000020ULL, 0x0000140000000020ULL, 0x0000000140000020ULL,
72 70 0x0000000000000000ULL, 0x0000000000020020ULL, 0x0000000140020020ULL, 0x0000140000000000ULL,
73 71 0x0000000140000000ULL, 0x0000140140020020ULL, 0x0000000000000020ULL, 0x0000140140000000ULL,
74 72 0x0000140140020000ULL, 0x0000140000000000ULL, 0x0000140000000000ULL, 0x0000000000020000ULL,
75 73 0x0000140140000020ULL, 0x0000000140000000ULL, 0x0000000140020000ULL, 0x0000140000000020ULL,
76 74 0x0000000000020000ULL, 0x0000000000000020ULL, 0x0000140000020020ULL, 0x0000000140020020ULL,
77 75 0x0000140140020020ULL, 0x0000000140000020ULL, 0x0000140140000000ULL, 0x0000140000020020ULL,
78 76 0x0000140000000020ULL, 0x0000000000020020ULL, 0x0000000140020020ULL, 0x0000140140020000ULL,
79 77 0x0000000000020020ULL, 0x0000140000020000ULL, 0x0000140000020000ULL, 0x0000000000000000ULL,
80 78 0x0000000140000020ULL, 0x0000000140020000ULL, 0x0000000000000000ULL, 0x0000140140000020ULL
81 79 },
82 80 {
83 81 0x2000005020000500ULL, 0x2000000020000000ULL, 0x0000000020000000ULL, 0x0000005020000500ULL,
84 82 0x0000005000000000ULL, 0x0000000000000500ULL, 0x2000005000000500ULL, 0x2000000020000500ULL,
85 83 0x2000000000000500ULL, 0x2000005020000500ULL, 0x2000005020000000ULL, 0x2000000000000000ULL,
86 84 0x2000000020000000ULL, 0x0000005000000000ULL, 0x0000000000000500ULL, 0x2000005000000500ULL,
87 85 0x0000005020000000ULL, 0x0000005000000500ULL, 0x2000000020000500ULL, 0x0000000000000000ULL,
88 86 0x2000000000000000ULL, 0x0000000020000000ULL, 0x0000005020000500ULL, 0x2000005000000000ULL,
89 87 0x0000005000000500ULL, 0x2000000000000500ULL, 0x0000000000000000ULL, 0x0000005020000000ULL,
90 88 0x0000000020000500ULL, 0x2000005020000000ULL, 0x2000005000000000ULL, 0x0000000020000500ULL,
91 89 0x0000000000000000ULL, 0x0000005020000500ULL, 0x2000005000000500ULL, 0x0000005000000000ULL,
92 90 0x2000000020000500ULL, 0x2000005000000000ULL, 0x2000005020000000ULL, 0x0000000020000000ULL,
93 91 0x2000005000000000ULL, 0x2000000020000000ULL, 0x0000000000000500ULL, 0x2000005020000500ULL,
94 92 0x0000005020000500ULL, 0x0000000000000500ULL, 0x0000000020000000ULL, 0x2000000000000000ULL,
95 93 0x0000000020000500ULL, 0x2000005020000000ULL, 0x0000005000000000ULL, 0x2000000000000500ULL,
96 94 0x0000005000000500ULL, 0x2000000020000500ULL, 0x2000000000000500ULL, 0x0000005000000500ULL,
97 95 0x0000005020000000ULL, 0x0000000000000000ULL, 0x2000000020000000ULL, 0x0000000020000500ULL,
98 96 0x2000000000000000ULL, 0x2000005000000500ULL, 0x2000005020000500ULL, 0x0000005020000000ULL
99 97 },
100 98 {
101 99 0x0000000000014040ULL, 0x0000800280014000ULL, 0x0000000000000000ULL, 0x0000800280000040ULL,
102 100 0x0000800000014000ULL, 0x0000000000000000ULL, 0x0000000280014040ULL, 0x0000800000014000ULL,
103 101 0x0000000280000040ULL, 0x0000800000000040ULL, 0x0000800000000040ULL, 0x0000000280000000ULL,
104 102 0x0000800280014040ULL, 0x0000000280000040ULL, 0x0000800280000000ULL, 0x0000000000014040ULL,
105 103 0x0000800000000000ULL, 0x0000000000000040ULL, 0x0000800280014000ULL, 0x0000000000014000ULL,
106 104 0x0000000280014000ULL, 0x0000800280000000ULL, 0x0000800280000040ULL, 0x0000000280014040ULL,
107 105 0x0000800000014040ULL, 0x0000000280014000ULL, 0x0000000280000000ULL, 0x0000800000014040ULL,
108 106 0x0000000000000040ULL, 0x0000800280014040ULL, 0x0000000000014000ULL, 0x0000800000000000ULL,
109 107 0x0000800280014000ULL, 0x0000800000000000ULL, 0x0000000280000040ULL, 0x0000000000014040ULL,
110 108 0x0000000280000000ULL, 0x0000800280014000ULL, 0x0000800000014000ULL, 0x0000000000000000ULL,
111 109 0x0000000000014000ULL, 0x0000000280000040ULL, 0x0000800280014040ULL, 0x0000800000014000ULL,
112 110 0x0000800000000040ULL, 0x0000000000014000ULL, 0x0000000000000000ULL, 0x0000800280000040ULL,
113 111 0x0000800000014040ULL, 0x0000000280000000ULL, 0x0000800000000000ULL, 0x0000800280014040ULL,
114 112 0x0000000000000040ULL, 0x0000000280014040ULL, 0x0000000280014000ULL, 0x0000800000000040ULL,
115 113 0x0000800280000000ULL, 0x0000800000014040ULL, 0x0000000000014040ULL, 0x0000800280000000ULL,
116 114 0x0000000280014040ULL, 0x0000000000000040ULL, 0x0000800280000040ULL, 0x0000000280014000ULL
117 115 },
118 116 {
119 117 0x4000020008100008ULL, 0x4000000008101008ULL, 0x4000000008101008ULL, 0x0000000000001000ULL,
120 118 0x0000020008101000ULL, 0x4000020000001008ULL, 0x4000020000000008ULL, 0x4000000008100008ULL,
121 119 0x0000000000000000ULL, 0x0000020008100000ULL, 0x0000020008100000ULL, 0x4000020008101008ULL,
122 120 0x4000000000001008ULL, 0x0000000000000000ULL, 0x0000020000001000ULL, 0x4000020000000008ULL,
123 121 0x4000000000000008ULL, 0x0000000008100000ULL, 0x0000020000000000ULL, 0x4000020008100008ULL,
124 122 0x0000000000001000ULL, 0x0000020000000000ULL, 0x4000000008100008ULL, 0x0000000008101000ULL,
125 123 0x4000020000001008ULL, 0x4000000000000008ULL, 0x0000000008101000ULL, 0x0000020000001000ULL,
126 124 0x0000000008100000ULL, 0x0000020008101000ULL, 0x4000020008101008ULL, 0x4000000000001008ULL,
127 125 0x0000020000001000ULL, 0x4000020000000008ULL, 0x0000020008100000ULL, 0x4000020008101008ULL,
128 126 0x4000000000001008ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 0x0000020008100000ULL,
129 127 0x0000000008101000ULL, 0x0000020000001000ULL, 0x4000020000001008ULL, 0x4000000000000008ULL,
130 128 0x4000020008100008ULL, 0x4000000008101008ULL, 0x4000000008101008ULL, 0x0000000000001000ULL,
131 129 0x4000020008101008ULL, 0x4000000000001008ULL, 0x4000000000000008ULL, 0x0000000008100000ULL,
132 130 0x4000020000000008ULL, 0x4000000008100008ULL, 0x0000020008101000ULL, 0x4000020000001008ULL,
133 131 0x4000000008100008ULL, 0x0000000008101000ULL, 0x0000020000000000ULL, 0x4000020008100008ULL,
134 132 0x0000000000001000ULL, 0x0000020000000000ULL, 0x0000000008100000ULL, 0x0000020008101000ULL
135 133 },
136 134 {
137 135 0x000000000000a000ULL, 0x000028080000a000ULL, 0x0000280800000000ULL, 0x100028000000a000ULL,
138 136 0x0000000800000000ULL, 0x000000000000a000ULL, 0x1000000000000000ULL, 0x0000280800000000ULL,
139 137 0x100000080000a000ULL, 0x0000000800000000ULL, 0x000028000000a000ULL, 0x100000080000a000ULL,
140 138 0x100028000000a000ULL, 0x1000280800000000ULL, 0x000000080000a000ULL, 0x1000000000000000ULL,
141 139 0x0000280000000000ULL, 0x1000000800000000ULL, 0x1000000800000000ULL, 0x0000000000000000ULL,
142 140 0x100000000000a000ULL, 0x100028080000a000ULL, 0x100028080000a000ULL, 0x000028000000a000ULL,
143 141 0x1000280800000000ULL, 0x100000000000a000ULL, 0x0000000000000000ULL, 0x1000280000000000ULL,
144 142 0x000028080000a000ULL, 0x0000280000000000ULL, 0x1000280000000000ULL, 0x000000080000a000ULL,
145 143 0x0000000800000000ULL, 0x100028000000a000ULL, 0x000000000000a000ULL, 0x0000280000000000ULL,
146 144 0x1000000000000000ULL, 0x0000280800000000ULL, 0x100028000000a000ULL, 0x100000080000a000ULL,
147 145 0x000028000000a000ULL, 0x1000000000000000ULL, 0x1000280800000000ULL, 0x000028080000a000ULL,
148 146 0x100000080000a000ULL, 0x000000000000a000ULL, 0x0000280000000000ULL, 0x1000280800000000ULL,
149 147 0x100028080000a000ULL, 0x000000080000a000ULL, 0x1000280000000000ULL, 0x100028080000a000ULL,
150 148 0x0000280800000000ULL, 0x0000000000000000ULL, 0x1000000800000000ULL, 0x1000280000000000ULL,
151 149 0x000000080000a000ULL, 0x000028000000a000ULL, 0x100000000000a000ULL, 0x0000000800000000ULL,
152 150 0x0000000000000000ULL, 0x1000000800000000ULL, 0x000028080000a000ULL, 0x100000000000a000ULL
153 151 },
154 152 {
155 153 0x0802000000000280ULL, 0x0802010000000000ULL, 0x0000000010000000ULL, 0x0802010010000280ULL,
156 154 0x0802010000000000ULL, 0x0000000000000280ULL, 0x0802010010000280ULL, 0x0000010000000000ULL,
157 155 0x0802000010000000ULL, 0x0000010010000280ULL, 0x0000010000000000ULL, 0x0802000000000280ULL,
158 156 0x0000010000000280ULL, 0x0802000010000000ULL, 0x0802000000000000ULL, 0x0000000010000280ULL,
159 157 0x0000000000000000ULL, 0x0000010000000280ULL, 0x0802000010000280ULL, 0x0000000010000000ULL,
160 158 0x0000010010000000ULL, 0x0802000010000280ULL, 0x0000000000000280ULL, 0x0802010000000280ULL,
161 159 0x0802010000000280ULL, 0x0000000000000000ULL, 0x0000010010000280ULL, 0x0802010010000000ULL,
162 160 0x0000000010000280ULL, 0x0000010010000000ULL, 0x0802010010000000ULL, 0x0802000000000000ULL,
163 161 0x0802000010000000ULL, 0x0000000000000280ULL, 0x0802010000000280ULL, 0x0000010010000000ULL,
164 162 0x0802010010000280ULL, 0x0000010000000000ULL, 0x0000000010000280ULL, 0x0802000000000280ULL,
165 163 0x0000010000000000ULL, 0x0802000010000000ULL, 0x0802000000000000ULL, 0x0000000010000280ULL,
166 164 0x0802000000000280ULL, 0x0802010010000280ULL, 0x0000010010000000ULL, 0x0802010000000000ULL,
167 165 0x0000010010000280ULL, 0x0802010010000000ULL, 0x0000000000000000ULL, 0x0802010000000280ULL,
168 166 0x0000000000000280ULL, 0x0000000010000000ULL, 0x0802010000000000ULL, 0x0000010010000280ULL,
169 167 0x0000000010000000ULL, 0x0000010000000280ULL, 0x0802000010000280ULL, 0x0000000000000000ULL,
170 168 0x0802010010000000ULL, 0x0802000000000000ULL, 0x0000010000000280ULL, 0x0802000010000280ULL
171 169 },
172 170 {
173 171 0x000000a000000000ULL, 0x800040a000000010ULL, 0x8000400000040010ULL, 0x0000000000000000ULL,
174 172 0x0000000000040000ULL, 0x8000400000040010ULL, 0x800000a000040010ULL, 0x000040a000040000ULL,
175 173 0x800040a000040010ULL, 0x000000a000000000ULL, 0x0000000000000000ULL, 0x8000400000000010ULL,
176 174 0x8000000000000010ULL, 0x0000400000000000ULL, 0x800040a000000010ULL, 0x8000000000040010ULL,
177 175 0x0000400000040000ULL, 0x800000a000040010ULL, 0x800000a000000010ULL, 0x0000400000040000ULL,
178 176 0x8000400000000010ULL, 0x000040a000000000ULL, 0x000040a000040000ULL, 0x800000a000000010ULL,
179 177 0x000040a000000000ULL, 0x0000000000040000ULL, 0x8000000000040010ULL, 0x800040a000040010ULL,
180 178 0x000000a000040000ULL, 0x8000000000000010ULL, 0x0000400000000000ULL, 0x000000a000040000ULL,
181 179 0x0000400000000000ULL, 0x000000a000040000ULL, 0x000000a000000000ULL, 0x8000400000040010ULL,
182 180 0x8000400000040010ULL, 0x800040a000000010ULL, 0x800040a000000010ULL, 0x8000000000000010ULL,
183 181 0x800000a000000010ULL, 0x0000400000000000ULL, 0x0000400000040000ULL, 0x000000a000000000ULL,
184 182 0x000040a000040000ULL, 0x8000000000040010ULL, 0x800000a000040010ULL, 0x000040a000040000ULL,
185 183 0x8000000000040010ULL, 0x8000400000000010ULL, 0x800040a000040010ULL, 0x000040a000000000ULL,
186 184 0x000000a000040000ULL, 0x0000000000000000ULL, 0x8000000000000010ULL, 0x800040a000040010ULL,
187 185 0x0000000000000000ULL, 0x800000a000040010ULL, 0x000040a000000000ULL, 0x0000000000040000ULL,
188 186 0x8000400000000010ULL, 0x0000400000040000ULL, 0x0000000000040000ULL, 0x800000a000000010ULL
189 187 },
190 188 {
191 189 0x0401000004080800ULL, 0x0000000004080000ULL, 0x0000000400000000ULL, 0x0401000404080800ULL,
192 190 0x0401000000000000ULL, 0x0401000004080800ULL, 0x0000000000000800ULL, 0x0401000000000000ULL,
193 191 0x0000000400000800ULL, 0x0401000400000000ULL, 0x0401000404080800ULL, 0x0000000404080000ULL,
194 192 0x0401000404080000ULL, 0x0000000404080800ULL, 0x0000000004080000ULL, 0x0000000000000800ULL,
195 193 0x0401000400000000ULL, 0x0401000000000800ULL, 0x0401000004080000ULL, 0x0000000004080800ULL,
196 194 0x0000000404080000ULL, 0x0000000400000800ULL, 0x0401000400000800ULL, 0x0401000404080000ULL,
197 195 0x0000000004080800ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 0x0401000400000800ULL,
198 196 0x0401000000000800ULL, 0x0401000004080000ULL, 0x0000000404080800ULL, 0x0000000400000000ULL,
199 197 0x0000000404080800ULL, 0x0000000400000000ULL, 0x0401000404080000ULL, 0x0000000004080000ULL,
200 198 0x0000000000000800ULL, 0x0401000400000800ULL, 0x0000000004080000ULL, 0x0000000404080800ULL,
201 199 0x0401000004080000ULL, 0x0000000000000800ULL, 0x0401000000000800ULL, 0x0401000400000000ULL,
202 200 0x0401000400000800ULL, 0x0401000000000000ULL, 0x0000000400000000ULL, 0x0401000004080800ULL,
203 201 0x0000000000000000ULL, 0x0401000404080800ULL, 0x0000000400000800ULL, 0x0401000000000800ULL,
204 202 0x0401000400000000ULL, 0x0401000004080000ULL, 0x0401000004080800ULL, 0x0000000000000000ULL,
205 203 0x0401000404080800ULL, 0x0000000404080000ULL, 0x0000000404080000ULL, 0x0000000004080800ULL,
206 204 0x0000000004080800ULL, 0x0000000400000800ULL, 0x0401000000000000ULL, 0x0401000404080000ULL
207 205 }
208 206 /* END CSTYLED */
209 207 };
210 208
211 209
212 210 static const uint64_t ip_table[2][256]=
213 211 {
214 212 /* BEGIN CSTYLED */
215 213 {
216 214 0x0000000000000000ULL, 0x0000000000000400ULL, 0x0080000000000280ULL, 0x0080000000000680ULL,
217 215 0x0000000000400000ULL, 0x0000000000400400ULL, 0x0080000000400280ULL, 0x0080000000400680ULL,
218 216 0x0000000000280000ULL, 0x0000000000280400ULL, 0x0080000000280280ULL, 0x0080000000280680ULL,
219 217 0x0000000000680000ULL, 0x0000000000680400ULL, 0x0080000000680280ULL, 0x0080000000680680ULL,
220 218 0x0000000400000000ULL, 0x0000000400000400ULL, 0x0080000400000280ULL, 0x0080000400000680ULL,
221 219 0x0000000400400000ULL, 0x0000000400400400ULL, 0x0080000400400280ULL, 0x0080000400400680ULL,
222 220 0x0000000400280000ULL, 0x0000000400280400ULL, 0x0080000400280280ULL, 0x0080000400280680ULL,
223 221 0x0000000400680000ULL, 0x0000000400680400ULL, 0x0080000400680280ULL, 0x0080000400680680ULL,
224 222 0x0000000280000000ULL, 0x0000000280000400ULL, 0x0080000280000280ULL, 0x0080000280000680ULL,
225 223 0x0000000280400000ULL, 0x0000000280400400ULL, 0x0080000280400280ULL, 0x0080000280400680ULL,
226 224 0x0000000280280000ULL, 0x0000000280280400ULL, 0x0080000280280280ULL, 0x0080000280280680ULL,
227 225 0x0000000280680000ULL, 0x0000000280680400ULL, 0x0080000280680280ULL, 0x0080000280680680ULL,
228 226 0x0000000680000000ULL, 0x0000000680000400ULL, 0x0080000680000280ULL, 0x0080000680000680ULL,
229 227 0x0000000680400000ULL, 0x0000000680400400ULL, 0x0080000680400280ULL, 0x0080000680400680ULL,
230 228 0x0000000680280000ULL, 0x0000000680280400ULL, 0x0080000680280280ULL, 0x0080000680280680ULL,
231 229 0x0000000680680000ULL, 0x0000000680680400ULL, 0x0080000680680280ULL, 0x0080000680680680ULL,
232 230 0x0000400000000000ULL, 0x0000400000000400ULL, 0x0080400000000280ULL, 0x0080400000000680ULL,
233 231 0x0000400000400000ULL, 0x0000400000400400ULL, 0x0080400000400280ULL, 0x0080400000400680ULL,
234 232 0x0000400000280000ULL, 0x0000400000280400ULL, 0x0080400000280280ULL, 0x0080400000280680ULL,
235 233 0x0000400000680000ULL, 0x0000400000680400ULL, 0x0080400000680280ULL, 0x0080400000680680ULL,
236 234 0x0000400400000000ULL, 0x0000400400000400ULL, 0x0080400400000280ULL, 0x0080400400000680ULL,
237 235 0x0000400400400000ULL, 0x0000400400400400ULL, 0x0080400400400280ULL, 0x0080400400400680ULL,
238 236 0x0000400400280000ULL, 0x0000400400280400ULL, 0x0080400400280280ULL, 0x0080400400280680ULL,
239 237 0x0000400400680000ULL, 0x0000400400680400ULL, 0x0080400400680280ULL, 0x0080400400680680ULL,
240 238 0x0000400280000000ULL, 0x0000400280000400ULL, 0x0080400280000280ULL, 0x0080400280000680ULL,
241 239 0x0000400280400000ULL, 0x0000400280400400ULL, 0x0080400280400280ULL, 0x0080400280400680ULL,
242 240 0x0000400280280000ULL, 0x0000400280280400ULL, 0x0080400280280280ULL, 0x0080400280280680ULL,
243 241 0x0000400280680000ULL, 0x0000400280680400ULL, 0x0080400280680280ULL, 0x0080400280680680ULL,
244 242 0x0000400680000000ULL, 0x0000400680000400ULL, 0x0080400680000280ULL, 0x0080400680000680ULL,
245 243 0x0000400680400000ULL, 0x0000400680400400ULL, 0x0080400680400280ULL, 0x0080400680400680ULL,
246 244 0x0000400680280000ULL, 0x0000400680280400ULL, 0x0080400680280280ULL, 0x0080400680280680ULL,
247 245 0x0000400680680000ULL, 0x0000400680680400ULL, 0x0080400680680280ULL, 0x0080400680680680ULL,
248 246 0x0000280000000000ULL, 0x0000280000000400ULL, 0x0080280000000280ULL, 0x0080280000000680ULL,
249 247 0x0000280000400000ULL, 0x0000280000400400ULL, 0x0080280000400280ULL, 0x0080280000400680ULL,
250 248 0x0000280000280000ULL, 0x0000280000280400ULL, 0x0080280000280280ULL, 0x0080280000280680ULL,
251 249 0x0000280000680000ULL, 0x0000280000680400ULL, 0x0080280000680280ULL, 0x0080280000680680ULL,
252 250 0x0000280400000000ULL, 0x0000280400000400ULL, 0x0080280400000280ULL, 0x0080280400000680ULL,
253 251 0x0000280400400000ULL, 0x0000280400400400ULL, 0x0080280400400280ULL, 0x0080280400400680ULL,
254 252 0x0000280400280000ULL, 0x0000280400280400ULL, 0x0080280400280280ULL, 0x0080280400280680ULL,
255 253 0x0000280400680000ULL, 0x0000280400680400ULL, 0x0080280400680280ULL, 0x0080280400680680ULL,
256 254 0x0000280280000000ULL, 0x0000280280000400ULL, 0x0080280280000280ULL, 0x0080280280000680ULL,
257 255 0x0000280280400000ULL, 0x0000280280400400ULL, 0x0080280280400280ULL, 0x0080280280400680ULL,
258 256 0x0000280280280000ULL, 0x0000280280280400ULL, 0x0080280280280280ULL, 0x0080280280280680ULL,
259 257 0x0000280280680000ULL, 0x0000280280680400ULL, 0x0080280280680280ULL, 0x0080280280680680ULL,
260 258 0x0000280680000000ULL, 0x0000280680000400ULL, 0x0080280680000280ULL, 0x0080280680000680ULL,
261 259 0x0000280680400000ULL, 0x0000280680400400ULL, 0x0080280680400280ULL, 0x0080280680400680ULL,
262 260 0x0000280680280000ULL, 0x0000280680280400ULL, 0x0080280680280280ULL, 0x0080280680280680ULL,
263 261 0x0000280680680000ULL, 0x0000280680680400ULL, 0x0080280680680280ULL, 0x0080280680680680ULL,
264 262 0x0000680000000000ULL, 0x0000680000000400ULL, 0x0080680000000280ULL, 0x0080680000000680ULL,
265 263 0x0000680000400000ULL, 0x0000680000400400ULL, 0x0080680000400280ULL, 0x0080680000400680ULL,
266 264 0x0000680000280000ULL, 0x0000680000280400ULL, 0x0080680000280280ULL, 0x0080680000280680ULL,
267 265 0x0000680000680000ULL, 0x0000680000680400ULL, 0x0080680000680280ULL, 0x0080680000680680ULL,
268 266 0x0000680400000000ULL, 0x0000680400000400ULL, 0x0080680400000280ULL, 0x0080680400000680ULL,
269 267 0x0000680400400000ULL, 0x0000680400400400ULL, 0x0080680400400280ULL, 0x0080680400400680ULL,
270 268 0x0000680400280000ULL, 0x0000680400280400ULL, 0x0080680400280280ULL, 0x0080680400280680ULL,
271 269 0x0000680400680000ULL, 0x0000680400680400ULL, 0x0080680400680280ULL, 0x0080680400680680ULL,
272 270 0x0000680280000000ULL, 0x0000680280000400ULL, 0x0080680280000280ULL, 0x0080680280000680ULL,
273 271 0x0000680280400000ULL, 0x0000680280400400ULL, 0x0080680280400280ULL, 0x0080680280400680ULL,
274 272 0x0000680280280000ULL, 0x0000680280280400ULL, 0x0080680280280280ULL, 0x0080680280280680ULL,
275 273 0x0000680280680000ULL, 0x0000680280680400ULL, 0x0080680280680280ULL, 0x0080680280680680ULL,
276 274 0x0000680680000000ULL, 0x0000680680000400ULL, 0x0080680680000280ULL, 0x0080680680000680ULL,
277 275 0x0000680680400000ULL, 0x0000680680400400ULL, 0x0080680680400280ULL, 0x0080680680400680ULL,
278 276 0x0000680680280000ULL, 0x0000680680280400ULL, 0x0080680680280280ULL, 0x0080680680280680ULL,
279 277 0x0000680680680000ULL, 0x0000680680680400ULL, 0x0080680680680280ULL, 0x0080680680680680ULL
280 278 },
281 279 {
282 280 0x0000000000000000ULL, 0x0000000000005000ULL, 0x0000000000000800ULL, 0x0000000000005800ULL,
283 281 0x0000000005000000ULL, 0x0000000005005000ULL, 0x0000000005000800ULL, 0x0000000005005800ULL,
284 282 0x0000000000800000ULL, 0x0000000000805000ULL, 0x0000000000800800ULL, 0x0000000000805800ULL,
285 283 0x0000000005800000ULL, 0x0000000005805000ULL, 0x0000000005800800ULL, 0x0000000005805800ULL,
286 284 0x0000005000000000ULL, 0x0000005000005000ULL, 0x0000005000000800ULL, 0x0000005000005800ULL,
287 285 0x0000005005000000ULL, 0x0000005005005000ULL, 0x0000005005000800ULL, 0x0000005005005800ULL,
288 286 0x0000005000800000ULL, 0x0000005000805000ULL, 0x0000005000800800ULL, 0x0000005000805800ULL,
289 287 0x0000005005800000ULL, 0x0000005005805000ULL, 0x0000005005800800ULL, 0x0000005005805800ULL,
290 288 0x0000000800000000ULL, 0x0000000800005000ULL, 0x0000000800000800ULL, 0x0000000800005800ULL,
291 289 0x0000000805000000ULL, 0x0000000805005000ULL, 0x0000000805000800ULL, 0x0000000805005800ULL,
292 290 0x0000000800800000ULL, 0x0000000800805000ULL, 0x0000000800800800ULL, 0x0000000800805800ULL,
293 291 0x0000000805800000ULL, 0x0000000805805000ULL, 0x0000000805800800ULL, 0x0000000805805800ULL,
294 292 0x0000005800000000ULL, 0x0000005800005000ULL, 0x0000005800000800ULL, 0x0000005800005800ULL,
295 293 0x0000005805000000ULL, 0x0000005805005000ULL, 0x0000005805000800ULL, 0x0000005805005800ULL,
296 294 0x0000005800800000ULL, 0x0000005800805000ULL, 0x0000005800800800ULL, 0x0000005800805800ULL,
297 295 0x0000005805800000ULL, 0x0000005805805000ULL, 0x0000005805800800ULL, 0x0000005805805800ULL,
298 296 0x0005000000000004ULL, 0x0005000000005004ULL, 0x0005000000000804ULL, 0x0005000000005804ULL,
299 297 0x0005000005000004ULL, 0x0005000005005004ULL, 0x0005000005000804ULL, 0x0005000005005804ULL,
300 298 0x0005000000800004ULL, 0x0005000000805004ULL, 0x0005000000800804ULL, 0x0005000000805804ULL,
301 299 0x0005000005800004ULL, 0x0005000005805004ULL, 0x0005000005800804ULL, 0x0005000005805804ULL,
302 300 0x0005005000000004ULL, 0x0005005000005004ULL, 0x0005005000000804ULL, 0x0005005000005804ULL,
303 301 0x0005005005000004ULL, 0x0005005005005004ULL, 0x0005005005000804ULL, 0x0005005005005804ULL,
304 302 0x0005005000800004ULL, 0x0005005000805004ULL, 0x0005005000800804ULL, 0x0005005000805804ULL,
305 303 0x0005005005800004ULL, 0x0005005005805004ULL, 0x0005005005800804ULL, 0x0005005005805804ULL,
306 304 0x0005000800000004ULL, 0x0005000800005004ULL, 0x0005000800000804ULL, 0x0005000800005804ULL,
307 305 0x0005000805000004ULL, 0x0005000805005004ULL, 0x0005000805000804ULL, 0x0005000805005804ULL,
308 306 0x0005000800800004ULL, 0x0005000800805004ULL, 0x0005000800800804ULL, 0x0005000800805804ULL,
309 307 0x0005000805800004ULL, 0x0005000805805004ULL, 0x0005000805800804ULL, 0x0005000805805804ULL,
310 308 0x0005005800000004ULL, 0x0005005800005004ULL, 0x0005005800000804ULL, 0x0005005800005804ULL,
311 309 0x0005005805000004ULL, 0x0005005805005004ULL, 0x0005005805000804ULL, 0x0005005805005804ULL,
312 310 0x0005005800800004ULL, 0x0005005800805004ULL, 0x0005005800800804ULL, 0x0005005800805804ULL,
313 311 0x0005005805800004ULL, 0x0005005805805004ULL, 0x0005005805800804ULL, 0x0005005805805804ULL,
314 312 0x0000800000000000ULL, 0x0000800000005000ULL, 0x0000800000000800ULL, 0x0000800000005800ULL,
315 313 0x0000800005000000ULL, 0x0000800005005000ULL, 0x0000800005000800ULL, 0x0000800005005800ULL,
316 314 0x0000800000800000ULL, 0x0000800000805000ULL, 0x0000800000800800ULL, 0x0000800000805800ULL,
317 315 0x0000800005800000ULL, 0x0000800005805000ULL, 0x0000800005800800ULL, 0x0000800005805800ULL,
318 316 0x0000805000000000ULL, 0x0000805000005000ULL, 0x0000805000000800ULL, 0x0000805000005800ULL,
319 317 0x0000805005000000ULL, 0x0000805005005000ULL, 0x0000805005000800ULL, 0x0000805005005800ULL,
320 318 0x0000805000800000ULL, 0x0000805000805000ULL, 0x0000805000800800ULL, 0x0000805000805800ULL,
321 319 0x0000805005800000ULL, 0x0000805005805000ULL, 0x0000805005800800ULL, 0x0000805005805800ULL,
322 320 0x0000800800000000ULL, 0x0000800800005000ULL, 0x0000800800000800ULL, 0x0000800800005800ULL,
323 321 0x0000800805000000ULL, 0x0000800805005000ULL, 0x0000800805000800ULL, 0x0000800805005800ULL,
324 322 0x0000800800800000ULL, 0x0000800800805000ULL, 0x0000800800800800ULL, 0x0000800800805800ULL,
325 323 0x0000800805800000ULL, 0x0000800805805000ULL, 0x0000800805800800ULL, 0x0000800805805800ULL,
326 324 0x0000805800000000ULL, 0x0000805800005000ULL, 0x0000805800000800ULL, 0x0000805800005800ULL,
327 325 0x0000805805000000ULL, 0x0000805805005000ULL, 0x0000805805000800ULL, 0x0000805805005800ULL,
328 326 0x0000805800800000ULL, 0x0000805800805000ULL, 0x0000805800800800ULL, 0x0000805800805800ULL,
329 327 0x0000805805800000ULL, 0x0000805805805000ULL, 0x0000805805800800ULL, 0x0000805805805800ULL,
330 328 0x0005800000000004ULL, 0x0005800000005004ULL, 0x0005800000000804ULL, 0x0005800000005804ULL,
331 329 0x0005800005000004ULL, 0x0005800005005004ULL, 0x0005800005000804ULL, 0x0005800005005804ULL,
332 330 0x0005800000800004ULL, 0x0005800000805004ULL, 0x0005800000800804ULL, 0x0005800000805804ULL,
333 331 0x0005800005800004ULL, 0x0005800005805004ULL, 0x0005800005800804ULL, 0x0005800005805804ULL,
334 332 0x0005805000000004ULL, 0x0005805000005004ULL, 0x0005805000000804ULL, 0x0005805000005804ULL,
335 333 0x0005805005000004ULL, 0x0005805005005004ULL, 0x0005805005000804ULL, 0x0005805005005804ULL,
336 334 0x0005805000800004ULL, 0x0005805000805004ULL, 0x0005805000800804ULL, 0x0005805000805804ULL,
337 335 0x0005805005800004ULL, 0x0005805005805004ULL, 0x0005805005800804ULL, 0x0005805005805804ULL,
338 336 0x0005800800000004ULL, 0x0005800800005004ULL, 0x0005800800000804ULL, 0x0005800800005804ULL,
339 337 0x0005800805000004ULL, 0x0005800805005004ULL, 0x0005800805000804ULL, 0x0005800805005804ULL,
340 338 0x0005800800800004ULL, 0x0005800800805004ULL, 0x0005800800800804ULL, 0x0005800800805804ULL,
341 339 0x0005800805800004ULL, 0x0005800805805004ULL, 0x0005800805800804ULL, 0x0005800805805804ULL,
342 340 0x0005805800000004ULL, 0x0005805800005004ULL, 0x0005805800000804ULL, 0x0005805800005804ULL,
343 341 0x0005805805000004ULL, 0x0005805805005004ULL, 0x0005805805000804ULL, 0x0005805805005804ULL,
344 342 0x0005805800800004ULL, 0x0005805800805004ULL, 0x0005805800800804ULL, 0x0005805800805804ULL,
345 343 0x0005805805800004ULL, 0x0005805805805004ULL, 0x0005805805800804ULL, 0x0005805805805804ULL
346 344 }
347 345 /* END CSTYLED */
348 346 };
349 347
350 348 static const uint32_t fp_table[256]=
351 349 {
352 350 0x00000000, 0x80000000, 0x00800000, 0x80800000,
353 351 0x00008000, 0x80008000, 0x00808000, 0x80808000,
354 352 0x00000080, 0x80000080, 0x00800080, 0x80800080,
355 353 0x00008080, 0x80008080, 0x00808080, 0x80808080,
356 354 0x40000000, 0xc0000000, 0x40800000, 0xc0800000,
357 355 0x40008000, 0xc0008000, 0x40808000, 0xc0808000,
358 356 0x40000080, 0xc0000080, 0x40800080, 0xc0800080,
359 357 0x40008080, 0xc0008080, 0x40808080, 0xc0808080,
360 358 0x00400000, 0x80400000, 0x00c00000, 0x80c00000,
361 359 0x00408000, 0x80408000, 0x00c08000, 0x80c08000,
362 360 0x00400080, 0x80400080, 0x00c00080, 0x80c00080,
363 361 0x00408080, 0x80408080, 0x00c08080, 0x80c08080,
364 362 0x40400000, 0xc0400000, 0x40c00000, 0xc0c00000,
365 363 0x40408000, 0xc0408000, 0x40c08000, 0xc0c08000,
366 364 0x40400080, 0xc0400080, 0x40c00080, 0xc0c00080,
367 365 0x40408080, 0xc0408080, 0x40c08080, 0xc0c08080,
368 366 0x00004000, 0x80004000, 0x00804000, 0x80804000,
369 367 0x0000c000, 0x8000c000, 0x0080c000, 0x8080c000,
370 368 0x00004080, 0x80004080, 0x00804080, 0x80804080,
371 369 0x0000c080, 0x8000c080, 0x0080c080, 0x8080c080,
372 370 0x40004000, 0xc0004000, 0x40804000, 0xc0804000,
373 371 0x4000c000, 0xc000c000, 0x4080c000, 0xc080c000,
374 372 0x40004080, 0xc0004080, 0x40804080, 0xc0804080,
375 373 0x4000c080, 0xc000c080, 0x4080c080, 0xc080c080,
376 374 0x00404000, 0x80404000, 0x00c04000, 0x80c04000,
377 375 0x0040c000, 0x8040c000, 0x00c0c000, 0x80c0c000,
378 376 0x00404080, 0x80404080, 0x00c04080, 0x80c04080,
379 377 0x0040c080, 0x8040c080, 0x00c0c080, 0x80c0c080,
380 378 0x40404000, 0xc0404000, 0x40c04000, 0xc0c04000,
381 379 0x4040c000, 0xc040c000, 0x40c0c000, 0xc0c0c000,
382 380 0x40404080, 0xc0404080, 0x40c04080, 0xc0c04080,
383 381 0x4040c080, 0xc040c080, 0x40c0c080, 0xc0c0c080,
384 382 0x00000040, 0x80000040, 0x00800040, 0x80800040,
385 383 0x00008040, 0x80008040, 0x00808040, 0x80808040,
386 384 0x000000c0, 0x800000c0, 0x008000c0, 0x808000c0,
387 385 0x000080c0, 0x800080c0, 0x008080c0, 0x808080c0,
388 386 0x40000040, 0xc0000040, 0x40800040, 0xc0800040,
389 387 0x40008040, 0xc0008040, 0x40808040, 0xc0808040,
390 388 0x400000c0, 0xc00000c0, 0x408000c0, 0xc08000c0,
391 389 0x400080c0, 0xc00080c0, 0x408080c0, 0xc08080c0,
392 390 0x00400040, 0x80400040, 0x00c00040, 0x80c00040,
393 391 0x00408040, 0x80408040, 0x00c08040, 0x80c08040,
394 392 0x004000c0, 0x804000c0, 0x00c000c0, 0x80c000c0,
395 393 0x004080c0, 0x804080c0, 0x00c080c0, 0x80c080c0,
396 394 0x40400040, 0xc0400040, 0x40c00040, 0xc0c00040,
397 395 0x40408040, 0xc0408040, 0x40c08040, 0xc0c08040,
398 396 0x404000c0, 0xc04000c0, 0x40c000c0, 0xc0c000c0,
399 397 0x404080c0, 0xc04080c0, 0x40c080c0, 0xc0c080c0,
400 398 0x00004040, 0x80004040, 0x00804040, 0x80804040,
401 399 0x0000c040, 0x8000c040, 0x0080c040, 0x8080c040,
402 400 0x000040c0, 0x800040c0, 0x008040c0, 0x808040c0,
403 401 0x0000c0c0, 0x8000c0c0, 0x0080c0c0, 0x8080c0c0,
404 402 0x40004040, 0xc0004040, 0x40804040, 0xc0804040,
405 403 0x4000c040, 0xc000c040, 0x4080c040, 0xc080c040,
406 404 0x400040c0, 0xc00040c0, 0x408040c0, 0xc08040c0,
407 405 0x4000c0c0, 0xc000c0c0, 0x4080c0c0, 0xc080c0c0,
408 406 0x00404040, 0x80404040, 0x00c04040, 0x80c04040,
409 407 0x0040c040, 0x8040c040, 0x00c0c040, 0x80c0c040,
410 408 0x004040c0, 0x804040c0, 0x00c040c0, 0x80c040c0,
411 409 0x0040c0c0, 0x8040c0c0, 0x00c0c0c0, 0x80c0c0c0,
412 410 0x40404040, 0xc0404040, 0x40c04040, 0xc0c04040,
413 411 0x4040c040, 0xc040c040, 0x40c0c040, 0xc0c0c040,
414 412 0x404040c0, 0xc04040c0, 0x40c040c0, 0xc0c040c0,
415 413 0x4040c0c0, 0xc040c0c0, 0x40c0c0c0, 0xc0c0c0c0
416 414 };
417 415
418 416 static const uint64_t all_a = 0xaaaaaaaaaaaaaaaaULL;
419 417 static const uint64_t all_5 = 0x5555555555555555ULL;
420 418 static const uint64_t top_1 = 0xfc000000000000ULL;
421 419 static const uint64_t mid_4 = 0x3fffffc000000ULL;
422 420 static const uint64_t low_3 = 0x3ffff00ULL;
423 421
424 422
425 423 static void
426 424 des_ip(uint64_t *l, uint64_t *r, uint64_t pt)
427 425 {
428 426 uint64_t a, b;
429 427
430 428 a = pt & all_a;
431 429 b = pt & all_5;
432 430 a = a | (a << 7);
433 431 b = b | (b >> 7);
434 432
435 433 b = (ip_table[0][(b >> 48) & 255ULL]) |
436 434 (ip_table[1][(b >> 32) & 255ULL]) |
437 435 (ip_table[0][(b >> 16) & 255ULL] << 6) |
438 436 (ip_table[1][b & 255ULL] << 6);
439 437
440 438 a = (ip_table[0][(a >> 56) & 255]) |
441 439 (ip_table[1][(a >> 40) & 255]) |
442 440 (ip_table[0][(a >> 24) & 255] << 6) |
443 441 (ip_table[1][(a >> 8) & 255] << 6);
444 442
445 443 *l = ((b & top_1) << 8) |
446 444 (b & mid_4) |
447 445 ((b & low_3) >> 5);
448 446
449 447 *r = ((a & top_1) << 8) |
450 448 (a & mid_4) |
451 449 ((a & low_3) >> 5);
452 450 }
453 451
454 452
455 453 static uint64_t
456 454 des_fp(uint64_t l, uint64_t r)
457 455 {
458 456 uint32_t upper, lower;
459 457
460 458 lower = fp_table[((l >> 55) & 240) | ((r >> 59) & 15)] |
461 459 (fp_table[((l >> 35) & 240) | ((r>>39) & 15)] >> 2) |
462 460 (fp_table[((l >> 23) & 240) | ((r >> 27) & 15)] >> 4) |
463 461 (fp_table[((l >> 6) & 240) | ((r >> 10) & 15)] >> 6);
464 462
465 463 upper = fp_table[((l >> 41) & 240) | ((r >> 45) & 15)] |
466 464 (fp_table[((l >> 29) & 240) | ((r >> 33) & 15)] >> 2) |
467 465 (fp_table[((l >> 12) & 240) | ((r >> 16) & 15)] >> 4) |
468 466 (fp_table[(l & 240) | (r >> 4) & 15] >> 6);
469 467
470 468 return ((((uint64_t)upper) << 32) | (uint64_t)lower);
471 469
472 470 }
473 471
474 472 uint64_t
475 473 des_crypt_impl(uint64_t *ks, uint64_t block, int one_or_three)
476 474 {
477 475 int i, j;
478 476 uint64_t l, r, t;
479 477
480 478 des_ip(&l, &r, block);
481 479 for (j = 0; j < one_or_three; j++) {
482 480 for (i = j * 16; i < (j + 1) * 16; i++) {
483 481 t = r ^ ks[i];
484 482 t = sbox_table[0][t >> 58] |
485 483 sbox_table[1][(t >> 44) & 63] |
486 484 sbox_table[2][(t >> 38) & 63] |
487 485 sbox_table[3][(t >> 32) & 63] |
488 486 sbox_table[4][(t >> 26) & 63] |
489 487 sbox_table[5][(t >> 15) & 63] |
490 488 sbox_table[6][(t >> 9) & 63] |
491 489 sbox_table[7][(t >> 3) & 63];
492 490 t = t^l;
493 491 l = r;
↓ open down ↓ |
437 lines elided |
↑ open up ↑ |
494 492 r = t;
495 493 }
496 494 r = l;
497 495 l = t;
498 496 }
499 497
500 498 return (des_fp(l, r));
501 499 }
502 500 #endif /* !sun4u */
503 501
504 -/* EXPORT DELETE END */
505 -
506 502 int
507 503 des3_crunch_block(const void *cookie, const uint8_t block[DES_BLOCK_LEN],
508 504 uint8_t out_block[DES_BLOCK_LEN], boolean_t decrypt)
509 505 {
510 -/* EXPORT DELETE START */
511 506 keysched3_t *ksch = (keysched3_t *)cookie;
512 507
513 508 /*
514 509 * The code below, that is always executed on LITTLE_ENDIAN machines,
515 510 * reverses bytes in the block. On BIG_ENDIAN, the same code
516 511 * copies the block without reversing bytes.
517 512 */
518 513 #ifdef _BIG_ENDIAN
519 514 if (IS_P2ALIGNED(block, sizeof (uint64_t)) &&
520 515 IS_P2ALIGNED(out_block, sizeof (uint64_t))) {
521 516 if (decrypt == B_TRUE)
522 517 /* LINTED */
523 518 *(uint64_t *)out_block = des_crypt_impl(
524 519 ksch->ksch_decrypt, /* LINTED */
525 520 *(uint64_t *)block, 3);
526 521 else
527 522 /* LINTED */
528 523 *(uint64_t *)out_block = des_crypt_impl(
529 524 ksch->ksch_encrypt, /* LINTED */
530 525 *(uint64_t *)block, 3);
531 526 } else
532 527 #endif /* _BIG_ENDIAN */
533 528 {
534 529 uint64_t tmp;
535 530
536 531 #ifdef UNALIGNED_POINTERS_PERMITTED
537 532 tmp = htonll(*(uint64_t *)(void *)&block[0]);
538 533 #else
539 534 tmp = (((uint64_t)block[0] << 56) | ((uint64_t)block[1] << 48) |
540 535 ((uint64_t)block[2] << 40) | ((uint64_t)block[3] << 32) |
541 536 ((uint64_t)block[4] << 24) | ((uint64_t)block[5] << 16) |
542 537 ((uint64_t)block[6] << 8) | (uint64_t)block[7]);
543 538 #endif /* UNALIGNED_POINTERS_PERMITTED */
544 539
545 540 if (decrypt == B_TRUE)
546 541 tmp = des_crypt_impl(ksch->ksch_decrypt, tmp, 3);
547 542 else
548 543 tmp = des_crypt_impl(ksch->ksch_encrypt, tmp, 3);
549 544
550 545 #ifdef UNALIGNED_POINTERS_PERMITTED
551 546 *(uint64_t *)(void *)&out_block[0] = htonll(tmp);
552 547 #else
↓ open down ↓ |
32 lines elided |
↑ open up ↑ |
553 548 out_block[0] = tmp >> 56;
554 549 out_block[1] = tmp >> 48;
555 550 out_block[2] = tmp >> 40;
556 551 out_block[3] = tmp >> 32;
557 552 out_block[4] = tmp >> 24;
558 553 out_block[5] = tmp >> 16;
559 554 out_block[6] = tmp >> 8;
560 555 out_block[7] = (uint8_t)tmp;
561 556 #endif /* UNALIGNED_POINTERS_PERMITTED */
562 557 }
563 -/* EXPORT DELETE END */
564 558 return (CRYPTO_SUCCESS);
565 559 }
566 560
567 561 int
568 562 des_crunch_block(const void *cookie, const uint8_t block[DES_BLOCK_LEN],
569 563 uint8_t out_block[DES_BLOCK_LEN], boolean_t decrypt)
570 564 {
571 -/* EXPORT DELETE START */
572 565 keysched_t *ksch = (keysched_t *)cookie;
573 566
574 567 /*
575 568 * The code below, that is always executed on LITTLE_ENDIAN machines,
576 569 * reverses bytes in the block. On BIG_ENDIAN, the same code
577 570 * copies the block without reversing bytes.
578 571 */
579 572 #ifdef _BIG_ENDIAN
580 573 if (IS_P2ALIGNED(block, sizeof (uint64_t)) &&
581 574 IS_P2ALIGNED(out_block, sizeof (uint64_t))) {
582 575 if (decrypt == B_TRUE)
583 576 /* LINTED */
584 577 *(uint64_t *)out_block = des_crypt_impl(
585 578 ksch->ksch_decrypt, /* LINTED */
586 579 *(uint64_t *)block, 1);
587 580 else
588 581 /* LINTED */
589 582 *(uint64_t *)out_block = des_crypt_impl(
590 583 ksch->ksch_encrypt, /* LINTED */
591 584 *(uint64_t *)block, 1);
592 585
593 586 } else
594 587 #endif /* _BIG_ENDIAN */
595 588 {
596 589 uint64_t tmp;
597 590
598 591 #ifdef UNALIGNED_POINTERS_PERMITTED
599 592 tmp = htonll(*(uint64_t *)(void *)&block[0]);
600 593 #else
601 594 tmp = (((uint64_t)block[0] << 56) | ((uint64_t)block[1] << 48) |
602 595 ((uint64_t)block[2] << 40) | ((uint64_t)block[3] << 32) |
603 596 ((uint64_t)block[4] << 24) | ((uint64_t)block[5] << 16) |
604 597 ((uint64_t)block[6] << 8) | (uint64_t)block[7]);
605 598 #endif /* UNALIGNED_POINTERS_PERMITTED */
606 599
607 600
608 601 if (decrypt == B_TRUE)
609 602 tmp = des_crypt_impl(ksch->ksch_decrypt, tmp, 1);
610 603 else
611 604 tmp = des_crypt_impl(ksch->ksch_encrypt, tmp, 1);
612 605
613 606 #ifdef UNALIGNED_POINTERS_PERMITTED
614 607 *(uint64_t *)(void *)&out_block[0] = htonll(tmp);
615 608 #else
↓ open down ↓ |
34 lines elided |
↑ open up ↑ |
616 609 out_block[0] = tmp >> 56;
617 610 out_block[1] = tmp >> 48;
618 611 out_block[2] = tmp >> 40;
619 612 out_block[3] = tmp >> 32;
620 613 out_block[4] = tmp >> 24;
621 614 out_block[5] = tmp >> 16;
622 615 out_block[6] = tmp >> 8;
623 616 out_block[7] = (uint8_t)tmp;
624 617 #endif /* UNALIGNED_POINTERS_PERMITTED */
625 618 }
626 -/* EXPORT DELETE END */
627 619 return (CRYPTO_SUCCESS);
628 620 }
629 621
630 622 static boolean_t
631 623 keycheck(uint8_t *key, uint8_t *corrected_key)
632 624 {
633 -/* EXPORT DELETE START */
634 625 uint64_t key_so_far;
635 626 uint_t i;
636 627 /*
637 628 * Table of weak and semi-weak keys. Fortunately, weak keys are
638 629 * endian-independent, and some semi-weak keys can be paired up in
639 630 * endian-opposite order. Since keys are stored as uint64_t's,
640 631 * use the ifdef _LITTLE_ENDIAN where appropriate.
641 632 */
642 633 static uint64_t des_weak_keys[] = {
643 634 /* Really weak keys. Byte-order independent values. */
644 635 0x0101010101010101ULL,
645 636 0x1f1f1f1f0e0e0e0eULL,
646 637 0xe0e0e0e0f1f1f1f1ULL,
647 638 0xfefefefefefefefeULL,
648 639
649 640 /* Semi-weak (and a few possibly-weak) keys. */
650 641
651 642 /* Byte-order independent semi-weak keys. */
652 643 0x01fe01fe01fe01feULL, 0xfe01fe01fe01fe01ULL,
653 644
654 645 /* Byte-order dependent semi-weak keys. */
655 646 #ifdef _LITTLE_ENDIAN
656 647 0xf10ef10ee01fe01fULL, 0x0ef10ef11fe01fe0ULL,
657 648 0x01f101f101e001e0ULL, 0xf101f101e001e001ULL,
658 649 0x0efe0efe1ffe1ffeULL, 0xfe0efe0efe1ffe1fULL,
659 650 0x010e010e011f011fULL, 0x0e010e011f011f01ULL,
660 651 0xf1fef1fee0fee0feULL, 0xfef1fef1fee0fee0ULL,
661 652 #else /* Big endian */
662 653 0x1fe01fe00ef10ef1ULL, 0xe01fe01ff10ef10eULL,
663 654 0x01e001e001f101f1ULL, 0xe001e001f101f101ULL,
664 655 0x1ffe1ffe0efe0efeULL, 0xfe1ffe1ffe0efe0eULL,
665 656 0x011f011f010e010eULL, 0x1f011f010e010e01ULL,
666 657 0xe0fee0fef1fef1feULL, 0xfee0fee0fef1fef1ULL,
667 658 #endif /* _LITTLE_ENDIAN */
668 659
669 660 /* We'll save the other possibly-weak keys for the future. */
670 661 };
671 662
672 663 if (key == NULL)
673 664 return (B_FALSE);
674 665
675 666 #ifdef UNALIGNED_POINTERS_PERMITTED
676 667 key_so_far = htonll(*(uint64_t *)(void *)&key[0]);
677 668 #else
678 669 /*
679 670 * The code below reverses the bytes on LITTLE_ENDIAN machines.
680 671 * On BIG_ENDIAN, the same code copies without reversing
681 672 * the bytes.
682 673 */
683 674 key_so_far = (((uint64_t)key[0] << 56) | ((uint64_t)key[1] << 48) |
684 675 ((uint64_t)key[2] << 40) | ((uint64_t)key[3] << 32) |
685 676 ((uint64_t)key[4] << 24) | ((uint64_t)key[5] << 16) |
686 677 ((uint64_t)key[6] << 8) | (uint64_t)key[7]);
687 678 #endif /* UNALIGNED_POINTERS_PERMITTED */
688 679
689 680 /*
690 681 * Fix parity.
691 682 */
692 683 fix_des_parity(&key_so_far);
693 684
694 685 /* Do weak key check itself. */
695 686 for (i = 0; i < (sizeof (des_weak_keys) / sizeof (uint64_t)); i++)
696 687 if (key_so_far == des_weak_keys[i]) {
697 688 return (B_FALSE);
698 689 }
699 690
700 691 if (corrected_key != NULL) {
701 692 #ifdef UNALIGNED_POINTERS_PERMITTED
702 693 *(uint64_t *)(void *)&corrected_key[0] = htonll(key_so_far);
703 694 #else
704 695 /*
705 696 * The code below reverses the bytes on LITTLE_ENDIAN machines.
706 697 * On BIG_ENDIAN, the same code copies without reversing
707 698 * the bytes.
708 699 */
↓ open down ↓ |
65 lines elided |
↑ open up ↑ |
709 700 corrected_key[0] = key_so_far >> 56;
710 701 corrected_key[1] = key_so_far >> 48;
711 702 corrected_key[2] = key_so_far >> 40;
712 703 corrected_key[3] = key_so_far >> 32;
713 704 corrected_key[4] = key_so_far >> 24;
714 705 corrected_key[5] = key_so_far >> 16;
715 706 corrected_key[6] = key_so_far >> 8;
716 707 corrected_key[7] = (uint8_t)key_so_far;
717 708 #endif /* UNALIGNED_POINTERS_PERMITTED */
718 709 }
719 -/* EXPORT DELETE END */
720 710 return (B_TRUE);
721 711 }
722 712
723 713 static boolean_t
724 714 des23_keycheck(uint8_t *key, uint8_t *corrected_key, boolean_t des3)
725 715 {
726 -/* EXPORT DELETE START */
727 716 uint64_t aligned_key[DES3_KEYSIZE / sizeof (uint64_t)];
728 717 uint64_t key_so_far, scratch, *currentkey;
729 718 uint_t j, num_weakkeys = 0;
730 719 uint8_t keysize = DES3_KEYSIZE;
731 720 uint8_t checks = 3;
732 721
733 722 if (key == NULL) {
734 723 return (B_FALSE);
735 724 }
736 725
737 726 if (des3 == B_FALSE) {
738 727 keysize = DES2_KEYSIZE;
739 728 checks = 2;
740 729 }
741 730
742 731 if (!IS_P2ALIGNED(key, sizeof (uint64_t))) {
743 732 bcopy(key, aligned_key, keysize);
744 733 currentkey = (uint64_t *)aligned_key;
745 734 } else {
746 735 /* LINTED */
747 736 currentkey = (uint64_t *)key;
748 737 }
749 738
750 739 for (j = 0; j < checks; j++) {
751 740 key_so_far = currentkey[j];
752 741
753 742 if (!keycheck((uint8_t *)&key_so_far, (uint8_t *)&scratch)) {
754 743 if (++num_weakkeys > 1) {
755 744 return (B_FALSE);
756 745 }
757 746 /*
758 747 * We found a weak key, but since
759 748 * we've only found one weak key,
760 749 * we can not reject the whole 3DES
761 750 * set of keys as weak.
762 751 *
763 752 * Break from the weak key loop
764 753 * (since this DES key is weak) and
765 754 * continue on.
766 755 */
767 756 }
768 757
769 758 currentkey[j] = scratch;
770 759 }
771 760
772 761 /*
773 762 * Perform key equivalence checks, now that parity is properly set.
↓ open down ↓ |
37 lines elided |
↑ open up ↑ |
774 763 * 1st and 2nd keys must be unique, the 3rd key can be the same as
775 764 * the 1st key for the 2 key variant of 3DES.
776 765 */
777 766 if (currentkey[0] == currentkey[1] || currentkey[1] == currentkey[2])
778 767 return (B_FALSE);
779 768
780 769 if (corrected_key != NULL) {
781 770 bcopy(currentkey, corrected_key, keysize);
782 771 }
783 772
784 -/* EXPORT DELETE END */
785 773 return (B_TRUE);
786 774 }
787 775
788 776 boolean_t
789 777 des_keycheck(uint8_t *key, des_strength_t strength, uint8_t *corrected_key)
790 778 {
791 779 if (strength == DES) {
792 780 return (keycheck(key, corrected_key));
793 781 } else if (strength == DES2) {
794 782 return (des23_keycheck(key, corrected_key, B_FALSE));
795 783 } else if (strength == DES3) {
796 784 return (des23_keycheck(key, corrected_key, B_TRUE));
797 785 } else {
798 786 return (B_FALSE);
799 787 }
800 788 }
801 789
802 790 void
803 791 des_parity_fix(uint8_t *key, des_strength_t strength, uint8_t *corrected_key)
804 792 {
805 -/* EXPORT DELETE START */
806 793 uint64_t aligned_key[DES3_KEYSIZE / sizeof (uint64_t)];
807 794 uint8_t *paritied_key;
808 795 uint64_t key_so_far;
809 796 int i = 0, offset = 0;
810 797
811 798 if (strength == DES)
812 799 bcopy(key, aligned_key, DES_KEYSIZE);
813 800 else
814 801 bcopy(key, aligned_key, DES3_KEYSIZE);
815 802
816 803 paritied_key = (uint8_t *)aligned_key;
817 804 while (strength > i) {
818 805 offset = 8 * i;
819 806 #ifdef UNALIGNED_POINTERS_PERMITTED
820 807 key_so_far = htonll(*(uint64_t *)(void *)&paritied_key[offset]);
821 808 #else
822 809 key_so_far = (((uint64_t)paritied_key[offset + 0] << 56) |
823 810 ((uint64_t)paritied_key[offset + 1] << 48) |
824 811 ((uint64_t)paritied_key[offset + 2] << 40) |
825 812 ((uint64_t)paritied_key[offset + 3] << 32) |
826 813 ((uint64_t)paritied_key[offset + 4] << 24) |
827 814 ((uint64_t)paritied_key[offset + 5] << 16) |
828 815 ((uint64_t)paritied_key[offset + 6] << 8) |
829 816 (uint64_t)paritied_key[offset + 7]);
830 817 #endif /* UNALIGNED_POINTERS_PERMITTED */
831 818
832 819 fix_des_parity(&key_so_far);
833 820
834 821 #ifdef UNALIGNED_POINTERS_PERMITTED
835 822 *(uint64_t *)(void *)&paritied_key[offset] = htonll(key_so_far);
836 823 #else
837 824 paritied_key[offset + 0] = key_so_far >> 56;
838 825 paritied_key[offset + 1] = key_so_far >> 48;
839 826 paritied_key[offset + 2] = key_so_far >> 40;
840 827 paritied_key[offset + 3] = key_so_far >> 32;
↓ open down ↓ |
25 lines elided |
↑ open up ↑ |
841 828 paritied_key[offset + 4] = key_so_far >> 24;
842 829 paritied_key[offset + 5] = key_so_far >> 16;
843 830 paritied_key[offset + 6] = key_so_far >> 8;
844 831 paritied_key[offset + 7] = (uint8_t)key_so_far;
845 832 #endif /* UNALIGNED_POINTERS_PERMITTED */
846 833
847 834 i++;
848 835 }
849 836
850 837 bcopy(paritied_key, corrected_key, DES_KEYSIZE * strength);
851 -/* EXPORT DELETE END */
852 838 }
853 839
854 840
855 841 /*
856 842 * Initialize key schedule for DES, DES2, and DES3
857 843 */
858 844 void
859 845 des_init_keysched(uint8_t *cipherKey, des_strength_t strength, void *ks)
860 846 {
861 -/* EXPORT DELETE START */
862 847 uint64_t *encryption_ks;
863 848 uint64_t *decryption_ks;
864 849 uint64_t keysched[48];
865 850 uint64_t key_uint64[3];
866 851 uint64_t tmp;
867 852 uint_t keysize, i, j;
868 853
869 854 switch (strength) {
870 855 case DES:
871 856 keysize = DES_KEYSIZE;
872 857 encryption_ks = ((keysched_t *)ks)->ksch_encrypt;
873 858 decryption_ks = ((keysched_t *)ks)->ksch_decrypt;
874 859 break;
875 860 case DES2:
876 861 keysize = DES2_KEYSIZE;
877 862 encryption_ks = ((keysched3_t *)ks)->ksch_encrypt;
878 863 decryption_ks = ((keysched3_t *)ks)->ksch_decrypt;
879 864 break;
880 865 case DES3:
881 866 keysize = DES3_KEYSIZE;
882 867 encryption_ks = ((keysched3_t *)ks)->ksch_encrypt;
883 868 decryption_ks = ((keysched3_t *)ks)->ksch_decrypt;
884 869 }
885 870
886 871 /*
887 872 * The code below, that is always executed on LITTLE_ENDIAN machines,
888 873 * reverses every 8 bytes in the key. On BIG_ENDIAN, the same code
889 874 * copies the key without reversing bytes.
890 875 */
891 876 #ifdef _BIG_ENDIAN
892 877 if (IS_P2ALIGNED(cipherKey, sizeof (uint64_t))) {
893 878 for (i = 0, j = 0; j < keysize; i++, j += 8) {
894 879 /* LINTED: pointer alignment */
895 880 key_uint64[i] = *((uint64_t *)&cipherKey[j]);
896 881 }
897 882 } else
898 883 #endif /* _BIG_ENDIAN */
899 884 {
900 885 for (i = 0, j = 0; j < keysize; i++, j += 8) {
901 886 #ifdef UNALIGNED_POINTERS_PERMITTED
902 887 key_uint64[i] =
903 888 htonll(*(uint64_t *)(void *)&cipherKey[j]);
904 889 #else
905 890 key_uint64[i] = (((uint64_t)cipherKey[j] << 56) |
906 891 ((uint64_t)cipherKey[j + 1] << 48) |
907 892 ((uint64_t)cipherKey[j + 2] << 40) |
908 893 ((uint64_t)cipherKey[j + 3] << 32) |
909 894 ((uint64_t)cipherKey[j + 4] << 24) |
910 895 ((uint64_t)cipherKey[j + 5] << 16) |
911 896 ((uint64_t)cipherKey[j + 6] << 8) |
912 897 (uint64_t)cipherKey[j + 7]);
913 898 #endif /* UNALIGNED_POINTERS_PERMITTED */
914 899 }
915 900 }
916 901
917 902 switch (strength) {
918 903 case DES:
919 904 des_ks(keysched, key_uint64[0]);
920 905 break;
921 906
922 907 case DES2:
923 908 /* DES2 is just DES3 with the first and third keys the same */
924 909 bcopy(key_uint64, key_uint64 + 2, DES_KEYSIZE);
925 910 /* FALLTHRU */
926 911 case DES3:
927 912 des_ks(keysched, key_uint64[0]);
928 913 des_ks(keysched + 16, key_uint64[1]);
929 914 for (i = 0; i < 8; i++) {
930 915 tmp = keysched[16+i];
931 916 keysched[16+i] = keysched[31-i];
932 917 keysched[31-i] = tmp;
933 918 }
934 919 des_ks(keysched+32, key_uint64[2]);
935 920 keysize = DES3_KEYSIZE;
936 921 }
937 922
938 923 /* save the encryption keyschedule */
939 924 bcopy(keysched, encryption_ks, keysize * 16);
↓ open down ↓ |
68 lines elided |
↑ open up ↑ |
940 925
941 926 /* reverse the key schedule */
942 927 for (i = 0; i < keysize; i++) {
943 928 tmp = keysched[i];
944 929 keysched[i] = keysched[2 * keysize - 1 - i];
945 930 keysched[2 * keysize -1 -i] = tmp;
946 931 }
947 932
948 933 /* save the decryption keyschedule */
949 934 bcopy(keysched, decryption_ks, keysize * 16);
950 -/* EXPORT DELETE END */
951 935 }
952 936
953 937 /*
954 938 * Allocate key schedule.
955 939 */
956 940 /*ARGSUSED*/
957 941 void *
958 942 des_alloc_keysched(size_t *keysched_size, des_strength_t strength, int kmflag)
959 943 {
960 944 void *keysched;
961 945
962 -/* EXPORT DELETE START */
963 -
964 946 size_t size;
965 947
966 948 switch (strength) {
967 949 case DES:
968 950 size = sizeof (keysched_t);
969 951 break;
970 952 case DES2:
971 953 case DES3:
972 954 size = sizeof (keysched3_t);
973 955 }
974 956
975 957 #ifdef _KERNEL
976 958 keysched = (keysched_t *)kmem_alloc(size, kmflag);
↓ open down ↓ |
3 lines elided |
↑ open up ↑ |
977 959 #else /* !_KERNEL */
978 960 keysched = (keysched_t *)malloc(size);
979 961 #endif /* _KERNEL */
980 962
981 963 if (keysched == NULL)
982 964 return (NULL);
983 965
984 966 if (keysched_size != NULL)
985 967 *keysched_size = size;
986 968
987 -/* EXPORT DELETE END */
988 -
989 969 return (keysched);
990 970 }
991 971
992 972 /*
993 973 * Replace the LSB of each byte by the xor of the other
994 974 * 7 bits. The tricky thing is that the original contents of the LSBs
995 975 * are nullified by including them twice in the xor computation.
996 976 */
997 977 static void
998 978 fix_des_parity(uint64_t *keyp)
999 979 {
1000 -/* EXPORT DELETE START */
1001 980 uint64_t k = *keyp;
1002 981 k ^= k >> 1;
1003 982 k ^= k >> 2;
1004 983 k ^= k >> 4;
1005 984 *keyp ^= (k & 0x0101010101010101ULL);
1006 985 *keyp ^= 0x0101010101010101ULL;
1007 -/* EXPORT DELETE END */
1008 986 }
1009 987
1010 988 void
1011 989 des_copy_block(uint8_t *in, uint8_t *out)
1012 990 {
1013 991 if (IS_P2ALIGNED(in, sizeof (uint32_t)) &&
1014 992 IS_P2ALIGNED(out, sizeof (uint32_t))) {
1015 993 /* LINTED: pointer alignment */
1016 994 *(uint32_t *)&out[0] = *(uint32_t *)&in[0];
1017 995 /* LINTED: pointer alignment */
1018 996 *(uint32_t *)&out[4] = *(uint32_t *)&in[4];
1019 997 } else {
1020 998 DES_COPY_BLOCK(in, out);
1021 999 }
1022 1000 }
1023 1001
1024 1002 /* XOR block of data into dest */
1025 1003 void
1026 1004 des_xor_block(uint8_t *data, uint8_t *dst)
1027 1005 {
1028 1006 if (IS_P2ALIGNED(dst, sizeof (uint32_t)) &&
1029 1007 IS_P2ALIGNED(data, sizeof (uint32_t))) {
1030 1008 /* LINTED: pointer alignment */
1031 1009 *(uint32_t *)&dst[0] ^=
1032 1010 /* LINTED: pointer alignment */
1033 1011 *(uint32_t *)&data[0];
1034 1012 /* LINTED: pointer alignment */
1035 1013 *(uint32_t *)&dst[4] ^=
1036 1014 /* LINTED: pointer alignment */
1037 1015 *(uint32_t *)&data[4];
1038 1016 } else {
1039 1017 DES_XOR_BLOCK(data, dst);
1040 1018 }
1041 1019 }
1042 1020
1043 1021 int
1044 1022 des_encrypt_block(const void *keysched, const uint8_t *in, uint8_t *out)
1045 1023 {
1046 1024 return (des_crunch_block(keysched, in, out, B_FALSE));
1047 1025 }
1048 1026
1049 1027 int
1050 1028 des3_encrypt_block(const void *keysched, const uint8_t *in, uint8_t *out)
1051 1029 {
1052 1030 return (des3_crunch_block(keysched, in, out, B_FALSE));
1053 1031 }
1054 1032
1055 1033 int
1056 1034 des_decrypt_block(const void *keysched, const uint8_t *in, uint8_t *out)
1057 1035 {
1058 1036 return (des_crunch_block(keysched, in, out, B_TRUE));
1059 1037 }
1060 1038
1061 1039 int
1062 1040 des3_decrypt_block(const void *keysched, const uint8_t *in, uint8_t *out)
1063 1041 {
1064 1042 return (des3_crunch_block(keysched, in, out, B_TRUE));
1065 1043 }
1066 1044
1067 1045 /*
1068 1046 * Encrypt multiple blocks of data according to mode.
1069 1047 */
1070 1048 int
1071 1049 des_encrypt_contiguous_blocks(void *ctx, char *data, size_t length,
1072 1050 crypto_data_t *out)
1073 1051 {
1074 1052 des_ctx_t *des_ctx = ctx;
1075 1053 int rv;
1076 1054
1077 1055 if (des_ctx->dc_flags & DES3_STRENGTH) {
1078 1056 if (des_ctx->dc_flags & CBC_MODE) {
1079 1057 rv = cbc_encrypt_contiguous_blocks(ctx, data,
1080 1058 length, out, DES_BLOCK_LEN, des3_encrypt_block,
1081 1059 des_copy_block, des_xor_block);
1082 1060 } else {
1083 1061 rv = ecb_cipher_contiguous_blocks(ctx, data, length,
1084 1062 out, DES_BLOCK_LEN, des3_encrypt_block);
1085 1063 }
1086 1064 } else {
1087 1065 if (des_ctx->dc_flags & CBC_MODE) {
1088 1066 rv = cbc_encrypt_contiguous_blocks(ctx, data,
1089 1067 length, out, DES_BLOCK_LEN, des_encrypt_block,
1090 1068 des_copy_block, des_xor_block);
1091 1069 } else {
1092 1070 rv = ecb_cipher_contiguous_blocks(ctx, data, length,
1093 1071 out, DES_BLOCK_LEN, des_encrypt_block);
1094 1072 }
1095 1073 }
1096 1074 return (rv);
1097 1075 }
1098 1076
1099 1077 /*
1100 1078 * Decrypt multiple blocks of data according to mode.
1101 1079 */
1102 1080 int
1103 1081 des_decrypt_contiguous_blocks(void *ctx, char *data, size_t length,
1104 1082 crypto_data_t *out)
1105 1083 {
1106 1084 des_ctx_t *des_ctx = ctx;
1107 1085 int rv;
1108 1086
1109 1087 if (des_ctx->dc_flags & DES3_STRENGTH) {
1110 1088 if (des_ctx->dc_flags & CBC_MODE) {
1111 1089 rv = cbc_decrypt_contiguous_blocks(ctx, data,
1112 1090 length, out, DES_BLOCK_LEN, des3_decrypt_block,
1113 1091 des_copy_block, des_xor_block);
1114 1092 } else {
1115 1093 rv = ecb_cipher_contiguous_blocks(ctx, data, length,
1116 1094 out, DES_BLOCK_LEN, des3_decrypt_block);
1117 1095 if (rv == CRYPTO_DATA_LEN_RANGE)
1118 1096 rv = CRYPTO_ENCRYPTED_DATA_LEN_RANGE;
1119 1097 }
1120 1098 } else {
1121 1099 if (des_ctx->dc_flags & CBC_MODE) {
1122 1100 rv = cbc_decrypt_contiguous_blocks(ctx, data,
1123 1101 length, out, DES_BLOCK_LEN, des_decrypt_block,
1124 1102 des_copy_block, des_xor_block);
1125 1103 } else {
1126 1104 rv = ecb_cipher_contiguous_blocks(ctx, data, length,
1127 1105 out, DES_BLOCK_LEN, des_decrypt_block);
1128 1106 if (rv == CRYPTO_DATA_LEN_RANGE)
1129 1107 rv = CRYPTO_ENCRYPTED_DATA_LEN_RANGE;
1130 1108 }
1131 1109 }
1132 1110 return (rv);
1133 1111 }
↓ open down ↓ |
116 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX