destest.c revision 296465
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
79int 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
92static 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
129static 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
166static 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
203static 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
239static unsigned char cbc_key[8] =
240    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
241static unsigned char cbc2_key[8] =
242    { 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86 };
243static unsigned char cbc3_key[8] =
244    { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
245static 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"; */
252static 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
260static 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."
270static unsigned char cbc2_key[8] =
271    { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 };
272static 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
279static 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
287static 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
294static 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
301static unsigned char cfb_key[8] =
302    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
303static unsigned char cfb_iv[8] =
304    { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
305static unsigned char cfb_buf1[40], cfb_buf2[40], cfb_tmp[8];
306static 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
313static 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
318static 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
323static 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
328static 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
333static 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
338static unsigned char ofb_key[8] =
339    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
340static unsigned char ofb_iv[8] =
341    { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
342static unsigned char ofb_buf1[24], ofb_buf2[24], ofb_tmp[8];
343static 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
350static DES_LONG cbc_cksum_ret = 0xB462FEF7L;
351# else
352static DES_LONG cbc_cksum_ret = 0xF7FE62B4L;
353# endif
354static unsigned char cbc_cksum_data[8] =
355    { 0x1D, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 };
356
357static char *pt(unsigned char *p);
358static int cfb_test(int bits, unsigned char *cfb_cipher);
359static int cfb64_test(unsigned char *cfb_cipher);
360static int ede_cfb64_test(unsigned char *cfb_cipher);
361int 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
815static 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
835static 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
862static 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
893static 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
930