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