MCPcopy
hub / github.com/tjfoc/gmsm / Sm2Sign

Function Sm2Sign

sm2/sm2.go:126–166  ·  view source on GitHub ↗

****************************************************************************//

(priv *PrivateKey, msg, uid []byte, random io.Reader)

Source from the content-addressed store, hash-verified

124//****************************************************************************//
125
126func Sm2Sign(priv *PrivateKey, msg, uid []byte, random io.Reader) (r, s *big.Int, err error) {
127 digest, err := priv.PublicKey.Sm3Digest(msg, uid)
128 if err != nil {
129 return nil, nil, err
130 }
131 e := new(big.Int).SetBytes(digest)
132 c := priv.PublicKey.Curve
133 N := c.Params().N
134 if N.Sign() == 0 {
135 return nil, nil, errZeroParam
136 }
137 var k *big.Int
138 for { // 调整算法细节以实现SM2
139 for {
140 k, err = randFieldElement(c, random)
141 if err != nil {
142 r = nil
143 return
144 }
145 r, _ = priv.Curve.ScalarBaseMult(k.Bytes())
146 r.Add(r, e)
147 r.Mod(r, N)
148 if r.Sign() != 0 {
149 if t := new(big.Int).Add(r, k); t.Cmp(N) != 0 {
150 break
151 }
152 }
153
154 }
155 rD := new(big.Int).Mul(priv.D, r)
156 s = new(big.Int).Sub(k, rD)
157 d1 := new(big.Int).Add(priv.D, one)
158 d1Inv := new(big.Int).ModInverse(d1, N)
159 s.Mul(s, d1Inv)
160 s.Mod(s, N)
161 if s.Sign() != 0 {
162 break
163 }
164 }
165 return
166}
167func Sm2Verify(pub *PublicKey, msg, uid []byte, r, s *big.Int) bool {
168 c := pub.Curve
169 N := c.Params().N

Callers 1

SignMethod · 0.85

Calls 6

randFieldElementFunction · 0.85
Sm3DigestMethod · 0.80
ParamsMethod · 0.80
SignMethod · 0.80
ScalarBaseMultMethod · 0.80
AddMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…