/// <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)); }
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); }
public PublicKey Decompress(CompressedPublicKey compressedPublicKey) { byte[] deserialized = Proxy.Decompress(compressedPublicKey.Bytes); return(new PublicKey(deserialized)); }