Files
xgcl/sm/sm9/internal/bn256/constants_test.go
T
2026-05-27 23:03:00 +08:00

115 lines
4.4 KiB
Go

package bn256
import (
"fmt"
"testing"
"xdx.jelly/xgcl/gmath"
)
// Generate the gfP present from big.Int
func gfPFromBase16(s string) (r [4]uint64) {
t := bigFromBase16(s)
r[0] = t.Uint64()
t.Rsh(t, 64)
r[1] = t.Uint64()
t.Rsh(t, 64)
r[2] = t.Uint64()
t.Rsh(t, 64)
r[3] = t.Uint64()
t.Rsh(t, 64)
return
}
func TestConstGFP(t *testing.T) {
// output var pPlus1Over4 = [4]uint64{0x86172b1b1782259a, 0x7b96e234482d6d67, 0x6a9bfb2e18613708, 0x23ed4078d2a8e1fe}
var p = bigFromBase10("65000549695646603732796438742359905742825358107623003571877145026864184071783")
p.Add(p, gmath.BigInt1)
p.Rsh(p, 2)
x := gfPFromBase16(p.Text(16))
for _, i := range x {
fmt.Printf("%x ", i)
}
}
func TestConst(t *testing.T) {
m := make(map[string][]string, 0)
m["xiToPMinus1Over6"] = []string{"3f23ea58e5720bdb843c6cfa9c08674947c5c86e0ddd04eda91d8354377b698b"}
m["xiToPMinus1Over3"] = []string{"f300000002a3a6f2780272354f8b78f4d5fc11967be65334"}
m["xiToPMinus1Over2"] = []string{"6c648de5dc0a3f2cf55acc93ee0baf159f9d411806dc5177f5b21fd3da24d011"}
m["xiToPSquaredMinus1Over3"] = []string{"f300000002a3a6f2780272354f8b78f4d5fc11967be65333"}
m["xiTo2PSquaredMinus2Over3"] = []string{"b640000002a3a6f0e303ab4ff2eb2052a9f02115caef75e70f738991676af249"}
m["xiToPSquaredMinus1Over6"] = []string{"f300000002a3a6f2780272354f8b78f4d5fc11967be65334"}
m["xiTo2PMinus2Over3"] = []string{"f300000002a3a6f2780272354f8b78f4d5fc11967be65333"}
m["p2"] = []string{"B640000002A3A6F1D603AB4FF58EC74521F2934B1A7AEEDBE56F9B27E351457D"}
m["np"] = []string{"afd2bac5558a13b3966a4b291522b137181ae39613c8dbaf892bc42c2f2ee42b"}
m["rN1"] = []string{"7d2bc576fdf597d1cda02d92d4d62924e74504e9a96b56cc0a1c7970e5df544d"}
m["r2"] = []string{"49bffffffd5c590e29fc54b00a7138bade0d6cb4e58511241a9064d81caeba83"}
//m["r2"] = []string{"2ea795a656f62fbde479b522d6706e7b88f8105fae1a5d3f27dea312b417e2d2"}
m["r3"] = []string{"219be84a7c687090cbec24519c22a14236920fc0837ec76e130257769df5827e"}
//m["pPlus1Over4"] = []string{"2d90000000a8e9bc7580ead3fd63b1d1487ca4d2c69ebbb6f95be6c9f8d4515f"}
//m["pMinus2"] = []string{"b640000002a3a6f1d603ab4ff58ec74521f2934b1a7aeedbe56f9b27e351457b"}
//m["pMinus1Over2"] = []string{"5b2000000151d378eb01d5a7fac763a290f949a58d3d776df2b7cd93f1a8a2be"}
m["xiToPMinus1"] = []string{"b640000002a3a6f1d603ab4ff58ec74521f2934b1a7aeedbe56f9b27e351457c"}
//// s is the Montgomery encoding of the square root of -3. Then, s = sqrt(-3) * 2^256 mod P.
//var s = &gfP{0x236e675956be783b, 0x053957e6f379ab64, 0xe60789a768f4a5c4, 0x04f8979dd8bad754}
//
//// sMinus1Over2 is the Montgomery encoding of (s-1)/2. Then, sMinus1Over2 = ( (s-1) / 2) * 2^256 mod P.
//var sMinus1Over2 = &gfP{0x3642364f386c1db8, 0xe825f92d2acd661f, 0xf2aba7e846c19d14, 0x5a0bcea3dc52b7a0}
for k, v := range m {
if len(v) == 1 {
f := gfPFromBase16(v[0])
fmt.Print("var ", k, " = &gfP{")
for i := range f {
fmt.Printf("0x%x", f[i])
if i < 3 {
fmt.Print(", ")
} else {
fmt.Println("}")
}
}
} else if len(v) == 2 {
t.Fatal()
}
}
}
func TestMontEncode(t *testing.T) {
m := make(map[string][]string, 0)
m["5*R"] = []string{"5"}
m["twistx0"] = []string{"85AEF3D078640C98597B6027B441A01FF1DD2C190F5E93C454806C11D8806141"}
m["twistx1"] = []string{"3722755292130B08D2AAB97FD34EC120EE265948D19C17ABF9B7213BAF82D65B"}
m["twisty0"] = []string{"17509B092E845C1266BA0D262CBEE6ED0736A96FA347C8BD856DC76B84EBEB96"}
m["twisty1"] = []string{"A7CF28D519BE3DA65F3170153D278FF247EFBA98A71A08116215BBA5C999A7C7"}
m["curvex"] = []string{"93DE051D62BF718FF5ED0704487D01D6E1E4086909DC3280E8C4E4817C66DDDD"}
m["curvey"] = []string{"21FE8DDA4F21E607631065125C395BBC1C1C00CBFA6024350C464CD70A3EA616"}
m["alpha"] = []string{"b640000002a3a6f0e303ab4ff2eb2052a9f02115caef75e70f738991676af249"}
m["xiTo2Minus2POver3"] = []string{"b640000002a3a6f0e303ab4ff2eb2052a9f02115caef75e70f738991676af249"}
m["xiTo1MinusPOver3"] = []string{"b640000002a3a6f0e303ab4ff2eb2052a9f02115caef75e70f738991676af24a"}
m["xiTo1MinusPOver2"] = []string{"49db721a269967c4e0a8debc0783182f82555233139e9d63efbd7b54092c756c"}
for k, v := range m {
if len(v) == 1 {
f := bigFromBase16(v[0])
f.Lsh(f, 256)
f.Mod(f, P)
fp := gfPFromBase16(f.Text(16))
fmt.Print("var ", k, " = &gfP{")
for i := range fp {
fmt.Printf("0x%x", fp[i])
if i < 3 {
fmt.Print(", ")
} else {
fmt.Println("}")
}
}
} else if len(v) == 2 {
t.Fatal()
}
}
}