]> git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/bf/bftest.c
Run util/openssl-format-source -v -c .
[thirdparty/openssl.git] / crypto / bf / bftest.c
1 /* crypto/bf/bftest.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59 /*
60 * This has been a quickly hacked 'ideatest.c'. When I add tests for other
61 * RC2 modes, more of the code will be uncommented.
62 */
63
64 #include <stdio.h>
65 #include <string.h>
66 #include <stdlib.h>
67 #include <openssl/opensslconf.h> /* To see if OPENSSL_NO_BF is defined */
68
69 #include "../e_os.h"
70
71 #ifdef OPENSSL_NO_BF
72 int main(int argc, char *argv[])
73 {
74 printf("No BF support\n");
75 return (0);
76 }
77 #else
78 # include <openssl/blowfish.h>
79
80 # ifdef CHARSET_EBCDIC
81 # include <openssl/ebcdic.h>
82 # endif
83
84 static char *bf_key[2] = {
85 "abcdefghijklmnopqrstuvwxyz",
86 "Who is John Galt?"
87 };
88
89 /* big endian */
90 static BF_LONG bf_plain[2][2] = {
91 {0x424c4f57L, 0x46495348L},
92 {0xfedcba98L, 0x76543210L}
93 };
94
95 static BF_LONG bf_cipher[2][2] = {
96 {0x324ed0feL, 0xf413a203L},
97 {0xcc91732bL, 0x8022f684L}
98 };
99
100 /************/
101
102 /* Lets use the DES test vectors :-) */
103 # define NUM_TESTS 34
104 static unsigned char ecb_data[NUM_TESTS][8] = {
105 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
106 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
107 {0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
108 {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
109 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
110 {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
111 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
112 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
113 {0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57},
114 {0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E},
115 {0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86},
116 {0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E},
117 {0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6},
118 {0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE},
119 {0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6},
120 {0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE},
121 {0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16},
122 {0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F},
123 {0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46},
124 {0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E},
125 {0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76},
126 {0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07},
127 {0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F},
128 {0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7},
129 {0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF},
130 {0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6},
131 {0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF},
132 {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
133 {0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E},
134 {0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE},
135 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
136 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
137 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
138 {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}
139 };
140
141 static unsigned char plain_data[NUM_TESTS][8] = {
142 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
143 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
144 {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
145 {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
146 {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
147 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
148 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
149 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
150 {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42},
151 {0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA},
152 {0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72},
153 {0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A},
154 {0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2},
155 {0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A},
156 {0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2},
157 {0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A},
158 {0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02},
159 {0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A},
160 {0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32},
161 {0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA},
162 {0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62},
163 {0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2},
164 {0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA},
165 {0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92},
166 {0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A},
167 {0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2},
168 {0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A},
169 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
170 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
171 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
172 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
173 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
174 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
175 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
176 };
177
178 static unsigned char cipher_data[NUM_TESTS][8] = {
179 {0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78},
180 {0x51, 0x86, 0x6F, 0xD5, 0xB8, 0x5E, 0xCB, 0x8A},
181 {0x7D, 0x85, 0x6F, 0x9A, 0x61, 0x30, 0x63, 0xF2},
182 {0x24, 0x66, 0xDD, 0x87, 0x8B, 0x96, 0x3C, 0x9D},
183 {0x61, 0xF9, 0xC3, 0x80, 0x22, 0x81, 0xB0, 0x96},
184 {0x7D, 0x0C, 0xC6, 0x30, 0xAF, 0xDA, 0x1E, 0xC7},
185 {0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78},
186 {0x0A, 0xCE, 0xAB, 0x0F, 0xC6, 0xA0, 0xA2, 0x8D},
187 {0x59, 0xC6, 0x82, 0x45, 0xEB, 0x05, 0x28, 0x2B},
188 {0xB1, 0xB8, 0xCC, 0x0B, 0x25, 0x0F, 0x09, 0xA0},
189 {0x17, 0x30, 0xE5, 0x77, 0x8B, 0xEA, 0x1D, 0xA4},
190 {0xA2, 0x5E, 0x78, 0x56, 0xCF, 0x26, 0x51, 0xEB},
191 {0x35, 0x38, 0x82, 0xB1, 0x09, 0xCE, 0x8F, 0x1A},
192 {0x48, 0xF4, 0xD0, 0x88, 0x4C, 0x37, 0x99, 0x18},
193 {0x43, 0x21, 0x93, 0xB7, 0x89, 0x51, 0xFC, 0x98},
194 {0x13, 0xF0, 0x41, 0x54, 0xD6, 0x9D, 0x1A, 0xE5},
195 {0x2E, 0xED, 0xDA, 0x93, 0xFF, 0xD3, 0x9C, 0x79},
196 {0xD8, 0x87, 0xE0, 0x39, 0x3C, 0x2D, 0xA6, 0xE3},
197 {0x5F, 0x99, 0xD0, 0x4F, 0x5B, 0x16, 0x39, 0x69},
198 {0x4A, 0x05, 0x7A, 0x3B, 0x24, 0xD3, 0x97, 0x7B},
199 {0x45, 0x20, 0x31, 0xC1, 0xE4, 0xFA, 0xDA, 0x8E},
200 {0x75, 0x55, 0xAE, 0x39, 0xF5, 0x9B, 0x87, 0xBD},
201 {0x53, 0xC5, 0x5F, 0x9C, 0xB4, 0x9F, 0xC0, 0x19},
202 {0x7A, 0x8E, 0x7B, 0xFA, 0x93, 0x7E, 0x89, 0xA3},
203 {0xCF, 0x9C, 0x5D, 0x7A, 0x49, 0x86, 0xAD, 0xB5},
204 {0xD1, 0xAB, 0xB2, 0x90, 0x65, 0x8B, 0xC7, 0x78},
205 {0x55, 0xCB, 0x37, 0x74, 0xD1, 0x3E, 0xF2, 0x01},
206 {0xFA, 0x34, 0xEC, 0x48, 0x47, 0xB2, 0x68, 0xB2},
207 {0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE},
208 {0xC3, 0x9E, 0x07, 0x2D, 0x9F, 0xAC, 0x63, 0x1D},
209 {0x01, 0x49, 0x33, 0xE0, 0xCD, 0xAF, 0xF6, 0xE4},
210 {0xF2, 0x1E, 0x9A, 0x77, 0xB7, 0x1C, 0x49, 0xBC},
211 {0x24, 0x59, 0x46, 0x88, 0x57, 0x54, 0x36, 0x9A},
212 {0x6B, 0x5C, 0x5A, 0x9C, 0x5D, 0x9E, 0x0A, 0x5A},
213 };
214
215 static unsigned char cbc_key[16] = {
216 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
217 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87
218 };
219 static unsigned char cbc_iv[8] =
220 { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
221 static char cbc_data[40] = "7654321 Now is the time for ";
222 static unsigned char cbc_ok[32] = {
223 0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
224 0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
225 0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
226 0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC
227 };
228
229 static unsigned char cfb64_ok[] = {
230 0xE7, 0x32, 0x14, 0xA2, 0x82, 0x21, 0x39, 0xCA,
231 0xF2, 0x6E, 0xCF, 0x6D, 0x2E, 0xB9, 0xE7, 0x6E,
232 0x3D, 0xA3, 0xDE, 0x04, 0xD1, 0x51, 0x72, 0x00,
233 0x51, 0x9D, 0x57, 0xA6, 0xC3
234 };
235
236 static unsigned char ofb64_ok[] = {
237 0xE7, 0x32, 0x14, 0xA2, 0x82, 0x21, 0x39, 0xCA,
238 0x62, 0xB3, 0x43, 0xCC, 0x5B, 0x65, 0x58, 0x73,
239 0x10, 0xDD, 0x90, 0x8D, 0x0C, 0x24, 0x1B, 0x22,
240 0x63, 0xC2, 0xCF, 0x80, 0xDA
241 };
242
243 # define KEY_TEST_NUM 25
244 static unsigned char key_test[KEY_TEST_NUM] = {
245 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
246 0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
247 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
248 0x88
249 };
250
251 static unsigned char key_data[8] =
252 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 };
253
254 static unsigned char key_out[KEY_TEST_NUM][8] = {
255 {0xF9, 0xAD, 0x59, 0x7C, 0x49, 0xDB, 0x00, 0x5E},
256 {0xE9, 0x1D, 0x21, 0xC1, 0xD9, 0x61, 0xA6, 0xD6},
257 {0xE9, 0xC2, 0xB7, 0x0A, 0x1B, 0xC6, 0x5C, 0xF3},
258 {0xBE, 0x1E, 0x63, 0x94, 0x08, 0x64, 0x0F, 0x05},
259 {0xB3, 0x9E, 0x44, 0x48, 0x1B, 0xDB, 0x1E, 0x6E},
260 {0x94, 0x57, 0xAA, 0x83, 0xB1, 0x92, 0x8C, 0x0D},
261 {0x8B, 0xB7, 0x70, 0x32, 0xF9, 0x60, 0x62, 0x9D},
262 {0xE8, 0x7A, 0x24, 0x4E, 0x2C, 0xC8, 0x5E, 0x82},
263 {0x15, 0x75, 0x0E, 0x7A, 0x4F, 0x4E, 0xC5, 0x77},
264 {0x12, 0x2B, 0xA7, 0x0B, 0x3A, 0xB6, 0x4A, 0xE0},
265 {0x3A, 0x83, 0x3C, 0x9A, 0xFF, 0xC5, 0x37, 0xF6},
266 {0x94, 0x09, 0xDA, 0x87, 0xA9, 0x0F, 0x6B, 0xF2},
267 {0x88, 0x4F, 0x80, 0x62, 0x50, 0x60, 0xB8, 0xB4},
268 {0x1F, 0x85, 0x03, 0x1C, 0x19, 0xE1, 0x19, 0x68},
269 {0x79, 0xD9, 0x37, 0x3A, 0x71, 0x4C, 0xA3, 0x4F},
270 {0x93, 0x14, 0x28, 0x87, 0xEE, 0x3B, 0xE1, 0x5C},
271 {0x03, 0x42, 0x9E, 0x83, 0x8C, 0xE2, 0xD1, 0x4B},
272 {0xA4, 0x29, 0x9E, 0x27, 0x46, 0x9F, 0xF6, 0x7B},
273 {0xAF, 0xD5, 0xAE, 0xD1, 0xC1, 0xBC, 0x96, 0xA8},
274 {0x10, 0x85, 0x1C, 0x0E, 0x38, 0x58, 0xDA, 0x9F},
275 {0xE6, 0xF5, 0x1E, 0xD7, 0x9B, 0x9D, 0xB2, 0x1F},
276 {0x64, 0xA6, 0xE1, 0x4A, 0xFD, 0x36, 0xB4, 0x6F},
277 {0x80, 0xC7, 0xD7, 0xD4, 0x5A, 0x54, 0x79, 0xAD},
278 {0x05, 0x04, 0x4B, 0x62, 0xFA, 0x52, 0xD0, 0x80},
279 };
280
281 static int test(void);
282 static int print_test_data(void);
283 int main(int argc, char *argv[])
284 {
285 int ret;
286
287 if (argc > 1)
288 ret = print_test_data();
289 else
290 ret = test();
291
292 # ifdef OPENSSL_SYS_NETWARE
293 if (ret)
294 printf("ERROR: %d\n", ret);
295 # endif
296 EXIT(ret);
297 return (0);
298 }
299
300 static int print_test_data(void)
301 {
302 unsigned int i, j;
303
304 printf("ecb test data\n");
305 printf("key bytes\t\tclear bytes\t\tcipher bytes\n");
306 for (i = 0; i < NUM_TESTS; i++) {
307 for (j = 0; j < 8; j++)
308 printf("%02X", ecb_data[i][j]);
309 printf("\t");
310 for (j = 0; j < 8; j++)
311 printf("%02X", plain_data[i][j]);
312 printf("\t");
313 for (j = 0; j < 8; j++)
314 printf("%02X", cipher_data[i][j]);
315 printf("\n");
316 }
317
318 printf("set_key test data\n");
319 printf("data[8]= ");
320 for (j = 0; j < 8; j++)
321 printf("%02X", key_data[j]);
322 printf("\n");
323 for (i = 0; i < KEY_TEST_NUM - 1; i++) {
324 printf("c=");
325 for (j = 0; j < 8; j++)
326 printf("%02X", key_out[i][j]);
327 printf(" k[%2u]=", i + 1);
328 for (j = 0; j < i + 1; j++)
329 printf("%02X", key_test[j]);
330 printf("\n");
331 }
332
333 printf("\nchaining mode test data\n");
334 printf("key[16] = ");
335 for (j = 0; j < 16; j++)
336 printf("%02X", cbc_key[j]);
337 printf("\niv[8] = ");
338 for (j = 0; j < 8; j++)
339 printf("%02X", cbc_iv[j]);
340 printf("\ndata[%d] = '%s'", (int)strlen(cbc_data) + 1, cbc_data);
341 printf("\ndata[%d] = ", (int)strlen(cbc_data) + 1);
342 for (j = 0; j < strlen(cbc_data) + 1; j++)
343 printf("%02X", cbc_data[j]);
344 printf("\n");
345 printf("cbc cipher text\n");
346 printf("cipher[%d]= ", 32);
347 for (j = 0; j < 32; j++)
348 printf("%02X", cbc_ok[j]);
349 printf("\n");
350
351 printf("cfb64 cipher text\n");
352 printf("cipher[%d]= ", (int)strlen(cbc_data) + 1);
353 for (j = 0; j < strlen(cbc_data) + 1; j++)
354 printf("%02X", cfb64_ok[j]);
355 printf("\n");
356
357 printf("ofb64 cipher text\n");
358 printf("cipher[%d]= ", (int)strlen(cbc_data) + 1);
359 for (j = 0; j < strlen(cbc_data) + 1; j++)
360 printf("%02X", ofb64_ok[j]);
361 printf("\n");
362 return (0);
363 }
364
365 static int test(void)
366 {
367 unsigned char cbc_in[40], cbc_out[40], iv[8];
368 int i, n, err = 0;
369 BF_KEY key;
370 BF_LONG data[2];
371 unsigned char out[8];
372 BF_LONG len;
373
374 # ifdef CHARSET_EBCDIC
375 ebcdic2ascii(cbc_data, cbc_data, strlen(cbc_data));
376 # endif
377
378 printf("testing blowfish in raw ecb mode\n");
379 for (n = 0; n < 2; n++) {
380 # ifdef CHARSET_EBCDIC
381 ebcdic2ascii(bf_key[n], bf_key[n], strlen(bf_key[n]));
382 # endif
383 BF_set_key(&key, strlen(bf_key[n]), (unsigned char *)bf_key[n]);
384
385 data[0] = bf_plain[n][0];
386 data[1] = bf_plain[n][1];
387 BF_encrypt(data, &key);
388 if (memcmp(&(bf_cipher[n][0]), &(data[0]), 8) != 0) {
389 printf("BF_encrypt error encrypting\n");
390 printf("got :");
391 for (i = 0; i < 2; i++)
392 printf("%08lX ", (unsigned long)data[i]);
393 printf("\n");
394 printf("expected:");
395 for (i = 0; i < 2; i++)
396 printf("%08lX ", (unsigned long)bf_cipher[n][i]);
397 err = 1;
398 printf("\n");
399 }
400
401 BF_decrypt(&(data[0]), &key);
402 if (memcmp(&(bf_plain[n][0]), &(data[0]), 8) != 0) {
403 printf("BF_encrypt error decrypting\n");
404 printf("got :");
405 for (i = 0; i < 2; i++)
406 printf("%08lX ", (unsigned long)data[i]);
407 printf("\n");
408 printf("expected:");
409 for (i = 0; i < 2; i++)
410 printf("%08lX ", (unsigned long)bf_plain[n][i]);
411 printf("\n");
412 err = 1;
413 }
414 }
415
416 printf("testing blowfish in ecb mode\n");
417
418 for (n = 0; n < NUM_TESTS; n++) {
419 BF_set_key(&key, 8, ecb_data[n]);
420
421 BF_ecb_encrypt(&(plain_data[n][0]), out, &key, BF_ENCRYPT);
422 if (memcmp(&(cipher_data[n][0]), out, 8) != 0) {
423 printf("BF_ecb_encrypt blowfish error encrypting\n");
424 printf("got :");
425 for (i = 0; i < 8; i++)
426 printf("%02X ", out[i]);
427 printf("\n");
428 printf("expected:");
429 for (i = 0; i < 8; i++)
430 printf("%02X ", cipher_data[n][i]);
431 err = 1;
432 printf("\n");
433 }
434
435 BF_ecb_encrypt(out, out, &key, BF_DECRYPT);
436 if (memcmp(&(plain_data[n][0]), out, 8) != 0) {
437 printf("BF_ecb_encrypt error decrypting\n");
438 printf("got :");
439 for (i = 0; i < 8; i++)
440 printf("%02X ", out[i]);
441 printf("\n");
442 printf("expected:");
443 for (i = 0; i < 8; i++)
444 printf("%02X ", plain_data[n][i]);
445 printf("\n");
446 err = 1;
447 }
448 }
449
450 printf("testing blowfish set_key\n");
451 for (n = 1; n < KEY_TEST_NUM; n++) {
452 BF_set_key(&key, n, key_test);
453 BF_ecb_encrypt(key_data, out, &key, BF_ENCRYPT);
454 /* mips-sgi-irix6.5-gcc vv -mabi=64 bug workaround */
455 if (memcmp(out, &(key_out[i = n - 1][0]), 8) != 0) {
456 printf("blowfish setkey error\n");
457 err = 1;
458 }
459 }
460
461 printf("testing blowfish in cbc mode\n");
462 len = strlen(cbc_data) + 1;
463
464 BF_set_key(&key, 16, cbc_key);
465 memset(cbc_in, 0, sizeof cbc_in);
466 memset(cbc_out, 0, sizeof cbc_out);
467 memcpy(iv, cbc_iv, sizeof iv);
468 BF_cbc_encrypt((unsigned char *)cbc_data, cbc_out, len,
469 &key, iv, BF_ENCRYPT);
470 if (memcmp(cbc_out, cbc_ok, 32) != 0) {
471 err = 1;
472 printf("BF_cbc_encrypt encrypt error\n");
473 for (i = 0; i < 32; i++)
474 printf("0x%02X,", cbc_out[i]);
475 }
476 memcpy(iv, cbc_iv, 8);
477 BF_cbc_encrypt(cbc_out, cbc_in, len, &key, iv, BF_DECRYPT);
478 if (memcmp(cbc_in, cbc_data, strlen(cbc_data) + 1) != 0) {
479 printf("BF_cbc_encrypt decrypt error\n");
480 err = 1;
481 }
482
483 printf("testing blowfish in cfb64 mode\n");
484
485 BF_set_key(&key, 16, cbc_key);
486 memset(cbc_in, 0, 40);
487 memset(cbc_out, 0, 40);
488 memcpy(iv, cbc_iv, 8);
489 n = 0;
490 BF_cfb64_encrypt((unsigned char *)cbc_data, cbc_out, (long)13,
491 &key, iv, &n, BF_ENCRYPT);
492 BF_cfb64_encrypt((unsigned char *)&(cbc_data[13]), &(cbc_out[13]),
493 len - 13, &key, iv, &n, BF_ENCRYPT);
494 if (memcmp(cbc_out, cfb64_ok, (int)len) != 0) {
495 err = 1;
496 printf("BF_cfb64_encrypt encrypt error\n");
497 for (i = 0; i < (int)len; i++)
498 printf("0x%02X,", cbc_out[i]);
499 }
500 n = 0;
501 memcpy(iv, cbc_iv, 8);
502 BF_cfb64_encrypt(cbc_out, cbc_in, 17, &key, iv, &n, BF_DECRYPT);
503 BF_cfb64_encrypt(&(cbc_out[17]), &(cbc_in[17]), len - 17,
504 &key, iv, &n, BF_DECRYPT);
505 if (memcmp(cbc_in, cbc_data, (int)len) != 0) {
506 printf("BF_cfb64_encrypt decrypt error\n");
507 err = 1;
508 }
509
510 printf("testing blowfish in ofb64\n");
511
512 BF_set_key(&key, 16, cbc_key);
513 memset(cbc_in, 0, 40);
514 memset(cbc_out, 0, 40);
515 memcpy(iv, cbc_iv, 8);
516 n = 0;
517 BF_ofb64_encrypt((unsigned char *)cbc_data, cbc_out, (long)13, &key, iv,
518 &n);
519 BF_ofb64_encrypt((unsigned char *)&(cbc_data[13]), &(cbc_out[13]),
520 len - 13, &key, iv, &n);
521 if (memcmp(cbc_out, ofb64_ok, (int)len) != 0) {
522 err = 1;
523 printf("BF_ofb64_encrypt encrypt error\n");
524 for (i = 0; i < (int)len; i++)
525 printf("0x%02X,", cbc_out[i]);
526 }
527 n = 0;
528 memcpy(iv, cbc_iv, 8);
529 BF_ofb64_encrypt(cbc_out, cbc_in, 17, &key, iv, &n);
530 BF_ofb64_encrypt(&(cbc_out[17]), &(cbc_in[17]), len - 17, &key, iv, &n);
531 if (memcmp(cbc_in, cbc_data, (int)len) != 0) {
532 printf("BF_ofb64_encrypt decrypt error\n");
533 err = 1;
534 }
535
536 return (err);
537 }
538 #endif