g12s_test.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. *******************************************************************************
  3. \file g12s_test.c
  4. \brief Tests for GOST R 34.10-2012 (Russia)
  5. \project bee2/test
  6. \created 2014.04.07
  7. \version 2023.09.22
  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/prng.h>
  15. #include <bee2/core/util.h>
  16. #include <bee2/crypto/g12s.h>
  17. /*
  18. *******************************************************************************
  19. Самотестирование
  20. -# Выполняются тесты из приложения A к ГОСТ Р 34.10-2012.
  21. -# Дополнительно проверяются стандартные кривые.
  22. *******************************************************************************
  23. */
  24. bool_t g12sTest()
  25. {
  26. g12s_params params[1];
  27. octet buf[G12S_ORDER_SIZE];
  28. octet privkey[G12S_ORDER_SIZE];
  29. octet pubkey[2 * G12S_FIELD_SIZE];
  30. octet hash[64];
  31. octet sig[2 * G12S_ORDER_SIZE];
  32. octet echo[64];
  33. // подготовить память
  34. if (sizeof(echo) < prngEcho_keep() ||
  35. sizeof(echo) < prngCOMBO_keep())
  36. return FALSE;
  37. // тест A.1 [загрузка параметров]
  38. if (g12sParamsStd(params, "1.2.643.2.2.35.0") != ERR_OK ||
  39. g12sParamsVal(params) != ERR_OK)
  40. return FALSE;
  41. // тест A.1 [генерация ключей]
  42. hexToRev(buf,
  43. "7A929ADE789BB9BE10ED359DD39A72C1"
  44. "1B60961F49397EEE1D19CE9891EC3B28");
  45. prngEchoStart(echo, buf, 32);
  46. if (g12sKeypairGen(privkey, pubkey, params, prngEchoStepR, echo)
  47. != ERR_OK ||
  48. !hexEqRev(privkey,
  49. "7A929ADE789BB9BE10ED359DD39A72C1"
  50. "1B60961F49397EEE1D19CE9891EC3B28") ||
  51. !hexEqRev(pubkey,
  52. "26F1B489D6701DD185C8413A977B3CBB"
  53. "AF64D1C593D26627DFFB101A87FF77DA"
  54. "7F2B49E270DB6D90D8595BEC458B50C5"
  55. "8585BA1D4E9B788F6689DBD8E56FD80B"))
  56. return FALSE;
  57. // тест A.1 [выработка ЭЦП]
  58. hexTo(hash,
  59. "2DFBC1B372D89A1188C09C52E0EEC61F"
  60. "CE52032AB1022E8E67ECE6672B043EE5");
  61. hexToRev(buf,
  62. "77105C9B20BCD3122823C8CF6FCC7B95"
  63. "6DE33814E95B7FE64FED924594DCEAB3");
  64. if (g12sSign(sig, params, hash, privkey, prngEchoStepR, echo) != ERR_OK ||
  65. !hexEq(sig,
  66. "41AA28D2F1AB148280CD9ED56FEDA419"
  67. "74053554A42767B83AD043FD39DC0493"
  68. "01456C64BA4642A1653C235A98A60249"
  69. "BCD6D3F746B631DF928014F6C5BF9C40"))
  70. return FALSE;
  71. // тест A.1 [проверка ЭЦП]
  72. if (g12sVerify(params, hash, sig, pubkey) != ERR_OK ||
  73. (sig[0] ^= 1, g12sVerify(params, hash, sig, pubkey) == ERR_OK))
  74. return FALSE;
  75. // тест A.2 [загрузка параметров]
  76. if (g12sParamsStd(params, "1.2.643.7.1.2.1.2.0") != ERR_OK ||
  77. g12sParamsVal(params) != ERR_OK)
  78. return FALSE;
  79. // тест A.2 [генерация ключей]
  80. hexToRev(buf,
  81. "0BA6048AADAE241BA40936D47756D7C9"
  82. "3091A0E8514669700EE7508E508B1020"
  83. "72E8123B2200A0563322DAD2827E2714"
  84. "A2636B7BFD18AADFC62967821FA18DD4");
  85. prngEchoStart(echo, buf, 64);
  86. if (g12sKeypairGen(privkey, pubkey, params, prngEchoStepR, echo)
  87. != ERR_OK ||
  88. !hexEqRev(privkey,
  89. "0BA6048AADAE241BA40936D47756D7C9"
  90. "3091A0E8514669700EE7508E508B1020"
  91. "72E8123B2200A0563322DAD2827E2714"
  92. "A2636B7BFD18AADFC62967821FA18DD4") ||
  93. !hexEqRev(pubkey,
  94. "37C7C90CD40B0F5621DC3AC1B751CFA0"
  95. "E2634FA0503B3D52639F5D7FB72AFD61"
  96. "EA199441D943FFE7F0C70A2759A3CDB8"
  97. "4C114E1F9339FDF27F35ECA93677BEEC"
  98. "115DC5BC96760C7B48598D8AB9E740D4"
  99. "C4A85A65BE33C1815B5C320C854621DD"
  100. "5A515856D13314AF69BC5B924C8B4DDF"
  101. "F75C45415C1D9DD9DD33612CD530EFE1"))
  102. return FALSE;
  103. // тест A.2 [выработка ЭЦП]
  104. hexTo(hash,
  105. "3754F3CFACC9E0615C4F4A7C4D8DAB53"
  106. "1B09B6F9C170C533A71D147035B0C591"
  107. "7184EE536593F4414339976C647C5D5A"
  108. "407ADEDB1D560C4FC6777D2972075B8C");
  109. hexToRev(buf,
  110. "0359E7F4B1410FEACC570456C6801496"
  111. "946312120B39D019D455986E364F3658"
  112. "86748ED7A44B3E794434006011842286"
  113. "212273A6D14CF70EA3AF71BB1AE679F1");
  114. if (g12sSign(sig, params, hash, privkey, prngEchoStepR, echo)
  115. != ERR_OK ||
  116. !hexEq(sig,
  117. "2F86FA60A081091A23DD795E1E3C689E"
  118. "E512A3C82EE0DCC2643C78EEA8FCACD3"
  119. "5492558486B20F1C9EC197C906998502"
  120. "60C93BCBCD9C5C3317E19344E173AE36"
  121. "1081B394696FFE8E6585E7A9362D26B6"
  122. "325F56778AADBC081C0BFBE933D52FF5"
  123. "823CE288E8C4F362526080DF7F70CE40"
  124. "6A6EEB1F56919CB92A9853BDE73E5B4A"))
  125. return FALSE;
  126. // тест A.2 [проверка ЭЦП]
  127. if (g12sVerify(params, hash, sig, pubkey) != ERR_OK ||
  128. (sig[0] ^= 1, g12sVerify(params, hash, sig, pubkey) == ERR_OK))
  129. return FALSE;
  130. // проверить кривую cryptoproA
  131. if (g12sParamsStd(params, "1.2.643.2.2.35.1") != ERR_OK ||
  132. g12sParamsVal(params) != ERR_OK)
  133. return FALSE;
  134. // проверить кривую cryptoproB
  135. if (g12sParamsStd(params, "1.2.643.2.2.35.2") != ERR_OK ||
  136. g12sParamsVal(params) != ERR_OK)
  137. return FALSE;
  138. // проверить кривую cryptoproC
  139. if (g12sParamsStd(params, "1.2.643.2.2.35.3") != ERR_OK ||
  140. g12sParamsVal(params) != ERR_OK)
  141. return FALSE;
  142. // проверить кривую cryptocom
  143. if (g12sParamsStd(params, "1.2.643.2.9.1.8.1") != ERR_OK ||
  144. g12sParamsVal(params) != ERR_OK)
  145. return FALSE;
  146. // проверить кривую paramsetA512
  147. if (g12sParamsStd(params, "1.2.643.7.1.2.1.2.1") != ERR_OK ||
  148. g12sParamsVal(params) != ERR_OK)
  149. return FALSE;
  150. // проверить кривую paramsetB512
  151. if (g12sParamsStd(params, "1.2.643.7.1.2.1.2.2") != ERR_OK ||
  152. g12sParamsVal(params) != ERR_OK)
  153. return FALSE;
  154. // все нормально
  155. return TRUE;
  156. }