Ejemplo n.º 1
0
    /// <summary>
    /// Verifies if the public key recovered from the <see cref="Signature"/> of this record matches
    /// the one that is included in the <value>Secp256k1</value> entry.
    /// If the <value>Secp256k1</value> entry is missing then <value>false</value> is returned.
    /// </summary>
    /// <param name="nodeRecord">A <see cref="NodeRecord"/> for which to verify the signature.</param>
    /// <returns><value>True</value> if signature has a matching public key, otherwise <value>false</value></returns>
    /// <exception cref="Exception">Thrown when <see cref="Signature"/> is <value>null</value></exception>
    public bool Verify(NodeRecord nodeRecord)
    {
        if (nodeRecord.Signature is null)
        {
            throw new Exception("Cannot verify an ENR with an empty signature.");
        }

        Keccak contentHash;

        if (nodeRecord.OriginalContentRlp is not null)
        {
            contentHash = Keccak.Compute(nodeRecord.OriginalContentRlp);
        }
        else
        {
            contentHash = nodeRecord.ContentHash;
        }

        CompressedPublicKey publicKeyA =
            _ecdsa.RecoverCompressedPublicKey(nodeRecord.Signature !, contentHash);
        Signature           sigB       = new (nodeRecord.Signature !.Bytes, 1);
        CompressedPublicKey publicKeyB =
            _ecdsa.RecoverCompressedPublicKey(sigB, contentHash);

        CompressedPublicKey?reportedKey =
            nodeRecord.GetObj <CompressedPublicKey>(EnrContentKey.Secp256K1);

        return(publicKeyA.Equals(reportedKey) || publicKeyB.Equals(reportedKey));
    }
Ejemplo n.º 2
0
        public void Decompress()
        {
            EthereumEcdsa       ethereumEcdsa       = new(ChainId.Olympic, LimboLogs.Instance);
            PrivateKey          privateKey          = Build.A.PrivateKey.TestObject;
            CompressedPublicKey compressedPublicKey = privateKey.CompressedPublicKey;
            PublicKey           expected            = privateKey.PublicKey;
            PublicKey           actual = ethereumEcdsa.Decompress(compressedPublicKey);

            Assert.AreEqual(expected, actual);
        }
Ejemplo n.º 3
0
 public PublicKey Decompress(CompressedPublicKey compressedPublicKey)
 {
     byte[] deserialized = Proxy.Decompress(compressedPublicKey.Bytes);
     return(new PublicKey(deserialized));
 }