gmsm/sm9/bn256/bn_pair_test.go
2022-07-07 10:50:24 +08:00

142 lines
12 KiB
Go

package bn256
import (
"math/big"
"testing"
)
var expected1 = &gfP12{}
var expected_b2 = &gfP12{}
var expected_b2_2 = &gfP12{}
func init() {
expected1.x.x.x = gfP{0x2c95725744116c03, 0x1bb35260b2b9a68c, 0x7db2e382760626fd, 0x7778b8974cbdeb19} // *fromBigInt(bigFromHex("4e378fb5561cd0668f906b731ac58fee25738edf09cadc7a29c0abc0177aea6d"))
expected1.x.x.y = gfP{0xff87f92dc4f87845, 0x97822f3a0f933413, 0x98640a8618c93cb1, 0xa3e8558daa87bf33} // *fromBigInt(bigFromHex("28b3404a61908f5d6198815c99af1990c8af38655930058c28c21bb539ce0000"))
expected1.x.y.x = gfP{0xd8f389eba52f2b50, 0xc96777354e98fdab, 0x604b99e84bc3c855, 0x52713354b0b754db} // *fromBigInt(bigFromHex("38bffe40a22d529a0c66124b2c308dac9229912656f62b4facfced408e02380f"))
expected1.x.y.y = gfP{0xfb37169580725336, 0xc2054d70ca10e2f1, 0xedc95ab9b858325c, 0x1d819744ed0249a3} // *fromBigInt(bigFromHex("a01f2c8bee81769609462c69c96aa923fd863e209d3ce26dd889b55e2e3873db"))
expected1.y.x.x = gfP{0xe51982451b57e681, 0xc38069dfb9a5cec5, 0xe14eeab45e231b40, 0x6735bf1e6a52a137} // *fromBigInt(bigFromHex("67e0e0c2eed7a6993dce28fe9aa2ef56834307860839677f96685f2b44d0911f"))
expected1.y.x.y = gfP{0x987264cefe698dc9, 0x6f93fcde9ceda6ad, 0x8ea90440272f8bbd, 0x3fb5dcd640b7b777} // *fromBigInt(bigFromHex("5a1ae172102efd95df7338dbc577c66d8d6c15e0a0158c7507228efb078f42a6"))
expected1.y.y.x = gfP{0x14c44d00ce1f33c6, 0x73fbfe2ca0b189a8, 0xa61bcab9b26756fd, 0x9481fcc18e6b4edb} // *fromBigInt(bigFromHex("1604a3fcfa9783e667ce9fcb1062c2a5c6685c316dda62de0548baa6ba30038b"))
expected1.y.y.y = gfP{0xd000ac4203d134d5, 0xf6a2d3f878be6418, 0xf13907aa71f9a54b, 0x3b37137fbf9c3654} // *fromBigInt(bigFromHex("93634f44fa13af76169f3cc8fbea880adaff8475d5fd28a75deb83c44362b439"))
expected1.z.x.x = gfP{0x4ffed75642893ec6, 0xc13037ebb8604239, 0xf5ab1ac4e0cbd3ae, 0x1e5e8f426223d69d} // *fromBigInt(bigFromHex("b3129a75d31d17194675a1bc56947920898fbf390a5bf5d931ce6cbb3340f66d"))
expected1.z.x.y = gfP{0x1bbc50b3c6efc70e, 0xb9717514153a91d1, 0xa18d16194c2c6d27, 0x688914dec77859e3} // *fromBigInt(bigFromHex("4c744e69c4a2e1c8ed72f796d151a17ce2325b943260fc460b9f73cb57c9014b"))
expected1.z.y.x = gfP{0xd61ffd4dd83000a9, 0x3a087e0d6eeb6a5b, 0x81be5df84658985, 0x1c759cf187f4495b} // *fromBigInt(bigFromHex("84b87422330d7936eaba1109fa5a7a7181ee16f2438b0aeb2f38fd5f7554e57a"))
expected1.z.y.y = gfP{0x2b8c8ee594a473c0, 0x4d351f06d3217c2f, 0x1806d0e05b4068b4, 0x827ab33399a430f4} // *fromBigInt(bigFromHex("aab9f06a4eeba4323a7833db202e4e35639d93fa3305af73f0f071d7d284fcfb"))
expected_b2.x.x.x = gfP{0xb142856248f41f28, 0xcbce124f35a82867, 0x63e1bc000fd4a3ca, 0x89a2688451d6b4ea} // *fromBigInt(bigFromHex("28542FB6954C84BE6A5F2988A31CB6817BA0781966FA83D9673A9577D3C0C134"))
expected_b2.x.x.y = gfP{0xba54d79abfc0d854, 0x9e3c87bca0badcc5, 0xdc632ac4e734c75f, 0x92c43954edc5d3d5} // *fromBigInt(bigFromHex("5E27C19FC02ED9AE37F5BB7BE9C03C2B87DE027539CCF03E6B7D36DE4AB45CD1"))
expected_b2.x.y.x = gfP{0x9783237a5c8a8899, 0x848d7ddb7378dd0d, 0xb6ee45e00c7bbc2, 0xa209362b5b8b64d7} // *fromBigInt(bigFromHex("A1ABFCD30C57DB0F1A838E3A8F2BF823479C978BD137230506EA6249C891049E"))
expected_b2.x.y.y = gfP{0xa72153cf39f25743, 0xf27c8043c983b41, 0x5e628235264aaaad, 0x2642efd31708b6d1} // *fromBigInt(bigFromHex("3497477913AB89F5E2960F382B1B5C8EE09DE0FA498BA95C4409D630D343DA40"))
expected_b2.y.x.x = gfP{0xfecc1b21266ac430, 0x650838657ba396e0, 0xd18f8fe6bee96e29, 0x7003f7ce19693a8c} // *fromBigInt(bigFromHex("4FEC93472DA33A4DB6599095C0CF895E3A7B993EE5E4EBE3B9AB7D7D5FF2A3D1"))
expected_b2.y.x.y = gfP{0x20d413ca394f32d1, 0x6b82b107f06497e2, 0x5950eb6a7ced3c30, 0x394ef12091520d8} // *fromBigInt(bigFromHex("647BA154C3E8E185DFC33657C1F128D480F3F7E3F16801208029E19434C733BB"))
expected_b2.y.y.x = gfP{0x957142303385bde4, 0x252a59e843ccde23, 0x49f76fbca37191cf, 0x302c714fa2ded663} // *fromBigInt(bigFromHex("73F21693C66FC23724DB26380C526223C705DAF6BA18B763A68623C86A632B05"))
expected_b2.y.y.y = gfP{0x4b85931b65bd558d, 0x6e9646a8e8cabe8c, 0x4e7904b2344079ea, 0x4c4fe244b580c818} // *fromBigInt(bigFromHex("0F63A071A6D62EA45B59A1942DFF5335D1A232C9C5664FAD5D6AF54C11418B0D"))
expected_b2.z.x.x = gfP{0xe5a8bf1e0fe5b270, 0x69f3aae541cc37b7, 0x60e902091f3e81a9, 0x98f8f58bfca091dc} // *fromBigInt(bigFromHex("8C8E9D8D905780D50E779067F2C4B1C8F83A8B59D735BB52AF35F56730BDE5AC"))
expected_b2.z.x.y = gfP{0x8118daee6274db2e, 0xc900a967503a1ef5, 0xa974896045e35548, 0x5c40204fa6380c8b} // *fromBigInt(bigFromHex("861CCD9978617267CE4AD9789F77739E62F2E57B48C2FF26D2E90A79A1D86B93"))
expected_b2.z.y.x = gfP{0xf598f2189e747334, 0xe2e8e6fd539bfba4, 0x106ca709cb184e8f, 0x39d9c0f47323da86} // *fromBigInt(bigFromHex("9B1CA08F64712E33AEDA3F44BD6CB633E0F722211E344D73EC9BBEBC92142765"))
expected_b2.z.y.y = gfP{0x40efda21cc6e7225, 0x48c061e55c3850fb, 0x39e48740501ddb77, 0x7cf66261692ebdc3} // *fromBigInt(bigFromHex("6BA584CE742A2A3AB41C15D3EF94EDEB8EF74A2BDCDAAECC09ABA567981F6437"))
expected_b2_2.x.x.x = gfP{0x5c186a7d2299505f, 0x64da1afac427ec0f, 0x833bb83af918a3fc, 0x6441ac98406886c8} // *fromBigInt(bigFromHex("1052D6E9D13E381909DFF7B2B41E13C987D0A9068423B769480DACCE6A06F492"))
expected_b2_2.x.x.y = gfP{0xaffde1e6431abcb4, 0x90278960e37327f0, 0x63665dc8a0b3f87, 0x4e4cbe22c9474bf2} // *fromBigInt(bigFromHex("5FFEB92AD870F97DC0893114DA22A44DBC9E7A8B6CA31A0CF0467265A1FB48C7"))
expected_b2_2.x.y.x = gfP{0x4e5d0c50f7b69266, 0xf076f42fbd812674, 0xe8c77f5fc5db7dec, 0x801f47b1ea7fcc57} // *fromBigInt(bigFromHex("2C5C3B37E4F2FF83DB33D98C0317BCBBBBF4AC6DF6B89ECA58268B280045E612"))
expected_b2_2.x.y.y = gfP{0x6a640da7b62484eb, 0x2f8eda9b8247cd00, 0x3ca05e46015337b7, 0xaa02d77cab6782b0} // *fromBigInt(bigFromHex("6CED9E2D7C9CD3D5AD630DEFAB0B831506218037EE0F861CF9B43C78434AEC38"))
expected_b2_2.y.x.x = gfP{0x9b45f8ba453cf192, 0x3bd07cd12f1e79c0, 0x8e885c71ec6dd8f3, 0x6e318f9e4f61fdb1} // *fromBigInt(bigFromHex("0AE7BF3E1AEC0CB67A03440906C7DFB3BCD4B6EEEBB7E371F0094AD4A816088D"))
expected_b2_2.y.x.y = gfP{0x8d3696539c05d217, 0x704fd2bfe0b77915, 0xd6c13796c8b320a3, 0x4af957616723718} // *fromBigInt(bigFromHex("98DBC791D0671CACA12236CDF8F39E15AEB96FAEB39606D5B04AC581746A663D"))
expected_b2_2.y.y.x = gfP{0xcc1646f686c7821f, 0xba97dbfa3324cc59, 0x59a771179a49d0d1, 0xc4aedae0efae84d} // *fromBigInt(bigFromHex("00DD2B7416BAA91172E89D5309D834F78C1E31B4483BB97185931BAD7BE1B9B5"))
expected_b2_2.y.y.y = gfP{0x4d3c2dc6c7308fdf, 0x30b1f54a4cb891b8, 0xda9e3e09b8dd93fb, 0x51988b9381033d83} // *fromBigInt(bigFromHex("7EBAC0349F8544469E60C32F6075FB0468A68147FF013537DF792FFCE024F857"))
expected_b2_2.z.x.x = gfP{0x446df8b4cc21f893, 0xb6dec85009834257, 0xef90da04c5745bac, 0x839cffa69c2d0668} // *fromBigInt(bigFromHex("10CC2B561A62B62DA36AEFD60850714F49170FD94A0010C6D4B651B64F3A3A5E"))
expected_b2_2.z.x.y = gfP{0xfc6de0161f7f6101, 0x6766467601150f5a, 0x644b3969a0995678, 0x331cfa93866eda1f} // *fromBigInt(bigFromHex("58C9687BEDDCD9E4FEDAB16B884D1FE6DFA117B2AB821F74E0BF7ACDA2269859"))
expected_b2_2.z.y.x = gfP{0xd891a606a5a81db2, 0x9f005779e86cfdee, 0xfed4c4fe0414571a, 0xb04886a78109bda9} // *fromBigInt(bigFromHex("2A430968F16086061904CE201847934B11CA0F9E9528F5A9D0CE8F015C9AEA79"))
expected_b2_2.z.y.y = gfP{0x360669dcffe4e5ba, 0xaa6909ce578135e4, 0x63627fc084c4a5ed, 0x44f13249582a471} // *fromBigInt(bigFromHex("934FDDA6D3AB48C8571CE2354B79742AA498CB8CDDE6BD1FA5946345A1A652F6"))
}
func Test_Pairing_A2(t *testing.T) {
pk := bigFromHex("0130E78459D78545CB54C587E02CF480CE0B66340F319F348A1D5B1F2DC5F4")
g2 := &G2{}
g2.ScalarBaseMult(pk)
ret := pairing(g2.p, curveGen)
if ret.x != expected1.x || ret.y != expected1.y || ret.z != expected1.z {
t.Errorf("not expected")
}
}
func Test_Pairing_B2(t *testing.T) {
deB := &twistPoint{}
deB.x.x = gfP{0x26ffa43b35b6284c, 0x6bd021fd9fbad8ca, 0x300609e7a86fb9f7, 0x7f80d54090947bd7} // *fromBigInt(bigFromHex("74CCC3AC9C383C60AF083972B96D05C75F12C8907D128A17ADAFBAB8C5A4ACF7"))
deB.x.y = gfP{0x14fa8025f791b79, 0x48a2a2693babdd4f, 0xaec5623fe6521f8e, 0x3e31e5de9005794b} // *fromBigInt(bigFromHex("01092FF4DE89362670C21711B6DBE52DCD5F8E40C6654B3DECE573C2AB3D29B2"))
deB.y.x = gfP{0xc9805ea27c0eee9f, 0x6878573ed5c183dc, 0x35570fc7770595a0, 0x2f2fadbd9e353477} // *fromBigInt(bigFromHex("44B0294AA04290E1524FF3E3DA8CFD432BB64DE3A8040B5B88D1B5FC86A4EBC1"))
deB.y.y = gfP{0xab992d9b3fb33dc, 0x8d802108de09f803, 0x728aca710f04571d, 0x80a0a7783fd0e0b8} // *fromBigInt(bigFromHex("8CFC48FB4FF37F1E27727464F3C34E2153861AD08E972D1625FC1A7BD18D5539"))
deB.z.SetOne()
deB.t.SetOne()
rA := &curvePoint{}
rA.x = gfP{0xdb329881cc8e9db6, 0x361fbd8a54f12643, 0x36197a12ac4129d6, 0xb249718a552868ad} // *fromBigInt(bigFromHex("7CBA5B19069EE66AA79D490413D11846B9BA76DD22567F809CF23B6D964BB265"))
rA.y = gfP{0x73274254afbe0912, 0xfc4a72769636645d, 0xa540b3b29e50f0a9, 0x9d7c405420331a24} // *fromBigInt(bigFromHex("A9760C99CB6F706343FED05637085864958D6C90902ABA7D405FBEDF7B781599"))
rA.z = *one
rA.t = *one
ret := pairing(deB, rA)
if ret.x != expected_b2.x || ret.y != expected_b2.y || ret.z != expected_b2.z {
t.Errorf("not expected")
}
}
func Test_Pairing_B2_2(t *testing.T) {
pubE := &curvePoint{}
pubE.x = gfP{0x243cdf6a3c700634, 0x9cc6bb4c51c190a2, 0x786741cd68256478, 0xb0f0b46af92f0e13} // *fromBigInt(bigFromHex("9174542668E8F14AB273C0945C3690C66E5DD09678B86F734C4350567ED06283"))
pubE.y = gfP{0x3fb24d6a61e6d9d7, 0x1fdf81874311e020, 0xcace28c7c4711b5b, 0xaa5f71dd30628449} // *fromBigInt(bigFromHex("54E598C6BF749A3DACC9FFFEDD9DB6866C50457CFC7AA2A4AD65C3168FF74210"))
pubE.z = *one
pubE.t = *one
ret := pairing(twistGen, pubE)
ret.Exp(ret, bigFromHex("00018B98C44BEF9F8537FB7D071B2C928B3BC65BD3D69E1EEE213564905634FE"))
if ret.x != expected_b2_2.x || ret.y != expected_b2_2.y || ret.z != expected_b2_2.z {
t.Errorf("not expected")
}
}
func Test_finalExponentiation(t *testing.T) {
x := &gfP12{
gfP4{
gfP2{
gfP{0xdb6db4822750a8a6, 0x84c6135a5121f134, 0x1874032f88791d41, 0x905112f2b85f3a37}, // *fromBigInt(bigFromHex("85AEF3D078640C98597B6027B441A01FF1DD2C190F5E93C454806C11D8806141")),
gfP{0x260226a68ce2da8f, 0x7ee5645edbf6c06b, 0xf8f57c82b1495444, 0x61fcf018bc47c4d1}, // *fromBigInt(bigFromHex("3722755292130B08D2AAB97FD34EC120EE265948D19C17ABF9B7213BAF82D65B")),
},
gfP2{
gfP{0xf7b82dac4c89bfbb, 0x3706f3f6a49dc12f, 0x1e29de93d3eef769, 0x81e448c3c76a5d53}, // *fromBigInt(bigFromHex("17509B092E845C1266BA0D262CBEE6ED0736A96FA347C8BD856DC76B84EBEB96")),
gfP{0xc03f138f9171c24a, 0x92fbab45a15a3ca7, 0x2445561e2ff77cdb, 0x108495e0c0f62ece}, // *fromBigInt(bigFromHex("A7CF28D519BE3DA65F3170153D278FF247EFBA98A71A08116215BBA5C999A7C7")),
},
},
gfP4{
gfP2{
gfP{0xdb6db4822750a8a6, 0x84c6135a5121f134, 0x1874032f88791d41, 0x905112f2b85f3a37}, // *fromBigInt(bigFromHex("85AEF3D078640C98597B6027B441A01FF1DD2C190F5E93C454806C11D8806141")),
gfP{0x260226a68ce2da8f, 0x7ee5645edbf6c06b, 0xf8f57c82b1495444, 0x61fcf018bc47c4d1}, // *fromBigInt(bigFromHex("3722755292130B08D2AAB97FD34EC120EE265948D19C17ABF9B7213BAF82D65B")),
},
gfP2{
gfP{0xf7b82dac4c89bfbb, 0x3706f3f6a49dc12f, 0x1e29de93d3eef769, 0x81e448c3c76a5d53}, // *fromBigInt(bigFromHex("17509B092E845C1266BA0D262CBEE6ED0736A96FA347C8BD856DC76B84EBEB96")),
gfP{0xc03f138f9171c24a, 0x92fbab45a15a3ca7, 0x2445561e2ff77cdb, 0x108495e0c0f62ece}, // *fromBigInt(bigFromHex("A7CF28D519BE3DA65F3170153D278FF247EFBA98A71A08116215BBA5C999A7C7")),
},
},
gfP4{
gfP2{
gfP{0xdb6db4822750a8a6, 0x84c6135a5121f134, 0x1874032f88791d41, 0x905112f2b85f3a37}, // *fromBigInt(bigFromHex("85AEF3D078640C98597B6027B441A01FF1DD2C190F5E93C454806C11D8806141")),
gfP{0x260226a68ce2da8f, 0x7ee5645edbf6c06b, 0xf8f57c82b1495444, 0x61fcf018bc47c4d1}, // *fromBigInt(bigFromHex("3722755292130B08D2AAB97FD34EC120EE265948D19C17ABF9B7213BAF82D65B")),
},
gfP2{
gfP{0xf7b82dac4c89bfbb, 0x3706f3f6a49dc12f, 0x1e29de93d3eef769, 0x81e448c3c76a5d53}, // *fromBigInt(bigFromHex("17509B092E845C1266BA0D262CBEE6ED0736A96FA347C8BD856DC76B84EBEB96")),
gfP{0xc03f138f9171c24a, 0x92fbab45a15a3ca7, 0x2445561e2ff77cdb, 0x108495e0c0f62ece}, // *fromBigInt(bigFromHex("A7CF28D519BE3DA65F3170153D278FF247EFBA98A71A08116215BBA5C999A7C7")),
},
},
}
got := finalExponentiation(x)
exp := new(big.Int).Exp(p, big.NewInt(12), nil)
exp.Sub(exp, big.NewInt(1))
exp.Div(exp, Order)
expected := (&gfP12{}).Exp(x, exp)
if got.x != expected.x || got.y != expected.y || got.z != expected.z {
t.Errorf("got %v, expected %v\n", got, expected)
}
}