Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/trunk/sys/src/libsec/port/bftest.c – Rev 26

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
26 7u83 1
#include <u.h>
2
#include <libc.h>
3
#include <libsec.h>
4
 
5
enum{
6
	Bsz = 8,
7
};
8
 
9
typedef struct Testvector Testvector;
10
 
11
struct Testvector{
12
	uchar key[Bsz];
13
	uchar plain[Bsz];
14
	uchar cipher[Bsz];
15
};
16
 
17
/*
18
 * Blowfish test vectors from https://www.schneier.com/code/vectors.txt
19
 */
20
Testvector vector [] = {
21
	{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
22
	 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
23
	 {0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78}},
24
 
25
	{{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
26
	 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
27
	 {0x51, 0x86, 0x6F, 0xD5, 0xB8, 0x5E, 0xCB, 0x8A}},
28
 
29
	{{0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
30
	 {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
31
	 {0x7D, 0x85, 0x6F, 0x9A, 0x61, 0x30, 0x63, 0xF2}},
32
 
33
	{{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
34
	 {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
35
	 {0x24, 0x66, 0xDD, 0x87, 0x8B, 0x96, 0x3C, 0x9D}},
36
 
37
	{{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
38
	 {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
39
	 {0x61, 0xF9, 0xC3, 0x80, 0x22, 0x81, 0xB0, 0x96}},
40
 
41
	{{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
42
	 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
43
	 {0x7D, 0x0C, 0xC6, 0x30, 0xAF, 0xDA, 0x1E, 0xC7}},
44
 
45
	{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
46
	 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
47
	 {0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78}},
48
 
49
	{{0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
50
	 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
51
	 {0x0A, 0xCE, 0xAB, 0x0F, 0xC6, 0xA0, 0xA2, 0x8D}},
52
 
53
	{{0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57},
54
	 {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42},
55
	 {0x59, 0xC6, 0x82, 0x45, 0xEB, 0x05, 0x28, 0x2B}},
56
 
57
	{{0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E},
58
	 {0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA},
59
	 {0xB1, 0xB8, 0xCC, 0x0B, 0x25, 0x0F, 0x09, 0xA0}},
60
 
61
	{{0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86},
62
	 {0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72},
63
	 {0x17, 0x30, 0xE5, 0x77, 0x8B, 0xEA, 0x1D, 0xA4}},
64
 
65
	{{0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E},
66
	 {0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A},
67
	 {0xA2, 0x5E, 0x78, 0x56, 0xCF, 0x26, 0x51, 0xEB}},
68
 
69
	{{0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6},
70
	 {0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2},
71
	 {0x35, 0x38, 0x82, 0xB1, 0x09, 0xCE, 0x8F, 0x1A}},
72
 
73
	{{0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE},
74
	 {0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A},
75
	 {0x48, 0xF4, 0xD0, 0x88, 0x4C, 0x37, 0x99, 0x18}},
76
 
77
	{{0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6},
78
	 {0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2},
79
	 {0x43, 0x21, 0x93, 0xB7, 0x89, 0x51, 0xFC, 0x98}},
80
 
81
	{{0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE},
82
	 {0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A},
83
	 {0x13, 0xF0, 0x41, 0x54, 0xD6, 0x9D, 0x1A, 0xE5}},
84
 
85
	{{0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16},
86
	 {0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02},
87
	 {0x2E, 0xED, 0xDA, 0x93, 0xFF, 0xD3, 0x9C, 0x79}},
88
 
89
	{{0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F},
90
	 {0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A},
91
	 {0xD8, 0x87, 0xE0, 0x39, 0x3C, 0x2D, 0xA6, 0xE3}},
92
 
93
	{{0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46},
94
	 {0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32},
95
	 {0x5F, 0x99, 0xD0, 0x4F, 0x5B, 0x16, 0x39, 0x69}},
96
 
97
	{{0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E},
98
	 {0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA},
99
	 {0x4A, 0x05, 0x7A, 0x3B, 0x24, 0xD3, 0x97, 0x7B}},
100
 
101
	{{0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76},
102
	 {0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62},
103
	 {0x45, 0x20, 0x31, 0xC1, 0xE4, 0xFA, 0xDA, 0x8E}},
104
 
105
	{{0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07},
106
	 {0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2},
107
	 {0x75, 0x55, 0xAE, 0x39, 0xF5, 0x9B, 0x87, 0xBD}},
108
 
109
	{{0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F},
110
	 {0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA},
111
	 {0x53, 0xC5, 0x5F, 0x9C, 0xB4, 0x9F, 0xC0, 0x19}},
112
 
113
	{{0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7},
114
	 {0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92},
115
	 {0x7A, 0x8E, 0x7B, 0xFA, 0x93, 0x7E, 0x89, 0xA3}},
116
 
117
	{{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF},
118
	 {0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A},
119
	 {0xCF, 0x9C, 0x5D, 0x7A, 0x49, 0x86, 0xAD, 0xB5}},
120
 
121
	{{0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6},
122
	 {0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2},
123
	 {0xD1, 0xAB, 0xB2, 0x90, 0x65, 0x8B, 0xC7, 0x78}},
124
 
125
	{{0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF},
126
	 {0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A},
127
	 {0x55, 0xCB, 0x37, 0x74, 0xD1, 0x3E, 0xF2, 0x01}},
128
 
129
	{{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
130
	 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
131
	 {0xFA, 0x34, 0xEC, 0x48, 0x47, 0xB2, 0x68, 0xB2}},
132
 
133
	{{0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E},
134
	 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
135
	 {0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE}},
136
 
137
	{{0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE},
138
	 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
139
	 {0xC3, 0x9E, 0x07, 0x2D, 0x9F, 0xAC, 0x63, 0x1D}},
140
 
141
	{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
142
	 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
143
	 {0x01, 0x49, 0x33, 0xE0, 0xCD, 0xAF, 0xF6, 0xE4}},
144
 
145
	{{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
146
	 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
147
	 {0xF2, 0x1E, 0x9A, 0x77, 0xB7, 0x1C, 0x49, 0xBC}},
148
 
149
	{{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
150
	 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
151
	 {0x24, 0x59, 0x46, 0x88, 0x57, 0x54, 0x36, 0x9A}},
152
 
153
	{{0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
154
	 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
155
	 {0x6B, 0x5C, 0x5A, 0x9C, 0x5D, 0x9E, 0x0A, 0x5A}}
156
};
157
 
158
uchar CBCkey[16] = { 
159
	 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 
160
	 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87
161
};
162
 
163
uchar CBCiv[8] = {
164
	 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10
165
};
166
 
167
uchar CBCdata[29] = {
168
	 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, 
169
	 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 
170
	 0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20, 
171
	 0x66, 0x6F, 0x72, 0x20, 0x00
172
};
173
 
174
uchar CBCcipher[32] = {
175
	 0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
176
	 0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
177
	 0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
178
	 0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC
179
};
180
 
181
int
182
testECB(Testvector *t)
183
{
184
	BFstate s;
185
	int i;
186
	uchar aux[Bsz];
187
 
188
	memcpy(aux, t->plain, Bsz);
189
 
190
	memset(&s, 0, sizeof(BFstate));
191
	setupBFstate(&s, t->key, Bsz, nil);
192
	bfECBencrypt(aux, Bsz, &s);
193
 
194
	if(memcmp(aux, t->cipher, Bsz) != 0){
195
		fprint(2, "ECB encrypt failed, ciphertext is:\n");
196
		for(i = 0; i < Bsz; i++)
197
			fprint(2, "%02X", aux[i]);
198
		fprint(2, "\nand should be:\n");
199
		for(i = 0; i < Bsz; i++)
200
			fprint(2, "%02X", t->cipher[i]);
201
		fprint(2, "\n");
202
		return -1;
203
	}
204
 
205
	memset(&s, 0, sizeof(BFstate));
206
	setupBFstate(&s, t->key, Bsz, nil);
207
	bfECBdecrypt(aux, Bsz, &s);
208
 
209
	if(memcmp(aux, t->plain, Bsz) != 0){
210
		fprint(2, "ECB decrypt failed, plaintext is:\n");
211
		for(i = 0; i < Bsz; i++)
212
			fprint(2, "%02X", aux[i]);
213
		fprint(2, "\nand should be:\n");
214
		for(i = 0; i < Bsz; i++)
215
			fprint(2, "%02X", t->plain[i]);
216
		fprint(2, "\n");
217
		return -1;
218
	}
219
	return 0;
220
}
221
 
222
int
223
testCBC(void)
224
{
225
	BFstate s;
226
	uchar aux[32];
227
	int i;
228
 
229
	memset(aux, 0 , sizeof(aux));
230
	memcpy(aux, CBCdata, sizeof(CBCdata));
231
	memset(&s, 0, sizeof(BFstate));
232
	setupBFstate(&s, CBCkey, sizeof(CBCkey), CBCiv);
233
	bfCBCencrypt(aux, 32, &s);
234
 
235
	if(memcmp(aux, CBCcipher, sizeof(CBCcipher)) != 0){
236
		fprint(2, "CBC encrypt failed, ciphertext is:\n");
237
		for(i = 0; i < sizeof(aux); i++)
238
			fprint(2, "%02X", aux[i]);
239
		fprint(2, "\nand should be:\n");
240
		for(i = 0; i < sizeof(CBCcipher); i++)
241
			fprint(2, "%02X", CBCcipher[i]);
242
		fprint(2, "\n");
243
		return -1;
244
	}
245
 
246
	memset(&s, 0, sizeof(BFstate));
247
	setupBFstate(&s, CBCkey, sizeof(CBCkey), CBCiv);
248
	bfCBCdecrypt(aux, 32, &s);
249
 
250
	if(memcmp(aux, CBCdata, sizeof(CBCdata)) != 0){
251
		fprint(2, "CBC decrypt failed, plaintext is:\n");
252
		for(i = 0; i < sizeof(aux); i++)
253
			fprint(2, "%02X", aux[i]);
254
		fprint(2, "\nand should be:\n");
255
		for(i = 0; i < sizeof(CBCdata); i++)
256
			fprint(2, "%02X", CBCdata[i]);
257
		fprint(2, "\n");
258
		return -1;
259
	}
260
 
261
	return 0;
262
}
263
 
264
void
265
main(int argc, char **argv)
266
{
267
	int i;
268
 
269
	if(argc != 1)
270
		sysfatal("usage: %s", argv[0]);
271
 
272
	for(i=0; i < nelem(vector); i++)
273
		if(testECB(&vector[i]) < 0)
274
			sysfatal("TestECB %d failed", i);
275
 
276
	if(testCBC() < 0)
277
		sysfatal("TestCBC failed");
278
	exits(nil);
279
}