mirror of
https://github.com/emmansun/gmsm.git
synced 2025-04-23 18:56:17 +08:00
171 lines
7.4 KiB
Go
171 lines
7.4 KiB
Go
package sm9
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"fmt"
|
|
"math/big"
|
|
"testing"
|
|
)
|
|
|
|
var secp256k1Params = &CurveParams{
|
|
Name: "secp256k1",
|
|
BitSize: 256,
|
|
P: bigFromHex("fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),
|
|
N: bigFromHex("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),
|
|
B: bigFromHex("0000000000000000000000000000000000000000000000000000000000000007"),
|
|
Gx: bigFromHex("79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"),
|
|
Gy: bigFromHex("483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"),
|
|
}
|
|
|
|
var sm9CurveParams = &CurveParams{
|
|
Name: "sm9",
|
|
BitSize: 256,
|
|
P: bigFromHex("B640000002A3A6F1D603AB4FF58EC74521F2934B1A7AEEDBE56F9B27E351457D"),
|
|
N: bigFromHex("B640000002A3A6F1D603AB4FF58EC74449F2934B18EA8BEEE56EE19CD69ECF25"),
|
|
B: bigFromHex("0000000000000000000000000000000000000000000000000000000000000005"),
|
|
Gx: bigFromHex("93DE051D62BF718FF5ED0704487D01D6E1E4086909DC3280E8C4E4817C66DDDD"),
|
|
Gy: bigFromHex("21FE8DDA4F21E607631065125C395BBC1C1C00CBFA6024350C464CD70A3EA616"),
|
|
}
|
|
|
|
type baseMultTest struct {
|
|
k string
|
|
x, y string
|
|
}
|
|
|
|
var s256BaseMultTests = []baseMultTest{
|
|
{
|
|
"AA5E28D6A97A2479A65527F7290311A3624D4CC0FA1578598EE3C2613BF99522",
|
|
"34F9460F0E4F08393D192B3C5133A6BA099AA0AD9FD54EBCCFACDFA239FF49C6",
|
|
"B71EA9BD730FD8923F6D25A7A91E7DD7728A960686CB5A901BB419E0F2CA232",
|
|
},
|
|
{
|
|
"7E2B897B8CEBC6361663AD410835639826D590F393D90A9538881735256DFAE3",
|
|
"D74BF844B0862475103D96A611CF2D898447E288D34B360BC885CB8CE7C00575",
|
|
"131C670D414C4546B88AC3FF664611B1C38CEB1C21D76369D7A7A0969D61D97D",
|
|
},
|
|
{
|
|
"6461E6DF0FE7DFD05329F41BF771B86578143D4DD1F7866FB4CA7E97C5FA945D",
|
|
"E8AECC370AEDD953483719A116711963CE201AC3EB21D3F3257BB48668C6A72F",
|
|
"C25CAF2F0EBA1DDB2F0F3F47866299EF907867B7D27E95B3873BF98397B24EE1",
|
|
},
|
|
{
|
|
"376A3A2CDCD12581EFFF13EE4AD44C4044B8A0524C42422A7E1E181E4DEECCEC",
|
|
"14890E61FCD4B0BD92E5B36C81372CA6FED471EF3AA60A3E415EE4FE987DABA1",
|
|
"297B858D9F752AB42D3BCA67EE0EB6DCD1C2B7B0DBE23397E66ADC272263F982",
|
|
},
|
|
{
|
|
"1B22644A7BE026548810C378D0B2994EEFA6D2B9881803CB02CEFF865287D1B9",
|
|
"F73C65EAD01C5126F28F442D087689BFA08E12763E0CEC1D35B01751FD735ED3",
|
|
"F449A8376906482A84ED01479BD18882B919C140D638307F0C0934BA12590BDE",
|
|
},
|
|
}
|
|
|
|
func TestBaseMult(t *testing.T) {
|
|
for i, e := range s256BaseMultTests {
|
|
k, ok := new(big.Int).SetString(e.k, 16)
|
|
if !ok {
|
|
t.Errorf("%d: bad value for k: %s", i, e.k)
|
|
}
|
|
x, y := secp256k1Params.ScalarBaseMult(k.Bytes())
|
|
if fmt.Sprintf("%X", x) != e.x || fmt.Sprintf("%X", y) != e.y {
|
|
t.Errorf("%d: bad output for k=%s: got (%X, %X), want (%s, %s)", i, e.k, x, y, e.x, e.y)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestOnCurve(t *testing.T) {
|
|
if !secp256k1Params.IsOnCurve(secp256k1Params.Gx, secp256k1Params.Gy) {
|
|
t.Errorf("point is not on curve")
|
|
}
|
|
if !sm9CurveParams.IsOnCurve(sm9CurveParams.Gx, sm9CurveParams.Gy) {
|
|
t.Errorf("point is not on curve")
|
|
}
|
|
}
|
|
|
|
func TestPMode4And8(t *testing.T) {
|
|
res := new(big.Int).Mod(sm9CurveParams.P, big.NewInt(4))
|
|
if res.Int64() != 1 {
|
|
t.Errorf("p mod 4 != 1")
|
|
}
|
|
res = new(big.Int).Mod(sm9CurveParams.P, big.NewInt(6))
|
|
if res.Int64() != 1 {
|
|
t.Errorf("p mod 6 != 1")
|
|
}
|
|
res = new(big.Int).Mod(sm9CurveParams.P, big.NewInt(8))
|
|
if res.Int64() != 5 {
|
|
t.Errorf("p mod 8 != 5")
|
|
}
|
|
res = new(big.Int).Sub(sm9CurveParams.P, big.NewInt(1))
|
|
res.Div(res, big.NewInt(2))
|
|
if hex.EncodeToString(res.Bytes()) != "5b2000000151d378eb01d5a7fac763a290f949a58d3d776df2b7cd93f1a8a2be" {
|
|
t.Errorf("expected %v, got %v\n", "5b2000000151d378eb01d5a7fac763a290f949a58d3d776df2b7cd93f1a8a2be", hex.EncodeToString(res.Bytes()))
|
|
}
|
|
|
|
res = new(big.Int).Add(sm9CurveParams.P, big.NewInt(1))
|
|
res.Div(res, big.NewInt(2))
|
|
if hex.EncodeToString(res.Bytes()) != "5b2000000151d378eb01d5a7fac763a290f949a58d3d776df2b7cd93f1a8a2bf" {
|
|
t.Errorf("expected %v, got %v\n", "5b2000000151d378eb01d5a7fac763a290f949a58d3d776df2b7cd93f1a8a2bf", hex.EncodeToString(res.Bytes()))
|
|
}
|
|
|
|
res = new(big.Int).Add(sm9CurveParams.P, big.NewInt(1))
|
|
res.Div(res, big.NewInt(3))
|
|
if hex.EncodeToString(res.Bytes()) != "3cc0000000e137a5f201391aa72f97c1b5fb866e5e28fa494c7a890d4bc5c1d4" {
|
|
t.Errorf("expected %v, got %v\n", "3cc0000000e137a5f201391aa72f97c1b5fb866e5e28fa494c7a890d4bc5c1d4", hex.EncodeToString(res.Bytes()))
|
|
}
|
|
|
|
res = new(big.Int).Sub(sm9CurveParams.P, big.NewInt(1))
|
|
res.Div(res, big.NewInt(4))
|
|
if hex.EncodeToString(res.Bytes()) != "2d90000000a8e9bc7580ead3fd63b1d1487ca4d2c69ebbb6f95be6c9f8d4515f" {
|
|
t.Errorf("expected %v, got %v\n", "2d90000000a8e9bc7580ead3fd63b1d1487ca4d2c69ebbb6f95be6c9f8d4515f", hex.EncodeToString(res.Bytes()))
|
|
}
|
|
|
|
res = new(big.Int).Sub(sm9CurveParams.P, big.NewInt(1))
|
|
res.Div(res, big.NewInt(6))
|
|
if hex.EncodeToString(res.Bytes()) != "1e60000000709bd2f9009c8d5397cbe0dafdc3372f147d24a63d4486a5e2e0ea" {
|
|
t.Errorf("expected %v, got %v\n", "1e60000000709bd2f9009c8d5397cbe0dafdc3372f147d24a63d4486a5e2e0ea", hex.EncodeToString(res.Bytes()))
|
|
}
|
|
|
|
res = new(big.Int).Sub(sm9CurveParams.P, big.NewInt(1))
|
|
res.Div(res, big.NewInt(3))
|
|
if hex.EncodeToString(res.Bytes()) != "3cc0000000e137a5f201391aa72f97c1b5fb866e5e28fa494c7a890d4bc5c1d4" {
|
|
t.Errorf("expected %v, got %v\n", "3cc0000000e137a5f201391aa72f97c1b5fb866e5e28fa494c7a890d4bc5c1d4", hex.EncodeToString(res.Bytes()))
|
|
}
|
|
|
|
res = new(big.Int).Mul(sm9CurveParams.P, sm9CurveParams.P)
|
|
res.Sub(res, big.NewInt(1))
|
|
res.Div(res, big.NewInt(3))
|
|
if hex.EncodeToString(res.Bytes()) != "2b3fb0000140abbbc71510370c6fa2b194d4665ff95c18014568b07bbd19fb54f0b9aded6fea5b670c35d6b4e3b966415456a4a8503c6361c90d41b4e8a78a58" {
|
|
t.Errorf("expected %v, got %v\n", "2b3fb0000140abbbc71510370c6fa2b194d4665ff95c18014568b07bbd19fb54f0b9aded6fea5b670c35d6b4e3b966415456a4a8503c6361c90d41b4e8a78a58", hex.EncodeToString(res.Bytes()))
|
|
}
|
|
|
|
res = new(big.Int).Mul(sm9CurveParams.P, sm9CurveParams.P)
|
|
res.Sub(res, big.NewInt(1))
|
|
res.Div(res, big.NewInt(2))
|
|
if hex.EncodeToString(res.Bytes()) != "40df880001e10199aa9f985292a7740a5f3e998ff60a2401e81d08b99ba6f8ff691684e427df891a9250c20f55961961fe81f6fc785a9512ad93e28f5cfb4f84" {
|
|
t.Errorf("expected %v, got %v\n", "40df880001e10199aa9f985292a7740a5f3e998ff60a2401e81d08b99ba6f8ff691684e427df891a9250c20f55961961fe81f6fc785a9512ad93e28f5cfb4f84", hex.EncodeToString(res.Bytes()))
|
|
}
|
|
|
|
res = new(big.Int).Sub(sm9CurveParams.P, big.NewInt(5))
|
|
res.Div(res, big.NewInt(8))
|
|
if hex.EncodeToString(res.Bytes()) != "16c80000005474de3ac07569feb1d8e8a43e5269634f5ddb7cadf364fc6a28af" {
|
|
t.Errorf("expected %v, got %v\n", "16c80000005474de3ac07569feb1d8e8a43e5269634f5ddb7cadf364fc6a28af", hex.EncodeToString(res.Bytes()))
|
|
}
|
|
|
|
res.Exp(big.NewInt(2), res, sm9CurveParams.P)
|
|
if hex.EncodeToString(res.Bytes()) != "800db90d149e875b5b564505fe88efba5223f2bf170cc61fea968b3df63edd75" {
|
|
t.Errorf("expected %v, got %v\n", "800db90d149e875b5b564505fe88efba5223f2bf170cc61fea968b3df63edd75", hex.EncodeToString(res.Bytes()))
|
|
}
|
|
|
|
res.Mul(u, big.NewInt(6))
|
|
res.Add(res, big.NewInt(5))
|
|
if hex.EncodeToString(res.Bytes()) != "02400000000215d941" {
|
|
t.Errorf("expected %v, got %v\n", "02400000000215d941", hex.EncodeToString(res.Bytes()))
|
|
}
|
|
res.Mul(u, big.NewInt(6))
|
|
res.Mul(res, u)
|
|
res.Add(res, big.NewInt(1))
|
|
if hex.EncodeToString(res.Bytes()) != "d8000000019062ed0000b98b0cb27659" {
|
|
t.Errorf("expected %v, got %v\n", "d8000000019062ed0000b98b0cb27659", hex.EncodeToString(res.Bytes()))
|
|
}
|
|
}
|