]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libsec/port/bftest.c
libsec: generalize pbkdf2_hmac_sha1() to pbkdf2_x() passing the hmac as an argument
[plan9front.git] / sys / src / libsec / port / bftest.c
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 }