155714Skris/* crypto/des/destest.c */
255714Skris/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
355714Skris * All rights reserved.
455714Skris *
555714Skris * This package is an SSL implementation written
655714Skris * by Eric Young (eay@cryptsoft.com).
755714Skris * The implementation was written so as to conform with Netscapes SSL.
8280304Sjkim *
955714Skris * This library is free for commercial and non-commercial use as long as
1055714Skris * the following conditions are aheared to.  The following conditions
1155714Skris * apply to all code found in this distribution, be it the RC4, RSA,
1255714Skris * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
1355714Skris * included with this distribution is covered by the same copyright terms
1455714Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15280304Sjkim *
1655714Skris * Copyright remains Eric Young's, and as such any Copyright notices in
1755714Skris * the code are not to be removed.
1855714Skris * If this package is used in a product, Eric Young should be given attribution
1955714Skris * as the author of the parts of the library used.
2055714Skris * This can be in the form of a textual message at program startup or
2155714Skris * in documentation (online or textual) provided with the package.
22280304Sjkim *
2355714Skris * Redistribution and use in source and binary forms, with or without
2455714Skris * modification, are permitted provided that the following conditions
2555714Skris * are met:
2655714Skris * 1. Redistributions of source code must retain the copyright
2755714Skris *    notice, this list of conditions and the following disclaimer.
2855714Skris * 2. Redistributions in binary form must reproduce the above copyright
2955714Skris *    notice, this list of conditions and the following disclaimer in the
3055714Skris *    documentation and/or other materials provided with the distribution.
3155714Skris * 3. All advertising materials mentioning features or use of this software
3255714Skris *    must display the following acknowledgement:
3355714Skris *    "This product includes cryptographic software written by
3455714Skris *     Eric Young (eay@cryptsoft.com)"
3555714Skris *    The word 'cryptographic' can be left out if the rouines from the library
3655714Skris *    being used are not cryptographic related :-).
37280304Sjkim * 4. If you include any Windows specific code (or a derivative thereof) from
3855714Skris *    the apps directory (application code) you must include an acknowledgement:
3955714Skris *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40280304Sjkim *
4155714Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
4255714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4355714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4455714Skris * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4555714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4755714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4955714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5055714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5155714Skris * SUCH DAMAGE.
52280304Sjkim *
5355714Skris * The licence and distribution terms for any publically available version or
5455714Skris * derivative of this code cannot be changed.  i.e. this code cannot simply be
5555714Skris * copied and put under another distribution licence
5655714Skris * [including the GNU Public Licence.]
5755714Skris */
5855714Skris
59109998Smarkm#include <stdio.h>
60109998Smarkm#include <stdlib.h>
61109998Smarkm
62109998Smarkm#include <openssl/e_os2.h>
63109998Smarkm#if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN16) || defined(OPENSSL_SYS_WINDOWS)
64280304Sjkim# ifndef OPENSSL_SYS_MSDOS
65280304Sjkim#  define OPENSSL_SYS_MSDOS
66280304Sjkim# endif
6755714Skris#endif
6855714Skris
69109998Smarkm#ifndef OPENSSL_SYS_MSDOS
70280304Sjkim# if !defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_VMS_DECC)
71280304Sjkim#  include OPENSSL_UNISTD
72280304Sjkim# endif
7355714Skris#else
74280304Sjkim# include <io.h>
7555714Skris#endif
7655714Skris#include <string.h>
7755714Skris
78109998Smarkm#ifdef OPENSSL_NO_DES
7955714Skrisint main(int argc, char *argv[])
8055714Skris{
8155714Skris    printf("No DES support\n");
82280304Sjkim    return (0);
8355714Skris}
8455714Skris#else
85280304Sjkim# include <openssl/des.h>
8655714Skris
87280304Sjkim# define crypt(c,s) (DES_crypt((c),(s)))
8855714Skris
8955714Skris/* tisk tisk - the test keys don't all have odd parity :-( */
9055714Skris/* test data */
91280304Sjkim# define NUM_TESTS 34
92280304Sjkimstatic unsigned char key_data[NUM_TESTS][8] = {
93280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
94280304Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
95280304Sjkim    {0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
96280304Sjkim    {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
97280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
98280304Sjkim    {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
99280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
100280304Sjkim    {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
101280304Sjkim    {0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57},
102280304Sjkim    {0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E},
103280304Sjkim    {0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86},
104280304Sjkim    {0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E},
105280304Sjkim    {0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6},
106280304Sjkim    {0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE},
107280304Sjkim    {0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6},
108280304Sjkim    {0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE},
109280304Sjkim    {0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16},
110280304Sjkim    {0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F},
111280304Sjkim    {0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46},
112280304Sjkim    {0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E},
113280304Sjkim    {0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76},
114280304Sjkim    {0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07},
115280304Sjkim    {0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F},
116280304Sjkim    {0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7},
117280304Sjkim    {0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF},
118280304Sjkim    {0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6},
119280304Sjkim    {0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF},
120280304Sjkim    {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
121280304Sjkim    {0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E},
122280304Sjkim    {0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE},
123280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
124280304Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
125280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
126280304Sjkim    {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}
127280304Sjkim};
12855714Skris
129280304Sjkimstatic unsigned char plain_data[NUM_TESTS][8] = {
130280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
131280304Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
132280304Sjkim    {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
133280304Sjkim    {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
134280304Sjkim    {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
135280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
136280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
137280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
138280304Sjkim    {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42},
139280304Sjkim    {0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA},
140280304Sjkim    {0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72},
141280304Sjkim    {0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A},
142280304Sjkim    {0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2},
143280304Sjkim    {0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A},
144280304Sjkim    {0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2},
145280304Sjkim    {0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A},
146280304Sjkim    {0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02},
147280304Sjkim    {0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A},
148280304Sjkim    {0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32},
149280304Sjkim    {0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA},
150280304Sjkim    {0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62},
151280304Sjkim    {0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2},
152280304Sjkim    {0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA},
153280304Sjkim    {0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92},
154280304Sjkim    {0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A},
155280304Sjkim    {0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2},
156280304Sjkim    {0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A},
157280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
158280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
159280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
160280304Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
161280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
162280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
163280304Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
164280304Sjkim};
16555714Skris
166280304Sjkimstatic unsigned char cipher_data[NUM_TESTS][8] = {
167280304Sjkim    {0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7},
168280304Sjkim    {0x73, 0x59, 0xB2, 0x16, 0x3E, 0x4E, 0xDC, 0x58},
169280304Sjkim    {0x95, 0x8E, 0x6E, 0x62, 0x7A, 0x05, 0x55, 0x7B},
170280304Sjkim    {0xF4, 0x03, 0x79, 0xAB, 0x9E, 0x0E, 0xC5, 0x33},
171280304Sjkim    {0x17, 0x66, 0x8D, 0xFC, 0x72, 0x92, 0x53, 0x2D},
172280304Sjkim    {0x8A, 0x5A, 0xE1, 0xF8, 0x1A, 0xB8, 0xF2, 0xDD},
173280304Sjkim    {0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7},
174280304Sjkim    {0xED, 0x39, 0xD9, 0x50, 0xFA, 0x74, 0xBC, 0xC4},
175280304Sjkim    {0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B},
176280304Sjkim    {0x7A, 0x38, 0x9D, 0x10, 0x35, 0x4B, 0xD2, 0x71},
177280304Sjkim    {0x86, 0x8E, 0xBB, 0x51, 0xCA, 0xB4, 0x59, 0x9A},
178280304Sjkim    {0x71, 0x78, 0x87, 0x6E, 0x01, 0xF1, 0x9B, 0x2A},
179280304Sjkim    {0xAF, 0x37, 0xFB, 0x42, 0x1F, 0x8C, 0x40, 0x95},
180280304Sjkim    {0x86, 0xA5, 0x60, 0xF1, 0x0E, 0xC6, 0xD8, 0x5B},
181280304Sjkim    {0x0C, 0xD3, 0xDA, 0x02, 0x00, 0x21, 0xDC, 0x09},
182280304Sjkim    {0xEA, 0x67, 0x6B, 0x2C, 0xB7, 0xDB, 0x2B, 0x7A},
183280304Sjkim    {0xDF, 0xD6, 0x4A, 0x81, 0x5C, 0xAF, 0x1A, 0x0F},
184280304Sjkim    {0x5C, 0x51, 0x3C, 0x9C, 0x48, 0x86, 0xC0, 0x88},
185280304Sjkim    {0x0A, 0x2A, 0xEE, 0xAE, 0x3F, 0xF4, 0xAB, 0x77},
186280304Sjkim    {0xEF, 0x1B, 0xF0, 0x3E, 0x5D, 0xFA, 0x57, 0x5A},
187280304Sjkim    {0x88, 0xBF, 0x0D, 0xB6, 0xD7, 0x0D, 0xEE, 0x56},
188280304Sjkim    {0xA1, 0xF9, 0x91, 0x55, 0x41, 0x02, 0x0B, 0x56},
189280304Sjkim    {0x6F, 0xBF, 0x1C, 0xAF, 0xCF, 0xFD, 0x05, 0x56},
190280304Sjkim    {0x2F, 0x22, 0xE4, 0x9B, 0xAB, 0x7C, 0xA1, 0xAC},
191280304Sjkim    {0x5A, 0x6B, 0x61, 0x2C, 0xC2, 0x6C, 0xCE, 0x4A},
192280304Sjkim    {0x5F, 0x4C, 0x03, 0x8E, 0xD1, 0x2B, 0x2E, 0x41},
193280304Sjkim    {0x63, 0xFA, 0xC0, 0xD0, 0x34, 0xD9, 0xF7, 0x93},
194280304Sjkim    {0x61, 0x7B, 0x3A, 0x0C, 0xE8, 0xF0, 0x71, 0x00},
195280304Sjkim    {0xDB, 0x95, 0x86, 0x05, 0xF8, 0xC8, 0xC6, 0x06},
196280304Sjkim    {0xED, 0xBF, 0xD1, 0xC6, 0x6C, 0x29, 0xCC, 0xC7},
197280304Sjkim    {0x35, 0x55, 0x50, 0xB2, 0x15, 0x0E, 0x24, 0x51},
198280304Sjkim    {0xCA, 0xAA, 0xAF, 0x4D, 0xEA, 0xF1, 0xDB, 0xAE},
199280304Sjkim    {0xD5, 0xD4, 0x4F, 0xF7, 0x20, 0x68, 0x3D, 0x0D},
200280304Sjkim    {0x2A, 0x2B, 0xB0, 0x08, 0xDF, 0x97, 0xC2, 0xF2}
201280304Sjkim};
20255714Skris
203280304Sjkimstatic unsigned char cipher_ecb2[NUM_TESTS - 1][8] = {
204280304Sjkim    {0x92, 0x95, 0xB5, 0x9B, 0xB3, 0x84, 0x73, 0x6E},
205280304Sjkim    {0x19, 0x9E, 0x9D, 0x6D, 0xF3, 0x9A, 0xA8, 0x16},
206280304Sjkim    {0x2A, 0x4B, 0x4D, 0x24, 0x52, 0x43, 0x84, 0x27},
207280304Sjkim    {0x35, 0x84, 0x3C, 0x01, 0x9D, 0x18, 0xC5, 0xB6},
208280304Sjkim    {0x4A, 0x5B, 0x2F, 0x42, 0xAA, 0x77, 0x19, 0x25},
209280304Sjkim    {0xA0, 0x6B, 0xA9, 0xB8, 0xCA, 0x5B, 0x17, 0x8A},
210280304Sjkim    {0xAB, 0x9D, 0xB7, 0xFB, 0xED, 0x95, 0xF2, 0x74},
211280304Sjkim    {0x3D, 0x25, 0x6C, 0x23, 0xA7, 0x25, 0x2F, 0xD6},
212280304Sjkim    {0xB7, 0x6F, 0xAB, 0x4F, 0xBD, 0xBD, 0xB7, 0x67},
213280304Sjkim    {0x8F, 0x68, 0x27, 0xD6, 0x9C, 0xF4, 0x1A, 0x10},
214280304Sjkim    {0x82, 0x57, 0xA1, 0xD6, 0x50, 0x5E, 0x81, 0x85},
215280304Sjkim    {0xA2, 0x0F, 0x0A, 0xCD, 0x80, 0x89, 0x7D, 0xFA},
216280304Sjkim    {0xCD, 0x2A, 0x53, 0x3A, 0xDB, 0x0D, 0x7E, 0xF3},
217280304Sjkim    {0xD2, 0xC2, 0xBE, 0x27, 0xE8, 0x1B, 0x68, 0xE3},
218280304Sjkim    {0xE9, 0x24, 0xCF, 0x4F, 0x89, 0x3C, 0x5B, 0x0A},
219280304Sjkim    {0xA7, 0x18, 0xC3, 0x9F, 0xFA, 0x9F, 0xD7, 0x69},
220280304Sjkim    {0x77, 0x2C, 0x79, 0xB1, 0xD2, 0x31, 0x7E, 0xB1},
221280304Sjkim    {0x49, 0xAB, 0x92, 0x7F, 0xD0, 0x22, 0x00, 0xB7},
222280304Sjkim    {0xCE, 0x1C, 0x6C, 0x7D, 0x85, 0xE3, 0x4A, 0x6F},
223280304Sjkim    {0xBE, 0x91, 0xD6, 0xE1, 0x27, 0xB2, 0xE9, 0x87},
224280304Sjkim    {0x70, 0x28, 0xAE, 0x8F, 0xD1, 0xF5, 0x74, 0x1A},
225280304Sjkim    {0xAA, 0x37, 0x80, 0xBB, 0xF3, 0x22, 0x1D, 0xDE},
226280304Sjkim    {0xA6, 0xC4, 0xD2, 0x5E, 0x28, 0x93, 0xAC, 0xB3},
227280304Sjkim    {0x22, 0x07, 0x81, 0x5A, 0xE4, 0xB7, 0x1A, 0xAD},
228280304Sjkim    {0xDC, 0xCE, 0x05, 0xE7, 0x07, 0xBD, 0xF5, 0x84},
229280304Sjkim    {0x26, 0x1D, 0x39, 0x2C, 0xB3, 0xBA, 0xA5, 0x85},
230280304Sjkim    {0xB4, 0xF7, 0x0F, 0x72, 0xFB, 0x04, 0xF0, 0xDC},
231280304Sjkim    {0x95, 0xBA, 0xA9, 0x4E, 0x87, 0x36, 0xF2, 0x89},
232280304Sjkim    {0xD4, 0x07, 0x3A, 0xF1, 0x5A, 0x17, 0x82, 0x0E},
233280304Sjkim    {0xEF, 0x6F, 0xAF, 0xA7, 0x66, 0x1A, 0x7E, 0x89},
234280304Sjkim    {0xC1, 0x97, 0xF5, 0x58, 0x74, 0x8A, 0x20, 0xE7},
235280304Sjkim    {0x43, 0x34, 0xCF, 0xDA, 0x22, 0xC4, 0x86, 0xC8},
236280304Sjkim    {0x08, 0xD7, 0xB4, 0xFB, 0x62, 0x9D, 0x08, 0x85}
237280304Sjkim};
23855714Skris
239280304Sjkimstatic unsigned char cbc_key[8] =
240280304Sjkim    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
241280304Sjkimstatic unsigned char cbc2_key[8] =
242280304Sjkim    { 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86 };
243280304Sjkimstatic unsigned char cbc3_key[8] =
244280304Sjkim    { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
245280304Sjkimstatic unsigned char cbc_iv[8] =
246280304Sjkim    { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
247280304Sjkim/*
248280304Sjkim * Changed the following text constant to binary so it will work on ebcdic
249280304Sjkim * machines :-)
250280304Sjkim */
25155714Skris/* static char cbc_data[40]="7654321 Now is the time for \0001"; */
252280304Sjkimstatic unsigned char cbc_data[40] = {
253280304Sjkim    0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
254280304Sjkim    0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
255280304Sjkim    0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
256280304Sjkim    0x66, 0x6F, 0x72, 0x20, 0x00, 0x31, 0x00, 0x00,
257280304Sjkim    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258280304Sjkim};
25955714Skris
260280304Sjkimstatic unsigned char cbc_ok[32] = {
261280304Sjkim    0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
262280304Sjkim    0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb,
263280304Sjkim    0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68,
264280304Sjkim    0x1d, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4
265280304Sjkim};
26655714Skris
267280304Sjkim# ifdef SCREW_THE_PARITY
268280304Sjkim#  error "SCREW_THE_PARITY is not ment to be defined."
269280304Sjkim#  error "Original vectors are preserved for reference only."
270280304Sjkimstatic unsigned char cbc2_key[8] =
271280304Sjkim    { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 };
272280304Sjkimstatic unsigned char xcbc_ok[32] = {
273280304Sjkim    0x86, 0x74, 0x81, 0x0D, 0x61, 0xA4, 0xA5, 0x48,
274280304Sjkim    0xB9, 0x93, 0x03, 0xE1, 0xB8, 0xBB, 0xBD, 0xBD,
275280304Sjkim    0x64, 0x30, 0x0B, 0xB9, 0x06, 0x65, 0x81, 0x76,
276280304Sjkim    0x04, 0x1D, 0x77, 0x62, 0x17, 0xCA, 0x2B, 0xD2,
277280304Sjkim};
278280304Sjkim# else
279280304Sjkimstatic unsigned char xcbc_ok[32] = {
280280304Sjkim    0x84, 0x6B, 0x29, 0x14, 0x85, 0x1E, 0x9A, 0x29,
281280304Sjkim    0x54, 0x73, 0x2F, 0x8A, 0xA0, 0xA6, 0x11, 0xC1,
282280304Sjkim    0x15, 0xCD, 0xC2, 0xD7, 0x95, 0x1B, 0x10, 0x53,
283280304Sjkim    0xA6, 0x3C, 0x5E, 0x03, 0xB2, 0x1A, 0xA3, 0xC4,
284280304Sjkim};
285280304Sjkim# endif
28655714Skris
287280304Sjkimstatic unsigned char cbc3_ok[32] = {
288280304Sjkim    0x3F, 0xE3, 0x01, 0xC9, 0x62, 0xAC, 0x01, 0xD0,
289280304Sjkim    0x22, 0x13, 0x76, 0x3C, 0x1C, 0xBD, 0x4C, 0xDC,
290280304Sjkim    0x79, 0x96, 0x57, 0xC0, 0x64, 0xEC, 0xF5, 0xD4,
291280304Sjkim    0x1C, 0x67, 0x38, 0x12, 0xCF, 0xDE, 0x96, 0x75
292280304Sjkim};
29355714Skris
294280304Sjkimstatic unsigned char pcbc_ok[32] = {
295280304Sjkim    0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
296280304Sjkim    0x6d, 0xec, 0xb4, 0x70, 0xa0, 0xe5, 0x6b, 0x15,
297280304Sjkim    0xae, 0xa6, 0xbf, 0x61, 0xed, 0x7d, 0x9c, 0x9f,
298280304Sjkim    0xf7, 0x17, 0x46, 0x3b, 0x8a, 0xb3, 0xcc, 0x88
299280304Sjkim};
30055714Skris
301280304Sjkimstatic unsigned char cfb_key[8] =
302280304Sjkim    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
303280304Sjkimstatic unsigned char cfb_iv[8] =
304280304Sjkim    { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
305280304Sjkimstatic unsigned char cfb_buf1[40], cfb_buf2[40], cfb_tmp[8];
306280304Sjkimstatic unsigned char plain[24] = {
307280304Sjkim    0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73,
308280304Sjkim    0x20, 0x74, 0x68, 0x65, 0x20, 0x74,
309280304Sjkim    0x69, 0x6d, 0x65, 0x20, 0x66, 0x6f,
310280304Sjkim    0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20
311280304Sjkim};
31255714Skris
313280304Sjkimstatic unsigned char cfb_cipher8[24] = {
314280304Sjkim    0xf3, 0x1f, 0xda, 0x07, 0x01, 0x14, 0x62, 0xee, 0x18, 0x7f, 0x43, 0xd8,
315280304Sjkim    0x0a, 0x7c, 0xd9, 0xb5, 0xb0, 0xd2, 0x90, 0xda, 0x6e, 0x5b, 0x9a, 0x87
316280304Sjkim};
31755714Skris
318280304Sjkimstatic unsigned char cfb_cipher16[24] = {
319280304Sjkim    0xF3, 0x09, 0x87, 0x87, 0x7F, 0x57, 0xF7, 0x3C, 0x36, 0xB6, 0xDB, 0x70,
320280304Sjkim    0xD8, 0xD5, 0x34, 0x19, 0xD3, 0x86, 0xB2, 0x23, 0xB7, 0xB2, 0xAD, 0x1B
321280304Sjkim};
32255714Skris
323280304Sjkimstatic unsigned char cfb_cipher32[24] = {
324280304Sjkim    0xF3, 0x09, 0x62, 0x49, 0xA4, 0xDF, 0xA4, 0x9F, 0x33, 0xDC, 0x7B, 0xAD,
325280304Sjkim    0x4C, 0xC8, 0x9F, 0x64, 0xE4, 0x53, 0xE5, 0xEC, 0x67, 0x20, 0xDA, 0xB6
326280304Sjkim};
327280304Sjkim
328280304Sjkimstatic unsigned char cfb_cipher48[24] = {
329280304Sjkim    0xF3, 0x09, 0x62, 0x49, 0xC7, 0xF4, 0x30, 0xB5, 0x15, 0xEC, 0xBB, 0x85,
330280304Sjkim    0x97, 0x5A, 0x13, 0x8C, 0x68, 0x60, 0xE2, 0x38, 0x34, 0x3C, 0xDC, 0x1F
331280304Sjkim};
332280304Sjkim
333280304Sjkimstatic unsigned char cfb_cipher64[24] = {
334280304Sjkim    0xF3, 0x09, 0x62, 0x49, 0xC7, 0xF4, 0x6E, 0x51, 0xA6, 0x9E, 0x83, 0x9B,
335280304Sjkim    0x1A, 0x92, 0xF7, 0x84, 0x03, 0x46, 0x71, 0x33, 0x89, 0x8E, 0xA6, 0x22
336280304Sjkim};
337280304Sjkim
338280304Sjkimstatic unsigned char ofb_key[8] =
339280304Sjkim    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
340280304Sjkimstatic unsigned char ofb_iv[8] =
341280304Sjkim    { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
342280304Sjkimstatic unsigned char ofb_buf1[24], ofb_buf2[24], ofb_tmp[8];
343280304Sjkimstatic unsigned char ofb_cipher[24] = {
344280304Sjkim    0xf3, 0x09, 0x62, 0x49, 0xc7, 0xf4, 0x6e, 0x51,
345280304Sjkim    0x35, 0xf2, 0x4a, 0x24, 0x2e, 0xeb, 0x3d, 0x3f,
346280304Sjkim    0x3d, 0x6d, 0x5b, 0xe3, 0x25, 0x5a, 0xf8, 0xc3
347280304Sjkim};
348280304Sjkim
349280304Sjkim# if 0
350280304Sjkimstatic DES_LONG cbc_cksum_ret = 0xB462FEF7L;
351280304Sjkim# else
352280304Sjkimstatic DES_LONG cbc_cksum_ret = 0xF7FE62B4L;
353280304Sjkim# endif
354280304Sjkimstatic unsigned char cbc_cksum_data[8] =
355280304Sjkim    { 0x1D, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 };
356280304Sjkim
35755714Skrisstatic char *pt(unsigned char *p);
35855714Skrisstatic int cfb_test(int bits, unsigned char *cfb_cipher);
35955714Skrisstatic int cfb64_test(unsigned char *cfb_cipher);
36055714Skrisstatic int ede_cfb64_test(unsigned char *cfb_cipher);
36155714Skrisint main(int argc, char *argv[])
362280304Sjkim{
363280304Sjkim    int j, err = 0;
364280304Sjkim    unsigned int i;
365280304Sjkim    des_cblock in, out, outin, iv3, iv2;
366280304Sjkim    des_key_schedule ks, ks2, ks3;
367280304Sjkim    unsigned char cbc_in[40];
368280304Sjkim    unsigned char cbc_out[40];
369280304Sjkim    DES_LONG cs;
370280304Sjkim    unsigned char cret[8];
371280304Sjkim# ifdef _CRAY
372280304Sjkim    struct {
373280304Sjkim        int a:32;
374280304Sjkim        int b:32;
375280304Sjkim    } lqret[2];
376280304Sjkim# else
377280304Sjkim    DES_LONG lqret[4];
378280304Sjkim# endif
379280304Sjkim    int num;
380280304Sjkim    char *str;
38155714Skris
382280304Sjkim# ifndef OPENSSL_NO_DESCBCM
383280304Sjkim    printf("Doing cbcm\n");
384280304Sjkim    if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
385280304Sjkim        printf("Key error %d\n", j);
386280304Sjkim        err = 1;
387280304Sjkim    }
388280304Sjkim    if ((j = DES_set_key_checked(&cbc2_key, &ks2)) != 0) {
389280304Sjkim        printf("Key error %d\n", j);
390280304Sjkim        err = 1;
391280304Sjkim    }
392280304Sjkim    if ((j = DES_set_key_checked(&cbc3_key, &ks3)) != 0) {
393280304Sjkim        printf("Key error %d\n", j);
394280304Sjkim        err = 1;
395280304Sjkim    }
396280304Sjkim    memset(cbc_out, 0, 40);
397280304Sjkim    memset(cbc_in, 0, 40);
398280304Sjkim    i = strlen((char *)cbc_data) + 1;
399280304Sjkim    /* i=((i+7)/8)*8; */
400280304Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
401280304Sjkim    memset(iv2, '\0', sizeof iv2);
40255714Skris
403280304Sjkim    DES_ede3_cbcm_encrypt(cbc_data, cbc_out, 16L, &ks, &ks2, &ks3, &iv3, &iv2,
404280304Sjkim                          DES_ENCRYPT);
405280304Sjkim    DES_ede3_cbcm_encrypt(&cbc_data[16], &cbc_out[16], i - 16, &ks, &ks2,
406280304Sjkim                          &ks3, &iv3, &iv2, DES_ENCRYPT);
407280304Sjkim/*- if (memcmp(cbc_out,cbc3_ok,
408280304Sjkim        (unsigned int)(strlen((char *)cbc_data)+1+7)/8*8) != 0)
409280304Sjkim        {
410280304Sjkim        printf("des_ede3_cbc_encrypt encrypt error\n");
411280304Sjkim        err=1;
412280304Sjkim        }
413280304Sjkim*/
414280304Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
415280304Sjkim    memset(iv2, '\0', sizeof iv2);
416280304Sjkim    DES_ede3_cbcm_encrypt(cbc_out, cbc_in, i, &ks, &ks2, &ks3, &iv3, &iv2,
417280304Sjkim                          DES_DECRYPT);
418280304Sjkim    if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) {
419280304Sjkim        unsigned int n;
42055714Skris
421280304Sjkim        printf("des_ede3_cbcm_encrypt decrypt error\n");
422280304Sjkim        for (n = 0; n < i; ++n)
423280304Sjkim            printf(" %02x", cbc_data[n]);
424280304Sjkim        printf("\n");
425280304Sjkim        for (n = 0; n < i; ++n)
426280304Sjkim            printf(" %02x", cbc_in[n]);
427280304Sjkim        printf("\n");
428280304Sjkim        err = 1;
429280304Sjkim    }
430280304Sjkim# endif
43155714Skris
432280304Sjkim    printf("Doing ecb\n");
433280304Sjkim    for (i = 0; i < NUM_TESTS; i++) {
434280304Sjkim        DES_set_key_unchecked(&key_data[i], &ks);
435280304Sjkim        memcpy(in, plain_data[i], 8);
436280304Sjkim        memset(out, 0, 8);
437280304Sjkim        memset(outin, 0, 8);
438280304Sjkim        des_ecb_encrypt(&in, &out, ks, DES_ENCRYPT);
439280304Sjkim        des_ecb_encrypt(&out, &outin, ks, DES_DECRYPT);
44055714Skris
441280304Sjkim        if (memcmp(out, cipher_data[i], 8) != 0) {
442280304Sjkim            printf("Encryption error %2d\nk=%s p=%s o=%s act=%s\n",
443280304Sjkim                   i + 1, pt(key_data[i]), pt(in), pt(cipher_data[i]),
444280304Sjkim                   pt(out));
445280304Sjkim            err = 1;
446280304Sjkim        }
447280304Sjkim        if (memcmp(in, outin, 8) != 0) {
448280304Sjkim            printf("Decryption error %2d\nk=%s p=%s o=%s act=%s\n",
449280304Sjkim                   i + 1, pt(key_data[i]), pt(out), pt(in), pt(outin));
450280304Sjkim            err = 1;
451280304Sjkim        }
452280304Sjkim    }
45355714Skris
454280304Sjkim# ifndef LIBDES_LIT
455280304Sjkim    printf("Doing ede ecb\n");
456280304Sjkim    for (i = 0; i < (NUM_TESTS - 2); i++) {
457280304Sjkim        DES_set_key_unchecked(&key_data[i], &ks);
458280304Sjkim        DES_set_key_unchecked(&key_data[i + 1], &ks2);
459280304Sjkim        DES_set_key_unchecked(&key_data[i + 2], &ks3);
460280304Sjkim        memcpy(in, plain_data[i], 8);
461280304Sjkim        memset(out, 0, 8);
462280304Sjkim        memset(outin, 0, 8);
463280304Sjkim        des_ecb2_encrypt(&in, &out, ks, ks2, DES_ENCRYPT);
464280304Sjkim        des_ecb2_encrypt(&out, &outin, ks, ks2, DES_DECRYPT);
46555714Skris
466280304Sjkim        if (memcmp(out, cipher_ecb2[i], 8) != 0) {
467280304Sjkim            printf("Encryption error %2d\nk=%s p=%s o=%s act=%s\n",
468280304Sjkim                   i + 1, pt(key_data[i]), pt(in), pt(cipher_ecb2[i]),
469280304Sjkim                   pt(out));
470280304Sjkim            err = 1;
471280304Sjkim        }
472280304Sjkim        if (memcmp(in, outin, 8) != 0) {
473280304Sjkim            printf("Decryption error %2d\nk=%s p=%s o=%s act=%s\n",
474280304Sjkim                   i + 1, pt(key_data[i]), pt(out), pt(in), pt(outin));
475280304Sjkim            err = 1;
476280304Sjkim        }
477280304Sjkim    }
478280304Sjkim# endif
47955714Skris
480280304Sjkim    printf("Doing cbc\n");
481280304Sjkim    if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
482280304Sjkim        printf("Key error %d\n", j);
483280304Sjkim        err = 1;
484280304Sjkim    }
485280304Sjkim    memset(cbc_out, 0, 40);
486280304Sjkim    memset(cbc_in, 0, 40);
487280304Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
488280304Sjkim    des_ncbc_encrypt(cbc_data, cbc_out, strlen((char *)cbc_data) + 1, ks,
489280304Sjkim                     &iv3, DES_ENCRYPT);
490280304Sjkim    if (memcmp(cbc_out, cbc_ok, 32) != 0) {
491280304Sjkim        printf("cbc_encrypt encrypt error\n");
492280304Sjkim        err = 1;
493280304Sjkim    }
49455714Skris
495280304Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
496280304Sjkim    des_ncbc_encrypt(cbc_out, cbc_in, strlen((char *)cbc_data) + 1, ks,
497280304Sjkim                     &iv3, DES_DECRYPT);
498280304Sjkim    if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data)) != 0) {
499280304Sjkim        printf("cbc_encrypt decrypt error\n");
500280304Sjkim        err = 1;
501280304Sjkim    }
502280304Sjkim# ifndef LIBDES_LIT
503280304Sjkim    printf("Doing desx cbc\n");
504280304Sjkim    if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
505280304Sjkim        printf("Key error %d\n", j);
506280304Sjkim        err = 1;
507280304Sjkim    }
508280304Sjkim    memset(cbc_out, 0, 40);
509280304Sjkim    memset(cbc_in, 0, 40);
510280304Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
511280304Sjkim    des_xcbc_encrypt(cbc_data, cbc_out, strlen((char *)cbc_data) + 1, ks,
512280304Sjkim                     &iv3, &cbc2_key, &cbc3_key, DES_ENCRYPT);
513280304Sjkim    if (memcmp(cbc_out, xcbc_ok, 32) != 0) {
514280304Sjkim        printf("des_xcbc_encrypt encrypt error\n");
515280304Sjkim        err = 1;
516280304Sjkim    }
517280304Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
518280304Sjkim    des_xcbc_encrypt(cbc_out, cbc_in, strlen((char *)cbc_data) + 1, ks,
519280304Sjkim                     &iv3, &cbc2_key, &cbc3_key, DES_DECRYPT);
520280304Sjkim    if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) {
521280304Sjkim        printf("des_xcbc_encrypt decrypt error\n");
522280304Sjkim        err = 1;
523280304Sjkim    }
524280304Sjkim# endif
52555714Skris
526280304Sjkim    printf("Doing ede cbc\n");
527280304Sjkim    if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
528280304Sjkim        printf("Key error %d\n", j);
529280304Sjkim        err = 1;
530280304Sjkim    }
531280304Sjkim    if ((j = DES_set_key_checked(&cbc2_key, &ks2)) != 0) {
532280304Sjkim        printf("Key error %d\n", j);
533280304Sjkim        err = 1;
534280304Sjkim    }
535280304Sjkim    if ((j = DES_set_key_checked(&cbc3_key, &ks3)) != 0) {
536280304Sjkim        printf("Key error %d\n", j);
537280304Sjkim        err = 1;
538280304Sjkim    }
539280304Sjkim    memset(cbc_out, 0, 40);
540280304Sjkim    memset(cbc_in, 0, 40);
541280304Sjkim    i = strlen((char *)cbc_data) + 1;
542280304Sjkim    /* i=((i+7)/8)*8; */
543280304Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
54455714Skris
545280304Sjkim    des_ede3_cbc_encrypt(cbc_data, cbc_out, 16L, ks, ks2, ks3, &iv3,
546280304Sjkim                         DES_ENCRYPT);
547280304Sjkim    des_ede3_cbc_encrypt(&(cbc_data[16]), &(cbc_out[16]), i - 16, ks, ks2,
548280304Sjkim                         ks3, &iv3, DES_ENCRYPT);
549280304Sjkim    if (memcmp
550280304Sjkim        (cbc_out, cbc3_ok,
551280304Sjkim         (unsigned int)(strlen((char *)cbc_data) + 1 + 7) / 8 * 8) != 0) {
552280304Sjkim        unsigned int n;
55355714Skris
554280304Sjkim        printf("des_ede3_cbc_encrypt encrypt error\n");
555280304Sjkim        for (n = 0; n < i; ++n)
556280304Sjkim            printf(" %02x", cbc_out[n]);
557280304Sjkim        printf("\n");
558280304Sjkim        for (n = 0; n < i; ++n)
559280304Sjkim            printf(" %02x", cbc3_ok[n]);
560280304Sjkim        printf("\n");
561280304Sjkim        err = 1;
562280304Sjkim    }
563109998Smarkm
564280304Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
565280304Sjkim    des_ede3_cbc_encrypt(cbc_out, cbc_in, i, ks, ks2, ks3, &iv3, DES_DECRYPT);
566280304Sjkim    if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) {
567280304Sjkim        unsigned int n;
56855714Skris
569280304Sjkim        printf("des_ede3_cbc_encrypt decrypt error\n");
570280304Sjkim        for (n = 0; n < i; ++n)
571280304Sjkim            printf(" %02x", cbc_data[n]);
572280304Sjkim        printf("\n");
573280304Sjkim        for (n = 0; n < i; ++n)
574280304Sjkim            printf(" %02x", cbc_in[n]);
575280304Sjkim        printf("\n");
576280304Sjkim        err = 1;
577280304Sjkim    }
578280304Sjkim# ifndef LIBDES_LIT
579280304Sjkim    printf("Doing pcbc\n");
580280304Sjkim    if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
581280304Sjkim        printf("Key error %d\n", j);
582280304Sjkim        err = 1;
583280304Sjkim    }
584280304Sjkim    memset(cbc_out, 0, 40);
585280304Sjkim    memset(cbc_in, 0, 40);
586280304Sjkim    des_pcbc_encrypt(cbc_data, cbc_out, strlen((char *)cbc_data) + 1, ks,
587280304Sjkim                     &cbc_iv, DES_ENCRYPT);
588280304Sjkim    if (memcmp(cbc_out, pcbc_ok, 32) != 0) {
589280304Sjkim        printf("pcbc_encrypt encrypt error\n");
590280304Sjkim        err = 1;
591280304Sjkim    }
592280304Sjkim    des_pcbc_encrypt(cbc_out, cbc_in, strlen((char *)cbc_data) + 1, ks,
593280304Sjkim                     &cbc_iv, DES_DECRYPT);
594280304Sjkim    if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) {
595280304Sjkim        printf("pcbc_encrypt decrypt error\n");
596280304Sjkim        err = 1;
597280304Sjkim    }
598109998Smarkm
599280304Sjkim    printf("Doing ");
600280304Sjkim    printf("cfb8 ");
601280304Sjkim    err += cfb_test(8, cfb_cipher8);
602280304Sjkim    printf("cfb16 ");
603280304Sjkim    err += cfb_test(16, cfb_cipher16);
604280304Sjkim    printf("cfb32 ");
605280304Sjkim    err += cfb_test(32, cfb_cipher32);
606280304Sjkim    printf("cfb48 ");
607280304Sjkim    err += cfb_test(48, cfb_cipher48);
608280304Sjkim    printf("cfb64 ");
609280304Sjkim    err += cfb_test(64, cfb_cipher64);
61055714Skris
611280304Sjkim    printf("cfb64() ");
612280304Sjkim    err += cfb64_test(cfb_cipher64);
61355714Skris
614280304Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
615280304Sjkim    for (i = 0; i < sizeof(plain); i++)
616280304Sjkim        des_cfb_encrypt(&(plain[i]), &(cfb_buf1[i]),
617280304Sjkim                        8, 1, ks, &cfb_tmp, DES_ENCRYPT);
618280304Sjkim    if (memcmp(cfb_cipher8, cfb_buf1, sizeof(plain)) != 0) {
619280304Sjkim        printf("cfb_encrypt small encrypt error\n");
620280304Sjkim        err = 1;
621280304Sjkim    }
62255714Skris
623280304Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
624280304Sjkim    for (i = 0; i < sizeof(plain); i++)
625280304Sjkim        des_cfb_encrypt(&(cfb_buf1[i]), &(cfb_buf2[i]),
626280304Sjkim                        8, 1, ks, &cfb_tmp, DES_DECRYPT);
627280304Sjkim    if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) {
628280304Sjkim        printf("cfb_encrypt small decrypt error\n");
629280304Sjkim        err = 1;
630280304Sjkim    }
63155714Skris
632280304Sjkim    printf("ede_cfb64() ");
633280304Sjkim    err += ede_cfb64_test(cfb_cipher64);
63455714Skris
635280304Sjkim    printf("done\n");
63655714Skris
637280304Sjkim    printf("Doing ofb\n");
638280304Sjkim    DES_set_key_checked(&ofb_key, &ks);
639280304Sjkim    memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
640280304Sjkim    des_ofb_encrypt(plain, ofb_buf1, 64, sizeof(plain) / 8, ks, &ofb_tmp);
641280304Sjkim    if (memcmp(ofb_cipher, ofb_buf1, sizeof(ofb_buf1)) != 0) {
642280304Sjkim        printf("ofb_encrypt encrypt error\n");
643280304Sjkim        printf("%02X %02X %02X %02X %02X %02X %02X %02X\n",
644280304Sjkim               ofb_buf1[8 + 0], ofb_buf1[8 + 1], ofb_buf1[8 + 2],
645280304Sjkim               ofb_buf1[8 + 3], ofb_buf1[8 + 4], ofb_buf1[8 + 5],
646280304Sjkim               ofb_buf1[8 + 6], ofb_buf1[8 + 7]);
647280304Sjkim        printf("%02X %02X %02X %02X %02X %02X %02X %02X\n", ofb_buf1[8 + 0],
648280304Sjkim               ofb_cipher[8 + 1], ofb_cipher[8 + 2], ofb_cipher[8 + 3],
649280304Sjkim               ofb_buf1[8 + 4], ofb_cipher[8 + 5], ofb_cipher[8 + 6],
650280304Sjkim               ofb_cipher[8 + 7]);
651280304Sjkim        err = 1;
652280304Sjkim    }
653280304Sjkim    memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
654280304Sjkim    des_ofb_encrypt(ofb_buf1, ofb_buf2, 64, sizeof(ofb_buf1) / 8, ks,
655280304Sjkim                    &ofb_tmp);
656280304Sjkim    if (memcmp(plain, ofb_buf2, sizeof(ofb_buf2)) != 0) {
657280304Sjkim        printf("ofb_encrypt decrypt error\n");
658280304Sjkim        printf("%02X %02X %02X %02X %02X %02X %02X %02X\n",
659280304Sjkim               ofb_buf2[8 + 0], ofb_buf2[8 + 1], ofb_buf2[8 + 2],
660280304Sjkim               ofb_buf2[8 + 3], ofb_buf2[8 + 4], ofb_buf2[8 + 5],
661280304Sjkim               ofb_buf2[8 + 6], ofb_buf2[8 + 7]);
662280304Sjkim        printf("%02X %02X %02X %02X %02X %02X %02X %02X\n", plain[8 + 0],
663280304Sjkim               plain[8 + 1], plain[8 + 2], plain[8 + 3], plain[8 + 4],
664280304Sjkim               plain[8 + 5], plain[8 + 6], plain[8 + 7]);
665280304Sjkim        err = 1;
666280304Sjkim    }
66755714Skris
668280304Sjkim    printf("Doing ofb64\n");
669280304Sjkim    DES_set_key_checked(&ofb_key, &ks);
670280304Sjkim    memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
671280304Sjkim    memset(ofb_buf1, 0, sizeof(ofb_buf1));
672280304Sjkim    memset(ofb_buf2, 0, sizeof(ofb_buf1));
673280304Sjkim    num = 0;
674280304Sjkim    for (i = 0; i < sizeof(plain); i++) {
675280304Sjkim        des_ofb64_encrypt(&(plain[i]), &(ofb_buf1[i]), 1, ks, &ofb_tmp, &num);
676280304Sjkim    }
677280304Sjkim    if (memcmp(ofb_cipher, ofb_buf1, sizeof(ofb_buf1)) != 0) {
678280304Sjkim        printf("ofb64_encrypt encrypt error\n");
679280304Sjkim        err = 1;
680280304Sjkim    }
681280304Sjkim    memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
682280304Sjkim    num = 0;
683280304Sjkim    des_ofb64_encrypt(ofb_buf1, ofb_buf2, sizeof(ofb_buf1), ks, &ofb_tmp,
684280304Sjkim                      &num);
685280304Sjkim    if (memcmp(plain, ofb_buf2, sizeof(ofb_buf2)) != 0) {
686280304Sjkim        printf("ofb64_encrypt decrypt error\n");
687280304Sjkim        err = 1;
688280304Sjkim    }
68955714Skris
690280304Sjkim    printf("Doing ede_ofb64\n");
691280304Sjkim    DES_set_key_checked(&ofb_key, &ks);
692280304Sjkim    memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
693280304Sjkim    memset(ofb_buf1, 0, sizeof(ofb_buf1));
694280304Sjkim    memset(ofb_buf2, 0, sizeof(ofb_buf1));
695280304Sjkim    num = 0;
696280304Sjkim    for (i = 0; i < sizeof(plain); i++) {
697280304Sjkim        des_ede3_ofb64_encrypt(&(plain[i]), &(ofb_buf1[i]), 1, ks, ks,
698280304Sjkim                               ks, &ofb_tmp, &num);
699280304Sjkim    }
700280304Sjkim    if (memcmp(ofb_cipher, ofb_buf1, sizeof(ofb_buf1)) != 0) {
701280304Sjkim        printf("ede_ofb64_encrypt encrypt error\n");
702280304Sjkim        err = 1;
703280304Sjkim    }
704280304Sjkim    memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
705280304Sjkim    num = 0;
706280304Sjkim    des_ede3_ofb64_encrypt(ofb_buf1, ofb_buf2, sizeof(ofb_buf1), ks, ks, ks,
707280304Sjkim                           &ofb_tmp, &num);
708280304Sjkim    if (memcmp(plain, ofb_buf2, sizeof(ofb_buf2)) != 0) {
709280304Sjkim        printf("ede_ofb64_encrypt decrypt error\n");
710280304Sjkim        err = 1;
711280304Sjkim    }
71255714Skris
713280304Sjkim    printf("Doing cbc_cksum\n");
714280304Sjkim    DES_set_key_checked(&cbc_key, &ks);
715280304Sjkim    cs = des_cbc_cksum(cbc_data, &cret, strlen((char *)cbc_data), ks,
716280304Sjkim                       &cbc_iv);
717280304Sjkim    if (cs != cbc_cksum_ret) {
718280304Sjkim        printf("bad return value (%08lX), should be %08lX\n",
719280304Sjkim               (unsigned long)cs, (unsigned long)cbc_cksum_ret);
720280304Sjkim        err = 1;
721280304Sjkim    }
722280304Sjkim    if (memcmp(cret, cbc_cksum_data, 8) != 0) {
723280304Sjkim        printf("bad cbc_cksum block returned\n");
724280304Sjkim        err = 1;
725280304Sjkim    }
72655714Skris
727280304Sjkim    printf("Doing quad_cksum\n");
728280304Sjkim    cs = des_quad_cksum(cbc_data, (des_cblock *)lqret,
729280304Sjkim                        (long)strlen((char *)cbc_data), 2,
730280304Sjkim                        (des_cblock *)cbc_iv);
731280304Sjkim    if (cs != 0x70d7a63aL) {
732280304Sjkim        printf("quad_cksum error, ret %08lx should be 70d7a63a\n",
733280304Sjkim               (unsigned long)cs);
734280304Sjkim        err = 1;
735280304Sjkim    }
736280304Sjkim#  ifdef _CRAY
737280304Sjkim    if (lqret[0].a != 0x327eba8dL) {
738280304Sjkim        printf("quad_cksum error, out[0] %08lx is not %08lx\n",
739280304Sjkim               (unsigned long)lqret[0].a, 0x327eba8dUL);
740280304Sjkim        err = 1;
741280304Sjkim    }
742280304Sjkim    if (lqret[0].b != 0x201a49ccL) {
743280304Sjkim        printf("quad_cksum error, out[1] %08lx is not %08lx\n",
744280304Sjkim               (unsigned long)lqret[0].b, 0x201a49ccUL);
745280304Sjkim        err = 1;
746280304Sjkim    }
747280304Sjkim    if (lqret[1].a != 0x70d7a63aL) {
748280304Sjkim        printf("quad_cksum error, out[2] %08lx is not %08lx\n",
749280304Sjkim               (unsigned long)lqret[1].a, 0x70d7a63aUL);
750280304Sjkim        err = 1;
751280304Sjkim    }
752280304Sjkim    if (lqret[1].b != 0x501c2c26L) {
753280304Sjkim        printf("quad_cksum error, out[3] %08lx is not %08lx\n",
754280304Sjkim               (unsigned long)lqret[1].b, 0x501c2c26UL);
755280304Sjkim        err = 1;
756280304Sjkim    }
757280304Sjkim#  else
758280304Sjkim    if (lqret[0] != 0x327eba8dL) {
759280304Sjkim        printf("quad_cksum error, out[0] %08lx is not %08lx\n",
760280304Sjkim               (unsigned long)lqret[0], 0x327eba8dUL);
761280304Sjkim        err = 1;
762280304Sjkim    }
763280304Sjkim    if (lqret[1] != 0x201a49ccL) {
764280304Sjkim        printf("quad_cksum error, out[1] %08lx is not %08lx\n",
765280304Sjkim               (unsigned long)lqret[1], 0x201a49ccUL);
766280304Sjkim        err = 1;
767280304Sjkim    }
768280304Sjkim    if (lqret[2] != 0x70d7a63aL) {
769280304Sjkim        printf("quad_cksum error, out[2] %08lx is not %08lx\n",
770280304Sjkim               (unsigned long)lqret[2], 0x70d7a63aUL);
771280304Sjkim        err = 1;
772280304Sjkim    }
773280304Sjkim    if (lqret[3] != 0x501c2c26L) {
774280304Sjkim        printf("quad_cksum error, out[3] %08lx is not %08lx\n",
775280304Sjkim               (unsigned long)lqret[3], 0x501c2c26UL);
776280304Sjkim        err = 1;
777280304Sjkim    }
778280304Sjkim#  endif
779280304Sjkim# endif
78055714Skris
781280304Sjkim    printf("input word alignment test");
782280304Sjkim    for (i = 0; i < 4; i++) {
783280304Sjkim        printf(" %d", i);
784280304Sjkim        des_ncbc_encrypt(&(cbc_out[i]), cbc_in,
785280304Sjkim                         strlen((char *)cbc_data) + 1, ks,
786280304Sjkim                         &cbc_iv, DES_ENCRYPT);
787280304Sjkim    }
788280304Sjkim    printf("\noutput word alignment test");
789280304Sjkim    for (i = 0; i < 4; i++) {
790280304Sjkim        printf(" %d", i);
791280304Sjkim        des_ncbc_encrypt(cbc_out, &(cbc_in[i]),
792280304Sjkim                         strlen((char *)cbc_data) + 1, ks,
793280304Sjkim                         &cbc_iv, DES_ENCRYPT);
794280304Sjkim    }
795280304Sjkim    printf("\n");
796280304Sjkim    printf("fast crypt test ");
797280304Sjkim    str = crypt("testing", "ef");
798280304Sjkim    if (strcmp("efGnQx2725bI2", str) != 0) {
799280304Sjkim        printf("fast crypt error, %s should be efGnQx2725bI2\n", str);
800280304Sjkim        err = 1;
801280304Sjkim    }
802280304Sjkim    str = crypt("bca76;23", "yA");
803280304Sjkim    if (strcmp("yA1Rp/1hZXIJk", str) != 0) {
804280304Sjkim        printf("fast crypt error, %s should be yA1Rp/1hZXIJk\n", str);
805280304Sjkim        err = 1;
806280304Sjkim    }
807280304Sjkim# ifdef OPENSSL_SYS_NETWARE
808280304Sjkim    if (err)
809280304Sjkim        printf("ERROR: %d\n", err);
810280304Sjkim# endif
811280304Sjkim    printf("\n");
812280304Sjkim    return (err);
813280304Sjkim}
81455714Skris
81555714Skrisstatic char *pt(unsigned char *p)
816280304Sjkim{
817280304Sjkim    static char bufs[10][20];
818280304Sjkim    static int bnum = 0;
819280304Sjkim    char *ret;
820280304Sjkim    int i;
821280304Sjkim    static char *f = "0123456789ABCDEF";
82255714Skris
823280304Sjkim    ret = &(bufs[bnum++][0]);
824280304Sjkim    bnum %= 10;
825280304Sjkim    for (i = 0; i < 8; i++) {
826280304Sjkim        ret[i * 2] = f[(p[i] >> 4) & 0xf];
827280304Sjkim        ret[i * 2 + 1] = f[p[i] & 0xf];
828280304Sjkim    }
829280304Sjkim    ret[16] = '\0';
830280304Sjkim    return (ret);
831280304Sjkim}
83255714Skris
833280304Sjkim# ifndef LIBDES_LIT
83455714Skris
83555714Skrisstatic int cfb_test(int bits, unsigned char *cfb_cipher)
836280304Sjkim{
837280304Sjkim    des_key_schedule ks;
838280304Sjkim    int i, err = 0;
83955714Skris
840280304Sjkim    DES_set_key_checked(&cfb_key, &ks);
841280304Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
842280304Sjkim    des_cfb_encrypt(plain, cfb_buf1, bits, sizeof(plain), ks, &cfb_tmp,
843280304Sjkim                    DES_ENCRYPT);
844280304Sjkim    if (memcmp(cfb_cipher, cfb_buf1, sizeof(plain)) != 0) {
845280304Sjkim        err = 1;
846280304Sjkim        printf("cfb_encrypt encrypt error\n");
847280304Sjkim        for (i = 0; i < 24; i += 8)
848280304Sjkim            printf("%s\n", pt(&(cfb_buf1[i])));
849280304Sjkim    }
850280304Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
851280304Sjkim    des_cfb_encrypt(cfb_buf1, cfb_buf2, bits, sizeof(plain), ks, &cfb_tmp,
852280304Sjkim                    DES_DECRYPT);
853280304Sjkim    if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) {
854280304Sjkim        err = 1;
855280304Sjkim        printf("cfb_encrypt decrypt error\n");
856280304Sjkim        for (i = 0; i < 24; i += 8)
857280304Sjkim            printf("%s\n", pt(&(cfb_buf1[i])));
858280304Sjkim    }
859280304Sjkim    return (err);
860280304Sjkim}
86155714Skris
86255714Skrisstatic int cfb64_test(unsigned char *cfb_cipher)
863280304Sjkim{
864280304Sjkim    des_key_schedule ks;
865280304Sjkim    int err = 0, i, n;
86655714Skris
867280304Sjkim    DES_set_key_checked(&cfb_key, &ks);
868280304Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
869280304Sjkim    n = 0;
870280304Sjkim    des_cfb64_encrypt(plain, cfb_buf1, 12, ks, &cfb_tmp, &n, DES_ENCRYPT);
871280304Sjkim    des_cfb64_encrypt(&(plain[12]), &(cfb_buf1[12]), sizeof(plain) - 12, ks,
872280304Sjkim                      &cfb_tmp, &n, DES_ENCRYPT);
873280304Sjkim    if (memcmp(cfb_cipher, cfb_buf1, sizeof(plain)) != 0) {
874280304Sjkim        err = 1;
875280304Sjkim        printf("cfb_encrypt encrypt error\n");
876280304Sjkim        for (i = 0; i < 24; i += 8)
877280304Sjkim            printf("%s\n", pt(&(cfb_buf1[i])));
878280304Sjkim    }
879280304Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
880280304Sjkim    n = 0;
881280304Sjkim    des_cfb64_encrypt(cfb_buf1, cfb_buf2, 17, ks, &cfb_tmp, &n, DES_DECRYPT);
882280304Sjkim    des_cfb64_encrypt(&(cfb_buf1[17]), &(cfb_buf2[17]),
883280304Sjkim                      sizeof(plain) - 17, ks, &cfb_tmp, &n, DES_DECRYPT);
884280304Sjkim    if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) {
885280304Sjkim        err = 1;
886280304Sjkim        printf("cfb_encrypt decrypt error\n");
887280304Sjkim        for (i = 0; i < 24; i += 8)
888280304Sjkim            printf("%s\n", pt(&(cfb_buf2[i])));
889280304Sjkim    }
890280304Sjkim    return (err);
891280304Sjkim}
89255714Skris
89355714Skrisstatic int ede_cfb64_test(unsigned char *cfb_cipher)
894280304Sjkim{
895280304Sjkim    des_key_schedule ks;
896280304Sjkim    int err = 0, i, n;
89755714Skris
898280304Sjkim    DES_set_key_checked(&cfb_key, &ks);
899280304Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
900280304Sjkim    n = 0;
901280304Sjkim    des_ede3_cfb64_encrypt(plain, cfb_buf1, 12, ks, ks, ks, &cfb_tmp, &n,
902280304Sjkim                           DES_ENCRYPT);
903280304Sjkim    des_ede3_cfb64_encrypt(&(plain[12]), &(cfb_buf1[12]),
904280304Sjkim                           sizeof(plain) - 12, ks, ks, ks,
905280304Sjkim                           &cfb_tmp, &n, DES_ENCRYPT);
906280304Sjkim    if (memcmp(cfb_cipher, cfb_buf1, sizeof(plain)) != 0) {
907280304Sjkim        err = 1;
908280304Sjkim        printf("ede_cfb_encrypt encrypt error\n");
909280304Sjkim        for (i = 0; i < 24; i += 8)
910280304Sjkim            printf("%s\n", pt(&(cfb_buf1[i])));
911280304Sjkim    }
912280304Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
913280304Sjkim    n = 0;
914280304Sjkim    des_ede3_cfb64_encrypt(cfb_buf1, cfb_buf2, (long)17, ks, ks, ks,
915280304Sjkim                           &cfb_tmp, &n, DES_DECRYPT);
916280304Sjkim    des_ede3_cfb64_encrypt(&(cfb_buf1[17]), &(cfb_buf2[17]),
917280304Sjkim                           sizeof(plain) - 17, ks, ks, ks,
918280304Sjkim                           &cfb_tmp, &n, DES_DECRYPT);
919280304Sjkim    if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) {
920280304Sjkim        err = 1;
921280304Sjkim        printf("ede_cfb_encrypt decrypt error\n");
922280304Sjkim        for (i = 0; i < 24; i += 8)
923280304Sjkim            printf("%s\n", pt(&(cfb_buf2[i])));
924280304Sjkim    }
925280304Sjkim    return (err);
926280304Sjkim}
92755714Skris
928280304Sjkim# endif
92955714Skris#endif
930