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