comparison testprof/modes_test.c @ 192:9cc34777b479 libtomcrypt

propagate from branch 'au.asn.ucc.matt.ltc-orig' (head 9ba8f01f44320e9cb9f19881105ae84f84a43ea9) to branch 'au.asn.ucc.matt.dropbear.ltc' (head dbf51c569bc34956ad948e4cc87a0eeb2170b768)
author Matt Johnston <matt@ucc.asn.au>
date Sun, 08 May 2005 06:36:47 +0000
parents 1c15b283127b
children 39d5d58461d6
comparison
equal deleted inserted replaced
164:cd1143579f00 192:9cc34777b479
1 /* test CFB/OFB/CBC modes */
2 #include <tomcrypt_test.h>
3
4 int modes_test(void)
5 {
6 unsigned char pt[64], ct[64], tmp[64], key[16], iv[16], iv2[16];
7 int cipher_idx;
8 symmetric_CBC cbc;
9 symmetric_CFB cfb;
10 symmetric_OFB ofb;
11 symmetric_CTR ctr;
12 unsigned long l;
13
14 /* make a random pt, key and iv */
15 yarrow_read(pt, 64, &yarrow_prng);
16 yarrow_read(key, 16, &yarrow_prng);
17 yarrow_read(iv, 16, &yarrow_prng);
18
19 /* get idx of AES handy */
20 cipher_idx = find_cipher("aes");
21 if (cipher_idx == -1) {
22 printf("test requires AES");
23 return 1;
24 }
25
26 #ifdef CBC
27 /* test CBC mode */
28 /* encode the block */
29 DO(cbc_start(cipher_idx, iv, key, 16, 0, &cbc));
30 l = sizeof(iv2);
31 DO(cbc_getiv(iv2, &l, &cbc));
32 if (l != 16 || memcmp(iv2, iv, 16)) {
33 printf("cbc_getiv failed");
34 return 1;
35 }
36 DO(cbc_encrypt(pt, ct, 64, &cbc));
37
38 /* decode the block */
39 DO(cbc_setiv(iv2, l, &cbc));
40 zeromem(tmp, sizeof(tmp));
41 DO(cbc_decrypt(ct, tmp, 64, &cbc));
42 if (memcmp(tmp, pt, 64) != 0) {
43 printf("CBC failed");
44 return 1;
45 }
46 #endif
47
48 #ifdef CFB
49 /* test CFB mode */
50 /* encode the block */
51 DO(cfb_start(cipher_idx, iv, key, 16, 0, &cfb));
52 l = sizeof(iv2);
53 DO(cfb_getiv(iv2, &l, &cfb));
54 /* note we don't memcmp iv2/iv since cfb_start processes the IV for the first block */
55 if (l != 16) {
56 printf("cfb_getiv failed");
57 return 1;
58 }
59 DO(cfb_encrypt(pt, ct, 64, &cfb));
60
61 /* decode the block */
62 DO(cfb_setiv(iv, l, &cfb));
63 zeromem(tmp, sizeof(tmp));
64 DO(cfb_decrypt(ct, tmp, 64, &cfb));
65 if (memcmp(tmp, pt, 64) != 0) {
66 printf("CFB failed");
67 return 1;
68 }
69 #endif
70
71 #ifdef OFB
72 /* test OFB mode */
73 /* encode the block */
74 DO(ofb_start(cipher_idx, iv, key, 16, 0, &ofb));
75 l = sizeof(iv2);
76 DO(ofb_getiv(iv2, &l, &ofb));
77 if (l != 16 || memcmp(iv2, iv, 16)) {
78 printf("ofb_getiv failed");
79 return 1;
80 }
81 DO(ofb_encrypt(pt, ct, 64, &ofb));
82
83 /* decode the block */
84 DO(ofb_setiv(iv2, l, &ofb));
85 zeromem(tmp, sizeof(tmp));
86 DO(ofb_decrypt(ct, tmp, 64, &ofb));
87 if (memcmp(tmp, pt, 64) != 0) {
88 printf("OFB failed");
89 return 1;
90 }
91 #endif
92
93 #ifdef CTR
94 /* test CTR mode */
95 /* encode the block */
96 DO(ctr_start(cipher_idx, iv, key, 16, 0, &ctr));
97 l = sizeof(iv2);
98 DO(ctr_getiv(iv2, &l, &ctr));
99 if (l != 16 || memcmp(iv2, iv, 16)) {
100 printf("ctr_getiv failed");
101 return 1;
102 }
103 DO(ctr_encrypt(pt, ct, 57, &ctr));
104
105 /* decode the block */
106 DO(ctr_setiv(iv2, l, &ctr));
107 zeromem(tmp, sizeof(tmp));
108 DO(ctr_decrypt(ct, tmp, 57, &ctr));
109 if (memcmp(tmp, pt, 57) != 0) {
110 printf("CTR failed");
111 return 1;
112 }
113 #endif
114
115 return 0;
116 }