From d8c6788e8f6892ca536f2f38be53b7c70429c7c5 Mon Sep 17 00:00:00 2001 From: Sun Yimin Date: Mon, 7 Apr 2025 13:10:09 +0800 Subject: [PATCH] sm2, sm2ec: remove useless codes since go 1.19 --- docs/cfca.md | 3 ++- sm2/sm2_legacy.go | 6 +++--- sm2/sm2ec/elliptic.go | 27 --------------------------- sm2/sm2ec/elliptic_test.go | 18 +++++++++--------- 4 files changed, 14 insertions(+), 40 deletions(-) diff --git a/docs/cfca.md b/docs/cfca.md index 2bdc945..9246cd3 100644 --- a/docs/cfca.md +++ b/docs/cfca.md @@ -104,7 +104,8 @@ SADK 3.2之后的版本,支持下列SM2密文格式(encryptedType): * 0x02/0x03 - C1为压缩点格式,具体是C1C3C2还是C1C2C3取决于解密时的选项参数,默认为C1C3C2。 ### 生成双密钥CSR (v0.29.6+) -`cfca.CreateCertificateRequest`,和CFCA SADK不同,调用者需要自行先生成两对密钥对,一对用于签名证书,一对用于加解密CFCA生成的加密用私钥文件(CFCA加密,申请者解密)。 +`cfca.CreateCertificateRequest`,和CFCA SADK不同,调用者需要自行先生成两对密钥对,一对用于签名证书,一对用于加解密CFCA生成的加密用私钥文件(CFCA加密,申请者解密)。这个方法对应CFCA的`cfca.sadk.util.P10Request.generateDoublePKCS10Request`方法。按我的理解,非国密(RSA)应该不需要支持这种双密钥对机制,不过既然**CFCA SADK**支持,本软件库从**v0.30.0**开始也支持。 + 使用`cfca.ParseEscrowPrivateKey`解析CFCA返回的加密用私钥。 ### SM2私钥、证书的解析 diff --git a/sm2/sm2_legacy.go b/sm2/sm2_legacy.go index 3180975..749d4c3 100644 --- a/sm2/sm2_legacy.go +++ b/sm2/sm2_legacy.go @@ -10,9 +10,9 @@ import ( "math/big" "strings" + _subtle "github.com/emmansun/gmsm/internal/subtle" "github.com/emmansun/gmsm/sm2/sm2ec" "github.com/emmansun/gmsm/sm3" - _subtle "github.com/emmansun/gmsm/internal/subtle" "golang.org/x/crypto/cryptobyte" "golang.org/x/crypto/cryptobyte/asn1" ) @@ -392,7 +392,7 @@ func bytesToPoint(curve elliptic.Curve, bytes []byte) (*big.Int, *big.Int, int, data := make([]byte, 1+byteLen*2) data[0] = uncompressed copy(data[1:], bytes[1:1+byteLen*2]) - x, y := sm2ec.Unmarshal(curve, data) + x, y := elliptic.Unmarshal(curve, data) if x == nil || y == nil { return nil, nil, 0, fmt.Errorf("sm2: point is not on curve %s", curve.Params().Name) } @@ -404,7 +404,7 @@ func bytesToPoint(curve elliptic.Curve, bytes []byte) (*big.Int, *big.Int, int, // Make sure it's NIST curve or SM2 P-256 curve if strings.HasPrefix(curve.Params().Name, "P-") || strings.EqualFold(curve.Params().Name, sm2ec.P256().Params().Name) { // y² = x³ - 3x + b, prime curves - x, y := sm2ec.UnmarshalCompressed(curve, bytes[:1+byteLen]) + x, y := elliptic.UnmarshalCompressed(curve, bytes[:1+byteLen]) if x == nil || y == nil { return nil, nil, 0, fmt.Errorf("sm2: point is not on curve %s", curve.Params().Name) } diff --git a/sm2/sm2ec/elliptic.go b/sm2/sm2ec/elliptic.go index 6baf196..aec3c48 100644 --- a/sm2/sm2ec/elliptic.go +++ b/sm2/sm2ec/elliptic.go @@ -2,7 +2,6 @@ package sm2ec import ( "crypto/elliptic" - "math/big" "sync" ) @@ -16,29 +15,3 @@ func P256() elliptic.Curve { initonce.Do(initAll) return sm2p256 } - -// Since golang 1.19 -// unmarshaler is implemented by curves with their own constant-time Unmarshal. -// There isn't an equivalent interface for Marshal/MarshalCompressed because -// that doesn't involve any mathematical operations, only FillBytes and Bit. -type unmarshaler interface { - Unmarshal([]byte) (x, y *big.Int) - UnmarshalCompressed([]byte) (x, y *big.Int) -} - -func Unmarshal(curve elliptic.Curve, data []byte) (x, y *big.Int) { - if c, ok := curve.(unmarshaler); ok { - return c.Unmarshal(data) - } - return elliptic.Unmarshal(curve, data) -} - -// UnmarshalCompressed converts a point, serialized by MarshalCompressed, into -// an x, y pair. It is an error if the point is not in compressed form, is not -// on the curve, or is the point at infinity. On error, x = nil. -func UnmarshalCompressed(curve elliptic.Curve, data []byte) (x, y *big.Int) { - if c, ok := curve.(unmarshaler); ok { - return c.UnmarshalCompressed(data) - } - return elliptic.UnmarshalCompressed(curve, data) -} diff --git a/sm2/sm2ec/elliptic_test.go b/sm2/sm2ec/elliptic_test.go index d906c9a..7f33657 100644 --- a/sm2/sm2ec/elliptic_test.go +++ b/sm2/sm2ec/elliptic_test.go @@ -61,7 +61,7 @@ func TestOffCurve(t *testing.T) { x.FillBytes(b[1 : 1+byteLen]) y.FillBytes(b[1+byteLen : 1+2*byteLen]) - x1, y1 := Unmarshal(curve, b) + x1, y1 := elliptic.Unmarshal(curve, b) if x1 != nil || y1 != nil { t.Errorf("unmarshaling a point not on the curve succeeded") } @@ -126,18 +126,18 @@ func testInfinity(t *testing.T, curve elliptic.Curve) { t.Errorf("IsOnCurve(∞) == true") } - if xx, yy := Unmarshal(curve, elliptic.Marshal(curve, x0, y0)); xx != nil || yy != nil { + if xx, yy := elliptic.Unmarshal(curve, elliptic.Marshal(curve, x0, y0)); xx != nil || yy != nil { t.Errorf("Unmarshal(Marshal(∞)) did not return an error") } // We don't test UnmarshalCompressed(MarshalCompressed(∞)) because there are // two valid points with x = 0. - if xx, yy := Unmarshal(curve, []byte{0x00}); xx != nil || yy != nil { + if xx, yy := elliptic.Unmarshal(curve, []byte{0x00}); xx != nil || yy != nil { t.Errorf("Unmarshal(∞) did not return an error") } byteLen := (curve.Params().BitSize + 7) / 8 buf := make([]byte, byteLen*2+1) buf[0] = 4 // Uncompressed format. - if xx, yy := Unmarshal(curve, buf); xx != nil || yy != nil { + if xx, yy := elliptic.Unmarshal(curve, buf); xx != nil || yy != nil { t.Errorf("Unmarshal((0,0)) did not return an error") } } @@ -149,7 +149,7 @@ func TestMarshal(t *testing.T) { t.Fatal(err) } serialized := elliptic.Marshal(curve, x, y) - xx, yy := Unmarshal(curve, serialized) + xx, yy := elliptic.Unmarshal(curve, serialized) if xx == nil { t.Fatal("failed to unmarshal") } @@ -230,7 +230,7 @@ func TestMarshalCompressed(t *testing.T) { t.Run("Invalid", func(t *testing.T) { data, _ := hex.DecodeString("02fd4bf61763b46581fd9174d623516cf3c81edd40e29ffa2777fb6cb0ae3ce535") - X, Y := UnmarshalCompressed(P256(), data) + X, Y := elliptic.UnmarshalCompressed(P256(), data) if X != nil || Y != nil { t.Error("expected an error for invalid encoding") } @@ -258,7 +258,7 @@ func testMarshalCompressed(t *testing.T, curve elliptic.Curve, x, y *big.Int, wa t.Errorf("got unexpected MarshalCompressed result: got %x, want %x", got, want) } - X, Y := UnmarshalCompressed(curve, got) + X, Y := elliptic.UnmarshalCompressed(curve, got) if X == nil || Y == nil { t.Fatalf("UnmarshalCompressed failed unexpectedly") } @@ -328,7 +328,7 @@ func BenchmarkMarshalUnmarshal(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { buf := elliptic.Marshal(curve, x, y) - xx, yy := Unmarshal(curve, buf) + xx, yy := elliptic.Unmarshal(curve, buf) if xx.Cmp(x) != 0 || yy.Cmp(y) != 0 { b.Error("Unmarshal output different from Marshal input") } @@ -338,7 +338,7 @@ func BenchmarkMarshalUnmarshal(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { buf := elliptic.MarshalCompressed(curve, x, y) - xx, yy := UnmarshalCompressed(curve, buf) + xx, yy := elliptic.UnmarshalCompressed(curve, buf) if xx.Cmp(x) != 0 || yy.Cmp(y) != 0 { b.Error("Unmarshal output different from Marshal input") }