Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package p751
  2. import (
  3. "bytes"
  4. "testing"
  5. "testing/quick"
  6. . "github.com/cloudflare/p751sidh/internal/isogeny"
  7. )
  8. func TestOne(t *testing.T) {
  9. var tmp Fp2Element
  10. kFieldOps.Mul(&tmp, &P751_OneFp2, &affine_xP)
  11. if !VartimeEqFp2(&tmp, &affine_xP) {
  12. t.Error("Not equal 1")
  13. }
  14. }
  15. // This test is here only to ensure that ScalarMult helper works correctly
  16. func TestScalarMultVersusSage(t *testing.T) {
  17. var xP ProjectivePoint
  18. xP = ProjectivePoint{X: affine_xP, Z: P751_OneFp2}
  19. xP = ScalarMult(&curve, &xP, mScalarBytes[:]) // = x([m]P)
  20. affine_xQ := xP.ToAffine(kCurveOps)
  21. if !VartimeEqFp2(&affine_xaP, affine_xQ) {
  22. t.Error("\nExpected\n", affine_xaP, "\nfound\n", affine_xQ)
  23. }
  24. }
  25. func Test_jInvariant(t *testing.T) {
  26. var curve = ProjectiveCurveParameters{A: curve_A, C: curve_C}
  27. var jbufRes [P751_SharedSecretSize]byte
  28. var jbufExp [P751_SharedSecretSize]byte
  29. // Computed using Sage
  30. // j = 3674553797500778604587777859668542828244523188705960771798425843588160903687122861541242595678107095655647237100722594066610650373491179241544334443939077738732728884873568393760629500307797547379838602108296735640313894560419*i + 3127495302417548295242630557836520229396092255080675419212556702820583041296798857582303163183558315662015469648040494128968509467224910895884358424271180055990446576645240058960358037224785786494172548090318531038910933793845
  31. var known_j = Fp2Element{
  32. A: FpElement{0xc7a8921c1fb23993, 0xa20aea321327620b, 0xf1caa17ed9676fa8, 0x61b780e6b1a04037, 0x47784af4c24acc7a, 0x83926e2e300b9adf, 0xcd891d56fae5b66, 0x49b66985beb733bc, 0xd4bcd2a473d518f, 0xe242239991abe224, 0xa8af5b20f98672f8, 0x139e4d4e4d98},
  33. B: FpElement{0xb5b52a21f81f359, 0x715e3a865db6d920, 0x9bac2f9d8911978b, 0xef14acd8ac4c1e3d, 0xe81aacd90cfb09c8, 0xaf898288de4a09d9, 0xb85a7fb88c5c4601, 0x2c37c3f1dd303387, 0x7ad3277fe332367c, 0xd4cbee7f25a8e6f8, 0x36eacbe979eaeffa, 0x59eb5a13ac33},
  34. }
  35. kCurveOps.Jinvariant(&curve, jbufRes[:])
  36. kCurveOps.Fp2ToBytes(jbufExp[:], &known_j)
  37. if !bytes.Equal(jbufRes[:], jbufExp[:]) {
  38. t.Error("Computed incorrect j-invariant: found\n", jbufRes, "\nexpected\n", jbufExp)
  39. }
  40. }
  41. func TestProjectivePointVartimeEq(t *testing.T) {
  42. var xP ProjectivePoint
  43. xP = ProjectivePoint{X: affine_xP, Z: P751_OneFp2}
  44. xQ := xP
  45. // Scale xQ, which results in the same projective point
  46. kFieldOps.Mul(&xQ.X, &xQ.X, &curve_A)
  47. kFieldOps.Mul(&xQ.Z, &xQ.Z, &curve_A)
  48. if !VartimeEqProjFp2(&xP, &xQ) {
  49. t.Error("Expected the scaled point to be equal to the original")
  50. }
  51. }
  52. func TestPointDoubleVersusSage(t *testing.T) {
  53. var curve = ProjectiveCurveParameters{A: curve_A, C: curve_C}
  54. var params = kCurveOps.CalcCurveParamsEquiv4(&curve)
  55. var xP ProjectivePoint
  56. xP = ProjectivePoint{X: affine_xP, Z: P751_OneFp2}
  57. kCurveOps.Pow2k(&xP, &params, 1)
  58. affine_xQ := xP.ToAffine(kCurveOps)
  59. if !VartimeEqFp2(affine_xQ, &affine_xP2) {
  60. t.Error("\nExpected\n", affine_xP2, "\nfound\n", affine_xQ)
  61. }
  62. }
  63. func TestPointMul4VersusSage(t *testing.T) {
  64. var params = kCurveOps.CalcCurveParamsEquiv4(&curve)
  65. var xP ProjectivePoint
  66. xP = ProjectivePoint{X: affine_xP, Z: P751_OneFp2}
  67. kCurveOps.Pow2k(&xP, &params, 2)
  68. affine_xQ := xP.ToAffine(kCurveOps)
  69. if !VartimeEqFp2(affine_xQ, &affine_xP4) {
  70. t.Error("\nExpected\n", affine_xP4, "\nfound\n", affine_xQ)
  71. }
  72. }
  73. func TestPointMul9VersusSage(t *testing.T) {
  74. var params = kCurveOps.CalcCurveParamsEquiv3(&curve)
  75. var xP ProjectivePoint
  76. xP = ProjectivePoint{X: affine_xP, Z: P751_OneFp2}
  77. kCurveOps.Pow3k(&xP, &params, 2)
  78. affine_xQ := xP.ToAffine(kCurveOps)
  79. if !VartimeEqFp2(affine_xQ, &affine_xP9) {
  80. t.Error("\nExpected\n", affine_xP9, "\nfound\n", affine_xQ)
  81. }
  82. }
  83. func TestPointPow2kVersusScalarMult(t *testing.T) {
  84. var xP, xQ, xR ProjectivePoint
  85. var params = kCurveOps.CalcCurveParamsEquiv4(&curve)
  86. xP = ProjectivePoint{X: affine_xP, Z: P751_OneFp2}
  87. xQ = xP
  88. kCurveOps.Pow2k(&xQ, &params, 5)
  89. xR = ScalarMult(&curve, &xP, []byte{32})
  90. affine_xQ := xQ.ToAffine(kCurveOps) // = x([32]P)
  91. affine_xR := xR.ToAffine(kCurveOps) // = x([32]P)
  92. if !VartimeEqFp2(affine_xQ, affine_xR) {
  93. t.Error("\nExpected\n", affine_xQ, "\nfound\n", affine_xR)
  94. }
  95. }
  96. func TestRecoverCoordinateA(t *testing.T) {
  97. var cparam ProjectiveCurveParameters
  98. // Vectors generated with SIKE reference implementation
  99. var a = Fp2Element{
  100. A: FpElement{0x9331D9C5AAF59EA4, 0xB32B702BE4046931, 0xCEBB333912ED4D34, 0x5628CE37CD29C7A2, 0x0BEAC5ED48B7F58E, 0x1FB9D3E281D65B07, 0x9C0CFACC1E195662, 0xAE4BCE0F6B70F7D9, 0x59E4E63D43FE71A0, 0xEF7CE57560CC8615, 0xE44A8FB7901E74E8, 0x000069D13C8366D1},
  101. B: FpElement{0xF6DA1070279AB966, 0xA78FB0CE7268C762, 0x19B40F044A57ABFA, 0x7AC8EE6160C0C233, 0x93D4993442947072, 0x757D2B3FA4E44860, 0x073A920F8C4D5257, 0x2031F1B054734037, 0xDEFAA1D2406555CD, 0x26F9C70E1496BE3D, 0x5B3F335A0A4D0976, 0x000013628B2E9C59}}
  102. var affine_xP = Fp2Element{
  103. A: FpElement{0xea6b2d1e2aebb250, 0x35d0b205dc4f6386, 0xb198e93cb1830b8d, 0x3b5b456b496ddcc6, 0x5be3f0d41132c260, 0xce5f188807516a00, 0x54f3e7469ea8866d, 0x33809ef47f36286, 0x6fa45f83eabe1edb, 0x1b3391ae5d19fd86, 0x1e66daf48584af3f, 0xb430c14aaa87},
  104. B: FpElement{0x97b41ebc61dcb2ad, 0x80ead31cb932f641, 0x40a940099948b642, 0x2a22fd16cdc7fe84, 0xaabf35b17579667f, 0x76c1d0139feb4032, 0x71467e1e7b1949be, 0x678ca8dadd0d6d81, 0x14445daea9064c66, 0x92d161eab4fa4691, 0x8dfbb01b6b238d36, 0x2e3718434e4e}}
  105. var affine_xQ = Fp2Element{
  106. A: FpElement{0xb055cf0ca1943439, 0xa9ff5de2fa6c69ed, 0x4f2761f934e5730a, 0x61a1dcaa1f94aa4b, 0xce3c8fadfd058543, 0xeac432aaa6701b8e, 0x8491d523093aea8b, 0xba273f9bd92b9b7f, 0xd8f59fd34439bb5a, 0xdc0350261c1fe600, 0x99375ab1eb151311, 0x14d175bbdbc5},
  107. B: FpElement{0xffb0ef8c2111a107, 0x55ceca3825991829, 0xdbf8a1ccc075d34b, 0xb8e9187bd85d8494, 0x670aa2d5c34a03b0, 0xef9fe2ed2b064953, 0xc911f5311d645aee, 0xf4411f409e410507, 0x934a0a852d03e1a8, 0xe6274e67ae1ad544, 0x9f4bc563c69a87bc, 0x6f316019681e}}
  108. var affine_xQmP = Fp2Element{
  109. A: FpElement{0x6ffb44306a153779, 0xc0ffef21f2f918f3, 0x196c46d35d77f778, 0x4a73f80452edcfe6, 0x9b00836bce61c67f, 0x387879418d84219e, 0x20700cf9fc1ec5d1, 0x1dfe2356ec64155e, 0xf8b9e33038256b1c, 0xd2aaf2e14bada0f0, 0xb33b226e79a4e313, 0x6be576fad4e5},
  110. B: FpElement{0x7db5dbc88e00de34, 0x75cc8cb9f8b6e11e, 0x8c8001c04ebc52ac, 0x67ef6c981a0b5a94, 0xc3654fbe73230738, 0xc6a46ee82983ceca, 0xed1aa61a27ef49f0, 0x17fe5a13b0858fe0, 0x9ae0ca945a4c6b3c, 0x234104a218ad8878, 0xa619627166104394, 0x556a01ff2e7e}}
  111. cparam.C = P751_OneFp2
  112. kCurveOps.RecoverCoordinateA(&cparam, &affine_xP, &affine_xQ, &affine_xQmP)
  113. // Check A is correct
  114. if !VartimeEqFp2(&cparam.A, &a) {
  115. t.Error("\nExpected\n", a, "\nfound\n", cparam.A)
  116. }
  117. // Check C is not changed
  118. if !VartimeEqFp2(&cparam.C, &P751_OneFp2) {
  119. t.Error("\nExpected\n", cparam.C, "\nfound\n", P751_OneFp2)
  120. }
  121. }
  122. func TestR2LVersusSage(t *testing.T) {
  123. var xR ProjectivePoint
  124. sageAffine_xR := Fp2Element{
  125. A: FpElement{0x729465ba800d4fd5, 0x9398015b59e514a1, 0x1a59dd6be76c748e, 0x1a7db94eb28dd55c, 0x444686e680b1b8ec, 0xcc3d4ace2a2454ff, 0x51d3dab4ec95a419, 0xc3b0f33594acac6a, 0x9598a74e7fd44f8a, 0x4fbf8c638f1c2e37, 0x844e347033052f51, 0x6cd6de3eafcf},
  126. B: FpElement{0x85da145412d73430, 0xd83c0e3b66eb3232, 0xd08ff2d453ec1369, 0xa64aaacfdb395b13, 0xe9cba211a20e806e, 0xa4f80b175d937cfc, 0x556ce5c64b1f7937, 0xb59b39ea2b3fdf7a, 0xc2526b869a4196b3, 0x8dad90bca9371750, 0xdfb4a30c9d9147a2, 0x346d2130629b}}
  127. xR = kCurveOps.ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(mScalarBytes)*8), mScalarBytes[:])
  128. affine_xR := xR.ToAffine(kCurveOps)
  129. if !VartimeEqFp2(affine_xR, &sageAffine_xR) {
  130. t.Error("\nExpected\n", sageAffine_xR, "\nfound\n", affine_xR)
  131. }
  132. }
  133. func TestPointTripleVersusAddDouble(t *testing.T) {
  134. tripleEqualsAddDouble := func(params GeneratedTestParams) bool {
  135. var P2, P3, P2plusP ProjectivePoint
  136. eqivParams4 := kCurveOps.CalcCurveParamsEquiv4(&params.Cparam)
  137. eqivParams3 := kCurveOps.CalcCurveParamsEquiv3(&params.Cparam)
  138. P2 = params.Point
  139. P3 = params.Point
  140. kCurveOps.Pow2k(&P2, &eqivParams4, 1) // = x([2]P)
  141. kCurveOps.Pow3k(&P3, &eqivParams3, 1) // = x([3]P)
  142. P2plusP = AddProjFp2(&P2, &params.Point, &params.Point) // = x([2]P + P)
  143. return VartimeEqProjFp2(&P3, &P2plusP)
  144. }
  145. if err := quick.Check(tripleEqualsAddDouble, quickCheckConfig); err != nil {
  146. t.Error(err)
  147. }
  148. }
  149. func BenchmarkThreePointLadder379BitScalar(b *testing.B) {
  150. var mScalarBytes = [...]uint8{84, 222, 146, 63, 85, 18, 173, 162, 167, 38, 10, 8, 143, 176, 93, 228, 247, 128, 50, 128, 205, 42, 15, 137, 119, 67, 43, 3, 61, 91, 237, 24, 235, 12, 53, 96, 186, 164, 232, 223, 197, 224, 64, 109, 137, 63, 246, 4}
  151. for n := 0; n < b.N; n++ {
  152. kCurveOps.ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(mScalarBytes)*8), mScalarBytes[:])
  153. }
  154. }
  155. func BenchmarkR2L379BitScalar(b *testing.B) {
  156. var mScalarBytes = [...]uint8{84, 222, 146, 63, 85, 18, 173, 162, 167, 38, 10, 8, 143, 176, 93, 228, 247, 128, 50, 128, 205, 42, 15, 137, 119, 67, 43, 3, 61, 91, 237, 24, 235, 12, 53, 96, 186, 164, 232, 223, 197, 224, 64, 109, 137, 63, 246, 4}
  157. for n := 0; n < b.N; n++ {
  158. kCurveOps.ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(mScalarBytes)*8), mScalarBytes[:])
  159. }
  160. }