Beispiel #1
0
        public static byte[] SignRFC6979(this ECDsa key, byte[] data)
        {
            var digest        = new Sha256Digest();
            var secp256r1     = SecNamedCurves.GetByName("secp256r1");
            var ec_parameters = new ECDomainParameters(secp256r1.Curve, secp256r1.G, secp256r1.N);
            var private_key   = new ECPrivateKeyParameters(new BigInteger(1, key.PrivateKey()), ec_parameters);
            var signer        = new ECDsaSigner(new HMacDsaKCalculator(digest));
            var hash          = new byte[digest.GetDigestSize()];

            digest.BlockUpdate(data, 0, data.Length);
            digest.DoFinal(hash, 0);
            signer.Init(true, private_key);
            var rs        = signer.GenerateSignature(hash);
            var signature = new byte[RFC6979SignatureSize];
            var rbytes    = rs[0].ToByteArrayUnsigned();
            var sbytes    = rs[1].ToByteArrayUnsigned();
            var index     = RFC6979SignatureSize / 2 - rbytes.Length;

            rbytes.CopyTo(signature, index);
            index = RFC6979SignatureSize - sbytes.Length;
            sbytes.CopyTo(signature, index);
            return(signature);
        }