Search Code
About crypto

Published 29 Dec 2009.

Last change message: N/A

Import this program

crypto

Published 29 Dec 2009, by   user Anders Rundgren   tag No tags
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 
00002 #include <stdio.h>
00003 #include <string.h>
00004 
00005 #include "webpki/crypto.h"
00006 #include "webpki/hexdump.h"
00007 
00008 using namespace webpki;
00009 
00010 unsigned char app_b1[SHA256Provider::DIGEST_LENGTH] = {
00011     0xba,0x78,0x16,0xbf,0x8f,0x01,0xcf,0xea,
00012     0x41,0x41,0x40,0xde,0x5d,0xae,0x22,0x23,
00013     0xb0,0x03,0x61,0xa3,0x96,0x17,0x7a,0x9c,
00014     0xb4,0x10,0xff,0x61,0xf2,0x00,0x15,0xad };
00015 
00016 unsigned char app_b2[SHA256Provider::DIGEST_LENGTH] = {
00017     0x24,0x8d,0x6a,0x61,0xd2,0x06,0x38,0xb8,
00018     0xe5,0xc0,0x26,0x93,0x0c,0x3e,0x60,0x39,
00019     0xa3,0x3c,0xe4,0x59,0x64,0xff,0x21,0x67,
00020     0xf6,0xec,0xed,0xd4,0x19,0xdb,0x06,0xc1 };
00021 
00022 unsigned char app_b3[SHA256Provider::DIGEST_LENGTH] = {
00023     0xcd,0xc7,0x6e,0x5c,0x99,0x14,0xfb,0x92,
00024     0x81,0xa1,0xc7,0xe2,0x84,0xd7,0x3e,0x67,
00025     0xf1,0x80,0x9a,0x48,0xa4,0x97,0x20,0x0e,
00026     0x04,0x6d,0x39,0xcc,0xc7,0x11,0x2c,0xd0 };
00027 
00028 #define BIG_TEST_SIZE 240
00029 
00030 unsigned char init_hex_data[500];
00031 int init_hex_len;
00032 
00033 HexDump dumper;
00034 
00035 int hex2 (int c)
00036 {
00037     if (c >= '0' && c <= '9')
00038         return c - '0';
00039     if (c >= 'a')
00040         return c - 'a' + 10;
00041     return c - 'A' + 10;
00042 }
00043 
00044 void init (const char *hex)
00045 {
00046     init_hex_len = 0;
00047     while (*hex)
00048     {
00049         int i = hex2 (*hex++) << 4;
00050         init_hex_data[init_hex_len++] = (unsigned char) i + hex2 (*hex++);
00051     }
00052 }
00053 
00054 static void dumpdata (const char *title, const unsigned char *data, int length)
00055   {
00056     printf("\n%s\n",title);
00057     dumper.printDebugData (data, length);
00058     printf("\n");
00059   }
00060 
00061 int main ()
00062   {
00063     const int KEYSIZE = AESProvider::AES_BLOCK_SIZE * 2;
00064     const unsigned char raw_key[KEYSIZE] = {'b', 'y', '9', '8', '4', 'g', '2', 'y', 'c', '2', 'g', '7', '6', '|', 'x', 's'};
00065     unsigned char plaintext[BIG_TEST_SIZE];
00066     unsigned char ciphertext[BIG_TEST_SIZE];
00067     unsigned char checktext[BIG_TEST_SIZE];
00068     unsigned char iv[AESProvider::AES_BLOCK_SIZE] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5'};
00069     AESProvider myaes;
00070 
00071     strcpy((char*)plaintext,"The quick brown fox jumped over the lazy bear");
00072     int in_out_len = strlen((char*)plaintext);
00073 
00074     // Straight encrypt
00075 
00076     myaes.setKey (raw_key, KEYSIZE, true);
00077     dumpdata ("Plaintext", plaintext, in_out_len);
00078 
00079     myaes.encrypt (ciphertext, in_out_len, plaintext, iv, true);
00080     dumpdata ("Ciphertext", (unsigned char*)ciphertext, in_out_len);
00081 
00082     // Straight decrypt
00083 
00084     myaes.setKey (raw_key, KEYSIZE, false);
00085     myaes.encrypt (checktext, in_out_len, ciphertext, iv, true);
00086     dumpdata ("Restored Plaintext", checktext, in_out_len);
00087 
00088     SHA256Provider sha256;
00089     unsigned char md[SHA256Provider::DIGEST_LENGTH];
00090 
00091     sha256.update ((unsigned char*) "abc", 3);
00092     sha256.doFinal (md);
00093 
00094 //    EVP_Digest ("abc",3,md,NULL,EVP_sha256(),NULL);
00095     if (memcmp(md,app_b1,sizeof(app_b1)))
00096     {
00097     printf("\nTEST 1 of 3 failed.\n");
00098     return 1;
00099     }
00100     else
00101     printf(".");
00102 
00103     sha256.update ((unsigned char*) "abcdbcde""cdefdefg""efghfghi""ghijhijk"
00104         "ijkljklm""klmnlmno""mnopnopq",56);
00105     sha256.doFinal (md);
00106     if (memcmp(md,app_b2,sizeof(app_b2)))
00107     {
00108     printf("\nTEST 2 of 3 failed.\n");
00109     return 1;
00110     }
00111     else
00112     printf(".");
00113 
00114     for (int i=0;i<1000000;i+=160)
00115       sha256.update ((unsigned char*) "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa"
00116                 "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa"
00117                 "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa"
00118                 "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa"
00119                 "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa",
00120                 (1000000-i)<160?1000000-i:160);
00121     sha256.doFinal (md);
00122     if (memcmp(md,app_b3,sizeof(app_b3)))
00123     {
00124     printf("\nTEST 3 of 3 failed.\n");
00125     return 1;
00126     }
00127     else
00128     printf(".");
00129     printf(" SHA passed.\n");
00130 
00131     SHA1Provider sha1;
00132     sha1.update((unsigned char*)"Test vector from febooti.com", 28);
00133     init ("a7631795f6d59cd6d14ebd0058a6394a4b93d868");
00134     sha1.doFinal (md);
00135     if (memcmp(md,init_hex_data,20))
00136     {
00137     printf("\nSHA TEST 1 failed.\n");
00138     return 1;
00139     }
00140     else
00141     printf(".SHA1 passed\n");
00142 
00143     HMAC_SHA256Provider hmac256;
00144     init ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
00145           "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
00146           "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
00147           "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
00148           "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
00149           "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
00150           "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
00151           "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
00152           "aaaaaa");
00153     hmac256.init (init_hex_data, init_hex_len);
00154     init ("54657374205573696e67204c61726765"
00155           "72205468616e20426c6f636b2d53697a"
00156           "65204b6579202d2048617368204b6579"
00157           "204669727374");
00158     hmac256.update (init_hex_data, init_hex_len);
00159     init ("60e431591ee0b67f0d8a26aacbf5b77f"
00160           "8e0bc6213728c5140546040f0ee37f54");
00161     hmac256.doFinal (md);
00162     if (memcmp(md,init_hex_data,sizeof (md)))
00163     {
00164     printf("\nHMAC TEST 1 failed.\n");
00165     return 1;
00166     }
00167     else
00168     printf(".");
00169     init ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
00170            "aaaaaaaa");
00171     hmac256.init (init_hex_data, init_hex_len);
00172     init ("dddddddddddddddddddddddddddddddd"
00173           "dddddddddddddddddddddddddddddddd"
00174           "dddddddddddddddddddddddddddddddd"
00175           "dddd");
00176     hmac256.update (init_hex_data, init_hex_len);
00177     init ("773ea91e36800e46854db8ebd09181a7"
00178           "2959098b3ef8c122d9635514ced565fe");
00179     hmac256.doFinal (md);
00180     if (memcmp(md,init_hex_data,sizeof (md)))
00181     {
00182     printf("\nHMAC TEST 2 failed.\n");
00183     return 1;
00184     }
00185     else
00186     printf(".");
00187     init ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
00188            "aaaaaaaa");
00189     hmac256.init (init_hex_data, init_hex_len);
00190     init ("dddddddddddddddddddddddddddddddd"
00191           "dddddddddddddddddd");
00192     hmac256.update (init_hex_data, init_hex_len);
00193     init ("dddddddddddddddddddddddddddddddd"
00194           "dddddddddddddddddd");
00195     hmac256.update (init_hex_data, init_hex_len);
00196     init ("773ea91e36800e46854db8ebd09181a7"
00197           "2959098b3ef8c122d9635514ced565fe");
00198     hmac256.doFinal (md);
00199     if (memcmp(md,init_hex_data,sizeof (md)))
00200     {
00201     printf("\nHMAC TEST 3 failed.\n");
00202     return 1;
00203     }
00204     else
00205     printf(". HMAC passed.\n");
00206 
00207   }