package utils import ( "crypto/elliptic" "crypto/x509/pkix" "encoding/asn1" "fmt" "reflect" "voucher/internal/pkg/cmb/sm2/model" ) var ( oidNamedCurveP256SM2 = asn1.ObjectIdentifier{1, 2, 156, 10197, 1, 301} // I get the SM2 ID through parsing the pem file generated by gmssl ) // PKIXPublicKey reflects a PKIX public key structure. See SubjectPublicKeyInfo // in RFC 3280. type PKIXPublicKey struct { Algo pkix.AlgorithmIdentifier BitString asn1.BitString } func ParsePublicKey(bytes []byte) (*model.PublicKey, error) { var pk PKIXPublicKey if _, err := asn1.Unmarshal(bytes, &pk); err != nil { return nil, err } if !reflect.DeepEqual(pk.Algo.Algorithm, oidSM2) { return nil, fmt.Errorf("not sm2 elliptic curve") } curve := NewP256Sm2() x, y := elliptic.Unmarshal(curve, pk.BitString.Bytes) return &model.PublicKey{ Curve: curve, X: x, Y: y, }, nil }