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
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
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
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 }