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