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