您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

180 行
6.7 KiB

  1. package sike
  2. const (
  3. // Number of uint64 limbs used to store field element
  4. FP_WORDS = 8
  5. )
  6. // Used internally by this package
  7. // -------------------------------
  8. var p = Fp{
  9. 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xABFFFFFFFFFFFFFF,
  10. 0x13085BDA2211E7A0, 0x1B9BF6C87B7E7DAF, 0x6045C6BDDA77A4D0, 0x004066F541811E1E,
  11. }
  12. // 2*503
  13. var pX2 = Fp{
  14. 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x57FFFFFFFFFFFFFF,
  15. 0x2610B7B44423CF41, 0x3737ED90F6FCFB5E, 0xC08B8D7BB4EF49A0, 0x0080CDEA83023C3C,
  16. }
  17. // p503 + 1
  18. var p1 = Fp{
  19. 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xAC00000000000000,
  20. 0x13085BDA2211E7A0, 0x1B9BF6C87B7E7DAF, 0x6045C6BDDA77A4D0, 0x004066F541811E1E,
  21. }
  22. // R^2=(2^512)^2 mod p
  23. var pR2 = Fp{
  24. 0x5289A0CF641D011F, 0x9B88257189FED2B9, 0xA3B365D58DC8F17A, 0x5BC57AB6EFF168EC,
  25. 0x9E51998BD84D4423, 0xBF8999CBAC3B5695, 0x46E9127BCE14CDB6, 0x003F6CFCE8B81771,
  26. }
  27. // 1/2 * R mod p
  28. var half = Fp2{
  29. A: Fp{
  30. 0x00000000000001FC, 0x0000000000000000, 0x0000000000000000, 0xB000000000000000,
  31. 0x3B69BB2464785D2A, 0x36824A2AF0FE9896, 0xF5899F427A94F309, 0x0033B15203C83BB8},
  32. }
  33. // 1*R mod p
  34. var one = Fp2{
  35. A: Fp{
  36. 0x00000000000003F9, 0x0000000000000000, 0x0000000000000000, 0xB400000000000000,
  37. 0x63CB1A6EA6DED2B4, 0x51689D8D667EB37D, 0x8ACD77C71AB24142, 0x0026FBAEC60F5953},
  38. }
  39. // 6*R mod p
  40. var six = Fp2{
  41. A: Fp{
  42. 0x00000000000017D8, 0x0000000000000000, 0x0000000000000000, 0xE000000000000000,
  43. 0x30B1E6E3A51520FA, 0xB13BC3BF6FFB3992, 0x8045412EEB3E3DED, 0x0069182E2159DBB8},
  44. }
  45. var Params SidhParams
  46. func init() {
  47. Params = SidhParams{
  48. // SIDH public key byte size.
  49. PublicKeySize: 378,
  50. // SIDH shared secret byte size.
  51. SharedSecretSize: 126,
  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. 0x5D083011589AD893, 0xADFD8D2CB67D0637, 0x330C9AC34FFB6361, 0xF0D47489A2E805A2,
  61. 0x27E2789259C6B8DC, 0x63866A2C121931B9, 0x8D4C65A7137DCF44, 0x003A183AE5967B3F,
  62. },
  63. B: Fp{
  64. 0x7E3541B8C96D1519, 0xD3ADAEEC0D61A26C, 0xC0A2219CE7703DD9, 0xFF3E46658FCDBC52,
  65. 0xD5B38DEAE6E196FF, 0x1AAC826364956D58, 0xEC9F4875B9A5F27A, 0x001B0B475AB99843,
  66. },
  67. },
  68. // The x-coordinate of QA
  69. Affine_Q: Fp2{
  70. A: Fp{
  71. 0x4D83695107D03BAD, 0x221F3299005E2FCF, 0x78E6AE22F30DECF2, 0x6D982DB5111253E4,
  72. 0x504C80A8AB4526A8, 0xEFD0C3AA210BB024, 0xCB77483501DC6FCF, 0x001052544A96BDF3,
  73. },
  74. B: Fp{
  75. 0x0D74FE3402BCAE47, 0xDF5B8CDA832D8AED, 0xB86BCF06E4BD837E, 0x892A2933A0FA1F63,
  76. 0x9F88FC67B6CCB461, 0x822926EA9DDA3AC8, 0xEAC8DDE5855425ED, 0x000618FE6DA37A80,
  77. },
  78. },
  79. // The x-coordinate of RA = PA-QA
  80. Affine_R: Fp2{
  81. A: Fp{
  82. 0x6B6F4A4F786CF310, 0xB019D444BDCFDBE3, 0xA14CB06680607834, 0xCB0D5582E7E6E60A,
  83. 0xBA4EE8771667E241, 0xE42A114FCB12E5FF, 0x9A0C074E275BCD98, 0x001871329B28689E,
  84. },
  85. B: Fp{
  86. 0x685FA8378513FE76, 0x84E8FC1785E8BDF0, 0x8A380F177CB7C1B7, 0x2227464F4F812C94,
  87. 0x117C94A81A90C279, 0x193D73132FB9FA28, 0x99335336F192C9EB, 0x0006C2FE778A34FD,
  88. },
  89. },
  90. // Max size of secret key for 2-torsion group, corresponds to 2^e2 - 1
  91. SecretBitLen: 250,
  92. // SecretBitLen in bytes.
  93. SecretByteLen: uint((250 + 7) / 8),
  94. // 2-torsion group computation strategy
  95. IsogenyStrategy: []uint32{
  96. 0x3D, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01,
  97. 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02,
  98. 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01,
  99. 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01,
  100. 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x1D, 0x10, 0x08, 0x04, 0x02, 0x01,
  101. 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02,
  102. 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x0D, 0x08,
  103. 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01,
  104. 0x05, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01},
  105. },
  106. B: DomainParams{
  107. // The x-coordinate of PB
  108. Affine_P: Fp2{
  109. A: Fp{
  110. 0xDF630FC5FB2468DB, 0xC30C5541C102040E, 0x3CDC9987B76511FC, 0xF54B5A09353D0CDD,
  111. 0x3ADBA8E00703C42F, 0x8253F9303DDC95D0, 0x62D30778763ABFD7, 0x001CD00FB581CD55,
  112. },
  113. B: Fp{
  114. 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
  115. 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
  116. },
  117. },
  118. // The x-coordinate of QB
  119. Affine_Q: Fp2{
  120. A: Fp{
  121. 0x2E3457A12B429261, 0x311F94E89627DCF8, 0x5B71C98FD1DB73F6, 0x3671DB7DCFC21541,
  122. 0xB6D1484C9FE0CF4F, 0x19CD110717356E35, 0xF4F9FB00AC9919DF, 0x0035BC124D38A70B,
  123. },
  124. B: Fp{
  125. 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
  126. 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
  127. },
  128. },
  129. // The x-coordinate of RB = PB - QB
  130. Affine_R: Fp2{
  131. A: Fp{
  132. 0x2E08BB99413D2952, 0xD3021467CD088D72, 0x21017AF859752245, 0x26314ED8FFD9DE5C,
  133. 0x4AF43C73344B6686, 0xCFA1F91149DF0993, 0xF327A95365587A89, 0x000DBF54E03D3906,
  134. },
  135. B: Fp{
  136. 0xFC1FC00CBD0A0CFB, 0x66C29FB284B491A9, 0x7FBED0B26D7F18E0, 0x9C02361066F4C67D,
  137. 0x2D83758DD0B19E6F, 0x0827029DB2CDC1D7, 0x58700A85FAD38A71, 0x0006FA256B614AD2,
  138. },
  139. },
  140. // Size of secret key for 3-torsion group, corresponds to log_2(3^e3) - 1.
  141. SecretBitLen: 252,
  142. // SecretBitLen in bytes.
  143. SecretByteLen: uint((252 + 7) / 8),
  144. // 3-torsion group computation strategy
  145. IsogenyStrategy: []uint32{
  146. 0x47, 0x26, 0x15, 0x0D, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02,
  147. 0x01, 0x01, 0x02, 0x01, 0x01, 0x05, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02,
  148. 0x01, 0x01, 0x01, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01,
  149. 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x11, 0x09, 0x05, 0x03, 0x02,
  150. 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02,
  151. 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01,
  152. 0x01, 0x02, 0x01, 0x01, 0x21, 0x11, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01,
  153. 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04,
  154. 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01,
  155. 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01,
  156. 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01,
  157. 0x01, 0x02, 0x01, 0x01},
  158. },
  159. OneFp2: one,
  160. HalfFp2: half,
  161. MsgLen: 24,
  162. // SIKEp503 provides 128 bit of classical security ([SIKE], 5.1)
  163. KemSize: 24,
  164. // ceil(503+7/8)
  165. Bytelen: 63,
  166. CiphertextSize: 24 + 378,
  167. }
  168. }