diff --git a/nitro/protocol/signature.nim b/nitro/protocol/signature.nim index 57564f4..d742cf5 100644 --- a/nitro/protocol/signature.nim +++ b/nitro/protocol/signature.nim @@ -34,6 +34,9 @@ proc recover*(signature: Signature, state: State): ?EthAddress = let hash = hashMessage(hashState(state)) recover(signature, hash)?.toAddress +proc verify*(signature: Signature, state: State, signer: EthAddress): bool = + recover(signature, state) == signer.some + proc `$`*(signature: Signature): string = var bytes = signature.toRaw() bytes[64] += 27 diff --git a/tests/nitro/protocol/testSignature.nim b/tests/nitro/protocol/testSignature.nim index 9fd4f6b..4fb6e09 100644 --- a/tests/nitro/protocol/testSignature.nim +++ b/tests/nitro/protocol/testSignature.nim @@ -18,12 +18,21 @@ suite "signature": check recover(signature, SkMessage(hash)).tryGet() == publicKey test "recovers ethereum address from signature": - let state1, state2 = State.example + let state = State.example let key = PrivateKey.random() let address = key.toPublicKey.toAddress - let signature = key.sign(state1) - check recover(signature, state1) == address.some - check recover(signature, state2) != address.some + let signature = key.sign(state) + check recover(signature, state) == address.some + check recover(signature, State.example) != address.some + + test "verifies signatures": + let state = State.example + let key = PrivateKey.random() + let address = key.toPublicKey.toAddress + let signature = key.sign(state) + check verify(signature, state, address) + check not verify(signature, state, EthAddress.example) + check not verify(signature, State.example, address) test "produces the same signatures as the javascript implementation": let state =State(