Anders Rundgren
/
crypto
main.cpp
- Committer:
- andersrundgren
- Date:
- 2009-12-29
- Revision:
- 0:1728f99b19f6
File content as of revision 0:1728f99b19f6:
#include <stdio.h> #include <string.h> #include "webpki/crypto.h" #include "webpki/hexdump.h" using namespace webpki; unsigned char app_b1[SHA256Provider::DIGEST_LENGTH] = { 0xba,0x78,0x16,0xbf,0x8f,0x01,0xcf,0xea, 0x41,0x41,0x40,0xde,0x5d,0xae,0x22,0x23, 0xb0,0x03,0x61,0xa3,0x96,0x17,0x7a,0x9c, 0xb4,0x10,0xff,0x61,0xf2,0x00,0x15,0xad }; unsigned char app_b2[SHA256Provider::DIGEST_LENGTH] = { 0x24,0x8d,0x6a,0x61,0xd2,0x06,0x38,0xb8, 0xe5,0xc0,0x26,0x93,0x0c,0x3e,0x60,0x39, 0xa3,0x3c,0xe4,0x59,0x64,0xff,0x21,0x67, 0xf6,0xec,0xed,0xd4,0x19,0xdb,0x06,0xc1 }; unsigned char app_b3[SHA256Provider::DIGEST_LENGTH] = { 0xcd,0xc7,0x6e,0x5c,0x99,0x14,0xfb,0x92, 0x81,0xa1,0xc7,0xe2,0x84,0xd7,0x3e,0x67, 0xf1,0x80,0x9a,0x48,0xa4,0x97,0x20,0x0e, 0x04,0x6d,0x39,0xcc,0xc7,0x11,0x2c,0xd0 }; #define BIG_TEST_SIZE 240 unsigned char init_hex_data[500]; int init_hex_len; HexDump dumper; int hex2 (int c) { if (c >= '0' && c <= '9') return c - '0'; if (c >= 'a') return c - 'a' + 10; return c - 'A' + 10; } void init (const char *hex) { init_hex_len = 0; while (*hex) { int i = hex2 (*hex++) << 4; init_hex_data[init_hex_len++] = (unsigned char) i + hex2 (*hex++); } } static void dumpdata (const char *title, const unsigned char *data, int length) { printf("\n%s\n",title); dumper.printDebugData (data, length); printf("\n"); } int main () { const int KEYSIZE = AESProvider::AES_BLOCK_SIZE * 2; const unsigned char raw_key[KEYSIZE] = {'b', 'y', '9', '8', '4', 'g', '2', 'y', 'c', '2', 'g', '7', '6', '|', 'x', 's'}; unsigned char plaintext[BIG_TEST_SIZE]; unsigned char ciphertext[BIG_TEST_SIZE]; unsigned char checktext[BIG_TEST_SIZE]; unsigned char iv[AESProvider::AES_BLOCK_SIZE] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5'}; AESProvider myaes; strcpy((char*)plaintext,"The quick brown fox jumped over the lazy bear"); int in_out_len = strlen((char*)plaintext); // Straight encrypt myaes.setKey (raw_key, KEYSIZE, true); dumpdata ("Plaintext", plaintext, in_out_len); myaes.encrypt (ciphertext, in_out_len, plaintext, iv, true); dumpdata ("Ciphertext", (unsigned char*)ciphertext, in_out_len); // Straight decrypt myaes.setKey (raw_key, KEYSIZE, false); myaes.encrypt (checktext, in_out_len, ciphertext, iv, true); dumpdata ("Restored Plaintext", checktext, in_out_len); SHA256Provider sha256; unsigned char md[SHA256Provider::DIGEST_LENGTH]; sha256.update ((unsigned char*) "abc", 3); sha256.doFinal (md); // EVP_Digest ("abc",3,md,NULL,EVP_sha256(),NULL); if (memcmp(md,app_b1,sizeof(app_b1))) { printf("\nTEST 1 of 3 failed.\n"); return 1; } else printf("."); sha256.update ((unsigned char*) "abcdbcde""cdefdefg""efghfghi""ghijhijk" "ijkljklm""klmnlmno""mnopnopq",56); sha256.doFinal (md); if (memcmp(md,app_b2,sizeof(app_b2))) { printf("\nTEST 2 of 3 failed.\n"); return 1; } else printf("."); for (int i=0;i<1000000;i+=160) sha256.update ((unsigned char*) "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa", (1000000-i)<160?1000000-i:160); sha256.doFinal (md); if (memcmp(md,app_b3,sizeof(app_b3))) { printf("\nTEST 3 of 3 failed.\n"); return 1; } else printf("."); printf(" SHA passed.\n"); SHA1Provider sha1; sha1.update((unsigned char*)"Test vector from febooti.com", 28); init ("a7631795f6d59cd6d14ebd0058a6394a4b93d868"); sha1.doFinal (md); if (memcmp(md,init_hex_data,20)) { printf("\nSHA TEST 1 failed.\n"); return 1; } else printf(".SHA1 passed\n"); HMAC_SHA256Provider hmac256; init ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaa"); hmac256.init (init_hex_data, init_hex_len); init ("54657374205573696e67204c61726765" "72205468616e20426c6f636b2d53697a" "65204b6579202d2048617368204b6579" "204669727374"); hmac256.update (init_hex_data, init_hex_len); init ("60e431591ee0b67f0d8a26aacbf5b77f" "8e0bc6213728c5140546040f0ee37f54"); hmac256.doFinal (md); if (memcmp(md,init_hex_data,sizeof (md))) { printf("\nHMAC TEST 1 failed.\n"); return 1; } else printf("."); init ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaa"); hmac256.init (init_hex_data, init_hex_len); init ("dddddddddddddddddddddddddddddddd" "dddddddddddddddddddddddddddddddd" "dddddddddddddddddddddddddddddddd" "dddd"); hmac256.update (init_hex_data, init_hex_len); init ("773ea91e36800e46854db8ebd09181a7" "2959098b3ef8c122d9635514ced565fe"); hmac256.doFinal (md); if (memcmp(md,init_hex_data,sizeof (md))) { printf("\nHMAC TEST 2 failed.\n"); return 1; } else printf("."); init ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaa"); hmac256.init (init_hex_data, init_hex_len); init ("dddddddddddddddddddddddddddddddd" "dddddddddddddddddd"); hmac256.update (init_hex_data, init_hex_len); init ("dddddddddddddddddddddddddddddddd" "dddddddddddddddddd"); hmac256.update (init_hex_data, init_hex_len); init ("773ea91e36800e46854db8ebd09181a7" "2959098b3ef8c122d9635514ced565fe"); hmac256.doFinal (md); if (memcmp(md,init_hex_data,sizeof (md))) { printf("\nHMAC TEST 3 failed.\n"); return 1; } else printf(". HMAC passed.\n"); }