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