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