155714Skris/* crypto/bf/bftest.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
59280304Sjkim/*
60280304Sjkim * This has been a quickly hacked 'ideatest.c'.  When I add tests for other
61280304Sjkim * RC2 modes, more of the code will be uncommented.
62280304Sjkim */
6355714Skris
6455714Skris#include <stdio.h>
6555714Skris#include <string.h>
6655714Skris#include <stdlib.h>
67160814Ssimon#include <openssl/opensslconf.h> /* To see if OPENSSL_NO_BF is defined */
6855714Skris
69109998Smarkm#include "../e_os.h"
70109998Smarkm
71109998Smarkm#ifdef OPENSSL_NO_BF
7255714Skrisint main(int argc, char *argv[])
7355714Skris{
7455714Skris    printf("No BF support\n");
75280304Sjkim    return (0);
7655714Skris}
7755714Skris#else
78280304Sjkim# include <openssl/blowfish.h>
7955714Skris
80280304Sjkim# ifdef CHARSET_EBCDIC
81280304Sjkim#  include <openssl/ebcdic.h>
82280304Sjkim# endif
8355714Skris
84280304Sjkimstatic char *bf_key[2] = {
85280304Sjkim    "abcdefghijklmnopqrstuvwxyz",
86280304Sjkim    "Who is John Galt?"
87280304Sjkim};
8855714Skris
8955714Skris/* big endian */
90280304Sjkimstatic BF_LONG bf_plain[2][2] = {
91280304Sjkim    {0x424c4f57L, 0x46495348L},
92280304Sjkim    {0xfedcba98L, 0x76543210L}
93280304Sjkim};
9455714Skris
95280304Sjkimstatic BF_LONG bf_cipher[2][2] = {
96280304Sjkim    {0x324ed0feL, 0xf413a203L},
97280304Sjkim    {0xcc91732bL, 0x8022f684L}
98280304Sjkim};
99280304Sjkim
10055714Skris/************/
10155714Skris
10255714Skris/* Lets use the DES test vectors :-) */
103280304Sjkim# define NUM_TESTS 34
104280304Sjkimstatic unsigned char ecb_data[NUM_TESTS][8] = {
105280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
106280304Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
107280304Sjkim    {0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
108280304Sjkim    {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
109280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
110280304Sjkim    {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
111280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
112280304Sjkim    {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
113280304Sjkim    {0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57},
114280304Sjkim    {0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E},
115280304Sjkim    {0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86},
116280304Sjkim    {0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E},
117280304Sjkim    {0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6},
118280304Sjkim    {0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE},
119280304Sjkim    {0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6},
120280304Sjkim    {0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE},
121280304Sjkim    {0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16},
122280304Sjkim    {0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F},
123280304Sjkim    {0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46},
124280304Sjkim    {0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E},
125280304Sjkim    {0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76},
126280304Sjkim    {0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07},
127280304Sjkim    {0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F},
128280304Sjkim    {0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7},
129280304Sjkim    {0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF},
130280304Sjkim    {0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6},
131280304Sjkim    {0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF},
132280304Sjkim    {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
133280304Sjkim    {0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E},
134280304Sjkim    {0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE},
135280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
136280304Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
137280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
138280304Sjkim    {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}
139280304Sjkim};
14055714Skris
141280304Sjkimstatic unsigned char plain_data[NUM_TESTS][8] = {
142280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
143280304Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
144280304Sjkim    {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
145280304Sjkim    {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
146280304Sjkim    {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
147280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
148280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
149280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
150280304Sjkim    {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42},
151280304Sjkim    {0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA},
152280304Sjkim    {0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72},
153280304Sjkim    {0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A},
154280304Sjkim    {0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2},
155280304Sjkim    {0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A},
156280304Sjkim    {0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2},
157280304Sjkim    {0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A},
158280304Sjkim    {0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02},
159280304Sjkim    {0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A},
160280304Sjkim    {0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32},
161280304Sjkim    {0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA},
162280304Sjkim    {0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62},
163280304Sjkim    {0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2},
164280304Sjkim    {0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA},
165280304Sjkim    {0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92},
166280304Sjkim    {0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A},
167280304Sjkim    {0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2},
168280304Sjkim    {0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A},
169280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
170280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
171280304Sjkim    {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
172280304Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
173280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
174280304Sjkim    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
175280304Sjkim    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
176280304Sjkim};
17755714Skris
178280304Sjkimstatic unsigned char cipher_data[NUM_TESTS][8] = {
179280304Sjkim    {0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78},
180280304Sjkim    {0x51, 0x86, 0x6F, 0xD5, 0xB8, 0x5E, 0xCB, 0x8A},
181280304Sjkim    {0x7D, 0x85, 0x6F, 0x9A, 0x61, 0x30, 0x63, 0xF2},
182280304Sjkim    {0x24, 0x66, 0xDD, 0x87, 0x8B, 0x96, 0x3C, 0x9D},
183280304Sjkim    {0x61, 0xF9, 0xC3, 0x80, 0x22, 0x81, 0xB0, 0x96},
184280304Sjkim    {0x7D, 0x0C, 0xC6, 0x30, 0xAF, 0xDA, 0x1E, 0xC7},
185280304Sjkim    {0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78},
186280304Sjkim    {0x0A, 0xCE, 0xAB, 0x0F, 0xC6, 0xA0, 0xA2, 0x8D},
187280304Sjkim    {0x59, 0xC6, 0x82, 0x45, 0xEB, 0x05, 0x28, 0x2B},
188280304Sjkim    {0xB1, 0xB8, 0xCC, 0x0B, 0x25, 0x0F, 0x09, 0xA0},
189280304Sjkim    {0x17, 0x30, 0xE5, 0x77, 0x8B, 0xEA, 0x1D, 0xA4},
190280304Sjkim    {0xA2, 0x5E, 0x78, 0x56, 0xCF, 0x26, 0x51, 0xEB},
191280304Sjkim    {0x35, 0x38, 0x82, 0xB1, 0x09, 0xCE, 0x8F, 0x1A},
192280304Sjkim    {0x48, 0xF4, 0xD0, 0x88, 0x4C, 0x37, 0x99, 0x18},
193280304Sjkim    {0x43, 0x21, 0x93, 0xB7, 0x89, 0x51, 0xFC, 0x98},
194280304Sjkim    {0x13, 0xF0, 0x41, 0x54, 0xD6, 0x9D, 0x1A, 0xE5},
195280304Sjkim    {0x2E, 0xED, 0xDA, 0x93, 0xFF, 0xD3, 0x9C, 0x79},
196280304Sjkim    {0xD8, 0x87, 0xE0, 0x39, 0x3C, 0x2D, 0xA6, 0xE3},
197280304Sjkim    {0x5F, 0x99, 0xD0, 0x4F, 0x5B, 0x16, 0x39, 0x69},
198280304Sjkim    {0x4A, 0x05, 0x7A, 0x3B, 0x24, 0xD3, 0x97, 0x7B},
199280304Sjkim    {0x45, 0x20, 0x31, 0xC1, 0xE4, 0xFA, 0xDA, 0x8E},
200280304Sjkim    {0x75, 0x55, 0xAE, 0x39, 0xF5, 0x9B, 0x87, 0xBD},
201280304Sjkim    {0x53, 0xC5, 0x5F, 0x9C, 0xB4, 0x9F, 0xC0, 0x19},
202280304Sjkim    {0x7A, 0x8E, 0x7B, 0xFA, 0x93, 0x7E, 0x89, 0xA3},
203280304Sjkim    {0xCF, 0x9C, 0x5D, 0x7A, 0x49, 0x86, 0xAD, 0xB5},
204280304Sjkim    {0xD1, 0xAB, 0xB2, 0x90, 0x65, 0x8B, 0xC7, 0x78},
205280304Sjkim    {0x55, 0xCB, 0x37, 0x74, 0xD1, 0x3E, 0xF2, 0x01},
206280304Sjkim    {0xFA, 0x34, 0xEC, 0x48, 0x47, 0xB2, 0x68, 0xB2},
207280304Sjkim    {0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE},
208280304Sjkim    {0xC3, 0x9E, 0x07, 0x2D, 0x9F, 0xAC, 0x63, 0x1D},
209280304Sjkim    {0x01, 0x49, 0x33, 0xE0, 0xCD, 0xAF, 0xF6, 0xE4},
210280304Sjkim    {0xF2, 0x1E, 0x9A, 0x77, 0xB7, 0x1C, 0x49, 0xBC},
211280304Sjkim    {0x24, 0x59, 0x46, 0x88, 0x57, 0x54, 0x36, 0x9A},
212280304Sjkim    {0x6B, 0x5C, 0x5A, 0x9C, 0x5D, 0x9E, 0x0A, 0x5A},
213280304Sjkim};
21455714Skris
215280304Sjkimstatic unsigned char cbc_key[16] = {
216280304Sjkim    0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
217280304Sjkim    0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87
218280304Sjkim};
219280304Sjkimstatic unsigned char cbc_iv[8] =
220280304Sjkim    { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
221280304Sjkimstatic char cbc_data[40] = "7654321 Now is the time for ";
222280304Sjkimstatic unsigned char cbc_ok[32] = {
223280304Sjkim    0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
224280304Sjkim    0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
225280304Sjkim    0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
226280304Sjkim    0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC
227280304Sjkim};
22855714Skris
229280304Sjkimstatic unsigned char cfb64_ok[] = {
230280304Sjkim    0xE7, 0x32, 0x14, 0xA2, 0x82, 0x21, 0x39, 0xCA,
231280304Sjkim    0xF2, 0x6E, 0xCF, 0x6D, 0x2E, 0xB9, 0xE7, 0x6E,
232280304Sjkim    0x3D, 0xA3, 0xDE, 0x04, 0xD1, 0x51, 0x72, 0x00,
233280304Sjkim    0x51, 0x9D, 0x57, 0xA6, 0xC3
234280304Sjkim};
23555714Skris
236280304Sjkimstatic unsigned char ofb64_ok[] = {
237280304Sjkim    0xE7, 0x32, 0x14, 0xA2, 0x82, 0x21, 0x39, 0xCA,
238280304Sjkim    0x62, 0xB3, 0x43, 0xCC, 0x5B, 0x65, 0x58, 0x73,
239280304Sjkim    0x10, 0xDD, 0x90, 0x8D, 0x0C, 0x24, 0x1B, 0x22,
240280304Sjkim    0x63, 0xC2, 0xCF, 0x80, 0xDA
241280304Sjkim};
24255714Skris
243280304Sjkim# define KEY_TEST_NUM    25
244280304Sjkimstatic unsigned char key_test[KEY_TEST_NUM] = {
245280304Sjkim    0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
246280304Sjkim    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
247280304Sjkim    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
248280304Sjkim    0x88
249280304Sjkim};
25055714Skris
251280304Sjkimstatic unsigned char key_data[8] =
252280304Sjkim    { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 };
25355714Skris
254280304Sjkimstatic unsigned char key_out[KEY_TEST_NUM][8] = {
255280304Sjkim    {0xF9, 0xAD, 0x59, 0x7C, 0x49, 0xDB, 0x00, 0x5E},
256280304Sjkim    {0xE9, 0x1D, 0x21, 0xC1, 0xD9, 0x61, 0xA6, 0xD6},
257280304Sjkim    {0xE9, 0xC2, 0xB7, 0x0A, 0x1B, 0xC6, 0x5C, 0xF3},
258280304Sjkim    {0xBE, 0x1E, 0x63, 0x94, 0x08, 0x64, 0x0F, 0x05},
259280304Sjkim    {0xB3, 0x9E, 0x44, 0x48, 0x1B, 0xDB, 0x1E, 0x6E},
260280304Sjkim    {0x94, 0x57, 0xAA, 0x83, 0xB1, 0x92, 0x8C, 0x0D},
261280304Sjkim    {0x8B, 0xB7, 0x70, 0x32, 0xF9, 0x60, 0x62, 0x9D},
262280304Sjkim    {0xE8, 0x7A, 0x24, 0x4E, 0x2C, 0xC8, 0x5E, 0x82},
263280304Sjkim    {0x15, 0x75, 0x0E, 0x7A, 0x4F, 0x4E, 0xC5, 0x77},
264280304Sjkim    {0x12, 0x2B, 0xA7, 0x0B, 0x3A, 0xB6, 0x4A, 0xE0},
265280304Sjkim    {0x3A, 0x83, 0x3C, 0x9A, 0xFF, 0xC5, 0x37, 0xF6},
266280304Sjkim    {0x94, 0x09, 0xDA, 0x87, 0xA9, 0x0F, 0x6B, 0xF2},
267280304Sjkim    {0x88, 0x4F, 0x80, 0x62, 0x50, 0x60, 0xB8, 0xB4},
268280304Sjkim    {0x1F, 0x85, 0x03, 0x1C, 0x19, 0xE1, 0x19, 0x68},
269280304Sjkim    {0x79, 0xD9, 0x37, 0x3A, 0x71, 0x4C, 0xA3, 0x4F},
270280304Sjkim    {0x93, 0x14, 0x28, 0x87, 0xEE, 0x3B, 0xE1, 0x5C},
271280304Sjkim    {0x03, 0x42, 0x9E, 0x83, 0x8C, 0xE2, 0xD1, 0x4B},
272280304Sjkim    {0xA4, 0x29, 0x9E, 0x27, 0x46, 0x9F, 0xF6, 0x7B},
273280304Sjkim    {0xAF, 0xD5, 0xAE, 0xD1, 0xC1, 0xBC, 0x96, 0xA8},
274280304Sjkim    {0x10, 0x85, 0x1C, 0x0E, 0x38, 0x58, 0xDA, 0x9F},
275280304Sjkim    {0xE6, 0xF5, 0x1E, 0xD7, 0x9B, 0x9D, 0xB2, 0x1F},
276280304Sjkim    {0x64, 0xA6, 0xE1, 0x4A, 0xFD, 0x36, 0xB4, 0x6F},
277280304Sjkim    {0x80, 0xC7, 0xD7, 0xD4, 0x5A, 0x54, 0x79, 0xAD},
278280304Sjkim    {0x05, 0x04, 0x4B, 0x62, 0xFA, 0x52, 0xD0, 0x80},
279280304Sjkim};
28055714Skris
281280304Sjkimstatic int test(void);
282280304Sjkimstatic int print_test_data(void);
28355714Skrisint main(int argc, char *argv[])
284280304Sjkim{
285280304Sjkim    int ret;
28655714Skris
287280304Sjkim    if (argc > 1)
288280304Sjkim        ret = print_test_data();
289280304Sjkim    else
290280304Sjkim        ret = test();
29155714Skris
292280304Sjkim# ifdef OPENSSL_SYS_NETWARE
293280304Sjkim    if (ret)
294280304Sjkim        printf("ERROR: %d\n", ret);
295280304Sjkim# endif
296280304Sjkim    EXIT(ret);
297280304Sjkim    return (0);
298280304Sjkim}
29955714Skris
30055714Skrisstatic int print_test_data(void)
301280304Sjkim{
302280304Sjkim    unsigned int i, j;
30355714Skris
304280304Sjkim    printf("ecb test data\n");
305280304Sjkim    printf("key bytes\t\tclear bytes\t\tcipher bytes\n");
306280304Sjkim    for (i = 0; i < NUM_TESTS; i++) {
307280304Sjkim        for (j = 0; j < 8; j++)
308280304Sjkim            printf("%02X", ecb_data[i][j]);
309280304Sjkim        printf("\t");
310280304Sjkim        for (j = 0; j < 8; j++)
311280304Sjkim            printf("%02X", plain_data[i][j]);
312280304Sjkim        printf("\t");
313280304Sjkim        for (j = 0; j < 8; j++)
314280304Sjkim            printf("%02X", cipher_data[i][j]);
315280304Sjkim        printf("\n");
316280304Sjkim    }
31755714Skris
318280304Sjkim    printf("set_key test data\n");
319280304Sjkim    printf("data[8]= ");
320280304Sjkim    for (j = 0; j < 8; j++)
321280304Sjkim        printf("%02X", key_data[j]);
322280304Sjkim    printf("\n");
323280304Sjkim    for (i = 0; i < KEY_TEST_NUM - 1; i++) {
324280304Sjkim        printf("c=");
325280304Sjkim        for (j = 0; j < 8; j++)
326280304Sjkim            printf("%02X", key_out[i][j]);
327280304Sjkim        printf(" k[%2u]=", i + 1);
328280304Sjkim        for (j = 0; j < i + 1; j++)
329280304Sjkim            printf("%02X", key_test[j]);
330280304Sjkim        printf("\n");
331280304Sjkim    }
33255714Skris
333280304Sjkim    printf("\nchaining mode test data\n");
334280304Sjkim    printf("key[16]   = ");
335280304Sjkim    for (j = 0; j < 16; j++)
336280304Sjkim        printf("%02X", cbc_key[j]);
337280304Sjkim    printf("\niv[8]     = ");
338280304Sjkim    for (j = 0; j < 8; j++)
339280304Sjkim        printf("%02X", cbc_iv[j]);
340280304Sjkim    printf("\ndata[%d]  = '%s'", (int)strlen(cbc_data) + 1, cbc_data);
341280304Sjkim    printf("\ndata[%d]  = ", (int)strlen(cbc_data) + 1);
342280304Sjkim    for (j = 0; j < strlen(cbc_data) + 1; j++)
343280304Sjkim        printf("%02X", cbc_data[j]);
344280304Sjkim    printf("\n");
345280304Sjkim    printf("cbc cipher text\n");
346280304Sjkim    printf("cipher[%d]= ", 32);
347280304Sjkim    for (j = 0; j < 32; j++)
348280304Sjkim        printf("%02X", cbc_ok[j]);
349280304Sjkim    printf("\n");
35055714Skris
351280304Sjkim    printf("cfb64 cipher text\n");
352280304Sjkim    printf("cipher[%d]= ", (int)strlen(cbc_data) + 1);
353280304Sjkim    for (j = 0; j < strlen(cbc_data) + 1; j++)
354280304Sjkim        printf("%02X", cfb64_ok[j]);
355280304Sjkim    printf("\n");
35655714Skris
357280304Sjkim    printf("ofb64 cipher text\n");
358280304Sjkim    printf("cipher[%d]= ", (int)strlen(cbc_data) + 1);
359280304Sjkim    for (j = 0; j < strlen(cbc_data) + 1; j++)
360280304Sjkim        printf("%02X", ofb64_ok[j]);
361280304Sjkim    printf("\n");
362280304Sjkim    return (0);
363280304Sjkim}
36455714Skris
36555714Skrisstatic int test(void)
366280304Sjkim{
367280304Sjkim    unsigned char cbc_in[40], cbc_out[40], iv[8];
368280304Sjkim    int i, n, err = 0;
369280304Sjkim    BF_KEY key;
370280304Sjkim    BF_LONG data[2];
371280304Sjkim    unsigned char out[8];
372280304Sjkim    BF_LONG len;
37355714Skris
374280304Sjkim# ifdef CHARSET_EBCDIC
375280304Sjkim    ebcdic2ascii(cbc_data, cbc_data, strlen(cbc_data));
376280304Sjkim# endif
37755714Skris
378280304Sjkim    printf("testing blowfish in raw ecb mode\n");
379280304Sjkim    for (n = 0; n < 2; n++) {
380280304Sjkim# ifdef CHARSET_EBCDIC
381280304Sjkim        ebcdic2ascii(bf_key[n], bf_key[n], strlen(bf_key[n]));
382280304Sjkim# endif
383280304Sjkim        BF_set_key(&key, strlen(bf_key[n]), (unsigned char *)bf_key[n]);
38455714Skris
385280304Sjkim        data[0] = bf_plain[n][0];
386280304Sjkim        data[1] = bf_plain[n][1];
387280304Sjkim        BF_encrypt(data, &key);
388280304Sjkim        if (memcmp(&(bf_cipher[n][0]), &(data[0]), 8) != 0) {
389280304Sjkim            printf("BF_encrypt error encrypting\n");
390280304Sjkim            printf("got     :");
391280304Sjkim            for (i = 0; i < 2; i++)
392280304Sjkim                printf("%08lX ", (unsigned long)data[i]);
393280304Sjkim            printf("\n");
394280304Sjkim            printf("expected:");
395280304Sjkim            for (i = 0; i < 2; i++)
396280304Sjkim                printf("%08lX ", (unsigned long)bf_cipher[n][i]);
397280304Sjkim            err = 1;
398280304Sjkim            printf("\n");
399280304Sjkim        }
40055714Skris
401280304Sjkim        BF_decrypt(&(data[0]), &key);
402280304Sjkim        if (memcmp(&(bf_plain[n][0]), &(data[0]), 8) != 0) {
403280304Sjkim            printf("BF_encrypt error decrypting\n");
404280304Sjkim            printf("got     :");
405280304Sjkim            for (i = 0; i < 2; i++)
406280304Sjkim                printf("%08lX ", (unsigned long)data[i]);
407280304Sjkim            printf("\n");
408280304Sjkim            printf("expected:");
409280304Sjkim            for (i = 0; i < 2; i++)
410280304Sjkim                printf("%08lX ", (unsigned long)bf_plain[n][i]);
411280304Sjkim            printf("\n");
412280304Sjkim            err = 1;
413280304Sjkim        }
414280304Sjkim    }
41555714Skris
416280304Sjkim    printf("testing blowfish in ecb mode\n");
41755714Skris
418280304Sjkim    for (n = 0; n < NUM_TESTS; n++) {
419280304Sjkim        BF_set_key(&key, 8, ecb_data[n]);
42055714Skris
421280304Sjkim        BF_ecb_encrypt(&(plain_data[n][0]), out, &key, BF_ENCRYPT);
422280304Sjkim        if (memcmp(&(cipher_data[n][0]), out, 8) != 0) {
423280304Sjkim            printf("BF_ecb_encrypt blowfish error encrypting\n");
424280304Sjkim            printf("got     :");
425280304Sjkim            for (i = 0; i < 8; i++)
426280304Sjkim                printf("%02X ", out[i]);
427280304Sjkim            printf("\n");
428280304Sjkim            printf("expected:");
429280304Sjkim            for (i = 0; i < 8; i++)
430280304Sjkim                printf("%02X ", cipher_data[n][i]);
431280304Sjkim            err = 1;
432280304Sjkim            printf("\n");
433280304Sjkim        }
43455714Skris
435280304Sjkim        BF_ecb_encrypt(out, out, &key, BF_DECRYPT);
436280304Sjkim        if (memcmp(&(plain_data[n][0]), out, 8) != 0) {
437280304Sjkim            printf("BF_ecb_encrypt error decrypting\n");
438280304Sjkim            printf("got     :");
439280304Sjkim            for (i = 0; i < 8; i++)
440280304Sjkim                printf("%02X ", out[i]);
441280304Sjkim            printf("\n");
442280304Sjkim            printf("expected:");
443280304Sjkim            for (i = 0; i < 8; i++)
444280304Sjkim                printf("%02X ", plain_data[n][i]);
445280304Sjkim            printf("\n");
446280304Sjkim            err = 1;
447280304Sjkim        }
448280304Sjkim    }
44955714Skris
450280304Sjkim    printf("testing blowfish set_key\n");
451280304Sjkim    for (n = 1; n < KEY_TEST_NUM; n++) {
452280304Sjkim        BF_set_key(&key, n, key_test);
453280304Sjkim        BF_ecb_encrypt(key_data, out, &key, BF_ENCRYPT);
454280304Sjkim        /* mips-sgi-irix6.5-gcc  vv  -mabi=64 bug workaround */
455280304Sjkim        if (memcmp(out, &(key_out[i = n - 1][0]), 8) != 0) {
456280304Sjkim            printf("blowfish setkey error\n");
457280304Sjkim            err = 1;
458280304Sjkim        }
459280304Sjkim    }
46055714Skris
461280304Sjkim    printf("testing blowfish in cbc mode\n");
462280304Sjkim    len = strlen(cbc_data) + 1;
46355714Skris
464280304Sjkim    BF_set_key(&key, 16, cbc_key);
465280304Sjkim    memset(cbc_in, 0, sizeof cbc_in);
466280304Sjkim    memset(cbc_out, 0, sizeof cbc_out);
467280304Sjkim    memcpy(iv, cbc_iv, sizeof iv);
468280304Sjkim    BF_cbc_encrypt((unsigned char *)cbc_data, cbc_out, len,
469280304Sjkim                   &key, iv, BF_ENCRYPT);
470280304Sjkim    if (memcmp(cbc_out, cbc_ok, 32) != 0) {
471280304Sjkim        err = 1;
472280304Sjkim        printf("BF_cbc_encrypt encrypt error\n");
473280304Sjkim        for (i = 0; i < 32; i++)
474280304Sjkim            printf("0x%02X,", cbc_out[i]);
475280304Sjkim    }
476280304Sjkim    memcpy(iv, cbc_iv, 8);
477280304Sjkim    BF_cbc_encrypt(cbc_out, cbc_in, len, &key, iv, BF_DECRYPT);
478280304Sjkim    if (memcmp(cbc_in, cbc_data, strlen(cbc_data) + 1) != 0) {
479280304Sjkim        printf("BF_cbc_encrypt decrypt error\n");
480280304Sjkim        err = 1;
481280304Sjkim    }
48255714Skris
483280304Sjkim    printf("testing blowfish in cfb64 mode\n");
48455714Skris
485280304Sjkim    BF_set_key(&key, 16, cbc_key);
486280304Sjkim    memset(cbc_in, 0, 40);
487280304Sjkim    memset(cbc_out, 0, 40);
488280304Sjkim    memcpy(iv, cbc_iv, 8);
489280304Sjkim    n = 0;
490280304Sjkim    BF_cfb64_encrypt((unsigned char *)cbc_data, cbc_out, (long)13,
491280304Sjkim                     &key, iv, &n, BF_ENCRYPT);
492280304Sjkim    BF_cfb64_encrypt((unsigned char *)&(cbc_data[13]), &(cbc_out[13]),
493280304Sjkim                     len - 13, &key, iv, &n, BF_ENCRYPT);
494280304Sjkim    if (memcmp(cbc_out, cfb64_ok, (int)len) != 0) {
495280304Sjkim        err = 1;
496280304Sjkim        printf("BF_cfb64_encrypt encrypt error\n");
497280304Sjkim        for (i = 0; i < (int)len; i++)
498280304Sjkim            printf("0x%02X,", cbc_out[i]);
499280304Sjkim    }
500280304Sjkim    n = 0;
501280304Sjkim    memcpy(iv, cbc_iv, 8);
502280304Sjkim    BF_cfb64_encrypt(cbc_out, cbc_in, 17, &key, iv, &n, BF_DECRYPT);
503280304Sjkim    BF_cfb64_encrypt(&(cbc_out[17]), &(cbc_in[17]), len - 17,
504280304Sjkim                     &key, iv, &n, BF_DECRYPT);
505280304Sjkim    if (memcmp(cbc_in, cbc_data, (int)len) != 0) {
506280304Sjkim        printf("BF_cfb64_encrypt decrypt error\n");
507280304Sjkim        err = 1;
508280304Sjkim    }
50955714Skris
510280304Sjkim    printf("testing blowfish in ofb64\n");
51155714Skris
512280304Sjkim    BF_set_key(&key, 16, cbc_key);
513280304Sjkim    memset(cbc_in, 0, 40);
514280304Sjkim    memset(cbc_out, 0, 40);
515280304Sjkim    memcpy(iv, cbc_iv, 8);
516280304Sjkim    n = 0;
517280304Sjkim    BF_ofb64_encrypt((unsigned char *)cbc_data, cbc_out, (long)13, &key, iv,
518280304Sjkim                     &n);
519280304Sjkim    BF_ofb64_encrypt((unsigned char *)&(cbc_data[13]), &(cbc_out[13]),
520280304Sjkim                     len - 13, &key, iv, &n);
521280304Sjkim    if (memcmp(cbc_out, ofb64_ok, (int)len) != 0) {
522280304Sjkim        err = 1;
523280304Sjkim        printf("BF_ofb64_encrypt encrypt error\n");
524280304Sjkim        for (i = 0; i < (int)len; i++)
525280304Sjkim            printf("0x%02X,", cbc_out[i]);
526280304Sjkim    }
527280304Sjkim    n = 0;
528280304Sjkim    memcpy(iv, cbc_iv, 8);
529280304Sjkim    BF_ofb64_encrypt(cbc_out, cbc_in, 17, &key, iv, &n);
530280304Sjkim    BF_ofb64_encrypt(&(cbc_out[17]), &(cbc_in[17]), len - 17, &key, iv, &n);
531280304Sjkim    if (memcmp(cbc_in, cbc_data, (int)len) != 0) {
532280304Sjkim        printf("BF_ofb64_encrypt decrypt error\n");
533280304Sjkim        err = 1;
534280304Sjkim    }
53555714Skris
536280304Sjkim    return (err);
537280304Sjkim}
53855714Skris#endif
539