1 /*
2 * Copyright 1995-2023 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 * DES low level APIs are deprecated for public use, but still ok for internal
12 * use.
13 */
14 #include "internal/deprecated.h"
15
16 #include <openssl/e_os2.h>
17 #include <string.h>
18
19 #include "testutil.h"
20 #include "internal/nelem.h"
21
22 #ifndef OPENSSL_NO_DES
23 # include <openssl/des.h>
24
25 /* In case any platform doesn't use unsigned int for its checksums */
26 # define TEST_cs_eq TEST_uint_eq
27
28 # define DATA_BUF_SIZE 20
29
30 /* tisk tisk - the test keys don't all have odd parity :-( */
31 /* test data */
32 # define NUM_TESTS 34
33 static unsigned char key_data[NUM_TESTS][8] = {
34 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
35 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
36 {0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
37 {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
38 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
39 {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
40 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
41 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
42 {0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57},
43 {0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E},
44 {0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86},
45 {0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E},
46 {0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6},
47 {0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE},
48 {0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6},
49 {0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE},
50 {0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16},
51 {0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F},
52 {0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46},
53 {0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E},
54 {0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76},
55 {0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07},
56 {0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F},
57 {0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7},
58 {0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF},
59 {0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6},
60 {0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF},
61 {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
62 {0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E},
63 {0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE},
64 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
65 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
66 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
67 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}
68 };
69
70 static unsigned char plain_data[NUM_TESTS][8] = {
71 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
72 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
73 {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
74 {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
75 {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
76 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
77 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
78 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
79 {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42},
80 {0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA},
81 {0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72},
82 {0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A},
83 {0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2},
84 {0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A},
85 {0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2},
86 {0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A},
87 {0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02},
88 {0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A},
89 {0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32},
90 {0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA},
91 {0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62},
92 {0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2},
93 {0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA},
94 {0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92},
95 {0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A},
96 {0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2},
97 {0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A},
98 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
99 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
100 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
101 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
102 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
103 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
104 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
105 };
106
107 static unsigned char cipher_data[NUM_TESTS][8] = {
108 {0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7},
109 {0x73, 0x59, 0xB2, 0x16, 0x3E, 0x4E, 0xDC, 0x58},
110 {0x95, 0x8E, 0x6E, 0x62, 0x7A, 0x05, 0x55, 0x7B},
111 {0xF4, 0x03, 0x79, 0xAB, 0x9E, 0x0E, 0xC5, 0x33},
112 {0x17, 0x66, 0x8D, 0xFC, 0x72, 0x92, 0x53, 0x2D},
113 {0x8A, 0x5A, 0xE1, 0xF8, 0x1A, 0xB8, 0xF2, 0xDD},
114 {0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7},
115 {0xED, 0x39, 0xD9, 0x50, 0xFA, 0x74, 0xBC, 0xC4},
116 {0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B},
117 {0x7A, 0x38, 0x9D, 0x10, 0x35, 0x4B, 0xD2, 0x71},
118 {0x86, 0x8E, 0xBB, 0x51, 0xCA, 0xB4, 0x59, 0x9A},
119 {0x71, 0x78, 0x87, 0x6E, 0x01, 0xF1, 0x9B, 0x2A},
120 {0xAF, 0x37, 0xFB, 0x42, 0x1F, 0x8C, 0x40, 0x95},
121 {0x86, 0xA5, 0x60, 0xF1, 0x0E, 0xC6, 0xD8, 0x5B},
122 {0x0C, 0xD3, 0xDA, 0x02, 0x00, 0x21, 0xDC, 0x09},
123 {0xEA, 0x67, 0x6B, 0x2C, 0xB7, 0xDB, 0x2B, 0x7A},
124 {0xDF, 0xD6, 0x4A, 0x81, 0x5C, 0xAF, 0x1A, 0x0F},
125 {0x5C, 0x51, 0x3C, 0x9C, 0x48, 0x86, 0xC0, 0x88},
126 {0x0A, 0x2A, 0xEE, 0xAE, 0x3F, 0xF4, 0xAB, 0x77},
127 {0xEF, 0x1B, 0xF0, 0x3E, 0x5D, 0xFA, 0x57, 0x5A},
128 {0x88, 0xBF, 0x0D, 0xB6, 0xD7, 0x0D, 0xEE, 0x56},
129 {0xA1, 0xF9, 0x91, 0x55, 0x41, 0x02, 0x0B, 0x56},
130 {0x6F, 0xBF, 0x1C, 0xAF, 0xCF, 0xFD, 0x05, 0x56},
131 {0x2F, 0x22, 0xE4, 0x9B, 0xAB, 0x7C, 0xA1, 0xAC},
132 {0x5A, 0x6B, 0x61, 0x2C, 0xC2, 0x6C, 0xCE, 0x4A},
133 {0x5F, 0x4C, 0x03, 0x8E, 0xD1, 0x2B, 0x2E, 0x41},
134 {0x63, 0xFA, 0xC0, 0xD0, 0x34, 0xD9, 0xF7, 0x93},
135 {0x61, 0x7B, 0x3A, 0x0C, 0xE8, 0xF0, 0x71, 0x00},
136 {0xDB, 0x95, 0x86, 0x05, 0xF8, 0xC8, 0xC6, 0x06},
137 {0xED, 0xBF, 0xD1, 0xC6, 0x6C, 0x29, 0xCC, 0xC7},
138 {0x35, 0x55, 0x50, 0xB2, 0x15, 0x0E, 0x24, 0x51},
139 {0xCA, 0xAA, 0xAF, 0x4D, 0xEA, 0xF1, 0xDB, 0xAE},
140 {0xD5, 0xD4, 0x4F, 0xF7, 0x20, 0x68, 0x3D, 0x0D},
141 {0x2A, 0x2B, 0xB0, 0x08, 0xDF, 0x97, 0xC2, 0xF2}
142 };
143
144 static unsigned char cipher_ecb2[NUM_TESTS - 1][8] = {
145 {0x92, 0x95, 0xB5, 0x9B, 0xB3, 0x84, 0x73, 0x6E},
146 {0x19, 0x9E, 0x9D, 0x6D, 0xF3, 0x9A, 0xA8, 0x16},
147 {0x2A, 0x4B, 0x4D, 0x24, 0x52, 0x43, 0x84, 0x27},
148 {0x35, 0x84, 0x3C, 0x01, 0x9D, 0x18, 0xC5, 0xB6},
149 {0x4A, 0x5B, 0x2F, 0x42, 0xAA, 0x77, 0x19, 0x25},
150 {0xA0, 0x6B, 0xA9, 0xB8, 0xCA, 0x5B, 0x17, 0x8A},
151 {0xAB, 0x9D, 0xB7, 0xFB, 0xED, 0x95, 0xF2, 0x74},
152 {0x3D, 0x25, 0x6C, 0x23, 0xA7, 0x25, 0x2F, 0xD6},
153 {0xB7, 0x6F, 0xAB, 0x4F, 0xBD, 0xBD, 0xB7, 0x67},
154 {0x8F, 0x68, 0x27, 0xD6, 0x9C, 0xF4, 0x1A, 0x10},
155 {0x82, 0x57, 0xA1, 0xD6, 0x50, 0x5E, 0x81, 0x85},
156 {0xA2, 0x0F, 0x0A, 0xCD, 0x80, 0x89, 0x7D, 0xFA},
157 {0xCD, 0x2A, 0x53, 0x3A, 0xDB, 0x0D, 0x7E, 0xF3},
158 {0xD2, 0xC2, 0xBE, 0x27, 0xE8, 0x1B, 0x68, 0xE3},
159 {0xE9, 0x24, 0xCF, 0x4F, 0x89, 0x3C, 0x5B, 0x0A},
160 {0xA7, 0x18, 0xC3, 0x9F, 0xFA, 0x9F, 0xD7, 0x69},
161 {0x77, 0x2C, 0x79, 0xB1, 0xD2, 0x31, 0x7E, 0xB1},
162 {0x49, 0xAB, 0x92, 0x7F, 0xD0, 0x22, 0x00, 0xB7},
163 {0xCE, 0x1C, 0x6C, 0x7D, 0x85, 0xE3, 0x4A, 0x6F},
164 {0xBE, 0x91, 0xD6, 0xE1, 0x27, 0xB2, 0xE9, 0x87},
165 {0x70, 0x28, 0xAE, 0x8F, 0xD1, 0xF5, 0x74, 0x1A},
166 {0xAA, 0x37, 0x80, 0xBB, 0xF3, 0x22, 0x1D, 0xDE},
167 {0xA6, 0xC4, 0xD2, 0x5E, 0x28, 0x93, 0xAC, 0xB3},
168 {0x22, 0x07, 0x81, 0x5A, 0xE4, 0xB7, 0x1A, 0xAD},
169 {0xDC, 0xCE, 0x05, 0xE7, 0x07, 0xBD, 0xF5, 0x84},
170 {0x26, 0x1D, 0x39, 0x2C, 0xB3, 0xBA, 0xA5, 0x85},
171 {0xB4, 0xF7, 0x0F, 0x72, 0xFB, 0x04, 0xF0, 0xDC},
172 {0x95, 0xBA, 0xA9, 0x4E, 0x87, 0x36, 0xF2, 0x89},
173 {0xD4, 0x07, 0x3A, 0xF1, 0x5A, 0x17, 0x82, 0x0E},
174 {0xEF, 0x6F, 0xAF, 0xA7, 0x66, 0x1A, 0x7E, 0x89},
175 {0xC1, 0x97, 0xF5, 0x58, 0x74, 0x8A, 0x20, 0xE7},
176 {0x43, 0x34, 0xCF, 0xDA, 0x22, 0xC4, 0x86, 0xC8},
177 {0x08, 0xD7, 0xB4, 0xFB, 0x62, 0x9D, 0x08, 0x85}
178 };
179
180 static unsigned char cbc_key[8] =
181 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
182 static unsigned char cbc2_key[8] =
183 { 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86 };
184 static unsigned char cbc3_key[8] =
185 { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
186 static unsigned char cbc_iv[8] =
187 { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
188 /*
189 * Changed the following text constant to binary so it will work on ebcdic
190 * machines :-)
191 */
192 /* static char cbc_data[40]="7654321 Now is the time for \0001"; */
193 static unsigned char cbc_data[40] = {
194 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
195 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
196 0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
197 0x66, 0x6F, 0x72, 0x20, 0x00, 0x31, 0x00, 0x00,
198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
199 };
200
201 static unsigned char cbc_ok[32] = {
202 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
203 0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb,
204 0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68,
205 0x1d, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4
206 };
207
208 # ifdef SCREW_THE_PARITY
209 # error "SCREW_THE_PARITY is not meant to be defined."
210 # error "Original vectors are preserved for reference only."
211 static unsigned char cbc2_key[8] =
212 { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 };
213 static unsigned char xcbc_ok[32] = {
214 0x86, 0x74, 0x81, 0x0D, 0x61, 0xA4, 0xA5, 0x48,
215 0xB9, 0x93, 0x03, 0xE1, 0xB8, 0xBB, 0xBD, 0xBD,
216 0x64, 0x30, 0x0B, 0xB9, 0x06, 0x65, 0x81, 0x76,
217 0x04, 0x1D, 0x77, 0x62, 0x17, 0xCA, 0x2B, 0xD2,
218 };
219 # else
220 static unsigned char xcbc_ok[32] = {
221 0x84, 0x6B, 0x29, 0x14, 0x85, 0x1E, 0x9A, 0x29,
222 0x54, 0x73, 0x2F, 0x8A, 0xA0, 0xA6, 0x11, 0xC1,
223 0x15, 0xCD, 0xC2, 0xD7, 0x95, 0x1B, 0x10, 0x53,
224 0xA6, 0x3C, 0x5E, 0x03, 0xB2, 0x1A, 0xA3, 0xC4,
225 };
226 # endif
227
228 static unsigned char cbc3_ok[32] = {
229 0x3F, 0xE3, 0x01, 0xC9, 0x62, 0xAC, 0x01, 0xD0,
230 0x22, 0x13, 0x76, 0x3C, 0x1C, 0xBD, 0x4C, 0xDC,
231 0x79, 0x96, 0x57, 0xC0, 0x64, 0xEC, 0xF5, 0xD4,
232 0x1C, 0x67, 0x38, 0x12, 0xCF, 0xDE, 0x96, 0x75
233 };
234
235 static unsigned char pcbc_ok[32] = {
236 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
237 0x6d, 0xec, 0xb4, 0x70, 0xa0, 0xe5, 0x6b, 0x15,
238 0xae, 0xa6, 0xbf, 0x61, 0xed, 0x7d, 0x9c, 0x9f,
239 0xf7, 0x17, 0x46, 0x3b, 0x8a, 0xb3, 0xcc, 0x88
240 };
241
242 static unsigned char cfb_key[8] =
243 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
244 static unsigned char cfb_iv[8] =
245 { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
246 static unsigned char cfb_buf1[40], cfb_buf2[40], cfb_tmp[8];
247 static unsigned char plain[24] = {
248 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73,
249 0x20, 0x74, 0x68, 0x65, 0x20, 0x74,
250 0x69, 0x6d, 0x65, 0x20, 0x66, 0x6f,
251 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20
252 };
253
254 static unsigned char cfb_cipher8[24] = {
255 0xf3, 0x1f, 0xda, 0x07, 0x01, 0x14, 0x62, 0xee, 0x18, 0x7f, 0x43, 0xd8,
256 0x0a, 0x7c, 0xd9, 0xb5, 0xb0, 0xd2, 0x90, 0xda, 0x6e, 0x5b, 0x9a, 0x87
257 };
258
259 static unsigned char cfb_cipher16[24] = {
260 0xF3, 0x09, 0x87, 0x87, 0x7F, 0x57, 0xF7, 0x3C, 0x36, 0xB6, 0xDB, 0x70,
261 0xD8, 0xD5, 0x34, 0x19, 0xD3, 0x86, 0xB2, 0x23, 0xB7, 0xB2, 0xAD, 0x1B
262 };
263
264 static unsigned char cfb_cipher32[24] = {
265 0xF3, 0x09, 0x62, 0x49, 0xA4, 0xDF, 0xA4, 0x9F, 0x33, 0xDC, 0x7B, 0xAD,
266 0x4C, 0xC8, 0x9F, 0x64, 0xE4, 0x53, 0xE5, 0xEC, 0x67, 0x20, 0xDA, 0xB6
267 };
268
269 static unsigned char cfb_cipher48[24] = {
270 0xF3, 0x09, 0x62, 0x49, 0xC7, 0xF4, 0x30, 0xB5, 0x15, 0xEC, 0xBB, 0x85,
271 0x97, 0x5A, 0x13, 0x8C, 0x68, 0x60, 0xE2, 0x38, 0x34, 0x3C, 0xDC, 0x1F
272 };
273
274 static unsigned char cfb_cipher64[24] = {
275 0xF3, 0x09, 0x62, 0x49, 0xC7, 0xF4, 0x6E, 0x51, 0xA6, 0x9E, 0x83, 0x9B,
276 0x1A, 0x92, 0xF7, 0x84, 0x03, 0x46, 0x71, 0x33, 0x89, 0x8E, 0xA6, 0x22
277 };
278
279 static unsigned char ofb_key[8] =
280 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
281 static unsigned char ofb_iv[8] =
282 { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
283 static unsigned char ofb_buf1[24], ofb_buf2[24], ofb_tmp[8];
284 static unsigned char ofb_cipher[24] = {
285 0xf3, 0x09, 0x62, 0x49, 0xc7, 0xf4, 0x6e, 0x51,
286 0x35, 0xf2, 0x4a, 0x24, 0x2e, 0xeb, 0x3d, 0x3f,
287 0x3d, 0x6d, 0x5b, 0xe3, 0x25, 0x5a, 0xf8, 0xc3
288 };
289 static DES_LONG cbc_cksum_ret = 0xF7FE62B4L;
290 static unsigned char cbc_cksum_data[8] =
291 { 0x1D, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 };
292
pt(const unsigned char * p,char buf[DATA_BUF_SIZE])293 static char *pt(const unsigned char *p, char buf[DATA_BUF_SIZE])
294 {
295 char *ret;
296 int i;
297 static const char *f = "0123456789ABCDEF";
298
299 ret = &(buf[0]);
300 for (i = 0; i < 8; i++) {
301 ret[i * 2] = f[(p[i] >> 4) & 0xf];
302 ret[i * 2 + 1] = f[p[i] & 0xf];
303 }
304 ret[16] = '\0';
305 return ret;
306 }
307
test_des_ecb(int i)308 static int test_des_ecb(int i)
309 {
310 DES_key_schedule ks;
311 DES_cblock in, out, outin;
312 char b1[DATA_BUF_SIZE], b2[DATA_BUF_SIZE];
313
314 DES_set_key_unchecked(&key_data[i], &ks);
315 memcpy(in, plain_data[i], 8);
316 memset(out, 0, 8);
317 memset(outin, 0, 8);
318 DES_ecb_encrypt(&in, &out, &ks, DES_ENCRYPT);
319 DES_ecb_encrypt(&out, &outin, &ks, DES_DECRYPT);
320
321 if (!TEST_mem_eq(out, 8, cipher_data[i], 8)) {
322 TEST_info("Encryption error %2d k=%s p=%s", i + 1,
323 pt(key_data[i], b1), pt(in, b2));
324 return 0;
325 }
326 if (!TEST_mem_eq(in, 8, outin, 8)) {
327 TEST_info("Decryption error %2d k=%s p=%s", i + 1,
328 pt(key_data[i], b1), pt(out, b2));
329 return 0;
330 }
331 return 1;
332 }
333
test_des_ede_ecb(int i)334 static int test_des_ede_ecb(int i)
335 {
336 DES_cblock in, out, outin;
337 DES_key_schedule ks, ks2, ks3;
338 char b1[DATA_BUF_SIZE], b2[DATA_BUF_SIZE];
339
340 DES_set_key_unchecked(&key_data[i], &ks);
341 DES_set_key_unchecked(&key_data[i + 1], &ks2);
342 DES_set_key_unchecked(&key_data[i + 2], &ks3);
343 memcpy(in, plain_data[i], 8);
344 memset(out, 0, 8);
345 memset(outin, 0, 8);
346 DES_ecb3_encrypt(&in, &out, &ks, &ks2, &ks, DES_ENCRYPT);
347 DES_ecb3_encrypt(&out, &outin, &ks, &ks2, &ks, DES_DECRYPT);
348
349 if (!TEST_mem_eq(out, 8, cipher_ecb2[i], 8)) {
350 TEST_info("Encryption error %2d k=%s p=%s", i + 1,
351 pt(key_data[i], b1), pt(in, b2));
352 return 0;
353 }
354 if (!TEST_mem_eq(in, 8, outin, 8)) {
355 TEST_info("Decryption error %2d k=%s p=%s ", i + 1,
356 pt(key_data[i], b1), pt(out, b2));
357 return 0;
358 }
359 return 1;
360 }
361
test_des_cbc(void)362 static int test_des_cbc(void)
363 {
364 unsigned char cbc_in[40];
365 unsigned char cbc_out[40];
366 DES_cblock iv3;
367 DES_key_schedule ks;
368 const size_t cbc_data_len = strlen((char *)cbc_data);
369
370 if (!TEST_int_eq(DES_set_key_checked(&cbc_key, &ks), 0))
371 return 0;
372 memset(cbc_out, 0, sizeof(cbc_out));
373 memset(cbc_in, 0, sizeof(cbc_in));
374 memcpy(iv3, cbc_iv, sizeof(cbc_iv));
375 DES_ncbc_encrypt(cbc_data, cbc_out, cbc_data_len + 1, &ks,
376 &iv3, DES_ENCRYPT);
377 if (!TEST_mem_eq(cbc_out, 32, cbc_ok, 32))
378 return 0;
379
380 memcpy(iv3, cbc_iv, sizeof(cbc_iv));
381 DES_ncbc_encrypt(cbc_out, cbc_in, cbc_data_len + 1, &ks,
382 &iv3, DES_DECRYPT);
383 return TEST_mem_eq(cbc_in, cbc_data_len, cbc_data, cbc_data_len);
384 }
385
test_des_ede_cbc(void)386 static int test_des_ede_cbc(void)
387 {
388 DES_cblock iv3;
389 DES_key_schedule ks;
390 unsigned char cbc_in[40];
391 unsigned char cbc_out[40];
392 const size_t n = strlen((char *)cbc_data) + 1;
393
394 if (!TEST_int_eq(DES_set_key_checked(&cbc_key, &ks), 0))
395 return 0;
396 memset(cbc_out, 0, sizeof(cbc_out));
397 memset(cbc_in, 0, sizeof(cbc_in));
398 memcpy(iv3, cbc_iv, sizeof(cbc_iv));
399 DES_xcbc_encrypt(cbc_data, cbc_out, n, &ks, &iv3, &cbc2_key, &cbc3_key,
400 DES_ENCRYPT);
401 if (!TEST_mem_eq(cbc_out, sizeof(xcbc_ok), xcbc_ok, sizeof(xcbc_ok)))
402 return 0;
403 memcpy(iv3, cbc_iv, sizeof(cbc_iv));
404 DES_xcbc_encrypt(cbc_out, cbc_in, n, &ks, &iv3, &cbc2_key, &cbc3_key,
405 DES_DECRYPT);
406 return TEST_mem_eq(cbc_data, n, cbc_data, n);
407 }
408
test_ede_cbc(void)409 static int test_ede_cbc(void)
410 {
411 DES_cblock iv3;
412 DES_key_schedule ks, ks2, ks3;
413 unsigned char cbc_in[40];
414 unsigned char cbc_out[40];
415 const size_t i = strlen((char *)cbc_data) + 1;
416 const size_t n = (i + 7) / 8 * 8;
417
418 if (!TEST_int_eq(DES_set_key_checked(&cbc_key, &ks), 0))
419 return 0;
420 if (!TEST_int_eq(DES_set_key_checked(&cbc2_key, &ks2), 0))
421 return 0;
422 if (!TEST_int_eq(DES_set_key_checked(&cbc3_key, &ks3), 0))
423 return 0;
424 memset(cbc_out, 0, sizeof(cbc_out));
425 memset(cbc_in, 0, sizeof(cbc_in));
426 memcpy(iv3, cbc_iv, sizeof(cbc_iv));
427
428 DES_ede3_cbc_encrypt(cbc_data, cbc_out, 16L, &ks, &ks2, &ks3, &iv3,
429 DES_ENCRYPT);
430 DES_ede3_cbc_encrypt(&cbc_data[16], &cbc_out[16], i - 16, &ks, &ks2,
431 &ks3, &iv3, DES_ENCRYPT);
432 if (!TEST_mem_eq(cbc_out, n, cbc3_ok, n))
433 return 0;
434
435 memcpy(iv3, cbc_iv, sizeof(cbc_iv));
436 DES_ede3_cbc_encrypt(cbc_out, cbc_in, i, &ks, &ks2, &ks3, &iv3,
437 DES_DECRYPT);
438 return TEST_mem_eq(cbc_in, i, cbc_data, i);
439 }
440
test_input_align(int i)441 static int test_input_align(int i)
442 {
443 unsigned char cbc_out[40];
444 DES_cblock iv;
445 DES_key_schedule ks;
446 const size_t n = strlen(i + (char *)cbc_data) + 1;
447
448 memset(cbc_out, 0, sizeof(cbc_out));
449 memcpy(iv, cbc_iv, sizeof(cbc_iv));
450 if (!TEST_int_eq(DES_set_key_checked(&cbc_key, &ks), 0))
451 return 0;
452 DES_ncbc_encrypt(&cbc_data[i], cbc_out, n, &ks, &iv, DES_ENCRYPT);
453 return 1;
454 }
455
test_output_align(int i)456 static int test_output_align(int i)
457 {
458 unsigned char cbc_out[40];
459 DES_cblock iv;
460 DES_key_schedule ks;
461 const size_t n = strlen((char *)cbc_data) + 1;
462
463 memset(cbc_out, 0, sizeof(cbc_out));
464 memcpy(iv, cbc_iv, sizeof(cbc_iv));
465 if (!TEST_int_eq(DES_set_key_checked(&cbc_key, &ks), 0))
466 return 0;
467 DES_ncbc_encrypt(cbc_data, &cbc_out[i], n, &ks, &iv, DES_ENCRYPT);
468 return 1;
469 }
470
test_des_crypt(void)471 static int test_des_crypt(void)
472 {
473 if (!TEST_str_eq("efGnQx2725bI2", DES_crypt("testing", "ef")))
474 return 0;
475 if (!TEST_str_eq("yA1Rp/1hZXIJk", DES_crypt("bca76;23", "yA")))
476 return 0;
477
478 if (!TEST_ptr_null(DES_crypt("testing", "y\202")))
479 return 0;
480 if (!TEST_ptr_null(DES_crypt("testing", "\0A")))
481 return 0;
482 if (!TEST_ptr_null(DES_crypt("testing", "A")))
483 return 0;
484 return 1;
485 }
486
test_des_pcbc(void)487 static int test_des_pcbc(void)
488 {
489 unsigned char cbc_in[40];
490 unsigned char cbc_out[40];
491 DES_key_schedule ks;
492 const int n = strlen((char *)cbc_data) + 1;
493
494 if (!TEST_int_eq(DES_set_key_checked(&cbc_key, &ks), 0))
495 return 0;
496 memset(cbc_out, 0, sizeof(cbc_out));
497 memset(cbc_in, 0, sizeof(cbc_in));
498 DES_pcbc_encrypt(cbc_data, cbc_out, n, &ks,
499 &cbc_iv, DES_ENCRYPT);
500 if (!TEST_mem_eq(cbc_out, sizeof(pcbc_ok), pcbc_ok, sizeof(pcbc_ok)))
501 return 0;
502 DES_pcbc_encrypt(cbc_out, cbc_in, n, &ks,
503 &cbc_iv, DES_DECRYPT);
504 return TEST_mem_eq(cbc_in, n, cbc_data, n);
505 }
506
cfb_test(int bits,unsigned char * cfb_cipher)507 static int cfb_test(int bits, unsigned char *cfb_cipher)
508 {
509 DES_key_schedule ks;
510
511 DES_set_key_checked(&cfb_key, &ks);
512 memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
513 DES_cfb_encrypt(plain, cfb_buf1, bits, sizeof(plain), &ks, &cfb_tmp,
514 DES_ENCRYPT);
515 if (!TEST_mem_eq(cfb_cipher, sizeof(plain), cfb_buf1, sizeof(plain)))
516 return 0;
517 memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
518 DES_cfb_encrypt(cfb_buf1, cfb_buf2, bits, sizeof(plain), &ks, &cfb_tmp,
519 DES_DECRYPT);
520 return TEST_mem_eq(plain, sizeof(plain), cfb_buf2, sizeof(plain));
521 }
522
test_des_cfb8(void)523 static int test_des_cfb8(void)
524 {
525 return cfb_test(8, cfb_cipher8);
526 }
527
test_des_cfb16(void)528 static int test_des_cfb16(void)
529 {
530 return cfb_test(16, cfb_cipher16);
531 }
532
test_des_cfb32(void)533 static int test_des_cfb32(void)
534 {
535 return cfb_test(32, cfb_cipher32);
536 }
537
test_des_cfb48(void)538 static int test_des_cfb48(void)
539 {
540 return cfb_test(48, cfb_cipher48);
541 }
542
test_des_cfb64(void)543 static int test_des_cfb64(void)
544 {
545 DES_key_schedule ks;
546 int n;
547 size_t i;
548
549 if (!cfb_test(64, cfb_cipher64))
550 return 0;
551
552 DES_set_key_checked(&cfb_key, &ks);
553 memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
554 n = 0;
555 DES_cfb64_encrypt(plain, cfb_buf1, 12, &ks, &cfb_tmp, &n, DES_ENCRYPT);
556 DES_cfb64_encrypt(&plain[12], &cfb_buf1[12], sizeof(plain) - 12, &ks,
557 &cfb_tmp, &n, DES_ENCRYPT);
558 if (!TEST_mem_eq(cfb_cipher64, sizeof(plain), cfb_buf1, sizeof(plain)))
559 return 0;
560 memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
561 n = 0;
562 DES_cfb64_encrypt(cfb_buf1, cfb_buf2, 17, &ks, &cfb_tmp, &n, DES_DECRYPT);
563 DES_cfb64_encrypt(&cfb_buf1[17], &cfb_buf2[17],
564 sizeof(plain) - 17, &ks, &cfb_tmp, &n, DES_DECRYPT);
565 if (!TEST_mem_eq(plain, sizeof(plain), cfb_buf2, sizeof(plain)))
566 return 0;
567
568 memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
569 for (i = 0; i < sizeof(plain); i++)
570 DES_cfb_encrypt(&plain[i], &cfb_buf1[i], 8, 1, &ks, &cfb_tmp,
571 DES_ENCRYPT);
572 if (!TEST_mem_eq(cfb_cipher8, sizeof(plain), cfb_buf1, sizeof(plain)))
573 return 0;
574
575 memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
576 for (i = 0; i < sizeof(plain); i++)
577 DES_cfb_encrypt(&cfb_buf1[i], &cfb_buf2[i], 8, 1, &ks, &cfb_tmp,
578 DES_DECRYPT);
579 return TEST_mem_eq(plain, sizeof(plain), cfb_buf2, sizeof(plain));
580 }
581
test_des_ede_cfb64(void)582 static int test_des_ede_cfb64(void)
583 {
584 DES_key_schedule ks;
585 int n;
586
587 DES_set_key_checked(&cfb_key, &ks);
588 memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
589 n = 0;
590 DES_ede3_cfb64_encrypt(plain, cfb_buf1, 12, &ks, &ks, &ks, &cfb_tmp, &n,
591 DES_ENCRYPT);
592 DES_ede3_cfb64_encrypt(&plain[12], &cfb_buf1[12], sizeof(plain) - 12, &ks,
593 &ks, &ks, &cfb_tmp, &n, DES_ENCRYPT);
594 if (!TEST_mem_eq(cfb_cipher64, sizeof(plain), cfb_buf1, sizeof(plain)))
595 return 0;
596 memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
597 n = 0;
598 DES_ede3_cfb64_encrypt(cfb_buf1, cfb_buf2, (long)17, &ks, &ks, &ks,
599 &cfb_tmp, &n, DES_DECRYPT);
600 DES_ede3_cfb64_encrypt(&cfb_buf1[17], &cfb_buf2[17], sizeof(plain) - 17,
601 &ks, &ks, &ks, &cfb_tmp, &n, DES_DECRYPT);
602 return TEST_mem_eq(plain, sizeof(plain), cfb_buf2, sizeof(plain));
603 }
604
test_des_ofb(void)605 static int test_des_ofb(void)
606 {
607 DES_key_schedule ks;
608
609 DES_set_key_checked(&ofb_key, &ks);
610 memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
611 DES_ofb_encrypt(plain, ofb_buf1, 64, sizeof(plain) / 8, &ks, &ofb_tmp);
612 if (!TEST_mem_eq(ofb_cipher, sizeof(ofb_buf1), ofb_buf1, sizeof(ofb_buf1)))
613 return 0;
614
615 memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
616 DES_ofb_encrypt(ofb_buf1, ofb_buf2, 64, sizeof(ofb_buf1) / 8, &ks,
617 &ofb_tmp);
618 return TEST_mem_eq(plain, sizeof(ofb_buf2), ofb_buf2, sizeof(ofb_buf2));
619 }
620
test_des_ofb64(void)621 static int test_des_ofb64(void)
622 {
623 DES_key_schedule ks;
624 int num;
625 size_t i;
626
627 DES_set_key_checked(&ofb_key, &ks);
628 memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
629 memset(ofb_buf1, 0, sizeof(ofb_buf1));
630 memset(ofb_buf2, 0, sizeof(ofb_buf1));
631 num = 0;
632 for (i = 0; i < sizeof(plain); i++) {
633 DES_ofb64_encrypt(&plain[i], &ofb_buf1[i], 1, &ks, &ofb_tmp, &num);
634 }
635 if (!TEST_mem_eq(ofb_cipher, sizeof(ofb_buf1), ofb_buf1, sizeof(ofb_buf1)))
636 return 0;
637 memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
638 num = 0;
639 DES_ofb64_encrypt(ofb_buf1, ofb_buf2, sizeof(ofb_buf1), &ks, &ofb_tmp,
640 &num);
641 return TEST_mem_eq(plain, sizeof(ofb_buf2), ofb_buf2, sizeof(ofb_buf2));
642 }
643
test_des_ede_ofb64(void)644 static int test_des_ede_ofb64(void)
645 {
646 DES_key_schedule ks;
647 int num;
648 size_t i;
649
650 DES_set_key_checked(&ofb_key, &ks);
651 memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
652 memset(ofb_buf1, 0, sizeof(ofb_buf1));
653 memset(ofb_buf2, 0, sizeof(ofb_buf1));
654 num = 0;
655 for (i = 0; i < sizeof(plain); i++) {
656 DES_ede3_ofb64_encrypt(&plain[i], &ofb_buf1[i], 1, &ks, &ks,
657 &ks, &ofb_tmp, &num);
658 }
659 if (!TEST_mem_eq(ofb_cipher, sizeof(ofb_buf1), ofb_buf1, sizeof(ofb_buf1)))
660 return 0;
661 memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
662 num = 0;
663 DES_ede3_ofb64_encrypt(ofb_buf1, ofb_buf2, sizeof(ofb_buf1), &ks, &ks, &ks,
664 &ofb_tmp, &num);
665 return TEST_mem_eq(plain, sizeof(ofb_buf2), ofb_buf2, sizeof(ofb_buf2));
666 }
667
test_des_cbc_cksum(void)668 static int test_des_cbc_cksum(void)
669 {
670 DES_LONG cs;
671 DES_key_schedule ks;
672 unsigned char cret[8];
673
674 DES_set_key_checked(&cbc_key, &ks);
675 cs = DES_cbc_cksum(cbc_data, &cret, strlen((char *)cbc_data), &ks,
676 &cbc_iv);
677 if (!TEST_cs_eq(cs, cbc_cksum_ret))
678 return 0;
679 return TEST_mem_eq(cret, 8, cbc_cksum_data, 8);
680 }
681
test_des_quad_cksum(void)682 static int test_des_quad_cksum(void)
683 {
684 DES_LONG cs, lqret[4];
685
686 cs = DES_quad_cksum(cbc_data, (DES_cblock *)lqret,
687 (long)strlen((char *)cbc_data), 2,
688 (DES_cblock *)cbc_iv);
689 if (!TEST_cs_eq(cs, 0x70d7a63aL))
690 return 0;
691 if (!TEST_cs_eq(lqret[0], 0x327eba8dL))
692 return 0;
693 if (!TEST_cs_eq(lqret[1], 0x201a49ccL))
694 return 0;
695 if (!TEST_cs_eq(lqret[2], 0x70d7a63aL))
696 return 0;
697 if (!TEST_cs_eq(lqret[3], 0x501c2c26L))
698 return 0;
699 return 1;
700 }
701
702 /*
703 * Test TDES based key wrapping.
704 * The wrapping process uses a randomly generated IV so it is difficult to
705 * undertake KATs. End to end testing is performed instead.
706 */
707 static const int test_des_key_wrap_sizes[] = {
708 8, 16, 24, 32, 64, 80
709 };
710
test_des_key_wrap(int idx)711 static int test_des_key_wrap(int idx)
712 {
713 int in_bytes = test_des_key_wrap_sizes[idx];
714 unsigned char in[100], c_txt[200], p_txt[200], key[24];
715 int clen, clen_upd, clen_fin, plen, plen_upd, plen_fin, expect, bs, i;
716 EVP_CIPHER *cipher = NULL;
717 EVP_CIPHER_CTX *ctx = NULL;
718 int res = 0;
719
720 /* Some sanity checks and cipher loading */
721 if (!TEST_size_t_le(in_bytes, sizeof(in))
722 || !TEST_ptr(cipher = EVP_CIPHER_fetch(NULL, "DES3-WRAP", NULL))
723 || !TEST_int_eq(bs = EVP_CIPHER_get_block_size(cipher), 8)
724 || !TEST_size_t_eq(bs * 3u, sizeof(key))
725 || !TEST_true(in_bytes % bs == 0)
726 || !TEST_ptr(ctx = EVP_CIPHER_CTX_new()))
727 goto err;
728
729 /* Create random data to end to end test */
730 for (i = 0; i < in_bytes; i++)
731 in[i] = test_random();
732
733 /* Build the key */
734 memcpy(key, cbc_key, sizeof(cbc_key));
735 memcpy(key + sizeof(cbc_key), cbc2_key, sizeof(cbc2_key));
736 memcpy(key + sizeof(cbc_key) + sizeof(cbc3_key), cbc_key, sizeof(cbc3_key));
737
738 /* Wrap / encrypt the key */
739 clen_upd = sizeof(c_txt);
740 if (!TEST_true(EVP_EncryptInit(ctx, cipher, key, NULL))
741 || !TEST_true(EVP_EncryptUpdate(ctx, c_txt, &clen_upd,
742 in, in_bytes)))
743 goto err;
744
745 expect = (in_bytes + (bs - 1)) / bs * bs + 2 * bs;
746 if (!TEST_int_eq(clen_upd, expect))
747 goto err;
748
749 clen_fin = sizeof(c_txt) - clen_upd;
750 if (!TEST_true(EVP_EncryptFinal(ctx, c_txt + clen_upd, &clen_fin))
751 || !TEST_int_eq(clen_fin, 0))
752 goto err;
753 clen = clen_upd + clen_fin;
754
755 /* Decrypt the wrapped key */
756 plen_upd = sizeof(p_txt);
757 if (!TEST_true(EVP_DecryptInit(ctx, cipher, key, NULL))
758 || !TEST_true(EVP_DecryptUpdate(ctx, p_txt, &plen_upd,
759 c_txt, clen)))
760 goto err;
761 plen_fin = sizeof(p_txt) - plen_upd;
762 if (!TEST_true(EVP_DecryptFinal(ctx, p_txt + plen_upd, &plen_fin)))
763 goto err;
764 plen = plen_upd + plen_fin;
765
766 if (!TEST_mem_eq(in, in_bytes, p_txt, plen))
767 goto err;
768 res = 1;
769 err:
770 EVP_CIPHER_free(cipher);
771 EVP_CIPHER_CTX_free(ctx);
772 return res;
773 }
774
775 /*-
776 * Weak and semi weak keys as taken from
777 * %A D.W. Davies
778 * %A W.L. Price
779 * %T Security for Computer Networks
780 * %I John Wiley & Sons
781 * %D 1984
782 */
783 static struct {
784 const DES_cblock key;
785 int expect;
786 } weak_keys[] = {
787 /* weak keys */
788 {{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 1 },
789 {{0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE}, 1 },
790 {{0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E}, 1 },
791 {{0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1}, 1 },
792 /* semi-weak keys */
793 {{0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE}, 1 },
794 {{0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01}, 1 },
795 {{0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1}, 1 },
796 {{0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E}, 1 },
797 {{0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1}, 1 },
798 {{0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01}, 1 },
799 {{0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE}, 1 },
800 {{0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E}, 1 },
801 {{0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E}, 1 },
802 {{0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01}, 1 },
803 {{0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE}, 1 },
804 {{0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1}, 1 },
805 /* good key */
806 {{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, 0 }
807 };
808
test_des_weak_keys(int n)809 static int test_des_weak_keys(int n)
810 {
811 const_DES_cblock *key = (unsigned char (*)[8])weak_keys[n].key;
812
813 return TEST_int_eq(DES_is_weak_key(key), weak_keys[n].expect);
814 }
815
816 static struct {
817 const DES_cblock key;
818 int expect;
819 } bad_parity_keys[] = {
820 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 0 },
821 {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 0 },
822 /* Perturb each byte in turn to create even parity */
823 {{0x48, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, 0 },
824 {{0x49, 0xE8, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, 0 },
825 {{0x49, 0xE9, 0x5C, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, 0 },
826 {{0x49, 0xE9, 0x5D, 0x7D, 0x4C, 0xA2, 0x29, 0xBF}, 0 },
827 {{0x49, 0xE9, 0x5D, 0x6D, 0x5C, 0xA2, 0x29, 0xBF}, 0 },
828 {{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA3, 0x29, 0xBF}, 0 },
829 {{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x39, 0xBF}, 0 },
830 {{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBE}, 0 },
831 /* Odd parity version of above */
832 {{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, 1 }
833 };
834
test_des_check_bad_parity(int n)835 static int test_des_check_bad_parity(int n)
836 {
837 const_DES_cblock *key = (unsigned char (*)[8])bad_parity_keys[n].key;
838
839 return TEST_int_eq(DES_check_key_parity(key), bad_parity_keys[n].expect);
840 }
841
842 /* Test that two key 3DES can generate a random key without error */
test_des_two_key(void)843 static int test_des_two_key(void)
844 {
845 int res = 0;
846 EVP_CIPHER *cipher = NULL;
847 EVP_CIPHER_CTX *ctx = NULL;
848 unsigned char key[16];
849
850 if (!TEST_ptr(cipher = EVP_CIPHER_fetch(NULL, "DES-EDE-ECB", NULL))
851 || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())
852 || !EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, 1)
853 || !EVP_CIPHER_CTX_set_key_length(ctx, sizeof(key))
854 || !EVP_CIPHER_CTX_rand_key(ctx, key))
855 goto err;
856
857 res = 1;
858 err:
859 EVP_CIPHER_free(cipher);
860 EVP_CIPHER_CTX_free(ctx);
861 return res;
862 }
863
864 #endif
865
setup_tests(void)866 int setup_tests(void)
867 {
868 #ifndef OPENSSL_NO_DES
869 ADD_ALL_TESTS(test_des_ecb, NUM_TESTS);
870 ADD_TEST(test_des_cbc);
871 ADD_TEST(test_ede_cbc);
872 ADD_ALL_TESTS(test_des_ede_ecb, NUM_TESTS - 2);
873 ADD_TEST(test_des_ede_cbc);
874 ADD_TEST(test_des_pcbc);
875 ADD_TEST(test_des_cfb8);
876 ADD_TEST(test_des_cfb16);
877 ADD_TEST(test_des_cfb32);
878 ADD_TEST(test_des_cfb48);
879 ADD_TEST(test_des_cfb64);
880 ADD_TEST(test_des_ede_cfb64);
881 ADD_TEST(test_des_ofb);
882 ADD_TEST(test_des_ofb64);
883 ADD_TEST(test_des_ede_ofb64);
884 ADD_TEST(test_des_cbc_cksum);
885 ADD_TEST(test_des_quad_cksum);
886 ADD_TEST(test_des_crypt);
887 ADD_ALL_TESTS(test_input_align, 4);
888 ADD_ALL_TESTS(test_output_align, 4);
889 ADD_ALL_TESTS(test_des_key_wrap, OSSL_NELEM(test_des_key_wrap_sizes));
890 ADD_ALL_TESTS(test_des_weak_keys, OSSL_NELEM(weak_keys));
891 ADD_ALL_TESTS(test_des_check_bad_parity, OSSL_NELEM(bad_parity_keys));
892 ADD_TEST(test_des_two_key);
893 #endif
894 return 1;
895 }
896