選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

184 行
6.1 KiB

  1. package sike
  2. const (
  3. // Number of uint64 limbs used to store field element
  4. FP_WORDS = 7
  5. )
  6. // Used internally by this package
  7. // -------------------------------
  8. var p = Fp{
  9. 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFDC1767AE2FFFFFF,
  10. 0x7BC65C783158AEA3, 0x6CFC5FD681C52056, 0x2341F27177344,
  11. }
  12. // 2*p434
  13. var pX2 = Fp{
  14. 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFB82ECF5C5FFFFFF,
  15. 0xF78CB8F062B15D47, 0xD9F8BFAD038A40AC, 0x4683E4E2EE688,
  16. }
  17. // p434 + 1
  18. var p1 = Fp{
  19. 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFDC1767AE3000000,
  20. 0x7BC65C783158AEA3, 0x6CFC5FD681C52056, 0x0002341F27177344,
  21. }
  22. // R^2=(2^512)^2 mod p
  23. var pR2 = Fp{
  24. 0x28E55B65DCD69B30, 0xACEC7367768798C2, 0xAB27973F8311688D, 0x175CC6AF8D6C7C0B,
  25. 0xABCD92BF2DDE347E, 0x69E16A61C7686D9A, 0x000025A89BCDD12A,
  26. }
  27. // 1/2 * R mod p
  28. var half = Fp2{
  29. A: Fp{
  30. 0x0000000000003A16, 0x0000000000000000, 0x0000000000000000, 0x5C87FA027E000000,
  31. 0x6C00D27DAACFD66A, 0x74992A2A2FBBA086, 0x0000767753DE976D},
  32. }
  33. // 1*R mod p
  34. var one = Fp2{
  35. A: Fp{
  36. 0x000000000000742C, 0x0000000000000000, 0x0000000000000000, 0xB90FF404FC000000,
  37. 0xD801A4FB559FACD4, 0xE93254545F77410C, 0x0000ECEEA7BD2EDA},
  38. }
  39. // 6*R mod p
  40. var six = Fp2{
  41. A: Fp{
  42. 0x000000000002B90A, 0x0000000000000000, 0x0000000000000000, 0x5ADCCB2822000000,
  43. 0x187D24F39F0CAFB4, 0x9D353A4D394145A0, 0x00012559A0403298},
  44. }
  45. var Params SidhParams
  46. func init() {
  47. Params = SidhParams{
  48. // SIDH public key byte size.
  49. PublicKeySize: 330,
  50. // SIDH shared secret byte size.
  51. SharedSecretSize: 110,
  52. InitCurve: ProjectiveCurveParameters{
  53. A: six,
  54. C: one,
  55. },
  56. A: DomainParams{
  57. // The x-coordinate of PA
  58. Affine_P: Fp2{
  59. A: Fp{
  60. 0x05ADF455C5C345BF, 0x91935C5CC767AC2B, 0xAFE4E879951F0257, 0x70E792DC89FA27B1,
  61. 0xF797F526BB48C8CD, 0x2181DB6131AF621F, 0x00000A1C08B1ECC4,
  62. },
  63. B: Fp{
  64. 0x74840EB87CDA7788, 0x2971AA0ECF9F9D0B, 0xCB5732BDF41715D5, 0x8CD8E51F7AACFFAA,
  65. 0xA7F424730D7E419F, 0xD671EB919A179E8C, 0x0000FFA26C5A924A,
  66. },
  67. },
  68. // The x-coordinate of QA
  69. Affine_Q: Fp2{
  70. A: Fp{
  71. 0xFEC6E64588B7273B, 0xD2A626D74CBBF1C6, 0xF8F58F07A78098C7, 0xE23941F470841B03,
  72. 0x1B63EDA2045538DD, 0x735CFEB0FFD49215, 0x0001C4CB77542876,
  73. },
  74. B: Fp{
  75. 0xADB0F733C17FFDD6, 0x6AFFBD037DA0A050, 0x680EC43DB144E02F, 0x1E2E5D5FF524E374,
  76. 0xE2DDA115260E2995, 0xA6E4B552E2EDE508, 0x00018ECCDDF4B53E,
  77. },
  78. },
  79. // The x-coordinate of RA = PA-QA
  80. Affine_R: Fp2{
  81. A: Fp{
  82. 0x01BA4DB518CD6C7D, 0x2CB0251FE3CC0611, 0x259B0C6949A9121B, 0x60E17AC16D2F82AD,
  83. 0x3AA41F1CE175D92D, 0x413FBE6A9B9BC4F3, 0x00022A81D8D55643,
  84. },
  85. B: Fp{
  86. 0xB8ADBC70FC82E54A, 0xEF9CDDB0D5FADDED, 0x5820C734C80096A0, 0x7799994BAA96E0E4,
  87. 0x044961599E379AF8, 0xDB2B94FBF09F27E2, 0x0000B87FC716C0C6,
  88. },
  89. },
  90. // Max size of secret key for 2-torsion group, corresponds to 2^e2 - 1
  91. SecretBitLen: 216,
  92. // SecretBitLen in bytes.
  93. SecretByteLen: 28,
  94. // 2-torsion group computation strategy
  95. IsogenyStrategy: []uint32{
  96. 0x30, 0x1C, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01,
  97. 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04,
  98. 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01,
  99. 0x02, 0x01, 0x01, 0x0D, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02,
  100. 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x04,
  101. 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01,
  102. 0x15, 0x0C, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01,
  103. 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x03, 0x02, 0x01,
  104. 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x09, 0x05, 0x03,
  105. 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04,
  106. 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01},
  107. },
  108. B: DomainParams{
  109. // The x-coordinate of PB
  110. Affine_P: Fp2{
  111. A: Fp{
  112. 0x6E5497556EDD48A3, 0x2A61B501546F1C05, 0xEB919446D049887D, 0x5864A4A69D450C4F,
  113. 0xB883F276A6490D2B, 0x22CC287022D5F5B9, 0x0001BED4772E551F,
  114. },
  115. B: Fp{
  116. 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
  117. 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
  118. },
  119. },
  120. // The x-coordinate of QB
  121. Affine_Q: Fp2{
  122. A: Fp{
  123. 0xFAE2A3F93D8B6B8E, 0x494871F51700FE1C, 0xEF1A94228413C27C, 0x498FF4A4AF60BD62,
  124. 0xB00AD2A708267E8A, 0xF4328294E017837F, 0x000034080181D8AE,
  125. },
  126. B: Fp{
  127. 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
  128. 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
  129. },
  130. },
  131. // The x-coordinate of RB = PB - QB
  132. Affine_R: Fp2{
  133. A: Fp{
  134. 0x283B34FAFEFDC8E4, 0x9208F44977C3E647, 0x7DEAE962816F4E9A, 0x68A2BA8AA262EC9D,
  135. 0x8176F112EA43F45B, 0x02106D022634F504, 0x00007E8A50F02E37,
  136. },
  137. B: Fp{
  138. 0xB378B7C1DA22CCB1, 0x6D089C99AD1D9230, 0xEBE15711813E2369, 0x2B35A68239D48A53,
  139. 0x445F6FD138407C93, 0xBEF93B29A3F6B54B, 0x000173FA910377D3,
  140. },
  141. },
  142. // Size of secret key for 3-torsion group, corresponds to log_2(3^e3) - 1.
  143. SecretBitLen: 217,
  144. // SecretBitLen in bytes.
  145. SecretByteLen: 28,
  146. // 3-torsion group computation strategy
  147. IsogenyStrategy: []uint32{
  148. 0x42, 0x21, 0x11, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01,
  149. 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01,
  150. 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02,
  151. 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x10,
  152. 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04,
  153. 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01,
  154. 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01,
  155. 0x01, 0x20, 0x10, 0x08, 0x04, 0x03, 0x01, 0x01, 0x01, 0x01,
  156. 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01,
  157. 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02,
  158. 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01,
  159. 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01,
  160. 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04,
  161. 0x02, 0x01, 0x01, 0x02, 0x01, 0x01},
  162. },
  163. OneFp2: one,
  164. HalfFp2: half,
  165. MsgLen: 16,
  166. // SIKEp434 provides 128 bit of classical security ([SIKE], 5.1)
  167. KemSize: 16,
  168. // ceil(434+7/8)
  169. Bytelen: 55,
  170. CiphertextSize: 16 + 330,
  171. }
  172. }