1 /*
2 * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 /*-
11 * set_key.c v 1.4 eay 24/9/91
12 * 1.4 Speed up by 400% :-)
13 * 1.3 added register declarations.
14 * 1.2 unrolled make_key_sched a bit more
15 * 1.1 added norm_expand_bits
16 * 1.0 First working version
17 */
18
19 /*
20 * DES low level APIs are deprecated for public use, but still ok for internal
21 * use.
22 */
23 #include "internal/deprecated.h"
24
25 #include <openssl/crypto.h>
26 #include "internal/constant_time.h"
27 #include "internal/nelem.h"
28 #include "des_local.h"
29
30 static const unsigned char odd_parity[256] = {
31 1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14,
32 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
33 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
34 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
35 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
36 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
37 97, 97, 98, 98, 100, 100, 103, 103, 104, 104, 107, 107, 109, 109, 110,
38 110,
39 112, 112, 115, 115, 117, 117, 118, 118, 121, 121, 122, 122, 124, 124, 127,
40 127,
41 128, 128, 131, 131, 133, 133, 134, 134, 137, 137, 138, 138, 140, 140, 143,
42 143,
43 145, 145, 146, 146, 148, 148, 151, 151, 152, 152, 155, 155, 157, 157, 158,
44 158,
45 161, 161, 162, 162, 164, 164, 167, 167, 168, 168, 171, 171, 173, 173, 174,
46 174,
47 176, 176, 179, 179, 181, 181, 182, 182, 185, 185, 186, 186, 188, 188, 191,
48 191,
49 193, 193, 194, 194, 196, 196, 199, 199, 200, 200, 203, 203, 205, 205, 206,
50 206,
51 208, 208, 211, 211, 213, 213, 214, 214, 217, 217, 218, 218, 220, 220, 223,
52 223,
53 224, 224, 227, 227, 229, 229, 230, 230, 233, 233, 234, 234, 236, 236, 239,
54 239,
55 241, 241, 242, 242, 244, 244, 247, 247, 248, 248, 251, 251, 253, 253, 254,
56 254
57 };
58
DES_set_odd_parity(DES_cblock * key)59 void DES_set_odd_parity(DES_cblock *key)
60 {
61 unsigned int i;
62
63 for (i = 0; i < DES_KEY_SZ; i++)
64 (*key)[i] = odd_parity[(*key)[i]];
65 }
66
67 /*
68 * Check that a key has the correct parity.
69 * Return 1 if parity is okay and 0 if not.
70 */
DES_check_key_parity(const_DES_cblock * key)71 int DES_check_key_parity(const_DES_cblock *key)
72 {
73 unsigned int i;
74 unsigned char res = 0377, b;
75
76 for (i = 0; i < DES_KEY_SZ; i++) {
77 b = (*key)[i];
78 b ^= b >> 4;
79 b ^= b >> 2;
80 b ^= b >> 1;
81 res &= constant_time_eq_8(b & 1, 1);
82 }
83 return (int)(res & 1);
84 }
85
86 /*-
87 * Weak and semi weak keys as taken from
88 * %A D.W. Davies
89 * %A W.L. Price
90 * %T Security for Computer Networks
91 * %I John Wiley & Sons
92 * %D 1984
93 */
94 static const DES_cblock weak_keys[] = {
95 /* weak keys */
96 { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
97 { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE },
98 { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
99 { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 },
100 /* semi-weak keys */
101 { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE },
102 { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 },
103 { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 },
104 { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E },
105 { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 },
106 { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 },
107 { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE },
108 { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E },
109 { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E },
110 { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 },
111 { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
112 { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 }
113 };
114
115 /*
116 * Check for weak keys.
117 * Return 1 if the key is weak and 0 otherwise.
118 */
DES_is_weak_key(const_DES_cblock * key)119 int DES_is_weak_key(const_DES_cblock *key)
120 {
121 unsigned int i, res = 0;
122 int j;
123
124 for (i = 0; i < OSSL_NELEM(weak_keys); i++) {
125 j = CRYPTO_memcmp(weak_keys[i], key, sizeof(DES_cblock));
126 res |= constant_time_is_zero((unsigned int)j);
127 }
128 return (int)(res & 1);
129 }
130
131 /*-
132 * NOW DEFINED IN des_local.h
133 * See ecb_encrypt.c for a pseudo description of these macros.
134 * #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
135 * (b)^=(t),\
136 * (a)=((a)^((t)<<(n))))
137 */
138
139 #define HPERM_OP(a, t, n, m) ((t) = ((((a) << (16 - (n))) ^ (a)) & (m)), \
140 (a) = (a) ^ (t) ^ (t >> (16 - (n))))
141
142 static const DES_LONG des_skb[8][64] = {
143 {
144 /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
145 0x00000000L,
146 0x00000010L,
147 0x20000000L,
148 0x20000010L,
149 0x00010000L,
150 0x00010010L,
151 0x20010000L,
152 0x20010010L,
153 0x00000800L,
154 0x00000810L,
155 0x20000800L,
156 0x20000810L,
157 0x00010800L,
158 0x00010810L,
159 0x20010800L,
160 0x20010810L,
161 0x00000020L,
162 0x00000030L,
163 0x20000020L,
164 0x20000030L,
165 0x00010020L,
166 0x00010030L,
167 0x20010020L,
168 0x20010030L,
169 0x00000820L,
170 0x00000830L,
171 0x20000820L,
172 0x20000830L,
173 0x00010820L,
174 0x00010830L,
175 0x20010820L,
176 0x20010830L,
177 0x00080000L,
178 0x00080010L,
179 0x20080000L,
180 0x20080010L,
181 0x00090000L,
182 0x00090010L,
183 0x20090000L,
184 0x20090010L,
185 0x00080800L,
186 0x00080810L,
187 0x20080800L,
188 0x20080810L,
189 0x00090800L,
190 0x00090810L,
191 0x20090800L,
192 0x20090810L,
193 0x00080020L,
194 0x00080030L,
195 0x20080020L,
196 0x20080030L,
197 0x00090020L,
198 0x00090030L,
199 0x20090020L,
200 0x20090030L,
201 0x00080820L,
202 0x00080830L,
203 0x20080820L,
204 0x20080830L,
205 0x00090820L,
206 0x00090830L,
207 0x20090820L,
208 0x20090830L,
209 },
210 {
211 /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
212 0x00000000L,
213 0x02000000L,
214 0x00002000L,
215 0x02002000L,
216 0x00200000L,
217 0x02200000L,
218 0x00202000L,
219 0x02202000L,
220 0x00000004L,
221 0x02000004L,
222 0x00002004L,
223 0x02002004L,
224 0x00200004L,
225 0x02200004L,
226 0x00202004L,
227 0x02202004L,
228 0x00000400L,
229 0x02000400L,
230 0x00002400L,
231 0x02002400L,
232 0x00200400L,
233 0x02200400L,
234 0x00202400L,
235 0x02202400L,
236 0x00000404L,
237 0x02000404L,
238 0x00002404L,
239 0x02002404L,
240 0x00200404L,
241 0x02200404L,
242 0x00202404L,
243 0x02202404L,
244 0x10000000L,
245 0x12000000L,
246 0x10002000L,
247 0x12002000L,
248 0x10200000L,
249 0x12200000L,
250 0x10202000L,
251 0x12202000L,
252 0x10000004L,
253 0x12000004L,
254 0x10002004L,
255 0x12002004L,
256 0x10200004L,
257 0x12200004L,
258 0x10202004L,
259 0x12202004L,
260 0x10000400L,
261 0x12000400L,
262 0x10002400L,
263 0x12002400L,
264 0x10200400L,
265 0x12200400L,
266 0x10202400L,
267 0x12202400L,
268 0x10000404L,
269 0x12000404L,
270 0x10002404L,
271 0x12002404L,
272 0x10200404L,
273 0x12200404L,
274 0x10202404L,
275 0x12202404L,
276 },
277 {
278 /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
279 0x00000000L,
280 0x00000001L,
281 0x00040000L,
282 0x00040001L,
283 0x01000000L,
284 0x01000001L,
285 0x01040000L,
286 0x01040001L,
287 0x00000002L,
288 0x00000003L,
289 0x00040002L,
290 0x00040003L,
291 0x01000002L,
292 0x01000003L,
293 0x01040002L,
294 0x01040003L,
295 0x00000200L,
296 0x00000201L,
297 0x00040200L,
298 0x00040201L,
299 0x01000200L,
300 0x01000201L,
301 0x01040200L,
302 0x01040201L,
303 0x00000202L,
304 0x00000203L,
305 0x00040202L,
306 0x00040203L,
307 0x01000202L,
308 0x01000203L,
309 0x01040202L,
310 0x01040203L,
311 0x08000000L,
312 0x08000001L,
313 0x08040000L,
314 0x08040001L,
315 0x09000000L,
316 0x09000001L,
317 0x09040000L,
318 0x09040001L,
319 0x08000002L,
320 0x08000003L,
321 0x08040002L,
322 0x08040003L,
323 0x09000002L,
324 0x09000003L,
325 0x09040002L,
326 0x09040003L,
327 0x08000200L,
328 0x08000201L,
329 0x08040200L,
330 0x08040201L,
331 0x09000200L,
332 0x09000201L,
333 0x09040200L,
334 0x09040201L,
335 0x08000202L,
336 0x08000203L,
337 0x08040202L,
338 0x08040203L,
339 0x09000202L,
340 0x09000203L,
341 0x09040202L,
342 0x09040203L,
343 },
344 {
345 /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
346 0x00000000L,
347 0x00100000L,
348 0x00000100L,
349 0x00100100L,
350 0x00000008L,
351 0x00100008L,
352 0x00000108L,
353 0x00100108L,
354 0x00001000L,
355 0x00101000L,
356 0x00001100L,
357 0x00101100L,
358 0x00001008L,
359 0x00101008L,
360 0x00001108L,
361 0x00101108L,
362 0x04000000L,
363 0x04100000L,
364 0x04000100L,
365 0x04100100L,
366 0x04000008L,
367 0x04100008L,
368 0x04000108L,
369 0x04100108L,
370 0x04001000L,
371 0x04101000L,
372 0x04001100L,
373 0x04101100L,
374 0x04001008L,
375 0x04101008L,
376 0x04001108L,
377 0x04101108L,
378 0x00020000L,
379 0x00120000L,
380 0x00020100L,
381 0x00120100L,
382 0x00020008L,
383 0x00120008L,
384 0x00020108L,
385 0x00120108L,
386 0x00021000L,
387 0x00121000L,
388 0x00021100L,
389 0x00121100L,
390 0x00021008L,
391 0x00121008L,
392 0x00021108L,
393 0x00121108L,
394 0x04020000L,
395 0x04120000L,
396 0x04020100L,
397 0x04120100L,
398 0x04020008L,
399 0x04120008L,
400 0x04020108L,
401 0x04120108L,
402 0x04021000L,
403 0x04121000L,
404 0x04021100L,
405 0x04121100L,
406 0x04021008L,
407 0x04121008L,
408 0x04021108L,
409 0x04121108L,
410 },
411 {
412 /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
413 0x00000000L,
414 0x10000000L,
415 0x00010000L,
416 0x10010000L,
417 0x00000004L,
418 0x10000004L,
419 0x00010004L,
420 0x10010004L,
421 0x20000000L,
422 0x30000000L,
423 0x20010000L,
424 0x30010000L,
425 0x20000004L,
426 0x30000004L,
427 0x20010004L,
428 0x30010004L,
429 0x00100000L,
430 0x10100000L,
431 0x00110000L,
432 0x10110000L,
433 0x00100004L,
434 0x10100004L,
435 0x00110004L,
436 0x10110004L,
437 0x20100000L,
438 0x30100000L,
439 0x20110000L,
440 0x30110000L,
441 0x20100004L,
442 0x30100004L,
443 0x20110004L,
444 0x30110004L,
445 0x00001000L,
446 0x10001000L,
447 0x00011000L,
448 0x10011000L,
449 0x00001004L,
450 0x10001004L,
451 0x00011004L,
452 0x10011004L,
453 0x20001000L,
454 0x30001000L,
455 0x20011000L,
456 0x30011000L,
457 0x20001004L,
458 0x30001004L,
459 0x20011004L,
460 0x30011004L,
461 0x00101000L,
462 0x10101000L,
463 0x00111000L,
464 0x10111000L,
465 0x00101004L,
466 0x10101004L,
467 0x00111004L,
468 0x10111004L,
469 0x20101000L,
470 0x30101000L,
471 0x20111000L,
472 0x30111000L,
473 0x20101004L,
474 0x30101004L,
475 0x20111004L,
476 0x30111004L,
477 },
478 {
479 /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
480 0x00000000L,
481 0x08000000L,
482 0x00000008L,
483 0x08000008L,
484 0x00000400L,
485 0x08000400L,
486 0x00000408L,
487 0x08000408L,
488 0x00020000L,
489 0x08020000L,
490 0x00020008L,
491 0x08020008L,
492 0x00020400L,
493 0x08020400L,
494 0x00020408L,
495 0x08020408L,
496 0x00000001L,
497 0x08000001L,
498 0x00000009L,
499 0x08000009L,
500 0x00000401L,
501 0x08000401L,
502 0x00000409L,
503 0x08000409L,
504 0x00020001L,
505 0x08020001L,
506 0x00020009L,
507 0x08020009L,
508 0x00020401L,
509 0x08020401L,
510 0x00020409L,
511 0x08020409L,
512 0x02000000L,
513 0x0A000000L,
514 0x02000008L,
515 0x0A000008L,
516 0x02000400L,
517 0x0A000400L,
518 0x02000408L,
519 0x0A000408L,
520 0x02020000L,
521 0x0A020000L,
522 0x02020008L,
523 0x0A020008L,
524 0x02020400L,
525 0x0A020400L,
526 0x02020408L,
527 0x0A020408L,
528 0x02000001L,
529 0x0A000001L,
530 0x02000009L,
531 0x0A000009L,
532 0x02000401L,
533 0x0A000401L,
534 0x02000409L,
535 0x0A000409L,
536 0x02020001L,
537 0x0A020001L,
538 0x02020009L,
539 0x0A020009L,
540 0x02020401L,
541 0x0A020401L,
542 0x02020409L,
543 0x0A020409L,
544 },
545 {
546 /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
547 0x00000000L,
548 0x00000100L,
549 0x00080000L,
550 0x00080100L,
551 0x01000000L,
552 0x01000100L,
553 0x01080000L,
554 0x01080100L,
555 0x00000010L,
556 0x00000110L,
557 0x00080010L,
558 0x00080110L,
559 0x01000010L,
560 0x01000110L,
561 0x01080010L,
562 0x01080110L,
563 0x00200000L,
564 0x00200100L,
565 0x00280000L,
566 0x00280100L,
567 0x01200000L,
568 0x01200100L,
569 0x01280000L,
570 0x01280100L,
571 0x00200010L,
572 0x00200110L,
573 0x00280010L,
574 0x00280110L,
575 0x01200010L,
576 0x01200110L,
577 0x01280010L,
578 0x01280110L,
579 0x00000200L,
580 0x00000300L,
581 0x00080200L,
582 0x00080300L,
583 0x01000200L,
584 0x01000300L,
585 0x01080200L,
586 0x01080300L,
587 0x00000210L,
588 0x00000310L,
589 0x00080210L,
590 0x00080310L,
591 0x01000210L,
592 0x01000310L,
593 0x01080210L,
594 0x01080310L,
595 0x00200200L,
596 0x00200300L,
597 0x00280200L,
598 0x00280300L,
599 0x01200200L,
600 0x01200300L,
601 0x01280200L,
602 0x01280300L,
603 0x00200210L,
604 0x00200310L,
605 0x00280210L,
606 0x00280310L,
607 0x01200210L,
608 0x01200310L,
609 0x01280210L,
610 0x01280310L,
611 },
612 {
613 /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
614 0x00000000L,
615 0x04000000L,
616 0x00040000L,
617 0x04040000L,
618 0x00000002L,
619 0x04000002L,
620 0x00040002L,
621 0x04040002L,
622 0x00002000L,
623 0x04002000L,
624 0x00042000L,
625 0x04042000L,
626 0x00002002L,
627 0x04002002L,
628 0x00042002L,
629 0x04042002L,
630 0x00000020L,
631 0x04000020L,
632 0x00040020L,
633 0x04040020L,
634 0x00000022L,
635 0x04000022L,
636 0x00040022L,
637 0x04040022L,
638 0x00002020L,
639 0x04002020L,
640 0x00042020L,
641 0x04042020L,
642 0x00002022L,
643 0x04002022L,
644 0x00042022L,
645 0x04042022L,
646 0x00000800L,
647 0x04000800L,
648 0x00040800L,
649 0x04040800L,
650 0x00000802L,
651 0x04000802L,
652 0x00040802L,
653 0x04040802L,
654 0x00002800L,
655 0x04002800L,
656 0x00042800L,
657 0x04042800L,
658 0x00002802L,
659 0x04002802L,
660 0x00042802L,
661 0x04042802L,
662 0x00000820L,
663 0x04000820L,
664 0x00040820L,
665 0x04040820L,
666 0x00000822L,
667 0x04000822L,
668 0x00040822L,
669 0x04040822L,
670 0x00002820L,
671 0x04002820L,
672 0x00042820L,
673 0x04042820L,
674 0x00002822L,
675 0x04002822L,
676 0x00042822L,
677 0x04042822L,
678 }
679 };
680
681 /* Return values as DES_set_key_checked() but always set the key */
DES_set_key(const_DES_cblock * key,DES_key_schedule * schedule)682 int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule)
683 {
684 int ret = 0;
685
686 if (!DES_check_key_parity(key))
687 ret = -1;
688 if (DES_is_weak_key(key))
689 ret = -2;
690 DES_set_key_unchecked(key, schedule);
691 return ret;
692 }
693
694 /*-
695 * return 0 if key parity is odd (correct),
696 * return -1 if key parity error,
697 * return -2 if illegal weak key.
698 */
DES_set_key_checked(const_DES_cblock * key,DES_key_schedule * schedule)699 int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule)
700 {
701 if (!DES_check_key_parity(key))
702 return -1;
703 if (DES_is_weak_key(key))
704 return -2;
705 DES_set_key_unchecked(key, schedule);
706 return 0;
707 }
708
DES_set_key_unchecked(const_DES_cblock * key,DES_key_schedule * schedule)709 void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule)
710 {
711 static const int shifts2[16] = {
712 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0
713 };
714 register DES_LONG c, d, t, s, t2;
715 register const unsigned char *in;
716 register DES_LONG *k;
717 register int i;
718
719 #ifdef OPENBSD_DEV_CRYPTO
720 memcpy(schedule->key, key, sizeof(schedule->key));
721 schedule->session = NULL;
722 #endif
723 k = &schedule->ks->deslong[0];
724 in = &(*key)[0];
725
726 c2l(in, c);
727 c2l(in, d);
728
729 /*
730 * do PC1 in 47 simple operations. Thanks to John Fletcher
731 * for the inspiration.
732 */
733 PERM_OP(d, c, t, 4, 0x0f0f0f0fL);
734 HPERM_OP(c, t, -2, 0xcccc0000L);
735 HPERM_OP(d, t, -2, 0xcccc0000L);
736 PERM_OP(d, c, t, 1, 0x55555555L);
737 PERM_OP(c, d, t, 8, 0x00ff00ffL);
738 PERM_OP(d, c, t, 1, 0x55555555L);
739 d = (((d & 0x000000ffL) << 16L) | (d & 0x0000ff00L) | ((d & 0x00ff0000L) >> 16L) | ((c & 0xf0000000L) >> 4L));
740 c &= 0x0fffffffL;
741
742 for (i = 0; i < ITERATIONS; i++) {
743 if (shifts2[i]) {
744 c = ((c >> 2L) | (c << 26L));
745 d = ((d >> 2L) | (d << 26L));
746 } else {
747 c = ((c >> 1L) | (c << 27L));
748 d = ((d >> 1L) | (d << 27L));
749 }
750 c &= 0x0fffffffL;
751 d &= 0x0fffffffL;
752 /*
753 * could be a few less shifts but I am to lazy at this point in time
754 * to investigate
755 */
756 s = des_skb[0][(c) & 0x3f] | des_skb[1][((c >> 6L) & 0x03) | ((c >> 7L) & 0x3c)] | des_skb[2][((c >> 13L) & 0x0f) | ((c >> 14L) & 0x30)] | des_skb[3][((c >> 20L) & 0x01) | ((c >> 21L) & 0x06) | ((c >> 22L) & 0x38)];
757 t = des_skb[4][(d) & 0x3f] | des_skb[5][((d >> 7L) & 0x03) | ((d >> 8L) & 0x3c)] | des_skb[6][(d >> 15L) & 0x3f] | des_skb[7][((d >> 21L) & 0x0f) | ((d >> 22L) & 0x30)];
758
759 /* table contained 0213 4657 */
760 t2 = ((t << 16L) | (s & 0x0000ffffL)) & 0xffffffffL;
761 *(k++) = ROTATE(t2, 30) & 0xffffffffL;
762
763 t2 = ((s >> 16L) | (t & 0xffff0000L));
764 *(k++) = ROTATE(t2, 26) & 0xffffffffL;
765 }
766 }
767
DES_key_sched(const_DES_cblock * key,DES_key_schedule * schedule)768 int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule)
769 {
770 return DES_set_key(key, schedule);
771 }
772