Mercurial > dropbear
comparison libtomcrypt/testprof/katja_test.c @ 382:0cbe8f6dbf9e
propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f)
to branch 'au.asn.ucc.matt.dropbear' (head 02c413252c90e9de8e03d91e9939dde3029f5c0a)
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 11 Jan 2007 02:41:05 +0000 |
parents | |
children | f849a5ca2efc |
comparison
equal
deleted
inserted
replaced
379:b66a00272a90 | 382:0cbe8f6dbf9e |
---|---|
1 #include <tomcrypt_test.h> | |
2 | |
3 #ifdef MKAT | |
4 | |
5 int katja_test(void) | |
6 { | |
7 unsigned char in[1024], out[1024], tmp[1024]; | |
8 katja_key key, privKey, pubKey; | |
9 int hash_idx, prng_idx, stat, stat2, size; | |
10 unsigned long kat_msgsize, len, len2, cnt; | |
11 static unsigned char lparam[] = { 0x01, 0x02, 0x03, 0x04 }; | |
12 | |
13 hash_idx = find_hash("sha1"); | |
14 prng_idx = find_prng("yarrow"); | |
15 if (hash_idx == -1 || prng_idx == -1) { | |
16 fprintf(stderr, "katja_test requires SHA1 and yarrow"); | |
17 return 1; | |
18 } | |
19 | |
20 for (size = 1024; size <= 2048; size += 256) { | |
21 | |
22 /* make 10 random key */ | |
23 for (cnt = 0; cnt < 10; cnt++) { | |
24 DO(katja_make_key(&yarrow_prng, prng_idx, size/8, &key)); | |
25 if (mp_count_bits(key.N) < size - 7) { | |
26 fprintf(stderr, "katja_%d key modulus has %d bits\n", size, mp_count_bits(key.N)); | |
27 | |
28 len = mp_unsigned_bin_size(key.N); | |
29 mp_to_unsigned_bin(key.N, tmp); | |
30 fprintf(stderr, "N == \n"); | |
31 for (cnt = 0; cnt < len; ) { | |
32 fprintf(stderr, "%02x ", tmp[cnt]); | |
33 if (!(++cnt & 15)) fprintf(stderr, "\n"); | |
34 } | |
35 | |
36 len = mp_unsigned_bin_size(key.p); | |
37 mp_to_unsigned_bin(key.p, tmp); | |
38 fprintf(stderr, "p == \n"); | |
39 for (cnt = 0; cnt < len; ) { | |
40 fprintf(stderr, "%02x ", tmp[cnt]); | |
41 if (!(++cnt & 15)) fprintf(stderr, "\n"); | |
42 } | |
43 | |
44 len = mp_unsigned_bin_size(key.q); | |
45 mp_to_unsigned_bin(key.q, tmp); | |
46 fprintf(stderr, "\nq == \n"); | |
47 for (cnt = 0; cnt < len; ) { | |
48 fprintf(stderr, "%02x ", tmp[cnt]); | |
49 if (!(++cnt & 15)) fprintf(stderr, "\n"); | |
50 } | |
51 fprintf(stderr, "\n"); | |
52 | |
53 | |
54 return 1; | |
55 } | |
56 if (cnt != 9) { | |
57 katja_free(&key); | |
58 } | |
59 } | |
60 /* encrypt the key (without lparam) */ | |
61 for (cnt = 0; cnt < 4; cnt++) { | |
62 for (kat_msgsize = 1; kat_msgsize <= 42; kat_msgsize++) { | |
63 /* make a random key/msg */ | |
64 yarrow_read(in, kat_msgsize, &yarrow_prng); | |
65 | |
66 len = sizeof(out); | |
67 len2 = kat_msgsize; | |
68 | |
69 DO(katja_encrypt_key(in, kat_msgsize, out, &len, NULL, 0, &yarrow_prng, prng_idx, hash_idx, &key)); | |
70 /* change a byte */ | |
71 out[8] ^= 1; | |
72 DO(katja_decrypt_key(out, len, tmp, &len2, NULL, 0, hash_idx, &stat2, &key)); | |
73 /* change a byte back */ | |
74 out[8] ^= 1; | |
75 if (len2 != kat_msgsize) { | |
76 fprintf(stderr, "\nkatja_decrypt_key mismatch len %lu (first decrypt)", len2); | |
77 return 1; | |
78 } | |
79 | |
80 len2 = kat_msgsize; | |
81 DO(katja_decrypt_key(out, len, tmp, &len2, NULL, 0, hash_idx, &stat, &key)); | |
82 if (!(stat == 1 && stat2 == 0)) { | |
83 fprintf(stderr, "katja_decrypt_key failed"); | |
84 return 1; | |
85 } | |
86 if (len2 != kat_msgsize || memcmp(tmp, in, kat_msgsize)) { | |
87 unsigned long x; | |
88 fprintf(stderr, "\nkatja_decrypt_key mismatch, len %lu (second decrypt)\n", len2); | |
89 fprintf(stderr, "Original contents: \n"); | |
90 for (x = 0; x < kat_msgsize; ) { | |
91 fprintf(stderr, "%02x ", in[x]); | |
92 if (!(++x % 16)) { | |
93 fprintf(stderr, "\n"); | |
94 } | |
95 } | |
96 fprintf(stderr, "\n"); | |
97 fprintf(stderr, "Output contents: \n"); | |
98 for (x = 0; x < kat_msgsize; ) { | |
99 fprintf(stderr, "%02x ", out[x]); | |
100 if (!(++x % 16)) { | |
101 fprintf(stderr, "\n"); | |
102 } | |
103 } | |
104 fprintf(stderr, "\n"); | |
105 return 1; | |
106 } | |
107 } | |
108 } | |
109 | |
110 /* encrypt the key (with lparam) */ | |
111 for (kat_msgsize = 1; kat_msgsize <= 42; kat_msgsize++) { | |
112 len = sizeof(out); | |
113 len2 = kat_msgsize; | |
114 DO(katja_encrypt_key(in, kat_msgsize, out, &len, lparam, sizeof(lparam), &yarrow_prng, prng_idx, hash_idx, &key)); | |
115 /* change a byte */ | |
116 out[8] ^= 1; | |
117 DO(katja_decrypt_key(out, len, tmp, &len2, lparam, sizeof(lparam), hash_idx, &stat2, &key)); | |
118 if (len2 != kat_msgsize) { | |
119 fprintf(stderr, "\nkatja_decrypt_key mismatch len %lu (first decrypt)", len2); | |
120 return 1; | |
121 } | |
122 /* change a byte back */ | |
123 out[8] ^= 1; | |
124 | |
125 len2 = kat_msgsize; | |
126 DO(katja_decrypt_key(out, len, tmp, &len2, lparam, sizeof(lparam), hash_idx, &stat, &key)); | |
127 if (!(stat == 1 && stat2 == 0)) { | |
128 fprintf(stderr, "katja_decrypt_key failed"); | |
129 return 1; | |
130 } | |
131 if (len2 != kat_msgsize || memcmp(tmp, in, kat_msgsize)) { | |
132 fprintf(stderr, "katja_decrypt_key mismatch len %lu", len2); | |
133 return 1; | |
134 } | |
135 } | |
136 | |
137 #if 0 | |
138 | |
139 /* sign a message (unsalted, lower cholestorol and Atkins approved) now */ | |
140 len = sizeof(out); | |
141 DO(katja_sign_hash(in, 20, out, &len, &yarrow_prng, prng_idx, hash_idx, 0, &key)); | |
142 | |
143 /* export key and import as both private and public */ | |
144 len2 = sizeof(tmp); | |
145 DO(katja_export(tmp, &len2, PK_PRIVATE, &key)); | |
146 DO(katja_import(tmp, len2, &privKey)); | |
147 len2 = sizeof(tmp); | |
148 DO(katja_export(tmp, &len2, PK_PUBLIC, &key)); | |
149 DO(katja_import(tmp, len2, &pubKey)); | |
150 | |
151 /* verify with original */ | |
152 DO(katja_verify_hash(out, len, in, 20, hash_idx, 0, &stat, &key)); | |
153 /* change a byte */ | |
154 in[0] ^= 1; | |
155 DO(katja_verify_hash(out, len, in, 20, hash_idx, 0, &stat2, &key)); | |
156 | |
157 if (!(stat == 1 && stat2 == 0)) { | |
158 fprintf(stderr, "katja_verify_hash (unsalted, origKey) failed, %d, %d", stat, stat2); | |
159 katja_free(&key); | |
160 katja_free(&pubKey); | |
161 katja_free(&privKey); | |
162 return 1; | |
163 } | |
164 | |
165 /* verify with privKey */ | |
166 /* change a byte */ | |
167 in[0] ^= 1; | |
168 DO(katja_verify_hash(out, len, in, 20, hash_idx, 0, &stat, &privKey)); | |
169 /* change a byte */ | |
170 in[0] ^= 1; | |
171 DO(katja_verify_hash(out, len, in, 20, hash_idx, 0, &stat2, &privKey)); | |
172 | |
173 if (!(stat == 1 && stat2 == 0)) { | |
174 fprintf(stderr, "katja_verify_hash (unsalted, privKey) failed, %d, %d", stat, stat2); | |
175 katja_free(&key); | |
176 katja_free(&pubKey); | |
177 katja_free(&privKey); | |
178 return 1; | |
179 } | |
180 | |
181 /* verify with pubKey */ | |
182 /* change a byte */ | |
183 in[0] ^= 1; | |
184 DO(katja_verify_hash(out, len, in, 20, hash_idx, 0, &stat, &pubKey)); | |
185 /* change a byte */ | |
186 in[0] ^= 1; | |
187 DO(katja_verify_hash(out, len, in, 20, hash_idx, 0, &stat2, &pubKey)); | |
188 | |
189 if (!(stat == 1 && stat2 == 0)) { | |
190 fprintf(stderr, "katja_verify_hash (unsalted, pubkey) failed, %d, %d", stat, stat2); | |
191 katja_free(&key); | |
192 katja_free(&pubKey); | |
193 katja_free(&privKey); | |
194 return 1; | |
195 } | |
196 | |
197 /* sign a message (salted) now (use privKey to make, pubKey to verify) */ | |
198 len = sizeof(out); | |
199 DO(katja_sign_hash(in, 20, out, &len, &yarrow_prng, prng_idx, hash_idx, 8, &privKey)); | |
200 DO(katja_verify_hash(out, len, in, 20, hash_idx, 8, &stat, &pubKey)); | |
201 /* change a byte */ | |
202 in[0] ^= 1; | |
203 DO(katja_verify_hash(out, len, in, 20, hash_idx, 8, &stat2, &pubKey)); | |
204 | |
205 if (!(stat == 1 && stat2 == 0)) { | |
206 fprintf(stderr, "katja_verify_hash (salted) failed, %d, %d", stat, stat2); | |
207 katja_free(&key); | |
208 katja_free(&pubKey); | |
209 katja_free(&privKey); | |
210 return 1; | |
211 } | |
212 #endif | |
213 | |
214 katja_free(&key); | |
215 katja_free(&pubKey); | |
216 katja_free(&privKey); | |
217 } | |
218 | |
219 /* free the key and return */ | |
220 return 0; | |
221 } | |
222 | |
223 #else | |
224 | |
225 int katja_test(void) | |
226 { | |
227 fprintf(stderr, "NOP"); | |
228 return 0; | |
229 } | |
230 | |
231 #endif |