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  }