xref: /netbsd-src/crypto/external/bsd/openssl/dist/test/bftest.c (revision 8fbed61efdd901c0e09614c9f45356aeeab23fe3)
1c7da899bSchristos /*
2*8fbed61eSchristos  * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3c7da899bSchristos  *
4*8fbed61eSchristos  * Licensed under the Apache License 2.0 (the "License").  You may not use
5c7da899bSchristos  * this file except in compliance with the License.  You can obtain a copy
6c7da899bSchristos  * in the file LICENSE in the source distribution or at
7c7da899bSchristos  * https://www.openssl.org/source/license.html
8c7da899bSchristos  */
9c7da899bSchristos 
10c7da899bSchristos /*
11*8fbed61eSchristos  * BF low level APIs are deprecated for public use, but still ok for internal
12*8fbed61eSchristos  * use.
13c7da899bSchristos  */
14*8fbed61eSchristos #include "internal/deprecated.h"
15c7da899bSchristos 
16c7da899bSchristos #include <stdio.h>
17c7da899bSchristos #include <string.h>
18c7da899bSchristos #include <stdlib.h>
19c7da899bSchristos #include <openssl/opensslconf.h> /* To see if OPENSSL_NO_BF is defined */
20e0ea3921Schristos #include "testutil.h"
21c7da899bSchristos 
22e0ea3921Schristos #include "internal/nelem.h"
23c7da899bSchristos 
24e0ea3921Schristos #ifndef OPENSSL_NO_BF
25c7da899bSchristos # include <openssl/blowfish.h>
26c7da899bSchristos 
27c7da899bSchristos # ifdef CHARSET_EBCDIC
28c7da899bSchristos #  include <openssl/ebcdic.h>
29c7da899bSchristos # endif
30c7da899bSchristos 
31c7da899bSchristos static char bf_key[2][30] = {
32c7da899bSchristos     "abcdefghijklmnopqrstuvwxyz",
33c7da899bSchristos     "Who is John Galt?"
34c7da899bSchristos };
35c7da899bSchristos 
36c7da899bSchristos /* big endian */
37c7da899bSchristos static BF_LONG bf_plain[2][2] = {
38c7da899bSchristos     {0x424c4f57L, 0x46495348L},
39c7da899bSchristos     {0xfedcba98L, 0x76543210L}
40c7da899bSchristos };
41c7da899bSchristos 
42c7da899bSchristos static BF_LONG bf_cipher[2][2] = {
43c7da899bSchristos     {0x324ed0feL, 0xf413a203L},
44c7da899bSchristos     {0xcc91732bL, 0x8022f684L}
45c7da899bSchristos };
46c7da899bSchristos 
47c7da899bSchristos /************/
48c7da899bSchristos 
49c7da899bSchristos /* Lets use the DES test vectors :-) */
50c7da899bSchristos # define NUM_TESTS 34
51c7da899bSchristos static unsigned char ecb_data[NUM_TESTS][8] = {
52c7da899bSchristos     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
53c7da899bSchristos     {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
54c7da899bSchristos     {0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
55c7da899bSchristos     {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
56c7da899bSchristos     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
57c7da899bSchristos     {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
58c7da899bSchristos     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
59c7da899bSchristos     {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
60c7da899bSchristos     {0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57},
61c7da899bSchristos     {0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E},
62c7da899bSchristos     {0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86},
63c7da899bSchristos     {0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E},
64c7da899bSchristos     {0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6},
65c7da899bSchristos     {0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE},
66c7da899bSchristos     {0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6},
67c7da899bSchristos     {0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE},
68c7da899bSchristos     {0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16},
69c7da899bSchristos     {0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F},
70c7da899bSchristos     {0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46},
71c7da899bSchristos     {0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E},
72c7da899bSchristos     {0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76},
73c7da899bSchristos     {0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07},
74c7da899bSchristos     {0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F},
75c7da899bSchristos     {0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7},
76c7da899bSchristos     {0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF},
77c7da899bSchristos     {0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6},
78c7da899bSchristos     {0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF},
79c7da899bSchristos     {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
80c7da899bSchristos     {0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E},
81c7da899bSchristos     {0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE},
82c7da899bSchristos     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
83c7da899bSchristos     {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
84c7da899bSchristos     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
85c7da899bSchristos     {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}
86c7da899bSchristos };
87c7da899bSchristos 
88c7da899bSchristos static unsigned char plain_data[NUM_TESTS][8] = {
89c7da899bSchristos     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
90c7da899bSchristos     {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
91c7da899bSchristos     {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
92c7da899bSchristos     {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
93c7da899bSchristos     {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
94c7da899bSchristos     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
95c7da899bSchristos     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
96c7da899bSchristos     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
97c7da899bSchristos     {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42},
98c7da899bSchristos     {0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA},
99c7da899bSchristos     {0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72},
100c7da899bSchristos     {0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A},
101c7da899bSchristos     {0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2},
102c7da899bSchristos     {0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A},
103c7da899bSchristos     {0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2},
104c7da899bSchristos     {0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A},
105c7da899bSchristos     {0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02},
106c7da899bSchristos     {0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A},
107c7da899bSchristos     {0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32},
108c7da899bSchristos     {0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA},
109c7da899bSchristos     {0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62},
110c7da899bSchristos     {0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2},
111c7da899bSchristos     {0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA},
112c7da899bSchristos     {0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92},
113c7da899bSchristos     {0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A},
114c7da899bSchristos     {0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2},
115c7da899bSchristos     {0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A},
116c7da899bSchristos     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
117c7da899bSchristos     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
118c7da899bSchristos     {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
119c7da899bSchristos     {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
120c7da899bSchristos     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
121c7da899bSchristos     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
122c7da899bSchristos     {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
123c7da899bSchristos };
124c7da899bSchristos 
125c7da899bSchristos static unsigned char cipher_data[NUM_TESTS][8] = {
126c7da899bSchristos     {0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78},
127c7da899bSchristos     {0x51, 0x86, 0x6F, 0xD5, 0xB8, 0x5E, 0xCB, 0x8A},
128c7da899bSchristos     {0x7D, 0x85, 0x6F, 0x9A, 0x61, 0x30, 0x63, 0xF2},
129c7da899bSchristos     {0x24, 0x66, 0xDD, 0x87, 0x8B, 0x96, 0x3C, 0x9D},
130c7da899bSchristos     {0x61, 0xF9, 0xC3, 0x80, 0x22, 0x81, 0xB0, 0x96},
131c7da899bSchristos     {0x7D, 0x0C, 0xC6, 0x30, 0xAF, 0xDA, 0x1E, 0xC7},
132c7da899bSchristos     {0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78},
133c7da899bSchristos     {0x0A, 0xCE, 0xAB, 0x0F, 0xC6, 0xA0, 0xA2, 0x8D},
134c7da899bSchristos     {0x59, 0xC6, 0x82, 0x45, 0xEB, 0x05, 0x28, 0x2B},
135c7da899bSchristos     {0xB1, 0xB8, 0xCC, 0x0B, 0x25, 0x0F, 0x09, 0xA0},
136c7da899bSchristos     {0x17, 0x30, 0xE5, 0x77, 0x8B, 0xEA, 0x1D, 0xA4},
137c7da899bSchristos     {0xA2, 0x5E, 0x78, 0x56, 0xCF, 0x26, 0x51, 0xEB},
138c7da899bSchristos     {0x35, 0x38, 0x82, 0xB1, 0x09, 0xCE, 0x8F, 0x1A},
139c7da899bSchristos     {0x48, 0xF4, 0xD0, 0x88, 0x4C, 0x37, 0x99, 0x18},
140c7da899bSchristos     {0x43, 0x21, 0x93, 0xB7, 0x89, 0x51, 0xFC, 0x98},
141c7da899bSchristos     {0x13, 0xF0, 0x41, 0x54, 0xD6, 0x9D, 0x1A, 0xE5},
142c7da899bSchristos     {0x2E, 0xED, 0xDA, 0x93, 0xFF, 0xD3, 0x9C, 0x79},
143c7da899bSchristos     {0xD8, 0x87, 0xE0, 0x39, 0x3C, 0x2D, 0xA6, 0xE3},
144c7da899bSchristos     {0x5F, 0x99, 0xD0, 0x4F, 0x5B, 0x16, 0x39, 0x69},
145c7da899bSchristos     {0x4A, 0x05, 0x7A, 0x3B, 0x24, 0xD3, 0x97, 0x7B},
146c7da899bSchristos     {0x45, 0x20, 0x31, 0xC1, 0xE4, 0xFA, 0xDA, 0x8E},
147c7da899bSchristos     {0x75, 0x55, 0xAE, 0x39, 0xF5, 0x9B, 0x87, 0xBD},
148c7da899bSchristos     {0x53, 0xC5, 0x5F, 0x9C, 0xB4, 0x9F, 0xC0, 0x19},
149c7da899bSchristos     {0x7A, 0x8E, 0x7B, 0xFA, 0x93, 0x7E, 0x89, 0xA3},
150c7da899bSchristos     {0xCF, 0x9C, 0x5D, 0x7A, 0x49, 0x86, 0xAD, 0xB5},
151c7da899bSchristos     {0xD1, 0xAB, 0xB2, 0x90, 0x65, 0x8B, 0xC7, 0x78},
152c7da899bSchristos     {0x55, 0xCB, 0x37, 0x74, 0xD1, 0x3E, 0xF2, 0x01},
153c7da899bSchristos     {0xFA, 0x34, 0xEC, 0x48, 0x47, 0xB2, 0x68, 0xB2},
154c7da899bSchristos     {0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE},
155c7da899bSchristos     {0xC3, 0x9E, 0x07, 0x2D, 0x9F, 0xAC, 0x63, 0x1D},
156c7da899bSchristos     {0x01, 0x49, 0x33, 0xE0, 0xCD, 0xAF, 0xF6, 0xE4},
157c7da899bSchristos     {0xF2, 0x1E, 0x9A, 0x77, 0xB7, 0x1C, 0x49, 0xBC},
158c7da899bSchristos     {0x24, 0x59, 0x46, 0x88, 0x57, 0x54, 0x36, 0x9A},
159c7da899bSchristos     {0x6B, 0x5C, 0x5A, 0x9C, 0x5D, 0x9E, 0x0A, 0x5A},
160c7da899bSchristos };
161c7da899bSchristos 
162c7da899bSchristos static unsigned char cbc_key[16] = {
163c7da899bSchristos     0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
164c7da899bSchristos     0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87
165c7da899bSchristos };
166c7da899bSchristos static unsigned char cbc_iv[8] =
167c7da899bSchristos     { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
168c7da899bSchristos static char cbc_data[40] = "7654321 Now is the time for ";
169c7da899bSchristos static unsigned char cbc_ok[32] = {
170c7da899bSchristos     0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
171c7da899bSchristos     0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
172c7da899bSchristos     0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
173c7da899bSchristos     0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC
174c7da899bSchristos };
175c7da899bSchristos 
176c7da899bSchristos static unsigned char cfb64_ok[] = {
177c7da899bSchristos     0xE7, 0x32, 0x14, 0xA2, 0x82, 0x21, 0x39, 0xCA,
178c7da899bSchristos     0xF2, 0x6E, 0xCF, 0x6D, 0x2E, 0xB9, 0xE7, 0x6E,
179c7da899bSchristos     0x3D, 0xA3, 0xDE, 0x04, 0xD1, 0x51, 0x72, 0x00,
180c7da899bSchristos     0x51, 0x9D, 0x57, 0xA6, 0xC3
181c7da899bSchristos };
182c7da899bSchristos 
183c7da899bSchristos static unsigned char ofb64_ok[] = {
184c7da899bSchristos     0xE7, 0x32, 0x14, 0xA2, 0x82, 0x21, 0x39, 0xCA,
185c7da899bSchristos     0x62, 0xB3, 0x43, 0xCC, 0x5B, 0x65, 0x58, 0x73,
186c7da899bSchristos     0x10, 0xDD, 0x90, 0x8D, 0x0C, 0x24, 0x1B, 0x22,
187c7da899bSchristos     0x63, 0xC2, 0xCF, 0x80, 0xDA
188c7da899bSchristos };
189c7da899bSchristos 
190c7da899bSchristos # define KEY_TEST_NUM    25
191c7da899bSchristos static unsigned char key_test[KEY_TEST_NUM] = {
192c7da899bSchristos     0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
193c7da899bSchristos     0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
194c7da899bSchristos     0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
195c7da899bSchristos     0x88
196c7da899bSchristos };
197c7da899bSchristos 
198c7da899bSchristos static unsigned char key_data[8] =
199c7da899bSchristos     { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 };
200c7da899bSchristos 
201c7da899bSchristos static unsigned char key_out[KEY_TEST_NUM][8] = {
202c7da899bSchristos     {0xF9, 0xAD, 0x59, 0x7C, 0x49, 0xDB, 0x00, 0x5E},
203c7da899bSchristos     {0xE9, 0x1D, 0x21, 0xC1, 0xD9, 0x61, 0xA6, 0xD6},
204c7da899bSchristos     {0xE9, 0xC2, 0xB7, 0x0A, 0x1B, 0xC6, 0x5C, 0xF3},
205c7da899bSchristos     {0xBE, 0x1E, 0x63, 0x94, 0x08, 0x64, 0x0F, 0x05},
206c7da899bSchristos     {0xB3, 0x9E, 0x44, 0x48, 0x1B, 0xDB, 0x1E, 0x6E},
207c7da899bSchristos     {0x94, 0x57, 0xAA, 0x83, 0xB1, 0x92, 0x8C, 0x0D},
208c7da899bSchristos     {0x8B, 0xB7, 0x70, 0x32, 0xF9, 0x60, 0x62, 0x9D},
209c7da899bSchristos     {0xE8, 0x7A, 0x24, 0x4E, 0x2C, 0xC8, 0x5E, 0x82},
210c7da899bSchristos     {0x15, 0x75, 0x0E, 0x7A, 0x4F, 0x4E, 0xC5, 0x77},
211c7da899bSchristos     {0x12, 0x2B, 0xA7, 0x0B, 0x3A, 0xB6, 0x4A, 0xE0},
212c7da899bSchristos     {0x3A, 0x83, 0x3C, 0x9A, 0xFF, 0xC5, 0x37, 0xF6},
213c7da899bSchristos     {0x94, 0x09, 0xDA, 0x87, 0xA9, 0x0F, 0x6B, 0xF2},
214c7da899bSchristos     {0x88, 0x4F, 0x80, 0x62, 0x50, 0x60, 0xB8, 0xB4},
215c7da899bSchristos     {0x1F, 0x85, 0x03, 0x1C, 0x19, 0xE1, 0x19, 0x68},
216c7da899bSchristos     {0x79, 0xD9, 0x37, 0x3A, 0x71, 0x4C, 0xA3, 0x4F},
217c7da899bSchristos     {0x93, 0x14, 0x28, 0x87, 0xEE, 0x3B, 0xE1, 0x5C},
218c7da899bSchristos     {0x03, 0x42, 0x9E, 0x83, 0x8C, 0xE2, 0xD1, 0x4B},
219c7da899bSchristos     {0xA4, 0x29, 0x9E, 0x27, 0x46, 0x9F, 0xF6, 0x7B},
220c7da899bSchristos     {0xAF, 0xD5, 0xAE, 0xD1, 0xC1, 0xBC, 0x96, 0xA8},
221c7da899bSchristos     {0x10, 0x85, 0x1C, 0x0E, 0x38, 0x58, 0xDA, 0x9F},
222c7da899bSchristos     {0xE6, 0xF5, 0x1E, 0xD7, 0x9B, 0x9D, 0xB2, 0x1F},
223c7da899bSchristos     {0x64, 0xA6, 0xE1, 0x4A, 0xFD, 0x36, 0xB4, 0x6F},
224c7da899bSchristos     {0x80, 0xC7, 0xD7, 0xD4, 0x5A, 0x54, 0x79, 0xAD},
225c7da899bSchristos     {0x05, 0x04, 0x4B, 0x62, 0xFA, 0x52, 0xD0, 0x80},
226c7da899bSchristos };
227c7da899bSchristos 
print_test_data(void)228c7da899bSchristos static int print_test_data(void)
229c7da899bSchristos {
230c7da899bSchristos     unsigned int i, j;
231c7da899bSchristos 
232c7da899bSchristos     printf("ecb test data\n");
233c7da899bSchristos     printf("key bytes\t\tclear bytes\t\tcipher bytes\n");
234c7da899bSchristos     for (i = 0; i < NUM_TESTS; i++) {
235c7da899bSchristos         for (j = 0; j < 8; j++)
236c7da899bSchristos             printf("%02X", ecb_data[i][j]);
237c7da899bSchristos         printf("\t");
238c7da899bSchristos         for (j = 0; j < 8; j++)
239c7da899bSchristos             printf("%02X", plain_data[i][j]);
240c7da899bSchristos         printf("\t");
241c7da899bSchristos         for (j = 0; j < 8; j++)
242c7da899bSchristos             printf("%02X", cipher_data[i][j]);
243c7da899bSchristos         printf("\n");
244c7da899bSchristos     }
245c7da899bSchristos 
246c7da899bSchristos     printf("set_key test data\n");
247c7da899bSchristos     printf("data[8]= ");
248c7da899bSchristos     for (j = 0; j < 8; j++)
249c7da899bSchristos         printf("%02X", key_data[j]);
250c7da899bSchristos     printf("\n");
251c7da899bSchristos     for (i = 0; i < KEY_TEST_NUM - 1; i++) {
252c7da899bSchristos         printf("c=");
253c7da899bSchristos         for (j = 0; j < 8; j++)
254c7da899bSchristos             printf("%02X", key_out[i][j]);
255c7da899bSchristos         printf(" k[%2u]=", i + 1);
256c7da899bSchristos         for (j = 0; j < i + 1; j++)
257c7da899bSchristos             printf("%02X", key_test[j]);
258c7da899bSchristos         printf("\n");
259c7da899bSchristos     }
260c7da899bSchristos 
261c7da899bSchristos     printf("\nchaining mode test data\n");
262c7da899bSchristos     printf("key[16]   = ");
263c7da899bSchristos     for (j = 0; j < 16; j++)
264c7da899bSchristos         printf("%02X", cbc_key[j]);
265c7da899bSchristos     printf("\niv[8]     = ");
266c7da899bSchristos     for (j = 0; j < 8; j++)
267c7da899bSchristos         printf("%02X", cbc_iv[j]);
268c7da899bSchristos     printf("\ndata[%d]  = '%s'", (int)strlen(cbc_data) + 1, cbc_data);
269c7da899bSchristos     printf("\ndata[%d]  = ", (int)strlen(cbc_data) + 1);
270c7da899bSchristos     for (j = 0; j < strlen(cbc_data) + 1; j++)
271c7da899bSchristos         printf("%02X", cbc_data[j]);
272c7da899bSchristos     printf("\n");
273c7da899bSchristos     printf("cbc cipher text\n");
274c7da899bSchristos     printf("cipher[%d]= ", 32);
275c7da899bSchristos     for (j = 0; j < 32; j++)
276c7da899bSchristos         printf("%02X", cbc_ok[j]);
277c7da899bSchristos     printf("\n");
278c7da899bSchristos 
279c7da899bSchristos     printf("cfb64 cipher text\n");
280c7da899bSchristos     printf("cipher[%d]= ", (int)strlen(cbc_data) + 1);
281c7da899bSchristos     for (j = 0; j < strlen(cbc_data) + 1; j++)
282c7da899bSchristos         printf("%02X", cfb64_ok[j]);
283c7da899bSchristos     printf("\n");
284c7da899bSchristos 
285c7da899bSchristos     printf("ofb64 cipher text\n");
286c7da899bSchristos     printf("cipher[%d]= ", (int)strlen(cbc_data) + 1);
287c7da899bSchristos     for (j = 0; j < strlen(cbc_data) + 1; j++)
288c7da899bSchristos         printf("%02X", ofb64_ok[j]);
289c7da899bSchristos     printf("\n");
290e0ea3921Schristos     return 0;
291c7da899bSchristos }
292c7da899bSchristos 
test_bf_ecb_raw(int n)293e0ea3921Schristos static int test_bf_ecb_raw(int n)
294c7da899bSchristos {
295e0ea3921Schristos     int ret = 1;
296c7da899bSchristos     BF_KEY key;
297c7da899bSchristos     BF_LONG data[2];
298c7da899bSchristos 
299c7da899bSchristos     BF_set_key(&key, strlen(bf_key[n]), (unsigned char *)bf_key[n]);
300c7da899bSchristos 
301c7da899bSchristos     data[0] = bf_plain[n][0];
302c7da899bSchristos     data[1] = bf_plain[n][1];
303c7da899bSchristos     BF_encrypt(data, &key);
304e0ea3921Schristos     if (!TEST_mem_eq(&(bf_cipher[n][0]), BF_BLOCK, &(data[0]), BF_BLOCK))
305e0ea3921Schristos         ret = 0;
306c7da899bSchristos 
307c7da899bSchristos     BF_decrypt(&(data[0]), &key);
308e0ea3921Schristos     if (!TEST_mem_eq(&(bf_plain[n][0]), BF_BLOCK, &(data[0]), BF_BLOCK))
309e0ea3921Schristos         ret = 0;
310e0ea3921Schristos 
311e0ea3921Schristos     return ret;
312c7da899bSchristos }
313c7da899bSchristos 
test_bf_ecb(int n)314e0ea3921Schristos static int test_bf_ecb(int n)
315e0ea3921Schristos {
316e0ea3921Schristos     int ret = 1;
317e0ea3921Schristos     BF_KEY key;
318e0ea3921Schristos     unsigned char out[8];
319c7da899bSchristos 
320c7da899bSchristos     BF_set_key(&key, 8, ecb_data[n]);
321c7da899bSchristos 
322c7da899bSchristos     BF_ecb_encrypt(&(plain_data[n][0]), out, &key, BF_ENCRYPT);
323e0ea3921Schristos     if (!TEST_mem_eq(&(cipher_data[n][0]), BF_BLOCK, out, BF_BLOCK))
324e0ea3921Schristos         ret = 0;
325c7da899bSchristos 
326c7da899bSchristos     BF_ecb_encrypt(out, out, &key, BF_DECRYPT);
327e0ea3921Schristos     if (!TEST_mem_eq(&(plain_data[n][0]), BF_BLOCK, out, BF_BLOCK))
328e0ea3921Schristos         ret = 0;
329e0ea3921Schristos 
330e0ea3921Schristos     return ret;
331c7da899bSchristos }
332c7da899bSchristos 
test_bf_set_key(int n)333e0ea3921Schristos static int test_bf_set_key(int n)
334e0ea3921Schristos {
335e0ea3921Schristos     int ret = 1;
336e0ea3921Schristos     BF_KEY key;
337e0ea3921Schristos     unsigned char out[8];
338e0ea3921Schristos 
339e0ea3921Schristos     BF_set_key(&key, n+1, key_test);
340c7da899bSchristos     BF_ecb_encrypt(key_data, out, &key, BF_ENCRYPT);
341c7da899bSchristos     /* mips-sgi-irix6.5-gcc  vv  -mabi=64 bug workaround */
342e0ea3921Schristos     if (!TEST_mem_eq(out, 8, &(key_out[n][0]), 8))
343e0ea3921Schristos         ret = 0;
344e0ea3921Schristos 
345e0ea3921Schristos     return ret;
346c7da899bSchristos }
347c7da899bSchristos 
test_bf_cbc(void)348e0ea3921Schristos static int test_bf_cbc(void)
349e0ea3921Schristos {
350e0ea3921Schristos     unsigned char cbc_in[40], cbc_out[40], iv[8];
351e0ea3921Schristos     int ret = 1;
352e0ea3921Schristos     BF_KEY key;
353e0ea3921Schristos     BF_LONG len;
354e0ea3921Schristos 
355c7da899bSchristos     len = strlen(cbc_data) + 1;
356c7da899bSchristos 
357c7da899bSchristos     BF_set_key(&key, 16, cbc_key);
358c7da899bSchristos     memset(cbc_in, 0, sizeof(cbc_in));
359c7da899bSchristos     memset(cbc_out, 0, sizeof(cbc_out));
36078327f04Schristos     memcpy(iv, cbc_iv, sizeof(iv));
361c7da899bSchristos     BF_cbc_encrypt((unsigned char *)cbc_data, cbc_out, len,
362c7da899bSchristos                    &key, iv, BF_ENCRYPT);
363e0ea3921Schristos     if (!TEST_mem_eq(cbc_out, 32, cbc_ok, 32))
364e0ea3921Schristos         ret = 0;
365e0ea3921Schristos 
366c7da899bSchristos     memcpy(iv, cbc_iv, 8);
367c7da899bSchristos     BF_cbc_encrypt(cbc_out, cbc_in, len, &key, iv, BF_DECRYPT);
368e0ea3921Schristos     if (!TEST_mem_eq(cbc_in, len, cbc_data, strlen(cbc_data) + 1))
369e0ea3921Schristos         ret = 0;
370e0ea3921Schristos 
371e0ea3921Schristos     return ret;
372c7da899bSchristos }
373c7da899bSchristos 
test_bf_cfb64(void)374e0ea3921Schristos static int test_bf_cfb64(void)
375e0ea3921Schristos {
376e0ea3921Schristos     unsigned char cbc_in[40], cbc_out[40], iv[8];
377e0ea3921Schristos     int n, ret = 1;
378e0ea3921Schristos     BF_KEY key;
379e0ea3921Schristos     BF_LONG len;
380e0ea3921Schristos 
381e0ea3921Schristos     len = strlen(cbc_data) + 1;
382c7da899bSchristos 
383c7da899bSchristos     BF_set_key(&key, 16, cbc_key);
384c7da899bSchristos     memset(cbc_in, 0, 40);
385c7da899bSchristos     memset(cbc_out, 0, 40);
386c7da899bSchristos     memcpy(iv, cbc_iv, 8);
387c7da899bSchristos     n = 0;
388c7da899bSchristos     BF_cfb64_encrypt((unsigned char *)cbc_data, cbc_out, (long)13,
389c7da899bSchristos                      &key, iv, &n, BF_ENCRYPT);
390c7da899bSchristos     BF_cfb64_encrypt((unsigned char *)&(cbc_data[13]), &(cbc_out[13]),
391c7da899bSchristos                      len - 13, &key, iv, &n, BF_ENCRYPT);
392e0ea3921Schristos     if (!TEST_mem_eq(cbc_out, (int)len, cfb64_ok, (int)len))
393e0ea3921Schristos         ret = 0;
394e0ea3921Schristos 
395c7da899bSchristos     n = 0;
396c7da899bSchristos     memcpy(iv, cbc_iv, 8);
397c7da899bSchristos     BF_cfb64_encrypt(cbc_out, cbc_in, 17, &key, iv, &n, BF_DECRYPT);
398c7da899bSchristos     BF_cfb64_encrypt(&(cbc_out[17]), &(cbc_in[17]), len - 17,
399c7da899bSchristos                      &key, iv, &n, BF_DECRYPT);
400e0ea3921Schristos     if (!TEST_mem_eq(cbc_in, (int)len, cbc_data, (int)len))
401e0ea3921Schristos         ret = 0;
402e0ea3921Schristos 
403e0ea3921Schristos     return ret;
404c7da899bSchristos }
405c7da899bSchristos 
test_bf_ofb64(void)406e0ea3921Schristos static int test_bf_ofb64(void)
407e0ea3921Schristos {
408e0ea3921Schristos     unsigned char cbc_in[40], cbc_out[40], iv[8];
409e0ea3921Schristos     int n, ret = 1;
410e0ea3921Schristos     BF_KEY key;
411e0ea3921Schristos     BF_LONG len;
412e0ea3921Schristos 
413e0ea3921Schristos     len = strlen(cbc_data) + 1;
414c7da899bSchristos 
415c7da899bSchristos     BF_set_key(&key, 16, cbc_key);
416c7da899bSchristos     memset(cbc_in, 0, 40);
417c7da899bSchristos     memset(cbc_out, 0, 40);
418c7da899bSchristos     memcpy(iv, cbc_iv, 8);
419c7da899bSchristos     n = 0;
420c7da899bSchristos     BF_ofb64_encrypt((unsigned char *)cbc_data, cbc_out, (long)13, &key, iv,
421c7da899bSchristos                      &n);
422c7da899bSchristos     BF_ofb64_encrypt((unsigned char *)&(cbc_data[13]), &(cbc_out[13]),
423c7da899bSchristos                      len - 13, &key, iv, &n);
424e0ea3921Schristos     if (!TEST_mem_eq(cbc_out, (int)len, ofb64_ok, (int)len))
425e0ea3921Schristos         ret = 0;
426e0ea3921Schristos 
427c7da899bSchristos     n = 0;
428c7da899bSchristos     memcpy(iv, cbc_iv, 8);
429c7da899bSchristos     BF_ofb64_encrypt(cbc_out, cbc_in, 17, &key, iv, &n);
430c7da899bSchristos     BF_ofb64_encrypt(&(cbc_out[17]), &(cbc_in[17]), len - 17, &key, iv, &n);
431e0ea3921Schristos     if (!TEST_mem_eq(cbc_in, (int)len, cbc_data, (int)len))
432e0ea3921Schristos         ret = 0;
433c7da899bSchristos 
434e0ea3921Schristos     return ret;
435c7da899bSchristos }
436c7da899bSchristos #endif
437e0ea3921Schristos 
438*8fbed61eSchristos typedef enum OPTION_choice {
439*8fbed61eSchristos     OPT_ERR = -1,
440*8fbed61eSchristos     OPT_EOF = 0,
441*8fbed61eSchristos     OPT_PRINT,
442*8fbed61eSchristos     OPT_TEST_ENUM
443*8fbed61eSchristos } OPTION_CHOICE;
444*8fbed61eSchristos 
test_get_options(void)445*8fbed61eSchristos const OPTIONS *test_get_options(void)
446*8fbed61eSchristos {
447*8fbed61eSchristos     static const OPTIONS test_options[] = {
448*8fbed61eSchristos         OPT_TEST_OPTIONS_DEFAULT_USAGE,
449*8fbed61eSchristos         { "print", OPT_PRINT, '-', "Output test tables instead of running tests"},
450*8fbed61eSchristos         { NULL }
451*8fbed61eSchristos     };
452*8fbed61eSchristos     return test_options;
453*8fbed61eSchristos }
454*8fbed61eSchristos 
setup_tests(void)455e0ea3921Schristos int setup_tests(void)
456e0ea3921Schristos {
457e0ea3921Schristos #ifndef OPENSSL_NO_BF
458*8fbed61eSchristos     OPTION_CHOICE o;
459e0ea3921Schristos # ifdef CHARSET_EBCDIC
460e0ea3921Schristos     int n;
461e0ea3921Schristos     ebcdic2ascii(cbc_data, cbc_data, strlen(cbc_data));
462e0ea3921Schristos     for (n = 0; n < 2; n++) {
463e0ea3921Schristos         ebcdic2ascii(bf_key[n], bf_key[n], strlen(bf_key[n]));
464e0ea3921Schristos     }
465e0ea3921Schristos # endif
466e0ea3921Schristos 
467*8fbed61eSchristos     while ((o = opt_next()) != OPT_EOF) {
468*8fbed61eSchristos         switch(o) {
469*8fbed61eSchristos         case OPT_PRINT:
470e0ea3921Schristos             print_test_data();
471*8fbed61eSchristos             return 1;
472*8fbed61eSchristos         case OPT_TEST_CASES:
473*8fbed61eSchristos             break;
474*8fbed61eSchristos         default:
475*8fbed61eSchristos            return 0;
476*8fbed61eSchristos         }
477*8fbed61eSchristos     }
478*8fbed61eSchristos 
479e0ea3921Schristos     ADD_ALL_TESTS(test_bf_ecb_raw, 2);
480e0ea3921Schristos     ADD_ALL_TESTS(test_bf_ecb, NUM_TESTS);
481e0ea3921Schristos     ADD_ALL_TESTS(test_bf_set_key, KEY_TEST_NUM-1);
482e0ea3921Schristos     ADD_TEST(test_bf_cbc);
483e0ea3921Schristos     ADD_TEST(test_bf_cfb64);
484e0ea3921Schristos     ADD_TEST(test_bf_ofb64);
485e0ea3921Schristos #endif
486e0ea3921Schristos     return 1;
487e0ea3921Schristos }
488