public virtual byte[] GenerateSignature() { byte[] eHash = DigestUtilities.DoFinal(digest); BigInteger n = ecParams.N; BigInteger e = CalculateE(n, eHash); BigInteger d = ((ECPrivateKeyParameters)ecKey).D; BigInteger r, s; ECMultiplier basePointMultiplier = CreateBasePointMultiplier(); // 5.2.1 Draft RFC: SM2 Public Key Algorithms do // generate s { BigInteger k; do // generate r { // A3 k = kCalculator.NextK(); // A4 ECPoint p = basePointMultiplier.Multiply(ecParams.G, k).Normalize(); // A5 r = e.Add(p.AffineXCoord.ToBigInteger()).Mod(n); }while (r.SignValue == 0 || r.Add(k).Equals(n)); // A6 BigInteger dPlus1ModN = d.Add(BigInteger.One).ModInverse(n); s = k.Subtract(r.Multiply(d)).Mod(n); s = dPlus1ModN.Multiply(s).Mod(n); }while (s.SignValue == 0); // A7 try { return(encoding.Encode(ecParams.N, r, s)); } catch (Exception ex) { throw new CryptoException("unable to encode signature: " + ex.Message, ex); } }
/** * Generate a signature for the message we've been loaded with using * the key we were initialised with. */ public virtual byte[] GenerateSignature() { if (!forSigning) { throw new InvalidOperationException("DSADigestSigner not initialised for signature generation."); } byte[] hash = new byte[digest.GetDigestSize()]; digest.DoFinal(hash, 0); BigInteger[] sig = dsa.GenerateSignature(hash); try { return(encoding.Encode(GetOrder(), sig[0], sig[1])); } catch (Exception) { throw new InvalidOperationException("unable to encode signature"); } }