modes_test.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
  2. /* SPDX-License-Identifier: Unlicense */
  3. /* test CFB/OFB/CBC modes */
  4. #include <tomcrypt_test.h>
  5. #ifdef LTC_CFB_MODE
  6. static const struct {
  7. int width;
  8. const char *key, *iv, *pt, *ct;
  9. } cfb_testvectors[] = {
  10. {
  11. 1,
  12. "2b7e151628aed2a6abf7158809cf4f3c",
  13. "000102030405060708090a0b0c0d0e0f",
  14. "6bc1",
  15. "68b3",
  16. },
  17. {
  18. 8,
  19. "2b7e151628aed2a6abf7158809cf4f3c",
  20. "000102030405060708090a0b0c0d0e0f",
  21. "6bc1b3e22e409f96e93d7e117393172aae2d",
  22. "3b79424c9c0dd436bace9e0ed4586a4f32b9",
  23. },
  24. };
  25. #endif
  26. int modes_test(void)
  27. {
  28. #ifdef LTC_CBC_MODE
  29. symmetric_CBC cbc;
  30. #endif
  31. #ifdef LTC_OFB_MODE
  32. symmetric_OFB ofb;
  33. #endif
  34. #ifdef LTC_CFB_MODE
  35. symmetric_CFB cfb;
  36. unsigned char tmp2[64];
  37. unsigned long n;
  38. #endif
  39. #if defined(LTC_CBC_MODE) || defined(LTC_CFB_MODE) || defined(LTC_OFB_MODE)
  40. unsigned char pt[64], ct[64], tmp[64], key[16], iv[16], iv2[16];
  41. int cipher_idx;
  42. unsigned long l;
  43. /* make a random pt, key and iv */
  44. ENSURE(yarrow_read(pt, 64, &yarrow_prng) == 64);
  45. ENSURE(yarrow_read(key, 16, &yarrow_prng) == 16);
  46. ENSURE(yarrow_read(iv, 16, &yarrow_prng) == 16);
  47. /* get idx of AES handy */
  48. ENSURE((cipher_idx = find_cipher("aes")) != -1);
  49. #endif
  50. #ifdef LTC_F8_MODE
  51. DO(f8_test_mode());
  52. #endif
  53. #ifdef LTC_LRW_MODE
  54. DO(lrw_test());
  55. #endif
  56. #ifdef LTC_CBC_MODE
  57. /* test CBC mode */
  58. /* encode the block */
  59. DO(cbc_start(cipher_idx, iv, key, 16, 0, &cbc));
  60. l = sizeof(iv2);
  61. DO(cbc_getiv(iv2, &l, &cbc));
  62. COMPARE_TESTVECTOR(iv2, l, iv, 16, "cbc_getiv", 0);
  63. DO(cbc_encrypt(pt, ct, 64, &cbc));
  64. /* decode the block */
  65. DO(cbc_setiv(iv2, l, &cbc));
  66. zeromem(tmp, sizeof(tmp));
  67. DO(cbc_decrypt(ct, tmp, 64, &cbc));
  68. COMPARE_TESTVECTOR(pt, 64, tmp, 64, "CBC", 0);
  69. #endif
  70. #ifdef LTC_CFB_MODE
  71. /* test CFB mode */
  72. /* encode the block */
  73. DO(cfb_start(cipher_idx, iv, key, 16, 0, &cfb));
  74. l = sizeof(iv2);
  75. DO(cfb_getiv(iv2, &l, &cfb));
  76. /* note we don't memcmp iv2/iv since cfb_start processes the IV for the first block */
  77. ENSURE(l == 16);
  78. DO(cfb_encrypt(pt, ct, 64, &cfb));
  79. /* decode the block */
  80. DO(cfb_setiv(iv, l, &cfb));
  81. zeromem(tmp, sizeof(tmp));
  82. DO(cfb_decrypt(ct, tmp, 64, &cfb));
  83. COMPARE_TESTVECTOR(tmp, 64, pt, 64, "cfb128-enc-dec", 0);
  84. cfb_done(&cfb);
  85. XMEMSET(&cfb, 0, sizeof(cfb));
  86. #define b16(e, w) do { \
  87. l = sizeof(w); \
  88. DO(base16_decode(e . w, XSTRLEN(e . w), w, &l)); \
  89. } while(0)
  90. for (n = 0; n < LTC_ARRAY_SIZE(cfb_testvectors); ++n) {
  91. b16(cfb_testvectors[n], key);
  92. b16(cfb_testvectors[n], iv);
  93. b16(cfb_testvectors[n], pt);
  94. b16(cfb_testvectors[n], ct);
  95. DO(cfb_start_ex(cipher_idx, iv, key, 16, 0, cfb_testvectors[n].width, &cfb));
  96. l = sizeof(iv2);
  97. DO(cfb_getiv(iv2, &l, &cfb));
  98. ENSURE(l == 16);
  99. DO(cfb_encrypt(pt, tmp, 2, &cfb));
  100. COMPARE_TESTVECTOR(tmp, 2, ct, 2, "cfb-enc", n);
  101. DO(cfb_setiv(iv2, l, &cfb));
  102. DO(cfb_decrypt(tmp, tmp2, 2, &cfb));
  103. COMPARE_TESTVECTOR(tmp2, 2, pt, 2, "cfb-dec", n);
  104. }
  105. #endif
  106. #ifdef LTC_OFB_MODE
  107. /* test OFB mode */
  108. /* encode the block */
  109. DO(ofb_start(cipher_idx, iv, key, 16, 0, &ofb));
  110. l = sizeof(iv2);
  111. DO(ofb_getiv(iv2, &l, &ofb));
  112. COMPARE_TESTVECTOR(iv2, l, iv, 16, "ofb_getiv", 0);
  113. DO(ofb_encrypt(pt, ct, 64, &ofb));
  114. /* decode the block */
  115. DO(ofb_setiv(iv2, l, &ofb));
  116. zeromem(tmp, sizeof(tmp));
  117. DO(ofb_decrypt(ct, tmp, 64, &ofb));
  118. COMPARE_TESTVECTOR(tmp, 64, pt, 64, "OFB", 0);
  119. #endif
  120. #if defined(LTC_CTR_MODE) && defined(LTC_RIJNDAEL)
  121. DO(ctr_test());
  122. #endif
  123. #ifdef LTC_XTS_MODE
  124. DO(xts_test());
  125. #endif
  126. return 0;
  127. }