g12s_test.c 5.5 KB

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