xref: /trunk/main/sal/workben/t_digest.c (revision 647f063d)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include <stdio.h>
25 #include <string.h>
26 #include <stdlib.h>
27 
28 #include <rtl/digest.h>
29 
30 static const char *digest_in_MD[] =
31 {
32 	"",
33 	"a",
34 	"abc",
35 	"message digest",
36 	"abcdefghijklmnopqrstuvwxyz",
37 	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
38 	"12345678901234567890123456789012345678901234567890123456789012345678901234567890",
39 	NULL,
40 };
41 
42 static const char *digest_out_MD2[]=
43 {
44 	"8350e5a3e24c153df2275c9f80692773",
45 	"32ec01ec4a6dac72c0ab96fb34c0b5d1",
46 	"da853b0d3f88d99b30283a69e6ded6bb",
47 	"ab4f496bfb2a530b219ff33031fe06b0",
48 	"4e8ddff3650292ab5a4108c3aa47940b",
49 	"da33def2a42df13975352846c30338cd",
50 	"d5976f79d83d3a0dc9806c3c66f3efd8",
51 };
52 
53 static const char *digest_out_MD5[]=
54 {
55 	"d41d8cd98f00b204e9800998ecf8427e",
56 	"0cc175b9c0f1b6a831c399e269772661",
57 	"900150983cd24fb0d6963f7d28e17f72",
58 	"f96b697d7cb7938d525a2f31aaf161d0",
59 	"c3fcd3d76192e4007dfb496cca67e13b",
60 	"d174ab98d277d9f5a5611c2c9f419d9f",
61 	"57edf4a22be3c955ac49da2e2107b67a",
62 };
63 
64 static const char *digest_in_SHA[]=
65 {
66 	"abc",
67 	"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
68 	NULL,
69 };
70 
71 static const char *digest_out_SHA_0[]=
72 {
73 	"0164b8a914cd2a5e74c4f7ff082c4d97f1edf880",
74 	"d2516ee1acfa5baf33dfc1c471e438449ef134c8",
75 };
76 
77 static const char *digest_out_SHA_1[]=
78 {
79 	"a9993e364706816aba3e25717850c26c9cd0d89d",
80 	"84983e441c3bd26ebaae4aa1f95129e5e54670f1",
81 };
82 
83 static const char *digest_bigout_SHA_0=
84 	"3232affa48628a26653b5aaa44541fd90d690603";
85 
86 static const char *digest_bigout_SHA_1=
87 	"34aa973cd4c4daa4f61eeb2bdbad27316534016f";
88 
89 
90 static const char digest_key_HMAC_MD5_1[] =
91 {
92 	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
93 	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
94 	0x00
95 };
96 static const char digest_key_HMAC_MD5_2[] =
97 {
98 	/* "Jefe" */
99 	'J', 'e', 'f', 'e',
100 	0x00
101 };
102 static const unsigned char digest_key_HMAC_MD5_3[] =
103 {
104 	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
105 	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
106 	0x00
107 };
108 static const char *digest_key_HMAC_MD5[] =
109 {
110 	(const char*)&digest_key_HMAC_MD5_1,
111 	(const char*)&digest_key_HMAC_MD5_2, /* "Jefe", */
112 	(const char*)&digest_key_HMAC_MD5_3,
113 	NULL
114 };
115 
116 static const unsigned char digest_in_HMAC_MD5_3[] =
117 {
118 	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
119 	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
120 	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
121 	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
122 	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
123 	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
124 	0xDD, 0xDD,
125 	0x00
126 };
127 static const char *digest_in_HMAC_MD5[] =
128 {
129 	"Hi There",
130 	"what do ya want for nothing?",
131 	(const char*)&digest_in_HMAC_MD5_3,
132 	NULL
133 };
134 
135 static const char *digest_out_HMAC_MD5[] =
136 {
137 	"9294727a3638bb1c13f48ef8158bfc9d",
138 	"750c783e6ab0b503eaa86e310a5db738",
139 	"56be34521d144c88dbb8c733f0e8b3f6",
140 	NULL
141 };
142 static const char *digest_out_HMAC_SHA1[] =
143 {
144 	/* unofficial, i.e. not verified */
145 	"675b0b3a1b4ddf4e124872da6c2f632bfed957e9",
146 	"effcdf6ae5eb2fa2d27416d5f184df9c259a7c79",
147 	"d730594d167e35d5956fd8003d0db3d3f46dc7bb",
148 	NULL
149 };
150 
151 
pt(unsigned char * md,int length)152 static char *pt (unsigned char *md, int length)
153 {
154 	int i;
155 	static char buf[80];
156 
157 	for (i=0; i<length; i++)
158 		sprintf(&(buf[i*2]),"%02x",md[i]);
159 
160 	return(buf);
161 }
162 
main(int argc,char ** argv)163 int SAL_CALL main (int argc, char **argv)
164 {
165 	const char **P,**R, **Q;
166 	char *p;
167 	int i=1, err=0;
168 
169 	unsigned char md[80];
170 	unsigned char buffer[1000];
171 
172 	rtlDigest Digest;
173 
174 	P=digest_in_MD;
175 	R=digest_out_MD2;
176 	i = 1;
177 	while (*P)
178 	{
179 		rtl_digest_MD2 (*P, strlen(*P), md, sizeof(md));
180 
181 		p=pt (md, RTL_DIGEST_LENGTH_MD2);
182 		if (strcmp (p, *R))
183 		{
184 			printf("error calculating MD2 on '%s'\n",*P);
185 			printf("got %s instead of %s\n",p,*R);
186 			err++;
187 		}
188 		else
189 			printf("test (MD2) %d ok\n",i);
190 		i++;
191 		R++;
192 		P++;
193 	}
194 
195 	P=digest_in_MD;
196 	R=digest_out_MD5;
197 	i=1;
198 	while (*P)
199 	{
200 		rtl_digest_MD5 (*P, strlen(*P), md, sizeof(md));
201 
202 		p=pt (md, RTL_DIGEST_LENGTH_MD5);
203 		if (strcmp (p, *R))
204 		{
205 			printf("error calculating MD5 on '%s'\n",*P);
206 			printf("got %s instead of %s\n",p,*R);
207 			err++;
208 		}
209 		else
210 			printf("test (MD5) %d ok\n",i);
211 		i++;
212 		R++;
213 		P++;
214 	}
215 
216 	P=digest_in_SHA;
217 	R=digest_out_SHA_0;
218 	i=1;
219 	while (*P)
220 	{
221 		rtl_digest_SHA (*P, strlen(*P), md, sizeof(md));
222 
223 		p=pt (md, RTL_DIGEST_LENGTH_SHA);
224 		if (strcmp (p, *R))
225 		{
226 			printf("error calculating SHA-0 on '%s'\n",*P);
227 			printf("got %s instead of %s\n",p,*R);
228 			err++;
229 		}
230 		else
231 			printf("test (SHA-0) %d ok\n",i);
232 		i++;
233 		R++;
234 		P++;
235 	}
236 
237 	memset (buffer, 'a', sizeof(buffer));
238 	R = &digest_bigout_SHA_0;
239 
240 	Digest = rtl_digest_createSHA();
241 	for (i=0; i<1000; i++)
242 		rtl_digest_updateSHA (Digest, buffer, sizeof(buffer));
243 
244 	rtl_digest_getSHA (Digest, md, sizeof(md));
245 	rtl_digest_destroySHA (Digest);
246 
247 	p=pt (md, RTL_DIGEST_LENGTH_SHA);
248 	if (strcmp (p, *R))
249 	{
250 		printf("error calculating SHA-0 on '%s'\n",p);
251 		printf("got %s instead of %s\n",p,*R);
252 		err++;
253 	}
254 	else
255 		printf("test (SHA-0) n ok\n");
256 
257 	P=digest_in_SHA;
258 	R=digest_out_SHA_1;
259 	i=1;
260 	while (*P)
261 	{
262 		rtl_digest_SHA1 (*P, strlen(*P), md, sizeof(md));
263 
264 		p=pt (md, RTL_DIGEST_LENGTH_SHA1);
265 		if (strcmp (p, *R))
266 		{
267 			printf("error calculating SHA-1 on '%s'\n",*P);
268 			printf("got %s instead of %s\n",p,*R);
269 			err++;
270 		}
271 		else
272 			printf("test (SHA-1) %d ok\n",i);
273 		i++;
274 		R++;
275 		P++;
276 	}
277 
278 	memset (buffer, 'a', sizeof(buffer));
279 	R = &digest_bigout_SHA_1;
280 
281 	Digest = rtl_digest_createSHA1();
282 	for (i=0; i<1000; i++)
283 		rtl_digest_updateSHA1 (Digest, buffer, sizeof(buffer));
284 
285 	rtl_digest_getSHA1 (Digest, md, sizeof(md));
286 	rtl_digest_destroySHA1 (Digest);
287 
288 	p=pt (md, RTL_DIGEST_LENGTH_SHA1);
289 	if (strcmp (p, *R))
290 	{
291 		printf("error calculating SHA-1 on '%s'\n",p);
292 		printf("got %s instead of %s\n",p,*R);
293 		err++;
294 	}
295 	else
296 		printf("test (SHA-1) n ok\n");
297 
298 
299 	P=digest_in_HMAC_MD5;
300 	Q=digest_key_HMAC_MD5;
301 	R=digest_out_HMAC_MD5;
302 	Digest = rtl_digest_createHMAC_MD5();
303 	i = 1;
304 	while (*P)
305 	{
306 		rtl_digest_initHMAC_MD5 (Digest, *Q, strlen(*Q));
307 		rtl_digest_updateHMAC_MD5 (Digest, *P, strlen(*P));
308 		rtl_digest_getHMAC_MD5 (Digest, md, sizeof(md));
309 
310 		p=pt (md, RTL_DIGEST_LENGTH_HMAC_MD5);
311 		if (strcmp (p, *R))
312 		{
313 			printf("error calculating HMAC-MD5 on '%s'\n",*P);
314 			printf("got %s instead of %s\n",p,*R);
315 			err++;
316 		}
317 		else
318 			printf("test (HMAC-MD5) %d ok\n",i);
319 		i++;
320 		R++;
321 		P++;
322 		Q++;
323 	}
324 	rtl_digest_destroyHMAC_MD5 (Digest);
325 
326 
327 	P=digest_in_HMAC_MD5;
328 	Q=digest_key_HMAC_MD5;
329 	R=digest_out_HMAC_SHA1;
330 	Digest = rtl_digest_createHMAC_SHA1();
331 	i = 1;
332 	while (*P)
333 	{
334 		rtl_digest_initHMAC_SHA1 (Digest, *Q, strlen(*Q));
335 		rtl_digest_updateHMAC_SHA1 (Digest, *P, strlen(*P));
336 		rtl_digest_getHMAC_SHA1 (Digest, md, sizeof(md));
337 
338 		p=pt (md, RTL_DIGEST_LENGTH_HMAC_SHA1);
339 		if (strcmp (p, *R))
340 		{
341 			printf("error calculating HMAC-SHA-1 on '%s'\n",*P);
342 			printf("got %s instead of %s\n",p,*R);
343 			err++;
344 		}
345 		else
346 			printf("test (HMAC-SHA-1) %d ok\n",i);
347 		i++;
348 		P++;
349 		Q++;
350 		R++;
351 	}
352 	rtl_digest_destroyHMAC_SHA1 (Digest);
353 
354 
355 	P=digest_in_HMAC_MD5;
356 	Q=digest_key_HMAC_MD5;
357 	rtl_digest_PBKDF2 (
358 		md, RTL_DIGEST_LENGTH_MD5, /* [out] derived key     */
359 		Q[1], strlen(Q[1]),        /* [in]  password        */
360 		P[1], strlen(P[1]),        /* [in]  salt            */
361 		1000);                     /* [in]  iteration count */
362 
363 	p=pt (md, RTL_DIGEST_LENGTH_MD5);
364 	if (strcmp (p, "6349e09cb6b8c1485cfa9780ee3264df"))
365 	{
366 		printf("error calculating PBKDF2 on '%s'\n", P[1]);
367 		err++;
368 	}
369 	else
370 		printf("test (PBKDF2) %d ok\n", 1);
371 
372 	return (err);
373 }
374 
375