Anders Rundgren
/
crypto
main.cpp@0:1728f99b19f6, 2009-12-29 (annotated)
- Committer:
- andersrundgren
- Date:
- Tue Dec 29 21:08:18 2009 +0000
- Revision:
- 0:1728f99b19f6
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andersrundgren | 0:1728f99b19f6 | 1 | |
andersrundgren | 0:1728f99b19f6 | 2 | #include <stdio.h> |
andersrundgren | 0:1728f99b19f6 | 3 | #include <string.h> |
andersrundgren | 0:1728f99b19f6 | 4 | |
andersrundgren | 0:1728f99b19f6 | 5 | #include "webpki/crypto.h" |
andersrundgren | 0:1728f99b19f6 | 6 | #include "webpki/hexdump.h" |
andersrundgren | 0:1728f99b19f6 | 7 | |
andersrundgren | 0:1728f99b19f6 | 8 | using namespace webpki; |
andersrundgren | 0:1728f99b19f6 | 9 | |
andersrundgren | 0:1728f99b19f6 | 10 | unsigned char app_b1[SHA256Provider::DIGEST_LENGTH] = { |
andersrundgren | 0:1728f99b19f6 | 11 | 0xba,0x78,0x16,0xbf,0x8f,0x01,0xcf,0xea, |
andersrundgren | 0:1728f99b19f6 | 12 | 0x41,0x41,0x40,0xde,0x5d,0xae,0x22,0x23, |
andersrundgren | 0:1728f99b19f6 | 13 | 0xb0,0x03,0x61,0xa3,0x96,0x17,0x7a,0x9c, |
andersrundgren | 0:1728f99b19f6 | 14 | 0xb4,0x10,0xff,0x61,0xf2,0x00,0x15,0xad }; |
andersrundgren | 0:1728f99b19f6 | 15 | |
andersrundgren | 0:1728f99b19f6 | 16 | unsigned char app_b2[SHA256Provider::DIGEST_LENGTH] = { |
andersrundgren | 0:1728f99b19f6 | 17 | 0x24,0x8d,0x6a,0x61,0xd2,0x06,0x38,0xb8, |
andersrundgren | 0:1728f99b19f6 | 18 | 0xe5,0xc0,0x26,0x93,0x0c,0x3e,0x60,0x39, |
andersrundgren | 0:1728f99b19f6 | 19 | 0xa3,0x3c,0xe4,0x59,0x64,0xff,0x21,0x67, |
andersrundgren | 0:1728f99b19f6 | 20 | 0xf6,0xec,0xed,0xd4,0x19,0xdb,0x06,0xc1 }; |
andersrundgren | 0:1728f99b19f6 | 21 | |
andersrundgren | 0:1728f99b19f6 | 22 | unsigned char app_b3[SHA256Provider::DIGEST_LENGTH] = { |
andersrundgren | 0:1728f99b19f6 | 23 | 0xcd,0xc7,0x6e,0x5c,0x99,0x14,0xfb,0x92, |
andersrundgren | 0:1728f99b19f6 | 24 | 0x81,0xa1,0xc7,0xe2,0x84,0xd7,0x3e,0x67, |
andersrundgren | 0:1728f99b19f6 | 25 | 0xf1,0x80,0x9a,0x48,0xa4,0x97,0x20,0x0e, |
andersrundgren | 0:1728f99b19f6 | 26 | 0x04,0x6d,0x39,0xcc,0xc7,0x11,0x2c,0xd0 }; |
andersrundgren | 0:1728f99b19f6 | 27 | |
andersrundgren | 0:1728f99b19f6 | 28 | #define BIG_TEST_SIZE 240 |
andersrundgren | 0:1728f99b19f6 | 29 | |
andersrundgren | 0:1728f99b19f6 | 30 | unsigned char init_hex_data[500]; |
andersrundgren | 0:1728f99b19f6 | 31 | int init_hex_len; |
andersrundgren | 0:1728f99b19f6 | 32 | |
andersrundgren | 0:1728f99b19f6 | 33 | HexDump dumper; |
andersrundgren | 0:1728f99b19f6 | 34 | |
andersrundgren | 0:1728f99b19f6 | 35 | int hex2 (int c) |
andersrundgren | 0:1728f99b19f6 | 36 | { |
andersrundgren | 0:1728f99b19f6 | 37 | if (c >= '0' && c <= '9') |
andersrundgren | 0:1728f99b19f6 | 38 | return c - '0'; |
andersrundgren | 0:1728f99b19f6 | 39 | if (c >= 'a') |
andersrundgren | 0:1728f99b19f6 | 40 | return c - 'a' + 10; |
andersrundgren | 0:1728f99b19f6 | 41 | return c - 'A' + 10; |
andersrundgren | 0:1728f99b19f6 | 42 | } |
andersrundgren | 0:1728f99b19f6 | 43 | |
andersrundgren | 0:1728f99b19f6 | 44 | void init (const char *hex) |
andersrundgren | 0:1728f99b19f6 | 45 | { |
andersrundgren | 0:1728f99b19f6 | 46 | init_hex_len = 0; |
andersrundgren | 0:1728f99b19f6 | 47 | while (*hex) |
andersrundgren | 0:1728f99b19f6 | 48 | { |
andersrundgren | 0:1728f99b19f6 | 49 | int i = hex2 (*hex++) << 4; |
andersrundgren | 0:1728f99b19f6 | 50 | init_hex_data[init_hex_len++] = (unsigned char) i + hex2 (*hex++); |
andersrundgren | 0:1728f99b19f6 | 51 | } |
andersrundgren | 0:1728f99b19f6 | 52 | } |
andersrundgren | 0:1728f99b19f6 | 53 | |
andersrundgren | 0:1728f99b19f6 | 54 | static void dumpdata (const char *title, const unsigned char *data, int length) |
andersrundgren | 0:1728f99b19f6 | 55 | { |
andersrundgren | 0:1728f99b19f6 | 56 | printf("\n%s\n",title); |
andersrundgren | 0:1728f99b19f6 | 57 | dumper.printDebugData (data, length); |
andersrundgren | 0:1728f99b19f6 | 58 | printf("\n"); |
andersrundgren | 0:1728f99b19f6 | 59 | } |
andersrundgren | 0:1728f99b19f6 | 60 | |
andersrundgren | 0:1728f99b19f6 | 61 | int main () |
andersrundgren | 0:1728f99b19f6 | 62 | { |
andersrundgren | 0:1728f99b19f6 | 63 | const int KEYSIZE = AESProvider::AES_BLOCK_SIZE * 2; |
andersrundgren | 0:1728f99b19f6 | 64 | const unsigned char raw_key[KEYSIZE] = {'b', 'y', '9', '8', '4', 'g', '2', 'y', 'c', '2', 'g', '7', '6', '|', 'x', 's'}; |
andersrundgren | 0:1728f99b19f6 | 65 | unsigned char plaintext[BIG_TEST_SIZE]; |
andersrundgren | 0:1728f99b19f6 | 66 | unsigned char ciphertext[BIG_TEST_SIZE]; |
andersrundgren | 0:1728f99b19f6 | 67 | unsigned char checktext[BIG_TEST_SIZE]; |
andersrundgren | 0:1728f99b19f6 | 68 | unsigned char iv[AESProvider::AES_BLOCK_SIZE] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5'}; |
andersrundgren | 0:1728f99b19f6 | 69 | AESProvider myaes; |
andersrundgren | 0:1728f99b19f6 | 70 | |
andersrundgren | 0:1728f99b19f6 | 71 | strcpy((char*)plaintext,"The quick brown fox jumped over the lazy bear"); |
andersrundgren | 0:1728f99b19f6 | 72 | int in_out_len = strlen((char*)plaintext); |
andersrundgren | 0:1728f99b19f6 | 73 | |
andersrundgren | 0:1728f99b19f6 | 74 | // Straight encrypt |
andersrundgren | 0:1728f99b19f6 | 75 | |
andersrundgren | 0:1728f99b19f6 | 76 | myaes.setKey (raw_key, KEYSIZE, true); |
andersrundgren | 0:1728f99b19f6 | 77 | dumpdata ("Plaintext", plaintext, in_out_len); |
andersrundgren | 0:1728f99b19f6 | 78 | |
andersrundgren | 0:1728f99b19f6 | 79 | myaes.encrypt (ciphertext, in_out_len, plaintext, iv, true); |
andersrundgren | 0:1728f99b19f6 | 80 | dumpdata ("Ciphertext", (unsigned char*)ciphertext, in_out_len); |
andersrundgren | 0:1728f99b19f6 | 81 | |
andersrundgren | 0:1728f99b19f6 | 82 | // Straight decrypt |
andersrundgren | 0:1728f99b19f6 | 83 | |
andersrundgren | 0:1728f99b19f6 | 84 | myaes.setKey (raw_key, KEYSIZE, false); |
andersrundgren | 0:1728f99b19f6 | 85 | myaes.encrypt (checktext, in_out_len, ciphertext, iv, true); |
andersrundgren | 0:1728f99b19f6 | 86 | dumpdata ("Restored Plaintext", checktext, in_out_len); |
andersrundgren | 0:1728f99b19f6 | 87 | |
andersrundgren | 0:1728f99b19f6 | 88 | SHA256Provider sha256; |
andersrundgren | 0:1728f99b19f6 | 89 | unsigned char md[SHA256Provider::DIGEST_LENGTH]; |
andersrundgren | 0:1728f99b19f6 | 90 | |
andersrundgren | 0:1728f99b19f6 | 91 | sha256.update ((unsigned char*) "abc", 3); |
andersrundgren | 0:1728f99b19f6 | 92 | sha256.doFinal (md); |
andersrundgren | 0:1728f99b19f6 | 93 | |
andersrundgren | 0:1728f99b19f6 | 94 | // EVP_Digest ("abc",3,md,NULL,EVP_sha256(),NULL); |
andersrundgren | 0:1728f99b19f6 | 95 | if (memcmp(md,app_b1,sizeof(app_b1))) |
andersrundgren | 0:1728f99b19f6 | 96 | { |
andersrundgren | 0:1728f99b19f6 | 97 | printf("\nTEST 1 of 3 failed.\n"); |
andersrundgren | 0:1728f99b19f6 | 98 | return 1; |
andersrundgren | 0:1728f99b19f6 | 99 | } |
andersrundgren | 0:1728f99b19f6 | 100 | else |
andersrundgren | 0:1728f99b19f6 | 101 | printf("."); |
andersrundgren | 0:1728f99b19f6 | 102 | |
andersrundgren | 0:1728f99b19f6 | 103 | sha256.update ((unsigned char*) "abcdbcde""cdefdefg""efghfghi""ghijhijk" |
andersrundgren | 0:1728f99b19f6 | 104 | "ijkljklm""klmnlmno""mnopnopq",56); |
andersrundgren | 0:1728f99b19f6 | 105 | sha256.doFinal (md); |
andersrundgren | 0:1728f99b19f6 | 106 | if (memcmp(md,app_b2,sizeof(app_b2))) |
andersrundgren | 0:1728f99b19f6 | 107 | { |
andersrundgren | 0:1728f99b19f6 | 108 | printf("\nTEST 2 of 3 failed.\n"); |
andersrundgren | 0:1728f99b19f6 | 109 | return 1; |
andersrundgren | 0:1728f99b19f6 | 110 | } |
andersrundgren | 0:1728f99b19f6 | 111 | else |
andersrundgren | 0:1728f99b19f6 | 112 | printf("."); |
andersrundgren | 0:1728f99b19f6 | 113 | |
andersrundgren | 0:1728f99b19f6 | 114 | for (int i=0;i<1000000;i+=160) |
andersrundgren | 0:1728f99b19f6 | 115 | sha256.update ((unsigned char*) "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 116 | "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 117 | "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 118 | "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 119 | "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa", |
andersrundgren | 0:1728f99b19f6 | 120 | (1000000-i)<160?1000000-i:160); |
andersrundgren | 0:1728f99b19f6 | 121 | sha256.doFinal (md); |
andersrundgren | 0:1728f99b19f6 | 122 | if (memcmp(md,app_b3,sizeof(app_b3))) |
andersrundgren | 0:1728f99b19f6 | 123 | { |
andersrundgren | 0:1728f99b19f6 | 124 | printf("\nTEST 3 of 3 failed.\n"); |
andersrundgren | 0:1728f99b19f6 | 125 | return 1; |
andersrundgren | 0:1728f99b19f6 | 126 | } |
andersrundgren | 0:1728f99b19f6 | 127 | else |
andersrundgren | 0:1728f99b19f6 | 128 | printf("."); |
andersrundgren | 0:1728f99b19f6 | 129 | printf(" SHA passed.\n"); |
andersrundgren | 0:1728f99b19f6 | 130 | |
andersrundgren | 0:1728f99b19f6 | 131 | SHA1Provider sha1; |
andersrundgren | 0:1728f99b19f6 | 132 | sha1.update((unsigned char*)"Test vector from febooti.com", 28); |
andersrundgren | 0:1728f99b19f6 | 133 | init ("a7631795f6d59cd6d14ebd0058a6394a4b93d868"); |
andersrundgren | 0:1728f99b19f6 | 134 | sha1.doFinal (md); |
andersrundgren | 0:1728f99b19f6 | 135 | if (memcmp(md,init_hex_data,20)) |
andersrundgren | 0:1728f99b19f6 | 136 | { |
andersrundgren | 0:1728f99b19f6 | 137 | printf("\nSHA TEST 1 failed.\n"); |
andersrundgren | 0:1728f99b19f6 | 138 | return 1; |
andersrundgren | 0:1728f99b19f6 | 139 | } |
andersrundgren | 0:1728f99b19f6 | 140 | else |
andersrundgren | 0:1728f99b19f6 | 141 | printf(".SHA1 passed\n"); |
andersrundgren | 0:1728f99b19f6 | 142 | |
andersrundgren | 0:1728f99b19f6 | 143 | HMAC_SHA256Provider hmac256; |
andersrundgren | 0:1728f99b19f6 | 144 | init ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 145 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 146 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 147 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 148 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 149 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 150 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 151 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 152 | "aaaaaa"); |
andersrundgren | 0:1728f99b19f6 | 153 | hmac256.init (init_hex_data, init_hex_len); |
andersrundgren | 0:1728f99b19f6 | 154 | init ("54657374205573696e67204c61726765" |
andersrundgren | 0:1728f99b19f6 | 155 | "72205468616e20426c6f636b2d53697a" |
andersrundgren | 0:1728f99b19f6 | 156 | "65204b6579202d2048617368204b6579" |
andersrundgren | 0:1728f99b19f6 | 157 | "204669727374"); |
andersrundgren | 0:1728f99b19f6 | 158 | hmac256.update (init_hex_data, init_hex_len); |
andersrundgren | 0:1728f99b19f6 | 159 | init ("60e431591ee0b67f0d8a26aacbf5b77f" |
andersrundgren | 0:1728f99b19f6 | 160 | "8e0bc6213728c5140546040f0ee37f54"); |
andersrundgren | 0:1728f99b19f6 | 161 | hmac256.doFinal (md); |
andersrundgren | 0:1728f99b19f6 | 162 | if (memcmp(md,init_hex_data,sizeof (md))) |
andersrundgren | 0:1728f99b19f6 | 163 | { |
andersrundgren | 0:1728f99b19f6 | 164 | printf("\nHMAC TEST 1 failed.\n"); |
andersrundgren | 0:1728f99b19f6 | 165 | return 1; |
andersrundgren | 0:1728f99b19f6 | 166 | } |
andersrundgren | 0:1728f99b19f6 | 167 | else |
andersrundgren | 0:1728f99b19f6 | 168 | printf("."); |
andersrundgren | 0:1728f99b19f6 | 169 | init ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 170 | "aaaaaaaa"); |
andersrundgren | 0:1728f99b19f6 | 171 | hmac256.init (init_hex_data, init_hex_len); |
andersrundgren | 0:1728f99b19f6 | 172 | init ("dddddddddddddddddddddddddddddddd" |
andersrundgren | 0:1728f99b19f6 | 173 | "dddddddddddddddddddddddddddddddd" |
andersrundgren | 0:1728f99b19f6 | 174 | "dddddddddddddddddddddddddddddddd" |
andersrundgren | 0:1728f99b19f6 | 175 | "dddd"); |
andersrundgren | 0:1728f99b19f6 | 176 | hmac256.update (init_hex_data, init_hex_len); |
andersrundgren | 0:1728f99b19f6 | 177 | init ("773ea91e36800e46854db8ebd09181a7" |
andersrundgren | 0:1728f99b19f6 | 178 | "2959098b3ef8c122d9635514ced565fe"); |
andersrundgren | 0:1728f99b19f6 | 179 | hmac256.doFinal (md); |
andersrundgren | 0:1728f99b19f6 | 180 | if (memcmp(md,init_hex_data,sizeof (md))) |
andersrundgren | 0:1728f99b19f6 | 181 | { |
andersrundgren | 0:1728f99b19f6 | 182 | printf("\nHMAC TEST 2 failed.\n"); |
andersrundgren | 0:1728f99b19f6 | 183 | return 1; |
andersrundgren | 0:1728f99b19f6 | 184 | } |
andersrundgren | 0:1728f99b19f6 | 185 | else |
andersrundgren | 0:1728f99b19f6 | 186 | printf("."); |
andersrundgren | 0:1728f99b19f6 | 187 | init ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
andersrundgren | 0:1728f99b19f6 | 188 | "aaaaaaaa"); |
andersrundgren | 0:1728f99b19f6 | 189 | hmac256.init (init_hex_data, init_hex_len); |
andersrundgren | 0:1728f99b19f6 | 190 | init ("dddddddddddddddddddddddddddddddd" |
andersrundgren | 0:1728f99b19f6 | 191 | "dddddddddddddddddd"); |
andersrundgren | 0:1728f99b19f6 | 192 | hmac256.update (init_hex_data, init_hex_len); |
andersrundgren | 0:1728f99b19f6 | 193 | init ("dddddddddddddddddddddddddddddddd" |
andersrundgren | 0:1728f99b19f6 | 194 | "dddddddddddddddddd"); |
andersrundgren | 0:1728f99b19f6 | 195 | hmac256.update (init_hex_data, init_hex_len); |
andersrundgren | 0:1728f99b19f6 | 196 | init ("773ea91e36800e46854db8ebd09181a7" |
andersrundgren | 0:1728f99b19f6 | 197 | "2959098b3ef8c122d9635514ced565fe"); |
andersrundgren | 0:1728f99b19f6 | 198 | hmac256.doFinal (md); |
andersrundgren | 0:1728f99b19f6 | 199 | if (memcmp(md,init_hex_data,sizeof (md))) |
andersrundgren | 0:1728f99b19f6 | 200 | { |
andersrundgren | 0:1728f99b19f6 | 201 | printf("\nHMAC TEST 3 failed.\n"); |
andersrundgren | 0:1728f99b19f6 | 202 | return 1; |
andersrundgren | 0:1728f99b19f6 | 203 | } |
andersrundgren | 0:1728f99b19f6 | 204 | else |
andersrundgren | 0:1728f99b19f6 | 205 | printf(". HMAC passed.\n"); |
andersrundgren | 0:1728f99b19f6 | 206 | |
andersrundgren | 0:1728f99b19f6 | 207 | } |