ecrdsa_defs.h 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Definitions of EC-RDSA Curve Parameters
  4. *
  5. * Copyright (c) 2019 Vitaly Chikunov <vt@altlinux.org>
  6. *
  7. * This program is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU General Public License as published by the Free
  9. * Software Foundation; either version 2 of the License, or (at your option)
  10. * any later version.
  11. */
  12. #ifndef _CRYTO_ECRDSA_DEFS_H
  13. #define _CRYTO_ECRDSA_DEFS_H
  14. #include <crypto/internal/ecc.h>
  15. #define ECRDSA_MAX_SIG_SIZE (2 * 512 / 8)
  16. #define ECRDSA_MAX_DIGITS (512 / 64)
  17. /*
  18. * EC-RDSA uses its own set of curves.
  19. *
  20. * cp256{a,b,c} curves first defined for GOST R 34.10-2001 in RFC 4357 (as
  21. * 256-bit {A,B,C}-ParamSet), but inherited for GOST R 34.10-2012 and
  22. * proposed for use in R 50.1.114-2016 and RFC 7836 as the 256-bit curves.
  23. */
  24. /* OID_gostCPSignA 1.2.643.2.2.35.1 */
  25. static u64 cp256a_g_x[] = {
  26. 0x0000000000000001ull, 0x0000000000000000ull,
  27. 0x0000000000000000ull, 0x0000000000000000ull, };
  28. static u64 cp256a_g_y[] = {
  29. 0x22ACC99C9E9F1E14ull, 0x35294F2DDF23E3B1ull,
  30. 0x27DF505A453F2B76ull, 0x8D91E471E0989CDAull, };
  31. static u64 cp256a_p[] = { /* p = 2^256 - 617 */
  32. 0xFFFFFFFFFFFFFD97ull, 0xFFFFFFFFFFFFFFFFull,
  33. 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull };
  34. static u64 cp256a_n[] = {
  35. 0x45841B09B761B893ull, 0x6C611070995AD100ull,
  36. 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull };
  37. static u64 cp256a_a[] = { /* a = p - 3 */
  38. 0xFFFFFFFFFFFFFD94ull, 0xFFFFFFFFFFFFFFFFull,
  39. 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull };
  40. static u64 cp256a_b[] = {
  41. 0x00000000000000a6ull, 0x0000000000000000ull,
  42. 0x0000000000000000ull, 0x0000000000000000ull };
  43. static struct ecc_curve gost_cp256a = {
  44. .name = "cp256a",
  45. .nbits = 256,
  46. .g = {
  47. .x = cp256a_g_x,
  48. .y = cp256a_g_y,
  49. .ndigits = 256 / 64,
  50. },
  51. .p = cp256a_p,
  52. .n = cp256a_n,
  53. .a = cp256a_a,
  54. .b = cp256a_b
  55. };
  56. /* OID_gostCPSignB 1.2.643.2.2.35.2 */
  57. static u64 cp256b_g_x[] = {
  58. 0x0000000000000001ull, 0x0000000000000000ull,
  59. 0x0000000000000000ull, 0x0000000000000000ull, };
  60. static u64 cp256b_g_y[] = {
  61. 0x744BF8D717717EFCull, 0xC545C9858D03ECFBull,
  62. 0xB83D1C3EB2C070E5ull, 0x3FA8124359F96680ull, };
  63. static u64 cp256b_p[] = { /* p = 2^255 + 3225 */
  64. 0x0000000000000C99ull, 0x0000000000000000ull,
  65. 0x0000000000000000ull, 0x8000000000000000ull, };
  66. static u64 cp256b_n[] = {
  67. 0xE497161BCC8A198Full, 0x5F700CFFF1A624E5ull,
  68. 0x0000000000000001ull, 0x8000000000000000ull, };
  69. static u64 cp256b_a[] = { /* a = p - 3 */
  70. 0x0000000000000C96ull, 0x0000000000000000ull,
  71. 0x0000000000000000ull, 0x8000000000000000ull, };
  72. static u64 cp256b_b[] = {
  73. 0x2F49D4CE7E1BBC8Bull, 0xE979259373FF2B18ull,
  74. 0x66A7D3C25C3DF80Aull, 0x3E1AF419A269A5F8ull, };
  75. static struct ecc_curve gost_cp256b = {
  76. .name = "cp256b",
  77. .nbits = 256,
  78. .g = {
  79. .x = cp256b_g_x,
  80. .y = cp256b_g_y,
  81. .ndigits = 256 / 64,
  82. },
  83. .p = cp256b_p,
  84. .n = cp256b_n,
  85. .a = cp256b_a,
  86. .b = cp256b_b
  87. };
  88. /* OID_gostCPSignC 1.2.643.2.2.35.3 */
  89. static u64 cp256c_g_x[] = {
  90. 0x0000000000000000ull, 0x0000000000000000ull,
  91. 0x0000000000000000ull, 0x0000000000000000ull, };
  92. static u64 cp256c_g_y[] = {
  93. 0x366E550DFDB3BB67ull, 0x4D4DC440D4641A8Full,
  94. 0x3CBF3783CD08C0EEull, 0x41ECE55743711A8Cull, };
  95. static u64 cp256c_p[] = {
  96. 0x7998F7B9022D759Bull, 0xCF846E86789051D3ull,
  97. 0xAB1EC85E6B41C8AAull, 0x9B9F605F5A858107ull,
  98. /* pre-computed value for Barrett's reduction */
  99. 0xedc283cdd217b5a2ull, 0xbac48fc06398ae59ull,
  100. 0x405384d55f9f3b73ull, 0xa51f176161f1d734ull,
  101. 0x0000000000000001ull, };
  102. static u64 cp256c_n[] = {
  103. 0xF02F3A6598980BB9ull, 0x582CA3511EDDFB74ull,
  104. 0xAB1EC85E6B41C8AAull, 0x9B9F605F5A858107ull, };
  105. static u64 cp256c_a[] = { /* a = p - 3 */
  106. 0x7998F7B9022D7598ull, 0xCF846E86789051D3ull,
  107. 0xAB1EC85E6B41C8AAull, 0x9B9F605F5A858107ull, };
  108. static u64 cp256c_b[] = {
  109. 0x000000000000805aull, 0x0000000000000000ull,
  110. 0x0000000000000000ull, 0x0000000000000000ull, };
  111. static struct ecc_curve gost_cp256c = {
  112. .name = "cp256c",
  113. .nbits = 256,
  114. .g = {
  115. .x = cp256c_g_x,
  116. .y = cp256c_g_y,
  117. .ndigits = 256 / 64,
  118. },
  119. .p = cp256c_p,
  120. .n = cp256c_n,
  121. .a = cp256c_a,
  122. .b = cp256c_b
  123. };
  124. /* tc512{a,b} curves first recommended in 2013 and then standardized in
  125. * R 50.1.114-2016 and RFC 7836 for use with GOST R 34.10-2012 (as TC26
  126. * 512-bit ParamSet{A,B}).
  127. */
  128. /* OID_gostTC26Sign512A 1.2.643.7.1.2.1.2.1 */
  129. static u64 tc512a_g_x[] = {
  130. 0x0000000000000003ull, 0x0000000000000000ull,
  131. 0x0000000000000000ull, 0x0000000000000000ull,
  132. 0x0000000000000000ull, 0x0000000000000000ull,
  133. 0x0000000000000000ull, 0x0000000000000000ull, };
  134. static u64 tc512a_g_y[] = {
  135. 0x89A589CB5215F2A4ull, 0x8028FE5FC235F5B8ull,
  136. 0x3D75E6A50E3A41E9ull, 0xDF1626BE4FD036E9ull,
  137. 0x778064FDCBEFA921ull, 0xCE5E1C93ACF1ABC1ull,
  138. 0xA61B8816E25450E6ull, 0x7503CFE87A836AE3ull, };
  139. static u64 tc512a_p[] = { /* p = 2^512 - 569 */
  140. 0xFFFFFFFFFFFFFDC7ull, 0xFFFFFFFFFFFFFFFFull,
  141. 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull,
  142. 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull,
  143. 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull, };
  144. static u64 tc512a_n[] = {
  145. 0xCACDB1411F10B275ull, 0x9B4B38ABFAD2B85Dull,
  146. 0x6FF22B8D4E056060ull, 0x27E69532F48D8911ull,
  147. 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull,
  148. 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull, };
  149. static u64 tc512a_a[] = { /* a = p - 3 */
  150. 0xFFFFFFFFFFFFFDC4ull, 0xFFFFFFFFFFFFFFFFull,
  151. 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull,
  152. 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull,
  153. 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull, };
  154. static u64 tc512a_b[] = {
  155. 0x503190785A71C760ull, 0x862EF9D4EBEE4761ull,
  156. 0x4CB4574010DA90DDull, 0xEE3CB090F30D2761ull,
  157. 0x79BD081CFD0B6265ull, 0x34B82574761CB0E8ull,
  158. 0xC1BD0B2B6667F1DAull, 0xE8C2505DEDFC86DDull, };
  159. static struct ecc_curve gost_tc512a = {
  160. .name = "tc512a",
  161. .nbits = 512,
  162. .g = {
  163. .x = tc512a_g_x,
  164. .y = tc512a_g_y,
  165. .ndigits = 512 / 64,
  166. },
  167. .p = tc512a_p,
  168. .n = tc512a_n,
  169. .a = tc512a_a,
  170. .b = tc512a_b
  171. };
  172. /* OID_gostTC26Sign512B 1.2.643.7.1.2.1.2.2 */
  173. static u64 tc512b_g_x[] = {
  174. 0x0000000000000002ull, 0x0000000000000000ull,
  175. 0x0000000000000000ull, 0x0000000000000000ull,
  176. 0x0000000000000000ull, 0x0000000000000000ull,
  177. 0x0000000000000000ull, 0x0000000000000000ull, };
  178. static u64 tc512b_g_y[] = {
  179. 0x7E21340780FE41BDull, 0x28041055F94CEEECull,
  180. 0x152CBCAAF8C03988ull, 0xDCB228FD1EDF4A39ull,
  181. 0xBE6DD9E6C8EC7335ull, 0x3C123B697578C213ull,
  182. 0x2C071E3647A8940Full, 0x1A8F7EDA389B094Cull, };
  183. static u64 tc512b_p[] = { /* p = 2^511 + 111 */
  184. 0x000000000000006Full, 0x0000000000000000ull,
  185. 0x0000000000000000ull, 0x0000000000000000ull,
  186. 0x0000000000000000ull, 0x0000000000000000ull,
  187. 0x0000000000000000ull, 0x8000000000000000ull, };
  188. static u64 tc512b_n[] = {
  189. 0xC6346C54374F25BDull, 0x8B996712101BEA0Eull,
  190. 0xACFDB77BD9D40CFAull, 0x49A1EC142565A545ull,
  191. 0x0000000000000001ull, 0x0000000000000000ull,
  192. 0x0000000000000000ull, 0x8000000000000000ull, };
  193. static u64 tc512b_a[] = { /* a = p - 3 */
  194. 0x000000000000006Cull, 0x0000000000000000ull,
  195. 0x0000000000000000ull, 0x0000000000000000ull,
  196. 0x0000000000000000ull, 0x0000000000000000ull,
  197. 0x0000000000000000ull, 0x8000000000000000ull, };
  198. static u64 tc512b_b[] = {
  199. 0xFB8CCBC7C5140116ull, 0x50F78BEE1FA3106Eull,
  200. 0x7F8B276FAD1AB69Cull, 0x3E965D2DB1416D21ull,
  201. 0xBF85DC806C4B289Full, 0xB97C7D614AF138BCull,
  202. 0x7E3E06CF6F5E2517ull, 0x687D1B459DC84145ull, };
  203. static struct ecc_curve gost_tc512b = {
  204. .name = "tc512b",
  205. .nbits = 512,
  206. .g = {
  207. .x = tc512b_g_x,
  208. .y = tc512b_g_y,
  209. .ndigits = 512 / 64,
  210. },
  211. .p = tc512b_p,
  212. .n = tc512b_n,
  213. .a = tc512b_a,
  214. .b = tc512b_b
  215. };
  216. #endif