2
0

aes-test.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /* libanode: the Anode C reference implementation
  2. * Copyright (C) 2009 Adam Ierymenko <[email protected]>
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>. */
  16. #include <time.h>
  17. #include <sys/time.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <stdlib.h>
  21. #include "../impl/aes.h"
  22. #include "../anode.h"
  23. static const unsigned char AES_TEST_KEY[32] = {
  24. 0x08,0x09,0x0A,0x0B,0x0D,0x0E,0x0F,0x10,0x12,0x13,0x14,0x15,0x17,0x18,0x19,0x1A,
  25. 0x1C,0x1D,0x1E,0x1F,0x21,0x22,0x23,0x24,0x26,0x27,0x28,0x29,0x2B,0x2C,0x2D,0x2E
  26. };
  27. static const unsigned char AES_TEST_IN[16] = {
  28. 0x06,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F,0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x21
  29. };
  30. static const unsigned char AES_TEST_OUT[16] = {
  31. 0x08,0x0e,0x95,0x17,0xeb,0x16,0x77,0x71,0x9a,0xcf,0x72,0x80,0x86,0x04,0x0a,0xe3
  32. };
  33. static const unsigned char CMAC_TEST_KEY[32] = {
  34. 0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,
  35. 0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4
  36. };
  37. static const unsigned char CMAC_TEST1_OUT[16] = {
  38. 0x02,0x89,0x62,0xf6,0x1b,0x7b,0xf8,0x9e,0xfc,0x6b,0x55,0x1f,0x46,0x67,0xd9,0x83
  39. };
  40. static const unsigned char CMAC_TEST2_IN[16] = {
  41. 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a
  42. };
  43. static const unsigned char CMAC_TEST2_OUT[16] = {
  44. 0x28,0xa7,0x02,0x3f,0x45,0x2e,0x8f,0x82,0xbd,0x4b,0xf2,0x8d,0x8c,0x37,0xc3,0x5c
  45. };
  46. static const unsigned char CMAC_TEST3_IN[40] = {
  47. 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a,
  48. 0xae,0x2d,0x8a,0x57,0x1e,0x03,0xac,0x9c,0x9e,0xb7,0x6f,0xac,0x45,0xaf,0x8e,0x51,
  49. 0x30,0xc8,0x1c,0x46,0xa3,0x5c,0xe4,0x11
  50. };
  51. static const unsigned char CMAC_TEST3_OUT[16] = {
  52. 0xaa,0xf3,0xd8,0xf1,0xde,0x56,0x40,0xc2,0x32,0xf5,0xb1,0x69,0xb9,0xc9,0x11,0xe6
  53. };
  54. static const unsigned char CMAC_TEST4_IN[64] = {
  55. 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a,
  56. 0xae,0x2d,0x8a,0x57,0x1e,0x03,0xac,0x9c,0x9e,0xb7,0x6f,0xac,0x45,0xaf,0x8e,0x51,
  57. 0x30,0xc8,0x1c,0x46,0xa3,0x5c,0xe4,0x11,0xe5,0xfb,0xc1,0x19,0x1a,0x0a,0x52,0xef,
  58. 0xf6,0x9f,0x24,0x45,0xdf,0x4f,0x9b,0x17,0xad,0x2b,0x41,0x7b,0xe6,0x6c,0x37,0x10
  59. };
  60. static const unsigned char CMAC_TEST4_OUT[16] = {
  61. 0xe1,0x99,0x21,0x90,0x54,0x9f,0x6e,0xd5,0x69,0x6a,0x2c,0x05,0x6c,0x31,0x54,0x10
  62. };
  63. static void test_cmac(const AnodeAesExpandedKey *expkey,const unsigned char *in,unsigned int inlen,const unsigned char *expected)
  64. {
  65. unsigned int i;
  66. unsigned char out[16];
  67. printf("Testing CMAC with %u byte input:\n",inlen);
  68. printf(" IN: ");
  69. for(i=0;i<inlen;++i)
  70. printf("%.2x",(int)in[i]);
  71. printf("\n");
  72. printf(" EXP: ");
  73. for(i=0;i<16;++i)
  74. printf("%.2x",(int)expected[i]);
  75. printf("\n");
  76. Anode_cmac_aes256(expkey,in,inlen,out);
  77. printf(" OUT: ");
  78. for(i=0;i<16;++i)
  79. printf("%.2x",(int)out[i]);
  80. printf("\n");
  81. if (memcmp(expected,out,16)) {
  82. printf("FAILED!\n");
  83. exit(1);
  84. } else printf("Passed.\n");
  85. }
  86. static void test_cfb(const AnodeAesExpandedKey *expkey,const unsigned char *in,unsigned int inlen,unsigned char *iv,const unsigned char *expected)
  87. {
  88. unsigned char tmp[131072];
  89. unsigned char tmp2[131072];
  90. unsigned char tmpiv[16];
  91. printf("Testing AES-256 CFB mode with %u bytes: ",inlen);
  92. fflush(stdout);
  93. memcpy(tmpiv,iv,16);
  94. Anode_aes256_cfb_encrypt(expkey,in,tmp,tmpiv,inlen);
  95. if (!memcmp(tmp,expected,inlen)) {
  96. printf("FAILED (didn't encrypt)!\n");
  97. exit(1);
  98. }
  99. memcpy(tmpiv,iv,16);
  100. Anode_aes256_cfb_decrypt(expkey,tmp,tmp2,tmpiv,inlen);
  101. if (memcmp(tmp2,expected,inlen)) {
  102. printf("FAILED (didn't encrypt)!\n");
  103. exit(1);
  104. } else printf("Passed.\n");
  105. }
  106. static const char *AES_DIGEST_TEST_1 = "test";
  107. static const char *AES_DIGEST_TEST_2 = "supercalifragilisticexpealidocious";
  108. static const char *AES_DIGEST_TEST_3 = "12345678";
  109. static const char *AES_DIGEST_TEST_4 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  110. int main(int argc,char **argv)
  111. {
  112. AnodeAesExpandedKey expkey;
  113. unsigned int i;
  114. unsigned char aestestbuf[16];
  115. unsigned char cfbin[131072];
  116. unsigned char iv[16];
  117. printf("Testing AES-256:");
  118. Anode_aes256_expand_key(AES_TEST_KEY,&expkey);
  119. printf(" IN: ");
  120. for(i=0;i<16;++i)
  121. printf("%.2x",(int)AES_TEST_IN[i]);
  122. printf("\n");
  123. printf(" EXP: ");
  124. for(i=0;i<16;++i)
  125. printf("%.2x",(int)AES_TEST_OUT[i]);
  126. printf("\n");
  127. Anode_aes256_encrypt(&expkey,AES_TEST_IN,aestestbuf);
  128. printf(" OUT: ");
  129. for(i=0;i<16;++i)
  130. printf("%.2x",(int)aestestbuf[i]);
  131. printf("\n");
  132. if (memcmp(AES_TEST_OUT,aestestbuf,16)) {
  133. printf("FAILED!\n");
  134. return 1;
  135. } else printf("Passed.\n");
  136. printf("\n");
  137. Anode_aes256_expand_key(CMAC_TEST_KEY,&expkey);
  138. test_cmac(&expkey,(unsigned char *)0,0,CMAC_TEST1_OUT);
  139. test_cmac(&expkey,CMAC_TEST2_IN,16,CMAC_TEST2_OUT);
  140. test_cmac(&expkey,CMAC_TEST3_IN,40,CMAC_TEST3_OUT);
  141. test_cmac(&expkey,CMAC_TEST4_IN,64,CMAC_TEST4_OUT);
  142. printf("\n");
  143. for(i=0;i<131072;++i)
  144. cfbin[i] = (unsigned char)(i & 0xff);
  145. for(i=0;i<16;++i)
  146. iv[i] = (unsigned char)(i & 0xff);
  147. for(i=12345;i<131072;i+=7777)
  148. test_cfb(&expkey,cfbin,i,iv,cfbin);
  149. printf("\nTesting AES-DIGEST...\n");
  150. printf("0 bytes: ");
  151. Anode_aes_digest(cfbin,0,iv);
  152. for(i=0;i<16;++i) printf("%.2x",(unsigned int)iv[i]);
  153. printf("\n");
  154. printf("%d bytes: ",(int)strlen(AES_DIGEST_TEST_1));
  155. Anode_aes_digest(AES_DIGEST_TEST_1,strlen(AES_DIGEST_TEST_1),iv);
  156. for(i=0;i<16;++i) printf("%.2x",(unsigned int)iv[i]);
  157. printf("\n");
  158. printf("%d bytes: ",(int)strlen(AES_DIGEST_TEST_2));
  159. Anode_aes_digest(AES_DIGEST_TEST_2,strlen(AES_DIGEST_TEST_2),iv);
  160. for(i=0;i<16;++i) printf("%.2x",(unsigned int)iv[i]);
  161. printf("\n");
  162. printf("%d bytes: ",(int)strlen(AES_DIGEST_TEST_3));
  163. Anode_aes_digest(AES_DIGEST_TEST_3,strlen(AES_DIGEST_TEST_3),iv);
  164. for(i=0;i<16;++i) printf("%.2x",(unsigned int)iv[i]);
  165. printf("\n");
  166. printf("%d bytes: ",(int)strlen(AES_DIGEST_TEST_4));
  167. Anode_aes_digest(AES_DIGEST_TEST_4,strlen(AES_DIGEST_TEST_4),iv);
  168. for(i=0;i<16;++i) printf("%.2x",(unsigned int)iv[i]);
  169. printf("\n");
  170. return 0;
  171. }