sm2, sm2ec: remove useless codes since go 1.19

This commit is contained in:
Sun Yimin 2025-04-07 13:10:09 +08:00 committed by GitHub
parent 0ef30b3ab5
commit d8c6788e8f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 14 additions and 40 deletions

View File

@ -104,7 +104,8 @@ SADK 3.2之后的版本支持下列SM2密文格式(encryptedType)
* 0x02/0x03 - C1为压缩点格式具体是C1C3C2还是C1C2C3取决于解密时的选项参数默认为C1C3C2。 * 0x02/0x03 - C1为压缩点格式具体是C1C3C2还是C1C2C3取决于解密时的选项参数默认为C1C3C2。
### 生成双密钥CSR v0.29.6+ ### 生成双密钥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返回的加密用私钥。 使用`cfca.ParseEscrowPrivateKey`解析CFCA返回的加密用私钥。
### SM2私钥、证书的解析 ### SM2私钥、证书的解析

View File

@ -10,9 +10,9 @@ import (
"math/big" "math/big"
"strings" "strings"
_subtle "github.com/emmansun/gmsm/internal/subtle"
"github.com/emmansun/gmsm/sm2/sm2ec" "github.com/emmansun/gmsm/sm2/sm2ec"
"github.com/emmansun/gmsm/sm3" "github.com/emmansun/gmsm/sm3"
_subtle "github.com/emmansun/gmsm/internal/subtle"
"golang.org/x/crypto/cryptobyte" "golang.org/x/crypto/cryptobyte"
"golang.org/x/crypto/cryptobyte/asn1" "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 := make([]byte, 1+byteLen*2)
data[0] = uncompressed data[0] = uncompressed
copy(data[1:], bytes[1:1+byteLen*2]) 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 { if x == nil || y == nil {
return nil, nil, 0, fmt.Errorf("sm2: point is not on curve %s", curve.Params().Name) 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 // 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) { if strings.HasPrefix(curve.Params().Name, "P-") || strings.EqualFold(curve.Params().Name, sm2ec.P256().Params().Name) {
// y² = x³ - 3x + b, prime curves // 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 { if x == nil || y == nil {
return nil, nil, 0, fmt.Errorf("sm2: point is not on curve %s", curve.Params().Name) return nil, nil, 0, fmt.Errorf("sm2: point is not on curve %s", curve.Params().Name)
} }

View File

@ -2,7 +2,6 @@ package sm2ec
import ( import (
"crypto/elliptic" "crypto/elliptic"
"math/big"
"sync" "sync"
) )
@ -16,29 +15,3 @@ func P256() elliptic.Curve {
initonce.Do(initAll) initonce.Do(initAll)
return sm2p256 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)
}

View File

@ -61,7 +61,7 @@ func TestOffCurve(t *testing.T) {
x.FillBytes(b[1 : 1+byteLen]) x.FillBytes(b[1 : 1+byteLen])
y.FillBytes(b[1+byteLen : 1+2*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 { if x1 != nil || y1 != nil {
t.Errorf("unmarshaling a point not on the curve succeeded") 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") 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") t.Errorf("Unmarshal(Marshal(∞)) did not return an error")
} }
// We don't test UnmarshalCompressed(MarshalCompressed(∞)) because there are // We don't test UnmarshalCompressed(MarshalCompressed(∞)) because there are
// two valid points with x = 0. // 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") t.Errorf("Unmarshal(∞) did not return an error")
} }
byteLen := (curve.Params().BitSize + 7) / 8 byteLen := (curve.Params().BitSize + 7) / 8
buf := make([]byte, byteLen*2+1) buf := make([]byte, byteLen*2+1)
buf[0] = 4 // Uncompressed format. 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") t.Errorf("Unmarshal((0,0)) did not return an error")
} }
} }
@ -149,7 +149,7 @@ func TestMarshal(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
serialized := elliptic.Marshal(curve, x, y) serialized := elliptic.Marshal(curve, x, y)
xx, yy := Unmarshal(curve, serialized) xx, yy := elliptic.Unmarshal(curve, serialized)
if xx == nil { if xx == nil {
t.Fatal("failed to unmarshal") t.Fatal("failed to unmarshal")
} }
@ -230,7 +230,7 @@ func TestMarshalCompressed(t *testing.T) {
t.Run("Invalid", func(t *testing.T) { t.Run("Invalid", func(t *testing.T) {
data, _ := hex.DecodeString("02fd4bf61763b46581fd9174d623516cf3c81edd40e29ffa2777fb6cb0ae3ce535") data, _ := hex.DecodeString("02fd4bf61763b46581fd9174d623516cf3c81edd40e29ffa2777fb6cb0ae3ce535")
X, Y := UnmarshalCompressed(P256(), data) X, Y := elliptic.UnmarshalCompressed(P256(), data)
if X != nil || Y != nil { if X != nil || Y != nil {
t.Error("expected an error for invalid encoding") 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) 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 { if X == nil || Y == nil {
t.Fatalf("UnmarshalCompressed failed unexpectedly") t.Fatalf("UnmarshalCompressed failed unexpectedly")
} }
@ -328,7 +328,7 @@ func BenchmarkMarshalUnmarshal(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
buf := elliptic.Marshal(curve, x, y) 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 { if xx.Cmp(x) != 0 || yy.Cmp(y) != 0 {
b.Error("Unmarshal output different from Marshal input") b.Error("Unmarshal output different from Marshal input")
} }
@ -338,7 +338,7 @@ func BenchmarkMarshalUnmarshal(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
buf := elliptic.MarshalCompressed(curve, x, y) 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 { if xx.Cmp(x) != 0 || yy.Cmp(y) != 0 {
b.Error("Unmarshal output different from Marshal input") b.Error("Unmarshal output different from Marshal input")
} }