brng_test.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. *******************************************************************************
  3. \file brng_test.c
  4. \brief Tests for STB 34.101.47 (brng)
  5. \project bee2/test
  6. \created 2013.04.01
  7. \version 2023.03.29
  8. \copyright The Bee2 authors
  9. \license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
  10. *******************************************************************************
  11. */
  12. #include <bee2/core/mem.h>
  13. #include <bee2/core/hex.h>
  14. #include <bee2/core/util.h>
  15. #include <bee2/crypto/brng.h>
  16. #include <bee2/crypto/belt.h>
  17. /*
  18. *******************************************************************************
  19. Самотестирование
  20. -# Выполняются тесты из приложения Б к СТБ 34.101.47.
  21. -# Номера тестов соответствуют номерам таблиц приложения.
  22. -# Тесты Б.1 реализованы в belt-test.
  23. -# Тесты Б.3 (brng-ctr-stb11761) не реализованы.
  24. -# В тесте Б.2 используется больше проверок, чем указано в таблице.
  25. Дополнительные данные нужны для построения тестов в других стандартах.
  26. -# Дополнительные тесты покрывают ошибки, выявленные в результате испытаний.
  27. *******************************************************************************
  28. */
  29. bool_t brngTest()
  30. {
  31. octet buf[256];
  32. octet buf1[256];
  33. octet iv[128];
  34. octet iv1[32];
  35. octet state[1024];
  36. // подготовить память
  37. if (sizeof(state) < brngCTR_keep() ||
  38. sizeof(state) < brngHMAC_keep())
  39. return FALSE;
  40. // тест Б.2
  41. memCopy(buf, beltH(), 256);
  42. brngCTRStart(state, beltH() + 128, beltH() + 128 + 64);
  43. brngCTRStepR(buf, 32, state);
  44. brngCTRStepR(buf + 32, 32, state);
  45. brngCTRStepR(buf + 64, 32, state);
  46. brngCTRStepG(iv, state);
  47. brngCTRStepR(buf + 96, 256 - 96, state);
  48. if (!hexEq(buf,
  49. "1F66B5B84B7339674533F0329C74F218"
  50. "34281FED0732429E0C79235FC273E269"
  51. "4C0E74B2CD5811AD21F23DE7E0FA742C"
  52. "3ED6EC483C461CE15C33A77AA308B7D2"
  53. "0F51D91347617C20BD4AB07AEF4F26A1"
  54. "AD1362A8F9A3D42FBE1B8E6F1C88AAD5"
  55. "0A4E8298BE0839E46F19409F637F4415"
  56. "572251DD0D39284F0F0390D93BBCE9EC"
  57. "F81B29D571F6452FF8B2B97F57E18A58"
  58. "BC946FEE45EAB32B06FCAC23A33F422B"
  59. "C431B41BBE8E802288737ACF45A29251"
  60. "FC736A3C6F478F77A7ED271D5EEDAA58"
  61. "E98309303623AFD33017C42BC6D43C15"
  62. "438446EE57D46E412EFC0B61B5FBA39E"
  63. "D37BABE50BFEEB8ED162BB1393D46FB4"
  64. "3534A201EB3B1A5C085DC5068ED6F89A"))
  65. return FALSE;
  66. if (!hexEq(iv,
  67. "C132971343FC9A48A02A885F194B09A1"
  68. "7ECDA4D01544AF8CA58450BF66D2E88A"))
  69. return FALSE;
  70. memCopy(buf1, beltH(), 96);
  71. memCopy(iv1, beltH() + 128 + 64, 32);
  72. brngCTRRand(buf1, 96, beltH() + 128, iv1);
  73. if (!memEq(buf, buf1, 96) || !memEq(iv, iv1, 32))
  74. return FALSE;
  75. // тест Б.4
  76. brngHMACStart(state, beltH() + 128, 32, beltH() + 128 + 64, 32);
  77. brngHMACStepR(buf, 32, state);
  78. brngHMACStepR(buf + 32, 11, state);
  79. brngHMACStepR(buf + 32 + 11, 19, state);
  80. brngHMACStepR(buf + 32 + 30, 2, state);
  81. brngHMACStepR(buf + 64, 32, state);
  82. if (!hexEq(buf,
  83. "AF907A0E470A3A1B268ECCCCC0B90F23"
  84. "9FE94A2DC6E014179FC789CB3C3887E4"
  85. "695C6B96B84948F8D76924E22260859D"
  86. "B9B5FE757BEDA2E17103EE44655A9FEF"
  87. "648077CCC5002E0561C6EF512C513B8C"
  88. "24B4F3A157221CFBC1597E969778C1E4"))
  89. return FALSE;
  90. memCopy(buf1, beltH(), 96);
  91. brngHMACRand(buf1, 96, beltH() + 128, 32, beltH() + 128 + 64, 32);
  92. if (!memEq(buf, buf1, 96))
  93. return FALSE;
  94. // дополнительный тест: короткие ключ, синхропосылка и выходной блок
  95. brngHMACStart(state, beltH() + 128, 1, beltH() + 128 + 64, 1);
  96. brngHMACStepR(buf, 2, state);
  97. brngHMACRand(buf1, 2, beltH() + 128, 1, beltH() + 128 + 64, 1);
  98. if (!memEq(buf, buf1, 2))
  99. return FALSE;
  100. if (!hexEq(buf,
  101. "42B1"))
  102. return FALSE;
  103. // дополнительный тест: длинный ключ, длинная синхропосылка
  104. memCopy(iv, beltH(), 127);
  105. brngHMACStart(state, beltH() + 128, 127, iv, 127);
  106. brngHMACStepR(buf, 256, state);
  107. brngHMACRand(buf1, 256, beltH() + 128, 127, iv, 127);
  108. if (!memEq(buf, buf1, 256))
  109. return FALSE;
  110. // дополнительный тест: длинная волатильная синхропосылки
  111. brngHMACStart(state, beltH() + 128, 127, iv, 127);
  112. iv[0]++;
  113. brngHMACStepR(buf, 256, state);
  114. if (memEq(buf, buf1, 256))
  115. return FALSE;
  116. // все нормально
  117. return TRUE;
  118. }