gitee.com/lh-her-team/common@v1.5.1/opencrypto/utils/sm2curve.go (about) 1 package utils 2 3 import ( 4 "crypto/elliptic" 5 "encoding/asn1" 6 "math/big" 7 "sync" 8 ) 9 10 const SM2_DEFAULT_USER_ID = "1234567812345678" 11 12 // curve 13 var ( 14 OidSM2 = asn1.ObjectIdentifier{1, 2, 840, 10045, 2, 1} // SM2 id 15 ) 16 17 var ( 18 oidNamedCurveP224 = asn1.ObjectIdentifier{1, 3, 132, 0, 33} 19 oidNamedCurveP256 = asn1.ObjectIdentifier{1, 2, 840, 10045, 3, 1, 7} 20 oidNamedCurveP384 = asn1.ObjectIdentifier{1, 3, 132, 0, 34} 21 oidNamedCurveP521 = asn1.ObjectIdentifier{1, 3, 132, 0, 35} 22 23 OidNamedCurveSm2 = asn1.ObjectIdentifier{1, 2, 156, 10197, 1, 301} 24 ) 25 26 var initonce sync.Once 27 28 type ( 29 p256Curve struct { 30 *elliptic.CurveParams 31 } 32 ) 33 34 var ( 35 p256 p256Curve 36 ) 37 38 func initSMP256() { 39 // See FIPS 186-3, section D.2.3 40 p256.CurveParams = &elliptic.CurveParams{Name: "SM2-P-256"} 41 var pStr = "115792089210356248756420345214020892766250353991924191454421193933289684991999" 42 p256.P, _ = new(big.Int).SetString(pStr, 10) 43 var nStr = "115792089210356248756420345214020892766061623724957744567843809356293439045923" 44 p256.N, _ = new(big.Int).SetString(nStr, 10) 45 var bStr = "18505919022281880113072981827955639221458448578012075254857346196103069175443" 46 p256.B, _ = new(big.Int).SetString(bStr, 10) 47 var gXStr = "22963146547237050559479531362550074578802567295341616970375194840604139615431" 48 p256.Gx, _ = new(big.Int).SetString(gXStr, 10) 49 var gYStr = "85132369209828568825618990617112496413088388631904505083283536607588877201568" 50 p256.Gy, _ = new(big.Int).SetString(gYStr, 10) 51 p256.BitSize = 256 52 } 53 54 func P256Sm2() elliptic.Curve { 55 initonce.Do(initSMP256) 56 return p256 57 } 58 59 func OidFromNamedCurve(curve elliptic.Curve) (asn1.ObjectIdentifier, bool) { 60 switch curve { 61 case elliptic.P224(): 62 return oidNamedCurveP224, true 63 case elliptic.P256(): 64 return oidNamedCurveP256, true 65 case elliptic.P384(): 66 return oidNamedCurveP384, true 67 case elliptic.P521(): 68 return oidNamedCurveP521, true 69 case P256Sm2(): 70 return OidNamedCurveSm2, true 71 } 72 return nil, false 73 } 74 75 // nolint 76 func namedCurveFromOID(oid asn1.ObjectIdentifier) elliptic.Curve { 77 switch { 78 case oid.Equal(oidNamedCurveP224): 79 return elliptic.P224() 80 case oid.Equal(oidNamedCurveP256): 81 return elliptic.P256() 82 case oid.Equal(oidNamedCurveP384): 83 return elliptic.P384() 84 case oid.Equal(oidNamedCurveP521): 85 return elliptic.P521() 86 case oid.Equal(OidNamedCurveSm2): 87 return P256Sm2() 88 } 89 return nil 90 }