Dependencies:   mbed

Committer:
andersrundgren
Date:
Tue Dec 29 21:08:18 2009 +0000
Revision:
0:1728f99b19f6

        

Who changed what in which revision?

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