2
0

modes_test.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. int modes_test(void)
  6. {
  7. int ret = CRYPT_NOP;
  8. #ifdef LTC_CBC_MODE
  9. symmetric_CBC cbc;
  10. #endif
  11. #ifdef LTC_CFB_MODE
  12. symmetric_CFB cfb;
  13. #endif
  14. #ifdef LTC_OFB_MODE
  15. symmetric_OFB ofb;
  16. #endif
  17. #if defined(LTC_CBC_MODE) || defined(LTC_CFB_MODE) || defined(LTC_OFB_MODE)
  18. unsigned char pt[64], ct[64], tmp[64], key[16], iv[16], iv2[16];
  19. int cipher_idx;
  20. unsigned long l;
  21. /* make a random pt, key and iv */
  22. ENSURE(yarrow_read(pt, 64, &yarrow_prng) == 64);
  23. ENSURE(yarrow_read(key, 16, &yarrow_prng) == 16);
  24. ENSURE(yarrow_read(iv, 16, &yarrow_prng) == 16);
  25. /* get idx of AES handy */
  26. cipher_idx = find_cipher("aes");
  27. if (cipher_idx == -1) {
  28. fprintf(stderr, "test requires AES");
  29. return 1;
  30. }
  31. #endif
  32. #ifdef LTC_F8_MODE
  33. DO(ret = f8_test_mode());
  34. #endif
  35. #ifdef LTC_LRW_MODE
  36. DO(ret = lrw_test());
  37. #endif
  38. #ifdef LTC_CBC_MODE
  39. /* test CBC mode */
  40. /* encode the block */
  41. DO(ret = cbc_start(cipher_idx, iv, key, 16, 0, &cbc));
  42. l = sizeof(iv2);
  43. DO(ret = cbc_getiv(iv2, &l, &cbc));
  44. if (l != 16 || memcmp(iv2, iv, 16)) {
  45. fprintf(stderr, "cbc_getiv failed");
  46. return 1;
  47. }
  48. DO(ret = cbc_encrypt(pt, ct, 64, &cbc));
  49. /* decode the block */
  50. DO(ret = cbc_setiv(iv2, l, &cbc));
  51. zeromem(tmp, sizeof(tmp));
  52. DO(ret = cbc_decrypt(ct, tmp, 64, &cbc));
  53. if (memcmp(tmp, pt, 64) != 0) {
  54. fprintf(stderr, "CBC failed");
  55. return 1;
  56. }
  57. #endif
  58. #ifdef LTC_CFB_MODE
  59. /* test CFB mode */
  60. /* encode the block */
  61. DO(ret = cfb_start(cipher_idx, iv, key, 16, 0, &cfb));
  62. l = sizeof(iv2);
  63. DO(ret = cfb_getiv(iv2, &l, &cfb));
  64. /* note we don't memcmp iv2/iv since cfb_start processes the IV for the first block */
  65. if (l != 16) {
  66. fprintf(stderr, "cfb_getiv failed");
  67. return 1;
  68. }
  69. DO(ret = cfb_encrypt(pt, ct, 64, &cfb));
  70. /* decode the block */
  71. DO(ret = cfb_setiv(iv, l, &cfb));
  72. zeromem(tmp, sizeof(tmp));
  73. DO(ret = cfb_decrypt(ct, tmp, 64, &cfb));
  74. if (memcmp(tmp, pt, 64) != 0) {
  75. fprintf(stderr, "CFB failed");
  76. return 1;
  77. }
  78. #endif
  79. #ifdef LTC_OFB_MODE
  80. /* test OFB mode */
  81. /* encode the block */
  82. DO(ret = ofb_start(cipher_idx, iv, key, 16, 0, &ofb));
  83. l = sizeof(iv2);
  84. DO(ret = ofb_getiv(iv2, &l, &ofb));
  85. if (l != 16 || memcmp(iv2, iv, 16)) {
  86. fprintf(stderr, "ofb_getiv failed");
  87. return 1;
  88. }
  89. DO(ret = ofb_encrypt(pt, ct, 64, &ofb));
  90. /* decode the block */
  91. DO(ret = ofb_setiv(iv2, l, &ofb));
  92. zeromem(tmp, sizeof(tmp));
  93. DO(ret = ofb_decrypt(ct, tmp, 64, &ofb));
  94. if (memcmp(tmp, pt, 64) != 0) {
  95. fprintf(stderr, "OFB failed");
  96. return 1;
  97. }
  98. #endif
  99. #if defined(LTC_CTR_MODE) && defined(LTC_RIJNDAEL)
  100. DO(ret = ctr_test());
  101. #endif
  102. #ifdef LTC_XTS_MODE
  103. DO(ret = xts_test());
  104. #endif
  105. return 0;
  106. }