xref: /AOO41X/main/sal/workben/t_digest.c (revision 647f063d49501903f1667b75f5634541fc603283)
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