Exemplo n.º 1
0
    public void ECDsaSign(string currency, BigInteger privateKey)
    {
        int chainId = GetChainId(currency);

        m_v = new BigInteger(chainId);
        m_r = new BigInteger(0);
        m_s = new BigInteger(0);

        byte[] e   = BouncyCastle.Keccak(EncodeRLP());
        byte[] sig = EllipticCurve.ECDsaSignHash(privateKey, e);

        BigInteger publicKeyX;
        BigInteger publicKeyY;

        BouncyCastle.ECPrivateKeyToPublicKey(privateKey, out publicKeyX, out publicKeyY);
        int recoveryId = BouncyCastle.ECCalcRecoveryId(sig.Take(32).ToArray(), sig.Skip(32).ToArray(), e, publicKeyX, publicKeyY);

        m_v = new BigInteger(chainId * 2 + 35 + recoveryId);
        m_r = Encode.BytesToBigInteger(sig.Take(32).ToArray());
        m_s = Encode.BytesToBigInteger(sig.Skip(32).ToArray());
    }