Ensure CRYPTO_mem_leaks is the last thing we do
[oweals/openssl.git] / test / destest.c
1 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young (eay@cryptsoft.com).
6  * The implementation was written so as to conform with Netscapes SSL.
7  *
8  * This library is free for commercial and non-commercial use as long as
9  * the following conditions are aheared to.  The following conditions
10  * apply to all code found in this distribution, be it the RC4, RSA,
11  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
12  * included with this distribution is covered by the same copyright terms
13  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.
17  * If this package is used in a product, Eric Young should be given attribution
18  * as the author of the parts of the library used.
19  * This can be in the form of a textual message at program startup or
20  * in documentation (online or textual) provided with the package.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  * 1. Redistributions of source code must retain the copyright
26  *    notice, this list of conditions and the following disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  *    notice, this list of conditions and the following disclaimer in the
29  *    documentation and/or other materials provided with the distribution.
30  * 3. All advertising materials mentioning features or use of this software
31  *    must display the following acknowledgement:
32  *    "This product includes cryptographic software written by
33  *     Eric Young (eay@cryptsoft.com)"
34  *    The word 'cryptographic' can be left out if the rouines from the library
35  *    being used are not cryptographic related :-).
36  * 4. If you include any Windows specific code (or a derivative thereof) from
37  *    the apps directory (application code) you must include an acknowledgement:
38  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  * The licence and distribution terms for any publically available version or
53  * derivative of this code cannot be changed.  i.e. this code cannot simply be
54  * copied and put under another distribution licence
55  * [including the GNU Public Licence.]
56  */
57
58 #include <stdio.h>
59 #include <stdlib.h>
60
61 #include <openssl/e_os2.h>
62 #if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WINDOWS)
63 # ifndef OPENSSL_SYS_MSDOS
64 #  define OPENSSL_SYS_MSDOS
65 # endif
66 #endif
67
68 #ifndef OPENSSL_SYS_MSDOS
69 # if !defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_VMS_DECC)
70 #  include OPENSSL_UNISTD
71 # endif
72 #else
73 # include <io.h>
74 #endif
75 #include <string.h>
76
77 #ifdef OPENSSL_NO_DES
78 int main(int argc, char *argv[])
79 {
80     printf("No DES support\n");
81     return (0);
82 }
83 #else
84 # include <openssl/des.h>
85
86 # define crypt(c,s) (DES_crypt((c),(s)))
87
88 /* tisk tisk - the test keys don't all have odd parity :-( */
89 /* test data */
90 # define NUM_TESTS 34
91 static unsigned char key_data[NUM_TESTS][8] = {
92     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
93     {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
94     {0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
95     {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
96     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
97     {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
98     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
99     {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
100     {0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57},
101     {0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E},
102     {0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86},
103     {0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E},
104     {0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6},
105     {0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE},
106     {0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6},
107     {0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE},
108     {0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16},
109     {0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F},
110     {0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46},
111     {0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E},
112     {0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76},
113     {0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07},
114     {0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F},
115     {0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7},
116     {0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF},
117     {0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6},
118     {0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF},
119     {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
120     {0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E},
121     {0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE},
122     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
123     {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
124     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
125     {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}
126 };
127
128 static unsigned char plain_data[NUM_TESTS][8] = {
129     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
130     {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
131     {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
132     {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
133     {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
134     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
135     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
136     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
137     {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42},
138     {0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA},
139     {0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72},
140     {0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A},
141     {0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2},
142     {0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A},
143     {0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2},
144     {0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A},
145     {0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02},
146     {0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A},
147     {0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32},
148     {0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA},
149     {0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62},
150     {0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2},
151     {0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA},
152     {0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92},
153     {0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A},
154     {0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2},
155     {0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A},
156     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
157     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
158     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
159     {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
160     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
161     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
162     {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
163 };
164
165 static unsigned char cipher_data[NUM_TESTS][8] = {
166     {0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7},
167     {0x73, 0x59, 0xB2, 0x16, 0x3E, 0x4E, 0xDC, 0x58},
168     {0x95, 0x8E, 0x6E, 0x62, 0x7A, 0x05, 0x55, 0x7B},
169     {0xF4, 0x03, 0x79, 0xAB, 0x9E, 0x0E, 0xC5, 0x33},
170     {0x17, 0x66, 0x8D, 0xFC, 0x72, 0x92, 0x53, 0x2D},
171     {0x8A, 0x5A, 0xE1, 0xF8, 0x1A, 0xB8, 0xF2, 0xDD},
172     {0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7},
173     {0xED, 0x39, 0xD9, 0x50, 0xFA, 0x74, 0xBC, 0xC4},
174     {0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B},
175     {0x7A, 0x38, 0x9D, 0x10, 0x35, 0x4B, 0xD2, 0x71},
176     {0x86, 0x8E, 0xBB, 0x51, 0xCA, 0xB4, 0x59, 0x9A},
177     {0x71, 0x78, 0x87, 0x6E, 0x01, 0xF1, 0x9B, 0x2A},
178     {0xAF, 0x37, 0xFB, 0x42, 0x1F, 0x8C, 0x40, 0x95},
179     {0x86, 0xA5, 0x60, 0xF1, 0x0E, 0xC6, 0xD8, 0x5B},
180     {0x0C, 0xD3, 0xDA, 0x02, 0x00, 0x21, 0xDC, 0x09},
181     {0xEA, 0x67, 0x6B, 0x2C, 0xB7, 0xDB, 0x2B, 0x7A},
182     {0xDF, 0xD6, 0x4A, 0x81, 0x5C, 0xAF, 0x1A, 0x0F},
183     {0x5C, 0x51, 0x3C, 0x9C, 0x48, 0x86, 0xC0, 0x88},
184     {0x0A, 0x2A, 0xEE, 0xAE, 0x3F, 0xF4, 0xAB, 0x77},
185     {0xEF, 0x1B, 0xF0, 0x3E, 0x5D, 0xFA, 0x57, 0x5A},
186     {0x88, 0xBF, 0x0D, 0xB6, 0xD7, 0x0D, 0xEE, 0x56},
187     {0xA1, 0xF9, 0x91, 0x55, 0x41, 0x02, 0x0B, 0x56},
188     {0x6F, 0xBF, 0x1C, 0xAF, 0xCF, 0xFD, 0x05, 0x56},
189     {0x2F, 0x22, 0xE4, 0x9B, 0xAB, 0x7C, 0xA1, 0xAC},
190     {0x5A, 0x6B, 0x61, 0x2C, 0xC2, 0x6C, 0xCE, 0x4A},
191     {0x5F, 0x4C, 0x03, 0x8E, 0xD1, 0x2B, 0x2E, 0x41},
192     {0x63, 0xFA, 0xC0, 0xD0, 0x34, 0xD9, 0xF7, 0x93},
193     {0x61, 0x7B, 0x3A, 0x0C, 0xE8, 0xF0, 0x71, 0x00},
194     {0xDB, 0x95, 0x86, 0x05, 0xF8, 0xC8, 0xC6, 0x06},
195     {0xED, 0xBF, 0xD1, 0xC6, 0x6C, 0x29, 0xCC, 0xC7},
196     {0x35, 0x55, 0x50, 0xB2, 0x15, 0x0E, 0x24, 0x51},
197     {0xCA, 0xAA, 0xAF, 0x4D, 0xEA, 0xF1, 0xDB, 0xAE},
198     {0xD5, 0xD4, 0x4F, 0xF7, 0x20, 0x68, 0x3D, 0x0D},
199     {0x2A, 0x2B, 0xB0, 0x08, 0xDF, 0x97, 0xC2, 0xF2}
200 };
201
202 static unsigned char cipher_ecb2[NUM_TESTS - 1][8] = {
203     {0x92, 0x95, 0xB5, 0x9B, 0xB3, 0x84, 0x73, 0x6E},
204     {0x19, 0x9E, 0x9D, 0x6D, 0xF3, 0x9A, 0xA8, 0x16},
205     {0x2A, 0x4B, 0x4D, 0x24, 0x52, 0x43, 0x84, 0x27},
206     {0x35, 0x84, 0x3C, 0x01, 0x9D, 0x18, 0xC5, 0xB6},
207     {0x4A, 0x5B, 0x2F, 0x42, 0xAA, 0x77, 0x19, 0x25},
208     {0xA0, 0x6B, 0xA9, 0xB8, 0xCA, 0x5B, 0x17, 0x8A},
209     {0xAB, 0x9D, 0xB7, 0xFB, 0xED, 0x95, 0xF2, 0x74},
210     {0x3D, 0x25, 0x6C, 0x23, 0xA7, 0x25, 0x2F, 0xD6},
211     {0xB7, 0x6F, 0xAB, 0x4F, 0xBD, 0xBD, 0xB7, 0x67},
212     {0x8F, 0x68, 0x27, 0xD6, 0x9C, 0xF4, 0x1A, 0x10},
213     {0x82, 0x57, 0xA1, 0xD6, 0x50, 0x5E, 0x81, 0x85},
214     {0xA2, 0x0F, 0x0A, 0xCD, 0x80, 0x89, 0x7D, 0xFA},
215     {0xCD, 0x2A, 0x53, 0x3A, 0xDB, 0x0D, 0x7E, 0xF3},
216     {0xD2, 0xC2, 0xBE, 0x27, 0xE8, 0x1B, 0x68, 0xE3},
217     {0xE9, 0x24, 0xCF, 0x4F, 0x89, 0x3C, 0x5B, 0x0A},
218     {0xA7, 0x18, 0xC3, 0x9F, 0xFA, 0x9F, 0xD7, 0x69},
219     {0x77, 0x2C, 0x79, 0xB1, 0xD2, 0x31, 0x7E, 0xB1},
220     {0x49, 0xAB, 0x92, 0x7F, 0xD0, 0x22, 0x00, 0xB7},
221     {0xCE, 0x1C, 0x6C, 0x7D, 0x85, 0xE3, 0x4A, 0x6F},
222     {0xBE, 0x91, 0xD6, 0xE1, 0x27, 0xB2, 0xE9, 0x87},
223     {0x70, 0x28, 0xAE, 0x8F, 0xD1, 0xF5, 0x74, 0x1A},
224     {0xAA, 0x37, 0x80, 0xBB, 0xF3, 0x22, 0x1D, 0xDE},
225     {0xA6, 0xC4, 0xD2, 0x5E, 0x28, 0x93, 0xAC, 0xB3},
226     {0x22, 0x07, 0x81, 0x5A, 0xE4, 0xB7, 0x1A, 0xAD},
227     {0xDC, 0xCE, 0x05, 0xE7, 0x07, 0xBD, 0xF5, 0x84},
228     {0x26, 0x1D, 0x39, 0x2C, 0xB3, 0xBA, 0xA5, 0x85},
229     {0xB4, 0xF7, 0x0F, 0x72, 0xFB, 0x04, 0xF0, 0xDC},
230     {0x95, 0xBA, 0xA9, 0x4E, 0x87, 0x36, 0xF2, 0x89},
231     {0xD4, 0x07, 0x3A, 0xF1, 0x5A, 0x17, 0x82, 0x0E},
232     {0xEF, 0x6F, 0xAF, 0xA7, 0x66, 0x1A, 0x7E, 0x89},
233     {0xC1, 0x97, 0xF5, 0x58, 0x74, 0x8A, 0x20, 0xE7},
234     {0x43, 0x34, 0xCF, 0xDA, 0x22, 0xC4, 0x86, 0xC8},
235     {0x08, 0xD7, 0xB4, 0xFB, 0x62, 0x9D, 0x08, 0x85}
236 };
237
238 static unsigned char cbc_key[8] =
239     { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
240 static unsigned char cbc2_key[8] =
241     { 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86 };
242 static unsigned char cbc3_key[8] =
243     { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
244 static unsigned char cbc_iv[8] =
245     { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
246 /*
247  * Changed the following text constant to binary so it will work on ebcdic
248  * machines :-)
249  */
250 /* static char cbc_data[40]="7654321 Now is the time for \0001"; */
251 static unsigned char cbc_data[40] = {
252     0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
253     0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
254     0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
255     0x66, 0x6F, 0x72, 0x20, 0x00, 0x31, 0x00, 0x00,
256     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257 };
258
259 static unsigned char cbc_ok[32] = {
260     0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
261     0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb,
262     0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68,
263     0x1d, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4
264 };
265
266 # ifdef SCREW_THE_PARITY
267 #  error "SCREW_THE_PARITY is not ment to be defined."
268 #  error "Original vectors are preserved for reference only."
269 static unsigned char cbc2_key[8] =
270     { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 };
271 static unsigned char xcbc_ok[32] = {
272     0x86, 0x74, 0x81, 0x0D, 0x61, 0xA4, 0xA5, 0x48,
273     0xB9, 0x93, 0x03, 0xE1, 0xB8, 0xBB, 0xBD, 0xBD,
274     0x64, 0x30, 0x0B, 0xB9, 0x06, 0x65, 0x81, 0x76,
275     0x04, 0x1D, 0x77, 0x62, 0x17, 0xCA, 0x2B, 0xD2,
276 };
277 # else
278 static unsigned char xcbc_ok[32] = {
279     0x84, 0x6B, 0x29, 0x14, 0x85, 0x1E, 0x9A, 0x29,
280     0x54, 0x73, 0x2F, 0x8A, 0xA0, 0xA6, 0x11, 0xC1,
281     0x15, 0xCD, 0xC2, 0xD7, 0x95, 0x1B, 0x10, 0x53,
282     0xA6, 0x3C, 0x5E, 0x03, 0xB2, 0x1A, 0xA3, 0xC4,
283 };
284 # endif
285
286 static unsigned char cbc3_ok[32] = {
287     0x3F, 0xE3, 0x01, 0xC9, 0x62, 0xAC, 0x01, 0xD0,
288     0x22, 0x13, 0x76, 0x3C, 0x1C, 0xBD, 0x4C, 0xDC,
289     0x79, 0x96, 0x57, 0xC0, 0x64, 0xEC, 0xF5, 0xD4,
290     0x1C, 0x67, 0x38, 0x12, 0xCF, 0xDE, 0x96, 0x75
291 };
292
293 static unsigned char pcbc_ok[32] = {
294     0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
295     0x6d, 0xec, 0xb4, 0x70, 0xa0, 0xe5, 0x6b, 0x15,
296     0xae, 0xa6, 0xbf, 0x61, 0xed, 0x7d, 0x9c, 0x9f,
297     0xf7, 0x17, 0x46, 0x3b, 0x8a, 0xb3, 0xcc, 0x88
298 };
299
300 static unsigned char cfb_key[8] =
301     { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
302 static unsigned char cfb_iv[8] =
303     { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
304 static unsigned char cfb_buf1[40], cfb_buf2[40], cfb_tmp[8];
305 static unsigned char plain[24] = {
306     0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73,
307     0x20, 0x74, 0x68, 0x65, 0x20, 0x74,
308     0x69, 0x6d, 0x65, 0x20, 0x66, 0x6f,
309     0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20
310 };
311
312 static unsigned char cfb_cipher8[24] = {
313     0xf3, 0x1f, 0xda, 0x07, 0x01, 0x14, 0x62, 0xee, 0x18, 0x7f, 0x43, 0xd8,
314     0x0a, 0x7c, 0xd9, 0xb5, 0xb0, 0xd2, 0x90, 0xda, 0x6e, 0x5b, 0x9a, 0x87
315 };
316
317 static unsigned char cfb_cipher16[24] = {
318     0xF3, 0x09, 0x87, 0x87, 0x7F, 0x57, 0xF7, 0x3C, 0x36, 0xB6, 0xDB, 0x70,
319     0xD8, 0xD5, 0x34, 0x19, 0xD3, 0x86, 0xB2, 0x23, 0xB7, 0xB2, 0xAD, 0x1B
320 };
321
322 static unsigned char cfb_cipher32[24] = {
323     0xF3, 0x09, 0x62, 0x49, 0xA4, 0xDF, 0xA4, 0x9F, 0x33, 0xDC, 0x7B, 0xAD,
324     0x4C, 0xC8, 0x9F, 0x64, 0xE4, 0x53, 0xE5, 0xEC, 0x67, 0x20, 0xDA, 0xB6
325 };
326
327 static unsigned char cfb_cipher48[24] = {
328     0xF3, 0x09, 0x62, 0x49, 0xC7, 0xF4, 0x30, 0xB5, 0x15, 0xEC, 0xBB, 0x85,
329     0x97, 0x5A, 0x13, 0x8C, 0x68, 0x60, 0xE2, 0x38, 0x34, 0x3C, 0xDC, 0x1F
330 };
331
332 static unsigned char cfb_cipher64[24] = {
333     0xF3, 0x09, 0x62, 0x49, 0xC7, 0xF4, 0x6E, 0x51, 0xA6, 0x9E, 0x83, 0x9B,
334     0x1A, 0x92, 0xF7, 0x84, 0x03, 0x46, 0x71, 0x33, 0x89, 0x8E, 0xA6, 0x22
335 };
336
337 static unsigned char ofb_key[8] =
338     { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
339 static unsigned char ofb_iv[8] =
340     { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
341 static unsigned char ofb_buf1[24], ofb_buf2[24], ofb_tmp[8];
342 static unsigned char ofb_cipher[24] = {
343     0xf3, 0x09, 0x62, 0x49, 0xc7, 0xf4, 0x6e, 0x51,
344     0x35, 0xf2, 0x4a, 0x24, 0x2e, 0xeb, 0x3d, 0x3f,
345     0x3d, 0x6d, 0x5b, 0xe3, 0x25, 0x5a, 0xf8, 0xc3
346 };
347 static DES_LONG cbc_cksum_ret = 0xF7FE62B4L;
348 static unsigned char cbc_cksum_data[8] =
349     { 0x1D, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 };
350
351 static char *pt(unsigned char *p);
352 static int cfb_test(int bits, unsigned char *cfb_cipher);
353 static int cfb64_test(unsigned char *cfb_cipher);
354 static int ede_cfb64_test(unsigned char *cfb_cipher);
355 int main(int argc, char *argv[])
356 {
357     int j, err = 0;
358     unsigned int i;
359     DES_cblock in, out, outin, iv3;
360     DES_key_schedule ks, ks2, ks3;
361     unsigned char cbc_in[40];
362     unsigned char cbc_out[40];
363     DES_LONG cs;
364     unsigned char cret[8];
365     DES_LONG lqret[4];
366     int num;
367     char *str;
368
369     printf("Doing ecb\n");
370     for (i = 0; i < NUM_TESTS; i++) {
371         DES_set_key_unchecked(&key_data[i], &ks);
372         memcpy(in, plain_data[i], 8);
373         memset(out, 0, 8);
374         memset(outin, 0, 8);
375         DES_ecb_encrypt(&in, &out, &ks, DES_ENCRYPT);
376         DES_ecb_encrypt(&out, &outin, &ks, DES_DECRYPT);
377
378         if (memcmp(out, cipher_data[i], 8) != 0) {
379             printf("Encryption error %2d\nk=%s p=%s o=%s act=%s\n",
380                    i + 1, pt(key_data[i]), pt(in), pt(cipher_data[i]),
381                    pt(out));
382             err = 1;
383         }
384         if (memcmp(in, outin, 8) != 0) {
385             printf("Decryption error %2d\nk=%s p=%s o=%s act=%s\n",
386                    i + 1, pt(key_data[i]), pt(out), pt(in), pt(outin));
387             err = 1;
388         }
389     }
390
391 # ifndef LIBDES_LIT
392     printf("Doing ede ecb\n");
393     for (i = 0; i < (NUM_TESTS - 2); i++) {
394         DES_set_key_unchecked(&key_data[i], &ks);
395         DES_set_key_unchecked(&key_data[i + 1], &ks2);
396         DES_set_key_unchecked(&key_data[i + 2], &ks3);
397         memcpy(in, plain_data[i], 8);
398         memset(out, 0, 8);
399         memset(outin, 0, 8);
400         DES_ecb3_encrypt(&in,&out,&ks,&ks2,&ks,DES_ENCRYPT);
401         DES_ecb3_encrypt(&out,&outin,&ks,&ks2,&ks,DES_DECRYPT);
402
403         if (memcmp(out, cipher_ecb2[i], 8) != 0) {
404             printf("Encryption error %2d\nk=%s p=%s o=%s act=%s\n",
405                    i + 1, pt(key_data[i]), pt(in), pt(cipher_ecb2[i]),
406                    pt(out));
407             err = 1;
408         }
409         if (memcmp(in, outin, 8) != 0) {
410             printf("Decryption error %2d\nk=%s p=%s o=%s act=%s\n",
411                    i + 1, pt(key_data[i]), pt(out), pt(in), pt(outin));
412             err = 1;
413         }
414     }
415 # endif
416
417     printf("Doing cbc\n");
418     if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
419         printf("Key error %d\n", j);
420         err = 1;
421     }
422     memset(cbc_out, 0, 40);
423     memset(cbc_in, 0, 40);
424     memcpy(iv3, cbc_iv, sizeof(cbc_iv));
425     DES_ncbc_encrypt(cbc_data, cbc_out, strlen((char *)cbc_data) + 1, &ks,
426                      &iv3, DES_ENCRYPT);
427     if (memcmp(cbc_out, cbc_ok, 32) != 0) {
428         printf("cbc_encrypt encrypt error\n");
429         err = 1;
430     }
431
432     memcpy(iv3, cbc_iv, sizeof(cbc_iv));
433     DES_ncbc_encrypt(cbc_out, cbc_in, strlen((char *)cbc_data) + 1, &ks,
434                      &iv3, DES_DECRYPT);
435     if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data)) != 0) {
436         printf("cbc_encrypt decrypt error\n");
437         err = 1;
438     }
439 # ifndef LIBDES_LIT
440     printf("Doing desx cbc\n");
441     if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
442         printf("Key error %d\n", j);
443         err = 1;
444     }
445     memset(cbc_out, 0, 40);
446     memset(cbc_in, 0, 40);
447     memcpy(iv3, cbc_iv, sizeof(cbc_iv));
448     DES_xcbc_encrypt(cbc_data, cbc_out, strlen((char *)cbc_data) + 1, &ks,
449                      &iv3, &cbc2_key, &cbc3_key, DES_ENCRYPT);
450     if (memcmp(cbc_out, xcbc_ok, 32) != 0) {
451         printf("des_xcbc_encrypt encrypt error\n");
452         err = 1;
453     }
454     memcpy(iv3, cbc_iv, sizeof(cbc_iv));
455     DES_xcbc_encrypt(cbc_out, cbc_in, strlen((char *)cbc_data) + 1, &ks,
456                      &iv3, &cbc2_key, &cbc3_key, DES_DECRYPT);
457     if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) {
458         printf("des_xcbc_encrypt decrypt error\n");
459         err = 1;
460     }
461 # endif
462
463     printf("Doing ede cbc\n");
464     if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
465         printf("Key error %d\n", j);
466         err = 1;
467     }
468     if ((j = DES_set_key_checked(&cbc2_key, &ks2)) != 0) {
469         printf("Key error %d\n", j);
470         err = 1;
471     }
472     if ((j = DES_set_key_checked(&cbc3_key, &ks3)) != 0) {
473         printf("Key error %d\n", j);
474         err = 1;
475     }
476     memset(cbc_out, 0, 40);
477     memset(cbc_in, 0, 40);
478     i = strlen((char *)cbc_data) + 1;
479     /* i=((i+7)/8)*8; */
480     memcpy(iv3, cbc_iv, sizeof(cbc_iv));
481
482     DES_ede3_cbc_encrypt(cbc_data, cbc_out, 16L, &ks, &ks2, &ks3, &iv3,
483                          DES_ENCRYPT);
484     DES_ede3_cbc_encrypt(&(cbc_data[16]), &(cbc_out[16]), i - 16, &ks, &ks2,
485                          &ks3, &iv3, DES_ENCRYPT);
486     if (memcmp
487         (cbc_out, cbc3_ok,
488          (unsigned int)(strlen((char *)cbc_data) + 1 + 7) / 8 * 8) != 0) {
489         unsigned int n;
490
491         printf("des_ede3_cbc_encrypt encrypt error\n");
492         for (n = 0; n < i; ++n)
493             printf(" %02x", cbc_out[n]);
494         printf("\n");
495         for (n = 0; n < i; ++n)
496             printf(" %02x", cbc3_ok[n]);
497         printf("\n");
498         err = 1;
499     }
500
501     memcpy(iv3, cbc_iv, sizeof(cbc_iv));
502     DES_ede3_cbc_encrypt(cbc_out, cbc_in, i, &ks, &ks2, &ks3, &iv3, DES_DECRYPT);
503     if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) {
504         unsigned int n;
505
506         printf("DES_ede3_cbc_encrypt decrypt error\n");
507         for (n = 0; n < i; ++n)
508             printf(" %02x", cbc_data[n]);
509         printf("\n");
510         for (n = 0; n < i; ++n)
511             printf(" %02x", cbc_in[n]);
512         printf("\n");
513         err = 1;
514     }
515 # ifndef LIBDES_LIT
516     printf("Doing pcbc\n");
517     if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
518         printf("Key error %d\n", j);
519         err = 1;
520     }
521     memset(cbc_out, 0, 40);
522     memset(cbc_in, 0, 40);
523     DES_pcbc_encrypt(cbc_data, cbc_out, strlen((char *)cbc_data) + 1, &ks,
524                      &cbc_iv, DES_ENCRYPT);
525     if (memcmp(cbc_out, pcbc_ok, 32) != 0) {
526         printf("pcbc_encrypt encrypt error\n");
527         err = 1;
528     }
529     DES_pcbc_encrypt(cbc_out, cbc_in, strlen((char *)cbc_data) + 1, &ks,
530                      &cbc_iv, DES_DECRYPT);
531     if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) {
532         printf("pcbc_encrypt decrypt error\n");
533         err = 1;
534     }
535
536     printf("Doing ");
537     printf("cfb8 ");
538     err += cfb_test(8, cfb_cipher8);
539     printf("cfb16 ");
540     err += cfb_test(16, cfb_cipher16);
541     printf("cfb32 ");
542     err += cfb_test(32, cfb_cipher32);
543     printf("cfb48 ");
544     err += cfb_test(48, cfb_cipher48);
545     printf("cfb64 ");
546     err += cfb_test(64, cfb_cipher64);
547
548     printf("cfb64() ");
549     err += cfb64_test(cfb_cipher64);
550
551     memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
552     for (i = 0; i < sizeof(plain); i++)
553         DES_cfb_encrypt(&(plain[i]), &(cfb_buf1[i]),
554                         8, 1, &ks, &cfb_tmp, DES_ENCRYPT);
555     if (memcmp(cfb_cipher8, cfb_buf1, sizeof(plain)) != 0) {
556         printf("cfb_encrypt small encrypt error\n");
557         err = 1;
558     }
559
560     memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
561     for (i = 0; i < sizeof(plain); i++)
562         DES_cfb_encrypt(&(cfb_buf1[i]), &(cfb_buf2[i]),
563                         8, 1, &ks, &cfb_tmp, DES_DECRYPT);
564     if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) {
565         printf("cfb_encrypt small decrypt error\n");
566         err = 1;
567     }
568
569     printf("ede_cfb64() ");
570     err += ede_cfb64_test(cfb_cipher64);
571
572     printf("done\n");
573
574     printf("Doing ofb\n");
575     DES_set_key_checked(&ofb_key, &ks);
576     memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
577     DES_ofb_encrypt(plain, ofb_buf1, 64, sizeof(plain) / 8, &ks, &ofb_tmp);
578     if (memcmp(ofb_cipher, ofb_buf1, sizeof(ofb_buf1)) != 0) {
579         printf("ofb_encrypt encrypt error\n");
580         printf("%02X %02X %02X %02X %02X %02X %02X %02X\n",
581                ofb_buf1[8 + 0], ofb_buf1[8 + 1], ofb_buf1[8 + 2],
582                ofb_buf1[8 + 3], ofb_buf1[8 + 4], ofb_buf1[8 + 5],
583                ofb_buf1[8 + 6], ofb_buf1[8 + 7]);
584         printf("%02X %02X %02X %02X %02X %02X %02X %02X\n", ofb_buf1[8 + 0],
585                ofb_cipher[8 + 1], ofb_cipher[8 + 2], ofb_cipher[8 + 3],
586                ofb_buf1[8 + 4], ofb_cipher[8 + 5], ofb_cipher[8 + 6],
587                ofb_cipher[8 + 7]);
588         err = 1;
589     }
590     memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
591     DES_ofb_encrypt(ofb_buf1, ofb_buf2, 64, sizeof(ofb_buf1) / 8, &ks,
592                     &ofb_tmp);
593     if (memcmp(plain, ofb_buf2, sizeof(ofb_buf2)) != 0) {
594         printf("ofb_encrypt decrypt error\n");
595         printf("%02X %02X %02X %02X %02X %02X %02X %02X\n",
596                ofb_buf2[8 + 0], ofb_buf2[8 + 1], ofb_buf2[8 + 2],
597                ofb_buf2[8 + 3], ofb_buf2[8 + 4], ofb_buf2[8 + 5],
598                ofb_buf2[8 + 6], ofb_buf2[8 + 7]);
599         printf("%02X %02X %02X %02X %02X %02X %02X %02X\n", plain[8 + 0],
600                plain[8 + 1], plain[8 + 2], plain[8 + 3], plain[8 + 4],
601                plain[8 + 5], plain[8 + 6], plain[8 + 7]);
602         err = 1;
603     }
604
605     printf("Doing ofb64\n");
606     DES_set_key_checked(&ofb_key, &ks);
607     memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
608     memset(ofb_buf1, 0, sizeof(ofb_buf1));
609     memset(ofb_buf2, 0, sizeof(ofb_buf1));
610     num = 0;
611     for (i = 0; i < sizeof(plain); i++) {
612         DES_ofb64_encrypt(&(plain[i]), &(ofb_buf1[i]), 1, &ks, &ofb_tmp, &num);
613     }
614     if (memcmp(ofb_cipher, ofb_buf1, sizeof(ofb_buf1)) != 0) {
615         printf("ofb64_encrypt encrypt error\n");
616         err = 1;
617     }
618     memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
619     num = 0;
620     DES_ofb64_encrypt(ofb_buf1, ofb_buf2, sizeof(ofb_buf1), &ks, &ofb_tmp,
621                       &num);
622     if (memcmp(plain, ofb_buf2, sizeof(ofb_buf2)) != 0) {
623         printf("ofb64_encrypt decrypt error\n");
624         err = 1;
625     }
626
627     printf("Doing ede_ofb64\n");
628     DES_set_key_checked(&ofb_key, &ks);
629     memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
630     memset(ofb_buf1, 0, sizeof(ofb_buf1));
631     memset(ofb_buf2, 0, sizeof(ofb_buf1));
632     num = 0;
633     for (i = 0; i < sizeof(plain); i++) {
634         DES_ede3_ofb64_encrypt(&(plain[i]), &(ofb_buf1[i]), 1, &ks, &ks,
635                                &ks, &ofb_tmp, &num);
636     }
637     if (memcmp(ofb_cipher, ofb_buf1, sizeof(ofb_buf1)) != 0) {
638         printf("ede_ofb64_encrypt encrypt error\n");
639         err = 1;
640     }
641     memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
642     num = 0;
643     DES_ede3_ofb64_encrypt(ofb_buf1, ofb_buf2, sizeof(ofb_buf1), &ks, &ks, &ks,
644                            &ofb_tmp, &num);
645     if (memcmp(plain, ofb_buf2, sizeof(ofb_buf2)) != 0) {
646         printf("ede_ofb64_encrypt decrypt error\n");
647         err = 1;
648     }
649
650     printf("Doing cbc_cksum\n");
651     DES_set_key_checked(&cbc_key, &ks);
652     cs = DES_cbc_cksum(cbc_data, &cret, strlen((char *)cbc_data), &ks,
653                        &cbc_iv);
654     if (cs != cbc_cksum_ret) {
655         printf("bad return value (%08lX), should be %08lX\n",
656                (unsigned long)cs, (unsigned long)cbc_cksum_ret);
657         err = 1;
658     }
659     if (memcmp(cret, cbc_cksum_data, 8) != 0) {
660         printf("bad cbc_cksum block returned\n");
661         err = 1;
662     }
663
664     printf("Doing quad_cksum\n");
665     cs = DES_quad_cksum(cbc_data, (DES_cblock *)lqret,
666                         (long)strlen((char *)cbc_data), 2,
667                         (DES_cblock *)cbc_iv);
668     if (cs != 0x70d7a63aL) {
669         printf("quad_cksum error, ret %08lx should be 70d7a63a\n",
670                (unsigned long)cs);
671         err = 1;
672     }
673     if (lqret[0] != 0x327eba8dL) {
674         printf("quad_cksum error, out[0] %08lx is not %08lx\n",
675                (unsigned long)lqret[0], 0x327eba8dUL);
676         err = 1;
677     }
678     if (lqret[1] != 0x201a49ccL) {
679         printf("quad_cksum error, out[1] %08lx is not %08lx\n",
680                (unsigned long)lqret[1], 0x201a49ccUL);
681         err = 1;
682     }
683     if (lqret[2] != 0x70d7a63aL) {
684         printf("quad_cksum error, out[2] %08lx is not %08lx\n",
685                (unsigned long)lqret[2], 0x70d7a63aUL);
686         err = 1;
687     }
688     if (lqret[3] != 0x501c2c26L) {
689         printf("quad_cksum error, out[3] %08lx is not %08lx\n",
690                (unsigned long)lqret[3], 0x501c2c26UL);
691         err = 1;
692     }
693 # endif
694
695     printf("input word alignment test");
696     for (i = 0; i < 4; i++) {
697         printf(" %d", i);
698         DES_ncbc_encrypt(&(cbc_out[i]), cbc_in,
699                          strlen((char *)cbc_data) + 1, &ks,
700                          &cbc_iv, DES_ENCRYPT);
701     }
702     printf("\noutput word alignment test");
703     for (i = 0; i < 4; i++) {
704         printf(" %d", i);
705         DES_ncbc_encrypt(cbc_out, &(cbc_in[i]),
706                          strlen((char *)cbc_data) + 1, &ks,
707                          &cbc_iv, DES_ENCRYPT);
708     }
709     printf("\n");
710     printf("fast crypt test ");
711     str = crypt("testing", "ef");
712     if (strcmp("efGnQx2725bI2", str) != 0) {
713         printf("fast crypt error, %s should be efGnQx2725bI2\n", str);
714         err = 1;
715     }
716     str = crypt("bca76;23", "yA");
717     if (strcmp("yA1Rp/1hZXIJk", str) != 0) {
718         printf("fast crypt error, %s should be yA1Rp/1hZXIJk\n", str);
719         err = 1;
720     }
721 # ifdef OPENSSL_SYS_NETWARE
722     if (err)
723         printf("ERROR: %d\n", err);
724 # endif
725     printf("\n");
726     return (err);
727 }
728
729 static char *pt(unsigned char *p)
730 {
731     static char bufs[10][20];
732     static int bnum = 0;
733     char *ret;
734     int i;
735     static char *f = "0123456789ABCDEF";
736
737     ret = &(bufs[bnum++][0]);
738     bnum %= 10;
739     for (i = 0; i < 8; i++) {
740         ret[i * 2] = f[(p[i] >> 4) & 0xf];
741         ret[i * 2 + 1] = f[p[i] & 0xf];
742     }
743     ret[16] = '\0';
744     return (ret);
745 }
746
747 # ifndef LIBDES_LIT
748
749 static int cfb_test(int bits, unsigned char *cfb_cipher)
750 {
751     DES_key_schedule ks;
752     int i, err = 0;
753
754     DES_set_key_checked(&cfb_key, &ks);
755     memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
756     DES_cfb_encrypt(plain, cfb_buf1, bits, sizeof(plain), &ks, &cfb_tmp,
757                     DES_ENCRYPT);
758     if (memcmp(cfb_cipher, cfb_buf1, sizeof(plain)) != 0) {
759         err = 1;
760         printf("cfb_encrypt encrypt error\n");
761         for (i = 0; i < 24; i += 8)
762             printf("%s\n", pt(&(cfb_buf1[i])));
763     }
764     memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
765     DES_cfb_encrypt(cfb_buf1, cfb_buf2, bits, sizeof(plain), &ks, &cfb_tmp,
766                     DES_DECRYPT);
767     if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) {
768         err = 1;
769         printf("cfb_encrypt decrypt error\n");
770         for (i = 0; i < 24; i += 8)
771             printf("%s\n", pt(&(cfb_buf1[i])));
772     }
773     return (err);
774 }
775
776 static int cfb64_test(unsigned char *cfb_cipher)
777 {
778     DES_key_schedule ks;
779     int err = 0, i, n;
780
781     DES_set_key_checked(&cfb_key, &ks);
782     memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
783     n = 0;
784     DES_cfb64_encrypt(plain, cfb_buf1, 12, &ks, &cfb_tmp, &n, DES_ENCRYPT);
785     DES_cfb64_encrypt(&(plain[12]), &(cfb_buf1[12]), sizeof(plain) - 12, &ks,
786                       &cfb_tmp, &n, DES_ENCRYPT);
787     if (memcmp(cfb_cipher, cfb_buf1, sizeof(plain)) != 0) {
788         err = 1;
789         printf("cfb_encrypt encrypt error\n");
790         for (i = 0; i < 24; i += 8)
791             printf("%s\n", pt(&(cfb_buf1[i])));
792     }
793     memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
794     n = 0;
795     DES_cfb64_encrypt(cfb_buf1, cfb_buf2, 17, &ks, &cfb_tmp, &n, DES_DECRYPT);
796     DES_cfb64_encrypt(&(cfb_buf1[17]), &(cfb_buf2[17]),
797                       sizeof(plain) - 17, &ks, &cfb_tmp, &n, DES_DECRYPT);
798     if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) {
799         err = 1;
800         printf("cfb_encrypt decrypt error\n");
801         for (i = 0; i < 24; i += 8)
802             printf("%s\n", pt(&(cfb_buf2[i])));
803     }
804     return (err);
805 }
806
807 static int ede_cfb64_test(unsigned char *cfb_cipher)
808 {
809     DES_key_schedule ks;
810     int err = 0, i, n;
811
812     DES_set_key_checked(&cfb_key, &ks);
813     memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
814     n = 0;
815     DES_ede3_cfb64_encrypt(plain, cfb_buf1, 12, &ks, &ks, &ks, &cfb_tmp, &n,
816                            DES_ENCRYPT);
817     DES_ede3_cfb64_encrypt(&(plain[12]), &(cfb_buf1[12]),
818                            sizeof(plain) - 12, &ks, &ks, &ks,
819                            &cfb_tmp, &n, DES_ENCRYPT);
820     if (memcmp(cfb_cipher, cfb_buf1, sizeof(plain)) != 0) {
821         err = 1;
822         printf("ede_cfb_encrypt encrypt error\n");
823         for (i = 0; i < 24; i += 8)
824             printf("%s\n", pt(&(cfb_buf1[i])));
825     }
826     memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
827     n = 0;
828     DES_ede3_cfb64_encrypt(cfb_buf1, cfb_buf2, (long)17, &ks, &ks, &ks,
829                            &cfb_tmp, &n, DES_DECRYPT);
830     DES_ede3_cfb64_encrypt(&(cfb_buf1[17]), &(cfb_buf2[17]),
831                            sizeof(plain) - 17, &ks, &ks, &ks,
832                            &cfb_tmp, &n, DES_DECRYPT);
833     if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) {
834         err = 1;
835         printf("ede_cfb_encrypt decrypt error\n");
836         for (i = 0; i < 24; i += 8)
837             printf("%s\n", pt(&(cfb_buf2[i])));
838     }
839     return (err);
840 }
841
842 # endif
843 #endif