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.
8280297Sjkim *
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).
15280297Sjkim *
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.
22280297Sjkim *
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 :-).
37280297Sjkim * 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)"
40280297Sjkim *
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.
52280297Sjkim *
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)
64280297Sjkim# ifndef OPENSSL_SYS_MSDOS
65280297Sjkim#  define OPENSSL_SYS_MSDOS
66280297Sjkim# endif
6755714Skris#endif
6855714Skris
69109998Smarkm#ifndef OPENSSL_SYS_MSDOS
70280297Sjkim# if !defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_VMS_DECC)
71280297Sjkim#  include OPENSSL_UNISTD
72280297Sjkim# endif
7355714Skris#else
74280297Sjkim# 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");
82280297Sjkim    return (0);
8355714Skris}
8455714Skris#else
85280297Sjkim# include <openssl/des.h>
8655714Skris
87280297Sjkim# define crypt(c,s) (DES_crypt((c),(s)))
8855714Skris
8955714Skris/* tisk tisk - the test keys don't all have odd parity :-( */
9055714Skris/* test data */
91280297Sjkim# define NUM_TESTS 34
92280297Sjkimstatic unsigned char key_data[NUM_TESTS][8] = {
93280297Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
94280297Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
95280297Sjkim    {0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
96280297Sjkim    {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
97280297Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
98280297Sjkim    {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
99280297Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
100280297Sjkim    {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
101280297Sjkim    {0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57},
102280297Sjkim    {0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E},
103280297Sjkim    {0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86},
104280297Sjkim    {0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E},
105280297Sjkim    {0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6},
106280297Sjkim    {0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE},
107280297Sjkim    {0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6},
108280297Sjkim    {0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE},
109280297Sjkim    {0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16},
110280297Sjkim    {0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F},
111280297Sjkim    {0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46},
112280297Sjkim    {0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E},
113280297Sjkim    {0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76},
114280297Sjkim    {0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07},
115280297Sjkim    {0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F},
116280297Sjkim    {0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7},
117280297Sjkim    {0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF},
118280297Sjkim    {0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6},
119280297Sjkim    {0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF},
120280297Sjkim    {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
121280297Sjkim    {0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E},
122280297Sjkim    {0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE},
123280297Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
124280297Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
125280297Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
126280297Sjkim    {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}
127280297Sjkim};
12855714Skris
129280297Sjkimstatic unsigned char plain_data[NUM_TESTS][8] = {
130280297Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
131280297Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
132280297Sjkim    {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
133280297Sjkim    {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
134280297Sjkim    {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
135280297Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
136280297Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
137280297Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
138280297Sjkim    {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42},
139280297Sjkim    {0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA},
140280297Sjkim    {0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72},
141280297Sjkim    {0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A},
142280297Sjkim    {0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2},
143280297Sjkim    {0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A},
144280297Sjkim    {0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2},
145280297Sjkim    {0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A},
146280297Sjkim    {0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02},
147280297Sjkim    {0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A},
148280297Sjkim    {0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32},
149280297Sjkim    {0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA},
150280297Sjkim    {0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62},
151280297Sjkim    {0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2},
152280297Sjkim    {0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA},
153280297Sjkim    {0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92},
154280297Sjkim    {0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A},
155280297Sjkim    {0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2},
156280297Sjkim    {0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A},
157280297Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
158280297Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
159280297Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
160280297Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
161280297Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
162280297Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
163280297Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
164280297Sjkim};
16555714Skris
166280297Sjkimstatic unsigned char cipher_data[NUM_TESTS][8] = {
167280297Sjkim    {0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7},
168280297Sjkim    {0x73, 0x59, 0xB2, 0x16, 0x3E, 0x4E, 0xDC, 0x58},
169280297Sjkim    {0x95, 0x8E, 0x6E, 0x62, 0x7A, 0x05, 0x55, 0x7B},
170280297Sjkim    {0xF4, 0x03, 0x79, 0xAB, 0x9E, 0x0E, 0xC5, 0x33},
171280297Sjkim    {0x17, 0x66, 0x8D, 0xFC, 0x72, 0x92, 0x53, 0x2D},
172280297Sjkim    {0x8A, 0x5A, 0xE1, 0xF8, 0x1A, 0xB8, 0xF2, 0xDD},
173280297Sjkim    {0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7},
174280297Sjkim    {0xED, 0x39, 0xD9, 0x50, 0xFA, 0x74, 0xBC, 0xC4},
175280297Sjkim    {0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B},
176280297Sjkim    {0x7A, 0x38, 0x9D, 0x10, 0x35, 0x4B, 0xD2, 0x71},
177280297Sjkim    {0x86, 0x8E, 0xBB, 0x51, 0xCA, 0xB4, 0x59, 0x9A},
178280297Sjkim    {0x71, 0x78, 0x87, 0x6E, 0x01, 0xF1, 0x9B, 0x2A},
179280297Sjkim    {0xAF, 0x37, 0xFB, 0x42, 0x1F, 0x8C, 0x40, 0x95},
180280297Sjkim    {0x86, 0xA5, 0x60, 0xF1, 0x0E, 0xC6, 0xD8, 0x5B},
181280297Sjkim    {0x0C, 0xD3, 0xDA, 0x02, 0x00, 0x21, 0xDC, 0x09},
182280297Sjkim    {0xEA, 0x67, 0x6B, 0x2C, 0xB7, 0xDB, 0x2B, 0x7A},
183280297Sjkim    {0xDF, 0xD6, 0x4A, 0x81, 0x5C, 0xAF, 0x1A, 0x0F},
184280297Sjkim    {0x5C, 0x51, 0x3C, 0x9C, 0x48, 0x86, 0xC0, 0x88},
185280297Sjkim    {0x0A, 0x2A, 0xEE, 0xAE, 0x3F, 0xF4, 0xAB, 0x77},
186280297Sjkim    {0xEF, 0x1B, 0xF0, 0x3E, 0x5D, 0xFA, 0x57, 0x5A},
187280297Sjkim    {0x88, 0xBF, 0x0D, 0xB6, 0xD7, 0x0D, 0xEE, 0x56},
188280297Sjkim    {0xA1, 0xF9, 0x91, 0x55, 0x41, 0x02, 0x0B, 0x56},
189280297Sjkim    {0x6F, 0xBF, 0x1C, 0xAF, 0xCF, 0xFD, 0x05, 0x56},
190280297Sjkim    {0x2F, 0x22, 0xE4, 0x9B, 0xAB, 0x7C, 0xA1, 0xAC},
191280297Sjkim    {0x5A, 0x6B, 0x61, 0x2C, 0xC2, 0x6C, 0xCE, 0x4A},
192280297Sjkim    {0x5F, 0x4C, 0x03, 0x8E, 0xD1, 0x2B, 0x2E, 0x41},
193280297Sjkim    {0x63, 0xFA, 0xC0, 0xD0, 0x34, 0xD9, 0xF7, 0x93},
194280297Sjkim    {0x61, 0x7B, 0x3A, 0x0C, 0xE8, 0xF0, 0x71, 0x00},
195280297Sjkim    {0xDB, 0x95, 0x86, 0x05, 0xF8, 0xC8, 0xC6, 0x06},
196280297Sjkim    {0xED, 0xBF, 0xD1, 0xC6, 0x6C, 0x29, 0xCC, 0xC7},
197280297Sjkim    {0x35, 0x55, 0x50, 0xB2, 0x15, 0x0E, 0x24, 0x51},
198280297Sjkim    {0xCA, 0xAA, 0xAF, 0x4D, 0xEA, 0xF1, 0xDB, 0xAE},
199280297Sjkim    {0xD5, 0xD4, 0x4F, 0xF7, 0x20, 0x68, 0x3D, 0x0D},
200280297Sjkim    {0x2A, 0x2B, 0xB0, 0x08, 0xDF, 0x97, 0xC2, 0xF2}
201280297Sjkim};
20255714Skris
203280297Sjkimstatic unsigned char cipher_ecb2[NUM_TESTS - 1][8] = {
204280297Sjkim    {0x92, 0x95, 0xB5, 0x9B, 0xB3, 0x84, 0x73, 0x6E},
205280297Sjkim    {0x19, 0x9E, 0x9D, 0x6D, 0xF3, 0x9A, 0xA8, 0x16},
206280297Sjkim    {0x2A, 0x4B, 0x4D, 0x24, 0x52, 0x43, 0x84, 0x27},
207280297Sjkim    {0x35, 0x84, 0x3C, 0x01, 0x9D, 0x18, 0xC5, 0xB6},
208280297Sjkim    {0x4A, 0x5B, 0x2F, 0x42, 0xAA, 0x77, 0x19, 0x25},
209280297Sjkim    {0xA0, 0x6B, 0xA9, 0xB8, 0xCA, 0x5B, 0x17, 0x8A},
210280297Sjkim    {0xAB, 0x9D, 0xB7, 0xFB, 0xED, 0x95, 0xF2, 0x74},
211280297Sjkim    {0x3D, 0x25, 0x6C, 0x23, 0xA7, 0x25, 0x2F, 0xD6},
212280297Sjkim    {0xB7, 0x6F, 0xAB, 0x4F, 0xBD, 0xBD, 0xB7, 0x67},
213280297Sjkim    {0x8F, 0x68, 0x27, 0xD6, 0x9C, 0xF4, 0x1A, 0x10},
214280297Sjkim    {0x82, 0x57, 0xA1, 0xD6, 0x50, 0x5E, 0x81, 0x85},
215280297Sjkim    {0xA2, 0x0F, 0x0A, 0xCD, 0x80, 0x89, 0x7D, 0xFA},
216280297Sjkim    {0xCD, 0x2A, 0x53, 0x3A, 0xDB, 0x0D, 0x7E, 0xF3},
217280297Sjkim    {0xD2, 0xC2, 0xBE, 0x27, 0xE8, 0x1B, 0x68, 0xE3},
218280297Sjkim    {0xE9, 0x24, 0xCF, 0x4F, 0x89, 0x3C, 0x5B, 0x0A},
219280297Sjkim    {0xA7, 0x18, 0xC3, 0x9F, 0xFA, 0x9F, 0xD7, 0x69},
220280297Sjkim    {0x77, 0x2C, 0x79, 0xB1, 0xD2, 0x31, 0x7E, 0xB1},
221280297Sjkim    {0x49, 0xAB, 0x92, 0x7F, 0xD0, 0x22, 0x00, 0xB7},
222280297Sjkim    {0xCE, 0x1C, 0x6C, 0x7D, 0x85, 0xE3, 0x4A, 0x6F},
223280297Sjkim    {0xBE, 0x91, 0xD6, 0xE1, 0x27, 0xB2, 0xE9, 0x87},
224280297Sjkim    {0x70, 0x28, 0xAE, 0x8F, 0xD1, 0xF5, 0x74, 0x1A},
225280297Sjkim    {0xAA, 0x37, 0x80, 0xBB, 0xF3, 0x22, 0x1D, 0xDE},
226280297Sjkim    {0xA6, 0xC4, 0xD2, 0x5E, 0x28, 0x93, 0xAC, 0xB3},
227280297Sjkim    {0x22, 0x07, 0x81, 0x5A, 0xE4, 0xB7, 0x1A, 0xAD},
228280297Sjkim    {0xDC, 0xCE, 0x05, 0xE7, 0x07, 0xBD, 0xF5, 0x84},
229280297Sjkim    {0x26, 0x1D, 0x39, 0x2C, 0xB3, 0xBA, 0xA5, 0x85},
230280297Sjkim    {0xB4, 0xF7, 0x0F, 0x72, 0xFB, 0x04, 0xF0, 0xDC},
231280297Sjkim    {0x95, 0xBA, 0xA9, 0x4E, 0x87, 0x36, 0xF2, 0x89},
232280297Sjkim    {0xD4, 0x07, 0x3A, 0xF1, 0x5A, 0x17, 0x82, 0x0E},
233280297Sjkim    {0xEF, 0x6F, 0xAF, 0xA7, 0x66, 0x1A, 0x7E, 0x89},
234280297Sjkim    {0xC1, 0x97, 0xF5, 0x58, 0x74, 0x8A, 0x20, 0xE7},
235280297Sjkim    {0x43, 0x34, 0xCF, 0xDA, 0x22, 0xC4, 0x86, 0xC8},
236280297Sjkim    {0x08, 0xD7, 0xB4, 0xFB, 0x62, 0x9D, 0x08, 0x85}
237280297Sjkim};
23855714Skris
239280297Sjkimstatic unsigned char cbc_key[8] =
240280297Sjkim    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
241280297Sjkimstatic unsigned char cbc2_key[8] =
242280297Sjkim    { 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86 };
243280297Sjkimstatic unsigned char cbc3_key[8] =
244280297Sjkim    { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
245280297Sjkimstatic unsigned char cbc_iv[8] =
246280297Sjkim    { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
247280297Sjkim/*
248280297Sjkim * Changed the following text constant to binary so it will work on ebcdic
249280297Sjkim * machines :-)
250280297Sjkim */
25155714Skris/* static char cbc_data[40]="7654321 Now is the time for \0001"; */
252280297Sjkimstatic unsigned char cbc_data[40] = {
253280297Sjkim    0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
254280297Sjkim    0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
255280297Sjkim    0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
256280297Sjkim    0x66, 0x6F, 0x72, 0x20, 0x00, 0x31, 0x00, 0x00,
257280297Sjkim    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258280297Sjkim};
25955714Skris
260280297Sjkimstatic unsigned char cbc_ok[32] = {
261280297Sjkim    0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
262280297Sjkim    0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb,
263280297Sjkim    0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68,
264280297Sjkim    0x1d, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4
265280297Sjkim};
26655714Skris
267280297Sjkim# ifdef SCREW_THE_PARITY
268280297Sjkim#  error "SCREW_THE_PARITY is not ment to be defined."
269280297Sjkim#  error "Original vectors are preserved for reference only."
270280297Sjkimstatic unsigned char cbc2_key[8] =
271280297Sjkim    { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 };
272280297Sjkimstatic unsigned char xcbc_ok[32] = {
273280297Sjkim    0x86, 0x74, 0x81, 0x0D, 0x61, 0xA4, 0xA5, 0x48,
274280297Sjkim    0xB9, 0x93, 0x03, 0xE1, 0xB8, 0xBB, 0xBD, 0xBD,
275280297Sjkim    0x64, 0x30, 0x0B, 0xB9, 0x06, 0x65, 0x81, 0x76,
276280297Sjkim    0x04, 0x1D, 0x77, 0x62, 0x17, 0xCA, 0x2B, 0xD2,
277280297Sjkim};
278280297Sjkim# else
279280297Sjkimstatic unsigned char xcbc_ok[32] = {
280280297Sjkim    0x84, 0x6B, 0x29, 0x14, 0x85, 0x1E, 0x9A, 0x29,
281280297Sjkim    0x54, 0x73, 0x2F, 0x8A, 0xA0, 0xA6, 0x11, 0xC1,
282280297Sjkim    0x15, 0xCD, 0xC2, 0xD7, 0x95, 0x1B, 0x10, 0x53,
283280297Sjkim    0xA6, 0x3C, 0x5E, 0x03, 0xB2, 0x1A, 0xA3, 0xC4,
284280297Sjkim};
285280297Sjkim# endif
28655714Skris
287280297Sjkimstatic unsigned char cbc3_ok[32] = {
288280297Sjkim    0x3F, 0xE3, 0x01, 0xC9, 0x62, 0xAC, 0x01, 0xD0,
289280297Sjkim    0x22, 0x13, 0x76, 0x3C, 0x1C, 0xBD, 0x4C, 0xDC,
290280297Sjkim    0x79, 0x96, 0x57, 0xC0, 0x64, 0xEC, 0xF5, 0xD4,
291280297Sjkim    0x1C, 0x67, 0x38, 0x12, 0xCF, 0xDE, 0x96, 0x75
292280297Sjkim};
29355714Skris
294280297Sjkimstatic unsigned char pcbc_ok[32] = {
295280297Sjkim    0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
296280297Sjkim    0x6d, 0xec, 0xb4, 0x70, 0xa0, 0xe5, 0x6b, 0x15,
297280297Sjkim    0xae, 0xa6, 0xbf, 0x61, 0xed, 0x7d, 0x9c, 0x9f,
298280297Sjkim    0xf7, 0x17, 0x46, 0x3b, 0x8a, 0xb3, 0xcc, 0x88
299280297Sjkim};
30055714Skris
301280297Sjkimstatic unsigned char cfb_key[8] =
302280297Sjkim    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
303280297Sjkimstatic unsigned char cfb_iv[8] =
304280297Sjkim    { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
305280297Sjkimstatic unsigned char cfb_buf1[40], cfb_buf2[40], cfb_tmp[8];
306280297Sjkimstatic unsigned char plain[24] = {
307280297Sjkim    0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73,
308280297Sjkim    0x20, 0x74, 0x68, 0x65, 0x20, 0x74,
309280297Sjkim    0x69, 0x6d, 0x65, 0x20, 0x66, 0x6f,
310280297Sjkim    0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20
311280297Sjkim};
31255714Skris
313280297Sjkimstatic unsigned char cfb_cipher8[24] = {
314280297Sjkim    0xf3, 0x1f, 0xda, 0x07, 0x01, 0x14, 0x62, 0xee, 0x18, 0x7f, 0x43, 0xd8,
315280297Sjkim    0x0a, 0x7c, 0xd9, 0xb5, 0xb0, 0xd2, 0x90, 0xda, 0x6e, 0x5b, 0x9a, 0x87
316280297Sjkim};
31755714Skris
318280297Sjkimstatic unsigned char cfb_cipher16[24] = {
319280297Sjkim    0xF3, 0x09, 0x87, 0x87, 0x7F, 0x57, 0xF7, 0x3C, 0x36, 0xB6, 0xDB, 0x70,
320280297Sjkim    0xD8, 0xD5, 0x34, 0x19, 0xD3, 0x86, 0xB2, 0x23, 0xB7, 0xB2, 0xAD, 0x1B
321280297Sjkim};
32255714Skris
323280297Sjkimstatic unsigned char cfb_cipher32[24] = {
324280297Sjkim    0xF3, 0x09, 0x62, 0x49, 0xA4, 0xDF, 0xA4, 0x9F, 0x33, 0xDC, 0x7B, 0xAD,
325280297Sjkim    0x4C, 0xC8, 0x9F, 0x64, 0xE4, 0x53, 0xE5, 0xEC, 0x67, 0x20, 0xDA, 0xB6
326280297Sjkim};
327280297Sjkim
328280297Sjkimstatic unsigned char cfb_cipher48[24] = {
329280297Sjkim    0xF3, 0x09, 0x62, 0x49, 0xC7, 0xF4, 0x30, 0xB5, 0x15, 0xEC, 0xBB, 0x85,
330280297Sjkim    0x97, 0x5A, 0x13, 0x8C, 0x68, 0x60, 0xE2, 0x38, 0x34, 0x3C, 0xDC, 0x1F
331280297Sjkim};
332280297Sjkim
333280297Sjkimstatic unsigned char cfb_cipher64[24] = {
334280297Sjkim    0xF3, 0x09, 0x62, 0x49, 0xC7, 0xF4, 0x6E, 0x51, 0xA6, 0x9E, 0x83, 0x9B,
335280297Sjkim    0x1A, 0x92, 0xF7, 0x84, 0x03, 0x46, 0x71, 0x33, 0x89, 0x8E, 0xA6, 0x22
336280297Sjkim};
337280297Sjkim
338280297Sjkimstatic unsigned char ofb_key[8] =
339280297Sjkim    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
340280297Sjkimstatic unsigned char ofb_iv[8] =
341280297Sjkim    { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
342280297Sjkimstatic unsigned char ofb_buf1[24], ofb_buf2[24], ofb_tmp[8];
343280297Sjkimstatic unsigned char ofb_cipher[24] = {
344280297Sjkim    0xf3, 0x09, 0x62, 0x49, 0xc7, 0xf4, 0x6e, 0x51,
345280297Sjkim    0x35, 0xf2, 0x4a, 0x24, 0x2e, 0xeb, 0x3d, 0x3f,
346280297Sjkim    0x3d, 0x6d, 0x5b, 0xe3, 0x25, 0x5a, 0xf8, 0xc3
347280297Sjkim};
348280297Sjkim
349280297Sjkim# if 0
350280297Sjkimstatic DES_LONG cbc_cksum_ret = 0xB462FEF7L;
351280297Sjkim# else
352280297Sjkimstatic DES_LONG cbc_cksum_ret = 0xF7FE62B4L;
353280297Sjkim# endif
354280297Sjkimstatic unsigned char cbc_cksum_data[8] =
355280297Sjkim    { 0x1D, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 };
356280297Sjkim
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[])
362280297Sjkim{
363280297Sjkim    int j, err = 0;
364280297Sjkim    unsigned int i;
365280297Sjkim    des_cblock in, out, outin, iv3, iv2;
366280297Sjkim    des_key_schedule ks, ks2, ks3;
367280297Sjkim    unsigned char cbc_in[40];
368280297Sjkim    unsigned char cbc_out[40];
369280297Sjkim    DES_LONG cs;
370280297Sjkim    unsigned char cret[8];
371280297Sjkim# ifdef _CRAY
372280297Sjkim    struct {
373280297Sjkim        int a:32;
374280297Sjkim        int b:32;
375280297Sjkim    } lqret[2];
376280297Sjkim# else
377280297Sjkim    DES_LONG lqret[4];
378280297Sjkim# endif
379280297Sjkim    int num;
380280297Sjkim    char *str;
38155714Skris
382280297Sjkim# ifndef OPENSSL_NO_DESCBCM
383280297Sjkim    printf("Doing cbcm\n");
384280297Sjkim    if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
385280297Sjkim        printf("Key error %d\n", j);
386280297Sjkim        err = 1;
387280297Sjkim    }
388280297Sjkim    if ((j = DES_set_key_checked(&cbc2_key, &ks2)) != 0) {
389280297Sjkim        printf("Key error %d\n", j);
390280297Sjkim        err = 1;
391280297Sjkim    }
392280297Sjkim    if ((j = DES_set_key_checked(&cbc3_key, &ks3)) != 0) {
393280297Sjkim        printf("Key error %d\n", j);
394280297Sjkim        err = 1;
395280297Sjkim    }
396280297Sjkim    memset(cbc_out, 0, 40);
397280297Sjkim    memset(cbc_in, 0, 40);
398280297Sjkim    i = strlen((char *)cbc_data) + 1;
399280297Sjkim    /* i=((i+7)/8)*8; */
400280297Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
401280297Sjkim    memset(iv2, '\0', sizeof iv2);
40255714Skris
403280297Sjkim    DES_ede3_cbcm_encrypt(cbc_data, cbc_out, 16L, &ks, &ks2, &ks3, &iv3, &iv2,
404280297Sjkim                          DES_ENCRYPT);
405280297Sjkim    DES_ede3_cbcm_encrypt(&cbc_data[16], &cbc_out[16], i - 16, &ks, &ks2,
406280297Sjkim                          &ks3, &iv3, &iv2, DES_ENCRYPT);
407280297Sjkim/*- if (memcmp(cbc_out,cbc3_ok,
408280297Sjkim        (unsigned int)(strlen((char *)cbc_data)+1+7)/8*8) != 0)
409280297Sjkim        {
410280297Sjkim        printf("des_ede3_cbc_encrypt encrypt error\n");
411280297Sjkim        err=1;
412280297Sjkim        }
413280297Sjkim*/
414280297Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
415280297Sjkim    memset(iv2, '\0', sizeof iv2);
416280297Sjkim    DES_ede3_cbcm_encrypt(cbc_out, cbc_in, i, &ks, &ks2, &ks3, &iv3, &iv2,
417280297Sjkim                          DES_DECRYPT);
418280297Sjkim    if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) {
419280297Sjkim        unsigned int n;
42055714Skris
421280297Sjkim        printf("des_ede3_cbcm_encrypt decrypt error\n");
422280297Sjkim        for (n = 0; n < i; ++n)
423280297Sjkim            printf(" %02x", cbc_data[n]);
424280297Sjkim        printf("\n");
425280297Sjkim        for (n = 0; n < i; ++n)
426280297Sjkim            printf(" %02x", cbc_in[n]);
427280297Sjkim        printf("\n");
428280297Sjkim        err = 1;
429280297Sjkim    }
430280297Sjkim# endif
43155714Skris
432280297Sjkim    printf("Doing ecb\n");
433280297Sjkim    for (i = 0; i < NUM_TESTS; i++) {
434280297Sjkim        DES_set_key_unchecked(&key_data[i], &ks);
435280297Sjkim        memcpy(in, plain_data[i], 8);
436280297Sjkim        memset(out, 0, 8);
437280297Sjkim        memset(outin, 0, 8);
438280297Sjkim        des_ecb_encrypt(&in, &out, ks, DES_ENCRYPT);
439280297Sjkim        des_ecb_encrypt(&out, &outin, ks, DES_DECRYPT);
44055714Skris
441280297Sjkim        if (memcmp(out, cipher_data[i], 8) != 0) {
442280297Sjkim            printf("Encryption error %2d\nk=%s p=%s o=%s act=%s\n",
443280297Sjkim                   i + 1, pt(key_data[i]), pt(in), pt(cipher_data[i]),
444280297Sjkim                   pt(out));
445280297Sjkim            err = 1;
446280297Sjkim        }
447280297Sjkim        if (memcmp(in, outin, 8) != 0) {
448280297Sjkim            printf("Decryption error %2d\nk=%s p=%s o=%s act=%s\n",
449280297Sjkim                   i + 1, pt(key_data[i]), pt(out), pt(in), pt(outin));
450280297Sjkim            err = 1;
451280297Sjkim        }
452280297Sjkim    }
45355714Skris
454280297Sjkim# ifndef LIBDES_LIT
455280297Sjkim    printf("Doing ede ecb\n");
456280297Sjkim    for (i = 0; i < (NUM_TESTS - 2); i++) {
457280297Sjkim        DES_set_key_unchecked(&key_data[i], &ks);
458280297Sjkim        DES_set_key_unchecked(&key_data[i + 1], &ks2);
459280297Sjkim        DES_set_key_unchecked(&key_data[i + 2], &ks3);
460280297Sjkim        memcpy(in, plain_data[i], 8);
461280297Sjkim        memset(out, 0, 8);
462280297Sjkim        memset(outin, 0, 8);
463280297Sjkim        des_ecb2_encrypt(&in, &out, ks, ks2, DES_ENCRYPT);
464280297Sjkim        des_ecb2_encrypt(&out, &outin, ks, ks2, DES_DECRYPT);
46555714Skris
466280297Sjkim        if (memcmp(out, cipher_ecb2[i], 8) != 0) {
467280297Sjkim            printf("Encryption error %2d\nk=%s p=%s o=%s act=%s\n",
468280297Sjkim                   i + 1, pt(key_data[i]), pt(in), pt(cipher_ecb2[i]),
469280297Sjkim                   pt(out));
470280297Sjkim            err = 1;
471280297Sjkim        }
472280297Sjkim        if (memcmp(in, outin, 8) != 0) {
473280297Sjkim            printf("Decryption error %2d\nk=%s p=%s o=%s act=%s\n",
474280297Sjkim                   i + 1, pt(key_data[i]), pt(out), pt(in), pt(outin));
475280297Sjkim            err = 1;
476280297Sjkim        }
477280297Sjkim    }
478280297Sjkim# endif
47955714Skris
480280297Sjkim    printf("Doing cbc\n");
481280297Sjkim    if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
482280297Sjkim        printf("Key error %d\n", j);
483280297Sjkim        err = 1;
484280297Sjkim    }
485280297Sjkim    memset(cbc_out, 0, 40);
486280297Sjkim    memset(cbc_in, 0, 40);
487280297Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
488280297Sjkim    des_ncbc_encrypt(cbc_data, cbc_out, strlen((char *)cbc_data) + 1, ks,
489280297Sjkim                     &iv3, DES_ENCRYPT);
490280297Sjkim    if (memcmp(cbc_out, cbc_ok, 32) != 0) {
491280297Sjkim        printf("cbc_encrypt encrypt error\n");
492280297Sjkim        err = 1;
493280297Sjkim    }
49455714Skris
495280297Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
496280297Sjkim    des_ncbc_encrypt(cbc_out, cbc_in, strlen((char *)cbc_data) + 1, ks,
497280297Sjkim                     &iv3, DES_DECRYPT);
498280297Sjkim    if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data)) != 0) {
499280297Sjkim        printf("cbc_encrypt decrypt error\n");
500280297Sjkim        err = 1;
501280297Sjkim    }
502280297Sjkim# ifndef LIBDES_LIT
503280297Sjkim    printf("Doing desx cbc\n");
504280297Sjkim    if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
505280297Sjkim        printf("Key error %d\n", j);
506280297Sjkim        err = 1;
507280297Sjkim    }
508280297Sjkim    memset(cbc_out, 0, 40);
509280297Sjkim    memset(cbc_in, 0, 40);
510280297Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
511280297Sjkim    des_xcbc_encrypt(cbc_data, cbc_out, strlen((char *)cbc_data) + 1, ks,
512280297Sjkim                     &iv3, &cbc2_key, &cbc3_key, DES_ENCRYPT);
513280297Sjkim    if (memcmp(cbc_out, xcbc_ok, 32) != 0) {
514280297Sjkim        printf("des_xcbc_encrypt encrypt error\n");
515280297Sjkim        err = 1;
516280297Sjkim    }
517280297Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
518280297Sjkim    des_xcbc_encrypt(cbc_out, cbc_in, strlen((char *)cbc_data) + 1, ks,
519280297Sjkim                     &iv3, &cbc2_key, &cbc3_key, DES_DECRYPT);
520280297Sjkim    if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) {
521280297Sjkim        printf("des_xcbc_encrypt decrypt error\n");
522280297Sjkim        err = 1;
523280297Sjkim    }
524280297Sjkim# endif
52555714Skris
526280297Sjkim    printf("Doing ede cbc\n");
527280297Sjkim    if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
528280297Sjkim        printf("Key error %d\n", j);
529280297Sjkim        err = 1;
530280297Sjkim    }
531280297Sjkim    if ((j = DES_set_key_checked(&cbc2_key, &ks2)) != 0) {
532280297Sjkim        printf("Key error %d\n", j);
533280297Sjkim        err = 1;
534280297Sjkim    }
535280297Sjkim    if ((j = DES_set_key_checked(&cbc3_key, &ks3)) != 0) {
536280297Sjkim        printf("Key error %d\n", j);
537280297Sjkim        err = 1;
538280297Sjkim    }
539280297Sjkim    memset(cbc_out, 0, 40);
540280297Sjkim    memset(cbc_in, 0, 40);
541280297Sjkim    i = strlen((char *)cbc_data) + 1;
542280297Sjkim    /* i=((i+7)/8)*8; */
543280297Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
54455714Skris
545280297Sjkim    des_ede3_cbc_encrypt(cbc_data, cbc_out, 16L, ks, ks2, ks3, &iv3,
546280297Sjkim                         DES_ENCRYPT);
547280297Sjkim    des_ede3_cbc_encrypt(&(cbc_data[16]), &(cbc_out[16]), i - 16, ks, ks2,
548280297Sjkim                         ks3, &iv3, DES_ENCRYPT);
549280297Sjkim    if (memcmp
550280297Sjkim        (cbc_out, cbc3_ok,
551280297Sjkim         (unsigned int)(strlen((char *)cbc_data) + 1 + 7) / 8 * 8) != 0) {
552280297Sjkim        unsigned int n;
55355714Skris
554280297Sjkim        printf("des_ede3_cbc_encrypt encrypt error\n");
555280297Sjkim        for (n = 0; n < i; ++n)
556280297Sjkim            printf(" %02x", cbc_out[n]);
557280297Sjkim        printf("\n");
558280297Sjkim        for (n = 0; n < i; ++n)
559280297Sjkim            printf(" %02x", cbc3_ok[n]);
560280297Sjkim        printf("\n");
561280297Sjkim        err = 1;
562280297Sjkim    }
563109998Smarkm
564280297Sjkim    memcpy(iv3, cbc_iv, sizeof(cbc_iv));
565280297Sjkim    des_ede3_cbc_encrypt(cbc_out, cbc_in, i, ks, ks2, ks3, &iv3, DES_DECRYPT);
566280297Sjkim    if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) {
567280297Sjkim        unsigned int n;
56855714Skris
569280297Sjkim        printf("des_ede3_cbc_encrypt decrypt error\n");
570280297Sjkim        for (n = 0; n < i; ++n)
571280297Sjkim            printf(" %02x", cbc_data[n]);
572280297Sjkim        printf("\n");
573280297Sjkim        for (n = 0; n < i; ++n)
574280297Sjkim            printf(" %02x", cbc_in[n]);
575280297Sjkim        printf("\n");
576280297Sjkim        err = 1;
577280297Sjkim    }
578280297Sjkim# ifndef LIBDES_LIT
579280297Sjkim    printf("Doing pcbc\n");
580280297Sjkim    if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) {
581280297Sjkim        printf("Key error %d\n", j);
582280297Sjkim        err = 1;
583280297Sjkim    }
584280297Sjkim    memset(cbc_out, 0, 40);
585280297Sjkim    memset(cbc_in, 0, 40);
586280297Sjkim    des_pcbc_encrypt(cbc_data, cbc_out, strlen((char *)cbc_data) + 1, ks,
587280297Sjkim                     &cbc_iv, DES_ENCRYPT);
588280297Sjkim    if (memcmp(cbc_out, pcbc_ok, 32) != 0) {
589280297Sjkim        printf("pcbc_encrypt encrypt error\n");
590280297Sjkim        err = 1;
591280297Sjkim    }
592280297Sjkim    des_pcbc_encrypt(cbc_out, cbc_in, strlen((char *)cbc_data) + 1, ks,
593280297Sjkim                     &cbc_iv, DES_DECRYPT);
594280297Sjkim    if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) {
595280297Sjkim        printf("pcbc_encrypt decrypt error\n");
596280297Sjkim        err = 1;
597280297Sjkim    }
598109998Smarkm
599280297Sjkim    printf("Doing ");
600280297Sjkim    printf("cfb8 ");
601280297Sjkim    err += cfb_test(8, cfb_cipher8);
602280297Sjkim    printf("cfb16 ");
603280297Sjkim    err += cfb_test(16, cfb_cipher16);
604280297Sjkim    printf("cfb32 ");
605280297Sjkim    err += cfb_test(32, cfb_cipher32);
606280297Sjkim    printf("cfb48 ");
607280297Sjkim    err += cfb_test(48, cfb_cipher48);
608280297Sjkim    printf("cfb64 ");
609280297Sjkim    err += cfb_test(64, cfb_cipher64);
61055714Skris
611280297Sjkim    printf("cfb64() ");
612280297Sjkim    err += cfb64_test(cfb_cipher64);
61355714Skris
614280297Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
615280297Sjkim    for (i = 0; i < sizeof(plain); i++)
616280297Sjkim        des_cfb_encrypt(&(plain[i]), &(cfb_buf1[i]),
617280297Sjkim                        8, 1, ks, &cfb_tmp, DES_ENCRYPT);
618280297Sjkim    if (memcmp(cfb_cipher8, cfb_buf1, sizeof(plain)) != 0) {
619280297Sjkim        printf("cfb_encrypt small encrypt error\n");
620280297Sjkim        err = 1;
621280297Sjkim    }
62255714Skris
623280297Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
624280297Sjkim    for (i = 0; i < sizeof(plain); i++)
625280297Sjkim        des_cfb_encrypt(&(cfb_buf1[i]), &(cfb_buf2[i]),
626280297Sjkim                        8, 1, ks, &cfb_tmp, DES_DECRYPT);
627280297Sjkim    if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) {
628280297Sjkim        printf("cfb_encrypt small decrypt error\n");
629280297Sjkim        err = 1;
630280297Sjkim    }
63155714Skris
632280297Sjkim    printf("ede_cfb64() ");
633280297Sjkim    err += ede_cfb64_test(cfb_cipher64);
63455714Skris
635280297Sjkim    printf("done\n");
63655714Skris
637280297Sjkim    printf("Doing ofb\n");
638280297Sjkim    DES_set_key_checked(&ofb_key, &ks);
639280297Sjkim    memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
640280297Sjkim    des_ofb_encrypt(plain, ofb_buf1, 64, sizeof(plain) / 8, ks, &ofb_tmp);
641280297Sjkim    if (memcmp(ofb_cipher, ofb_buf1, sizeof(ofb_buf1)) != 0) {
642280297Sjkim        printf("ofb_encrypt encrypt error\n");
643280297Sjkim        printf("%02X %02X %02X %02X %02X %02X %02X %02X\n",
644280297Sjkim               ofb_buf1[8 + 0], ofb_buf1[8 + 1], ofb_buf1[8 + 2],
645280297Sjkim               ofb_buf1[8 + 3], ofb_buf1[8 + 4], ofb_buf1[8 + 5],
646280297Sjkim               ofb_buf1[8 + 6], ofb_buf1[8 + 7]);
647280297Sjkim        printf("%02X %02X %02X %02X %02X %02X %02X %02X\n", ofb_buf1[8 + 0],
648280297Sjkim               ofb_cipher[8 + 1], ofb_cipher[8 + 2], ofb_cipher[8 + 3],
649280297Sjkim               ofb_buf1[8 + 4], ofb_cipher[8 + 5], ofb_cipher[8 + 6],
650280297Sjkim               ofb_cipher[8 + 7]);
651280297Sjkim        err = 1;
652280297Sjkim    }
653280297Sjkim    memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
654280297Sjkim    des_ofb_encrypt(ofb_buf1, ofb_buf2, 64, sizeof(ofb_buf1) / 8, ks,
655280297Sjkim                    &ofb_tmp);
656280297Sjkim    if (memcmp(plain, ofb_buf2, sizeof(ofb_buf2)) != 0) {
657280297Sjkim        printf("ofb_encrypt decrypt error\n");
658280297Sjkim        printf("%02X %02X %02X %02X %02X %02X %02X %02X\n",
659280297Sjkim               ofb_buf2[8 + 0], ofb_buf2[8 + 1], ofb_buf2[8 + 2],
660280297Sjkim               ofb_buf2[8 + 3], ofb_buf2[8 + 4], ofb_buf2[8 + 5],
661280297Sjkim               ofb_buf2[8 + 6], ofb_buf2[8 + 7]);
662280297Sjkim        printf("%02X %02X %02X %02X %02X %02X %02X %02X\n", plain[8 + 0],
663280297Sjkim               plain[8 + 1], plain[8 + 2], plain[8 + 3], plain[8 + 4],
664280297Sjkim               plain[8 + 5], plain[8 + 6], plain[8 + 7]);
665280297Sjkim        err = 1;
666280297Sjkim    }
66755714Skris
668280297Sjkim    printf("Doing ofb64\n");
669280297Sjkim    DES_set_key_checked(&ofb_key, &ks);
670280297Sjkim    memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
671280297Sjkim    memset(ofb_buf1, 0, sizeof(ofb_buf1));
672280297Sjkim    memset(ofb_buf2, 0, sizeof(ofb_buf1));
673280297Sjkim    num = 0;
674280297Sjkim    for (i = 0; i < sizeof(plain); i++) {
675280297Sjkim        des_ofb64_encrypt(&(plain[i]), &(ofb_buf1[i]), 1, ks, &ofb_tmp, &num);
676280297Sjkim    }
677280297Sjkim    if (memcmp(ofb_cipher, ofb_buf1, sizeof(ofb_buf1)) != 0) {
678280297Sjkim        printf("ofb64_encrypt encrypt error\n");
679280297Sjkim        err = 1;
680280297Sjkim    }
681280297Sjkim    memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
682280297Sjkim    num = 0;
683280297Sjkim    des_ofb64_encrypt(ofb_buf1, ofb_buf2, sizeof(ofb_buf1), ks, &ofb_tmp,
684280297Sjkim                      &num);
685280297Sjkim    if (memcmp(plain, ofb_buf2, sizeof(ofb_buf2)) != 0) {
686280297Sjkim        printf("ofb64_encrypt decrypt error\n");
687280297Sjkim        err = 1;
688280297Sjkim    }
68955714Skris
690280297Sjkim    printf("Doing ede_ofb64\n");
691280297Sjkim    DES_set_key_checked(&ofb_key, &ks);
692280297Sjkim    memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
693280297Sjkim    memset(ofb_buf1, 0, sizeof(ofb_buf1));
694280297Sjkim    memset(ofb_buf2, 0, sizeof(ofb_buf1));
695280297Sjkim    num = 0;
696280297Sjkim    for (i = 0; i < sizeof(plain); i++) {
697280297Sjkim        des_ede3_ofb64_encrypt(&(plain[i]), &(ofb_buf1[i]), 1, ks, ks,
698280297Sjkim                               ks, &ofb_tmp, &num);
699280297Sjkim    }
700280297Sjkim    if (memcmp(ofb_cipher, ofb_buf1, sizeof(ofb_buf1)) != 0) {
701280297Sjkim        printf("ede_ofb64_encrypt encrypt error\n");
702280297Sjkim        err = 1;
703280297Sjkim    }
704280297Sjkim    memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv));
705280297Sjkim    num = 0;
706280297Sjkim    des_ede3_ofb64_encrypt(ofb_buf1, ofb_buf2, sizeof(ofb_buf1), ks, ks, ks,
707280297Sjkim                           &ofb_tmp, &num);
708280297Sjkim    if (memcmp(plain, ofb_buf2, sizeof(ofb_buf2)) != 0) {
709280297Sjkim        printf("ede_ofb64_encrypt decrypt error\n");
710280297Sjkim        err = 1;
711280297Sjkim    }
71255714Skris
713280297Sjkim    printf("Doing cbc_cksum\n");
714280297Sjkim    DES_set_key_checked(&cbc_key, &ks);
715280297Sjkim    cs = des_cbc_cksum(cbc_data, &cret, strlen((char *)cbc_data), ks,
716280297Sjkim                       &cbc_iv);
717280297Sjkim    if (cs != cbc_cksum_ret) {
718280297Sjkim        printf("bad return value (%08lX), should be %08lX\n",
719280297Sjkim               (unsigned long)cs, (unsigned long)cbc_cksum_ret);
720280297Sjkim        err = 1;
721280297Sjkim    }
722280297Sjkim    if (memcmp(cret, cbc_cksum_data, 8) != 0) {
723280297Sjkim        printf("bad cbc_cksum block returned\n");
724280297Sjkim        err = 1;
725280297Sjkim    }
72655714Skris
727280297Sjkim    printf("Doing quad_cksum\n");
728280297Sjkim    cs = des_quad_cksum(cbc_data, (des_cblock *)lqret,
729280297Sjkim                        (long)strlen((char *)cbc_data), 2,
730280297Sjkim                        (des_cblock *)cbc_iv);
731280297Sjkim    if (cs != 0x70d7a63aL) {
732280297Sjkim        printf("quad_cksum error, ret %08lx should be 70d7a63a\n",
733280297Sjkim               (unsigned long)cs);
734280297Sjkim        err = 1;
735280297Sjkim    }
736280297Sjkim#  ifdef _CRAY
737280297Sjkim    if (lqret[0].a != 0x327eba8dL) {
738280297Sjkim        printf("quad_cksum error, out[0] %08lx is not %08lx\n",
739280297Sjkim               (unsigned long)lqret[0].a, 0x327eba8dUL);
740280297Sjkim        err = 1;
741280297Sjkim    }
742280297Sjkim    if (lqret[0].b != 0x201a49ccL) {
743280297Sjkim        printf("quad_cksum error, out[1] %08lx is not %08lx\n",
744280297Sjkim               (unsigned long)lqret[0].b, 0x201a49ccUL);
745280297Sjkim        err = 1;
746280297Sjkim    }
747280297Sjkim    if (lqret[1].a != 0x70d7a63aL) {
748280297Sjkim        printf("quad_cksum error, out[2] %08lx is not %08lx\n",
749280297Sjkim               (unsigned long)lqret[1].a, 0x70d7a63aUL);
750280297Sjkim        err = 1;
751280297Sjkim    }
752280297Sjkim    if (lqret[1].b != 0x501c2c26L) {
753280297Sjkim        printf("quad_cksum error, out[3] %08lx is not %08lx\n",
754280297Sjkim               (unsigned long)lqret[1].b, 0x501c2c26UL);
755280297Sjkim        err = 1;
756280297Sjkim    }
757280297Sjkim#  else
758280297Sjkim    if (lqret[0] != 0x327eba8dL) {
759280297Sjkim        printf("quad_cksum error, out[0] %08lx is not %08lx\n",
760280297Sjkim               (unsigned long)lqret[0], 0x327eba8dUL);
761280297Sjkim        err = 1;
762280297Sjkim    }
763280297Sjkim    if (lqret[1] != 0x201a49ccL) {
764280297Sjkim        printf("quad_cksum error, out[1] %08lx is not %08lx\n",
765280297Sjkim               (unsigned long)lqret[1], 0x201a49ccUL);
766280297Sjkim        err = 1;
767280297Sjkim    }
768280297Sjkim    if (lqret[2] != 0x70d7a63aL) {
769280297Sjkim        printf("quad_cksum error, out[2] %08lx is not %08lx\n",
770280297Sjkim               (unsigned long)lqret[2], 0x70d7a63aUL);
771280297Sjkim        err = 1;
772280297Sjkim    }
773280297Sjkim    if (lqret[3] != 0x501c2c26L) {
774280297Sjkim        printf("quad_cksum error, out[3] %08lx is not %08lx\n",
775280297Sjkim               (unsigned long)lqret[3], 0x501c2c26UL);
776280297Sjkim        err = 1;
777280297Sjkim    }
778280297Sjkim#  endif
779280297Sjkim# endif
78055714Skris
781280297Sjkim    printf("input word alignment test");
782280297Sjkim    for (i = 0; i < 4; i++) {
783280297Sjkim        printf(" %d", i);
784280297Sjkim        des_ncbc_encrypt(&(cbc_out[i]), cbc_in,
785280297Sjkim                         strlen((char *)cbc_data) + 1, ks,
786280297Sjkim                         &cbc_iv, DES_ENCRYPT);
787280297Sjkim    }
788280297Sjkim    printf("\noutput word alignment test");
789280297Sjkim    for (i = 0; i < 4; i++) {
790280297Sjkim        printf(" %d", i);
791280297Sjkim        des_ncbc_encrypt(cbc_out, &(cbc_in[i]),
792280297Sjkim                         strlen((char *)cbc_data) + 1, ks,
793280297Sjkim                         &cbc_iv, DES_ENCRYPT);
794280297Sjkim    }
795280297Sjkim    printf("\n");
796280297Sjkim    printf("fast crypt test ");
797280297Sjkim    str = crypt("testing", "ef");
798280297Sjkim    if (strcmp("efGnQx2725bI2", str) != 0) {
799280297Sjkim        printf("fast crypt error, %s should be efGnQx2725bI2\n", str);
800280297Sjkim        err = 1;
801280297Sjkim    }
802280297Sjkim    str = crypt("bca76;23", "yA");
803280297Sjkim    if (strcmp("yA1Rp/1hZXIJk", str) != 0) {
804280297Sjkim        printf("fast crypt error, %s should be yA1Rp/1hZXIJk\n", str);
805280297Sjkim        err = 1;
806280297Sjkim    }
807280297Sjkim# ifdef OPENSSL_SYS_NETWARE
808280297Sjkim    if (err)
809280297Sjkim        printf("ERROR: %d\n", err);
810280297Sjkim# endif
811280297Sjkim    printf("\n");
812280297Sjkim    return (err);
813280297Sjkim}
81455714Skris
81555714Skrisstatic char *pt(unsigned char *p)
816280297Sjkim{
817280297Sjkim    static char bufs[10][20];
818280297Sjkim    static int bnum = 0;
819280297Sjkim    char *ret;
820280297Sjkim    int i;
821280297Sjkim    static char *f = "0123456789ABCDEF";
82255714Skris
823280297Sjkim    ret = &(bufs[bnum++][0]);
824280297Sjkim    bnum %= 10;
825280297Sjkim    for (i = 0; i < 8; i++) {
826280297Sjkim        ret[i * 2] = f[(p[i] >> 4) & 0xf];
827280297Sjkim        ret[i * 2 + 1] = f[p[i] & 0xf];
828280297Sjkim    }
829280297Sjkim    ret[16] = '\0';
830280297Sjkim    return (ret);
831280297Sjkim}
83255714Skris
833280297Sjkim# ifndef LIBDES_LIT
83455714Skris
83555714Skrisstatic int cfb_test(int bits, unsigned char *cfb_cipher)
836280297Sjkim{
837280297Sjkim    des_key_schedule ks;
838280297Sjkim    int i, err = 0;
83955714Skris
840280297Sjkim    DES_set_key_checked(&cfb_key, &ks);
841280297Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
842280297Sjkim    des_cfb_encrypt(plain, cfb_buf1, bits, sizeof(plain), ks, &cfb_tmp,
843280297Sjkim                    DES_ENCRYPT);
844280297Sjkim    if (memcmp(cfb_cipher, cfb_buf1, sizeof(plain)) != 0) {
845280297Sjkim        err = 1;
846280297Sjkim        printf("cfb_encrypt encrypt error\n");
847280297Sjkim        for (i = 0; i < 24; i += 8)
848280297Sjkim            printf("%s\n", pt(&(cfb_buf1[i])));
849280297Sjkim    }
850280297Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
851280297Sjkim    des_cfb_encrypt(cfb_buf1, cfb_buf2, bits, sizeof(plain), ks, &cfb_tmp,
852280297Sjkim                    DES_DECRYPT);
853280297Sjkim    if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) {
854280297Sjkim        err = 1;
855280297Sjkim        printf("cfb_encrypt decrypt error\n");
856280297Sjkim        for (i = 0; i < 24; i += 8)
857280297Sjkim            printf("%s\n", pt(&(cfb_buf1[i])));
858280297Sjkim    }
859280297Sjkim    return (err);
860280297Sjkim}
86155714Skris
86255714Skrisstatic int cfb64_test(unsigned char *cfb_cipher)
863280297Sjkim{
864280297Sjkim    des_key_schedule ks;
865280297Sjkim    int err = 0, i, n;
86655714Skris
867280297Sjkim    DES_set_key_checked(&cfb_key, &ks);
868280297Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
869280297Sjkim    n = 0;
870280297Sjkim    des_cfb64_encrypt(plain, cfb_buf1, 12, ks, &cfb_tmp, &n, DES_ENCRYPT);
871280297Sjkim    des_cfb64_encrypt(&(plain[12]), &(cfb_buf1[12]), sizeof(plain) - 12, ks,
872280297Sjkim                      &cfb_tmp, &n, DES_ENCRYPT);
873280297Sjkim    if (memcmp(cfb_cipher, cfb_buf1, sizeof(plain)) != 0) {
874280297Sjkim        err = 1;
875280297Sjkim        printf("cfb_encrypt encrypt error\n");
876280297Sjkim        for (i = 0; i < 24; i += 8)
877280297Sjkim            printf("%s\n", pt(&(cfb_buf1[i])));
878280297Sjkim    }
879280297Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
880280297Sjkim    n = 0;
881280297Sjkim    des_cfb64_encrypt(cfb_buf1, cfb_buf2, 17, ks, &cfb_tmp, &n, DES_DECRYPT);
882280297Sjkim    des_cfb64_encrypt(&(cfb_buf1[17]), &(cfb_buf2[17]),
883280297Sjkim                      sizeof(plain) - 17, ks, &cfb_tmp, &n, DES_DECRYPT);
884280297Sjkim    if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) {
885280297Sjkim        err = 1;
886280297Sjkim        printf("cfb_encrypt decrypt error\n");
887280297Sjkim        for (i = 0; i < 24; i += 8)
888280297Sjkim            printf("%s\n", pt(&(cfb_buf2[i])));
889280297Sjkim    }
890280297Sjkim    return (err);
891280297Sjkim}
89255714Skris
89355714Skrisstatic int ede_cfb64_test(unsigned char *cfb_cipher)
894280297Sjkim{
895280297Sjkim    des_key_schedule ks;
896280297Sjkim    int err = 0, i, n;
89755714Skris
898280297Sjkim    DES_set_key_checked(&cfb_key, &ks);
899280297Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
900280297Sjkim    n = 0;
901280297Sjkim    des_ede3_cfb64_encrypt(plain, cfb_buf1, 12, ks, ks, ks, &cfb_tmp, &n,
902280297Sjkim                           DES_ENCRYPT);
903280297Sjkim    des_ede3_cfb64_encrypt(&(plain[12]), &(cfb_buf1[12]),
904280297Sjkim                           sizeof(plain) - 12, ks, ks, ks,
905280297Sjkim                           &cfb_tmp, &n, DES_ENCRYPT);
906280297Sjkim    if (memcmp(cfb_cipher, cfb_buf1, sizeof(plain)) != 0) {
907280297Sjkim        err = 1;
908280297Sjkim        printf("ede_cfb_encrypt encrypt error\n");
909280297Sjkim        for (i = 0; i < 24; i += 8)
910280297Sjkim            printf("%s\n", pt(&(cfb_buf1[i])));
911280297Sjkim    }
912280297Sjkim    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv));
913280297Sjkim    n = 0;
914280297Sjkim    des_ede3_cfb64_encrypt(cfb_buf1, cfb_buf2, (long)17, ks, ks, ks,
915280297Sjkim                           &cfb_tmp, &n, DES_DECRYPT);
916280297Sjkim    des_ede3_cfb64_encrypt(&(cfb_buf1[17]), &(cfb_buf2[17]),
917280297Sjkim                           sizeof(plain) - 17, ks, ks, ks,
918280297Sjkim                           &cfb_tmp, &n, DES_DECRYPT);
919280297Sjkim    if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) {
920280297Sjkim        err = 1;
921280297Sjkim        printf("ede_cfb_encrypt decrypt error\n");
922280297Sjkim        for (i = 0; i < 24; i += 8)
923280297Sjkim            printf("%s\n", pt(&(cfb_buf2[i])));
924280297Sjkim    }
925280297Sjkim    return (err);
926280297Sjkim}
92755714Skris
928280297Sjkim# endif
92955714Skris#endif
930