1 #include <tomcrypt.h>
2 
3 /*
4  * KDF test vector calculation program, W.Ehrhardt Jul 2008
5  * Calculates TVs for pkcs_5_alg1/2 with md5, sha1, sha224/256/384/512, whirlpool
6  * Data from RFC 3211 - Password-based Encryption for CMS
7  * sha1 output matches RFC 3211
8  */
9 
10 
usage(char * name)11 void usage(char* name)
12 {
13   printf("Usage: %s <hash>\n", name);
14   printf(" hash: md4 | md5 | rmd160 | sha1 | sha224 | sha256 | sha384 | sha512 | whirlpool\n");
15   printf(" calculates pbkdf1/2 and mgf1 for specified hash\n");
16 }
17 
main(int argc,char * argv[])18 int main(int argc, char* argv[])
19 {
20   unsigned char pwd1[8]  = "password";
21   unsigned char salt1[8] = {0x12, 0x34, 0x56, 0x78, 0x78, 0x56, 0x34, 0x12};
22 
23   unsigned char pwd2[76] = "All n-entities must communicate with other n-entities via n-1 entiteeheehees";
24   unsigned char salt2[8] = {0x12, 0x34, 0x56, 0x78, 0x78, 0x56, 0x34, 0x12};
25 
26   unsigned char outbuf[48];
27   int err, hash;
28   unsigned long i,outlen;
29 
30   if (argc<2) {
31     usage(argv[0]);
32     return -1;
33   }
34 
35 
36   if (!strcmp(argv[1],"md5")) {
37     register_hash(&md5_desc);
38   }
39   else if (!strcmp(argv[1],"md4")) {
40     register_hash(&md4_desc);
41   }
42   else if (!strcmp(argv[1],"sha1")) {
43     register_hash(&sha1_desc);
44   }
45   else if (!strcmp(argv[1],"rmd160")) {
46     register_hash(&rmd160_desc);
47   }
48   else if (!strcmp(argv[1],"sha224")) {
49     register_hash(&sha224_desc);
50   }
51   else if (!strcmp(argv[1],"sha256")) {
52     register_hash(&sha256_desc);
53   }
54   else if (!strcmp(argv[1],"sha384")) {
55     register_hash(&sha384_desc);
56   }
57   else if (!strcmp(argv[1],"sha512")) {
58     register_hash(&sha512_desc);
59   }
60   else if (!strcmp(argv[1],"whirlpool")) {
61     register_hash(&whirlpool_desc);
62   }
63   else {
64     usage(argv[0]);
65     return -1;
66   }
67 
68   if ((hash = find_hash(argv[1])) < 0) {
69     printf("find_hash error: %s\n", argv[1]);
70     return -1;
71   }
72 
73   printf("pkcs_5_alg2:\n\n");
74 
75   outlen = 8;
76   if ((err = pkcs_5_alg2(pwd1, 8, salt1, 8, 5, hash, outbuf, &outlen)) != CRYPT_OK) {
77     printf("pkcs_5_alg2 error!\n");
78     return -1;
79   }
80   printf(";Test 1 %s\n", argv[1]);
81   for (i=0; i<outlen; i++) {printf("%02x",outbuf[i]);}
82   printf("\n\n");
83 
84   outlen = 16;
85   if ((err = pkcs_5_alg2(pwd2, 76, salt2, 8, 500, hash, outbuf, &outlen)) != CRYPT_OK) {
86     printf("pkcs_5_alg2 error!\n");
87     return -1;
88   }
89   printf(";Test 2 %s\n", argv[1]);
90   for (i=0; i<outlen; i++) {printf("%02x",outbuf[i]);}
91   printf("\n\n");
92 
93   outlen = 16;
94   if ((err = pkcs_5_alg2(pwd2, 76, salt2, 8, 300000, hash, outbuf, &outlen)) != CRYPT_OK) {
95     printf("pkcs_5_alg2 error!\n");
96     return -1;
97   }
98   printf(";Test 3 %s\n", argv[1]);
99   for (i=0; i<outlen; i++) {printf("%02x",outbuf[i]);}
100   printf("\n\n");
101 
102 
103   printf("pkcs_5_alg1:\n\n");
104 
105   outlen = 8;
106   if ((err = pkcs_5_alg1(pwd1, 8, salt1, 5, hash, outbuf, &outlen)) != CRYPT_OK) {
107     printf("pkcs_5_alg1 error!\n");
108     return -1;
109   }
110   printf(";Test 4 %s\n", argv[1]);
111   for (i=0; i<outlen; i++) {printf("%02x",outbuf[i]);}
112   printf("\n\n");
113 
114   if (hash_descriptor[hash].hashsize>15) {
115     outlen = 16;
116     if ((err = pkcs_5_alg1(pwd2, 76, salt2, 500, hash, outbuf, &outlen)) != CRYPT_OK) {
117       printf("pkcs_5_alg1 error!\n");
118       return -1;
119     }
120     printf(";Test 5 %s\n", argv[1]);
121     for (i=0; i<outlen; i++) {printf("%02x",outbuf[i]);}
122     printf("\n\n");
123 
124     outlen = 16;
125     if ((err = pkcs_5_alg1(pwd2, 76, salt2, 300000, hash, outbuf, &outlen)) != CRYPT_OK) {
126       printf("pkcs_5_alg1 error!\n");
127       return -1;
128     }
129     printf(";Test 6 %s\n", argv[1]);
130     for (i=0; i<outlen; i++) {printf("%02x",outbuf[i]);}
131     printf("\n\n");
132   }
133   return 0;
134 
135   printf("pkcs_1_mgf1:\n\n");
136 
137   outlen = 24;
138   if ((err = pkcs_1_mgf1(hash, pwd1, 8, outbuf, outlen)) != CRYPT_OK) {
139     printf("pkcs_1_mgf1 error!\n");
140     return -1;
141   }
142   printf(";Test 7 %s\n", argv[1]);
143   for (i=0; i<outlen; i++) {printf("%02x",outbuf[i]);}
144   printf("\n\n");
145 
146   return 0;
147 
148 }
149