mirror of
https://github.com/logos-messaging/logos-messaging-nim.git
synced 2026-01-02 14:03:06 +00:00
fix: hash inputs for external nullifier, remove length prefix for sha256 (#3660)
* fix: hash inputs for external nullifier, remove length prefix for sha256 * feat: use nimcrypto keccak instead of sha256 ffi * feat: wrapper function to generate external nullifier
This commit is contained in:
parent
7c24a15459
commit
2d40cb9d62
@ -70,53 +70,6 @@ suite "Waku rln relay":
|
|||||||
|
|
||||||
info "the generated identity credential: ", idCredential
|
info "the generated identity credential: ", idCredential
|
||||||
|
|
||||||
test "hash Nim Wrappers":
|
|
||||||
# create an RLN instance
|
|
||||||
let rlnInstance = createRLNInstanceWrapper()
|
|
||||||
require:
|
|
||||||
rlnInstance.isOk()
|
|
||||||
|
|
||||||
# prepare the input
|
|
||||||
let
|
|
||||||
msg = "Hello".toBytes()
|
|
||||||
hashInput = encodeLengthPrefix(msg)
|
|
||||||
hashInputBuffer = toBuffer(hashInput)
|
|
||||||
|
|
||||||
# prepare other inputs to the hash function
|
|
||||||
let outputBuffer = default(Buffer)
|
|
||||||
|
|
||||||
let hashSuccess = sha256(unsafeAddr hashInputBuffer, unsafeAddr outputBuffer, true)
|
|
||||||
require:
|
|
||||||
hashSuccess
|
|
||||||
let outputArr = cast[ptr array[32, byte]](outputBuffer.`ptr`)[]
|
|
||||||
|
|
||||||
check:
|
|
||||||
"1e32b3ab545c07c8b4a7ab1ca4f46bc31e4fdc29ac3b240ef1d54b4017a26e4c" ==
|
|
||||||
outputArr.inHex()
|
|
||||||
|
|
||||||
let
|
|
||||||
hashOutput = cast[ptr array[32, byte]](outputBuffer.`ptr`)[]
|
|
||||||
hashOutputHex = hashOutput.toHex()
|
|
||||||
|
|
||||||
info "hash output", hashOutputHex
|
|
||||||
|
|
||||||
test "sha256 hash utils":
|
|
||||||
# create an RLN instance
|
|
||||||
let rlnInstance = createRLNInstanceWrapper()
|
|
||||||
require:
|
|
||||||
rlnInstance.isOk()
|
|
||||||
let rln = rlnInstance.get()
|
|
||||||
|
|
||||||
# prepare the input
|
|
||||||
let msg = "Hello".toBytes()
|
|
||||||
|
|
||||||
let hashRes = sha256(msg)
|
|
||||||
|
|
||||||
check:
|
|
||||||
hashRes.isOk()
|
|
||||||
"1e32b3ab545c07c8b4a7ab1ca4f46bc31e4fdc29ac3b240ef1d54b4017a26e4c" ==
|
|
||||||
hashRes.get().inHex()
|
|
||||||
|
|
||||||
test "poseidon hash utils":
|
test "poseidon hash utils":
|
||||||
# create an RLN instance
|
# create an RLN instance
|
||||||
let rlnInstance = createRLNInstanceWrapper()
|
let rlnInstance = createRLNInstanceWrapper()
|
||||||
|
|||||||
@ -379,7 +379,7 @@ method generateProof*(
|
|||||||
|
|
||||||
let x = keccak.keccak256.digest(data)
|
let x = keccak.keccak256.digest(data)
|
||||||
|
|
||||||
let extNullifier = poseidon(@[@(epoch), @(rlnIdentifier)]).valueOr:
|
let extNullifier = generateExternalNullifier(epoch, rlnIdentifier).valueOr:
|
||||||
return err("Failed to compute external nullifier: " & error)
|
return err("Failed to compute external nullifier: " & error)
|
||||||
|
|
||||||
let witness = RLNWitnessInput(
|
let witness = RLNWitnessInput(
|
||||||
@ -457,10 +457,9 @@ method verifyProof*(
|
|||||||
|
|
||||||
var normalizedProof = proof
|
var normalizedProof = proof
|
||||||
|
|
||||||
normalizedProof.externalNullifier = poseidon(
|
let externalNullifier = generateExternalNullifier(proof.epoch, proof.rlnIdentifier).valueOr:
|
||||||
@[@(proof.epoch), @(proof.rlnIdentifier)]
|
|
||||||
).valueOr:
|
|
||||||
return err("Failed to compute external nullifier: " & error)
|
return err("Failed to compute external nullifier: " & error)
|
||||||
|
normalizedProof.externalNullifier = externalNullifier
|
||||||
|
|
||||||
let proofBytes = serialize(normalizedProof, input)
|
let proofBytes = serialize(normalizedProof, input)
|
||||||
let proofBuffer = proofBytes.toBuffer()
|
let proofBuffer = proofBytes.toBuffer()
|
||||||
|
|||||||
@ -6,7 +6,8 @@ import
|
|||||||
stew/[arrayops, byteutils, endians2],
|
stew/[arrayops, byteutils, endians2],
|
||||||
stint,
|
stint,
|
||||||
results,
|
results,
|
||||||
std/[sequtils, strutils, tables]
|
std/[sequtils, strutils, tables],
|
||||||
|
nimcrypto/keccak as keccak
|
||||||
|
|
||||||
import ./rln_interface, ../conversion_utils, ../protocol_types, ../protocol_metrics
|
import ./rln_interface, ../conversion_utils, ../protocol_types, ../protocol_metrics
|
||||||
import ../../waku_core, ../../waku_keystore
|
import ../../waku_core, ../../waku_keystore
|
||||||
@ -119,24 +120,6 @@ proc createRLNInstance*(): RLNResult =
|
|||||||
res = createRLNInstanceLocal()
|
res = createRLNInstanceLocal()
|
||||||
return res
|
return res
|
||||||
|
|
||||||
proc sha256*(data: openArray[byte]): RlnRelayResult[MerkleNode] =
|
|
||||||
## a thin layer on top of the Nim wrapper of the sha256 hasher
|
|
||||||
var lenPrefData = encodeLengthPrefix(data)
|
|
||||||
var
|
|
||||||
hashInputBuffer = lenPrefData.toBuffer()
|
|
||||||
outputBuffer: Buffer # will holds the hash output
|
|
||||||
|
|
||||||
trace "sha256 hash input buffer length", bufflen = hashInputBuffer.len
|
|
||||||
let hashSuccess = sha256(addr hashInputBuffer, addr outputBuffer, true)
|
|
||||||
|
|
||||||
# check whether the hash call is done successfully
|
|
||||||
if not hashSuccess:
|
|
||||||
return err("error in sha256 hash")
|
|
||||||
|
|
||||||
let output = cast[ptr MerkleNode](outputBuffer.`ptr`)[]
|
|
||||||
|
|
||||||
return ok(output)
|
|
||||||
|
|
||||||
proc poseidon*(data: seq[seq[byte]]): RlnRelayResult[array[32, byte]] =
|
proc poseidon*(data: seq[seq[byte]]): RlnRelayResult[array[32, byte]] =
|
||||||
## a thin layer on top of the Nim wrapper of the poseidon hasher
|
## a thin layer on top of the Nim wrapper of the poseidon hasher
|
||||||
var inputBytes = serialize(data)
|
var inputBytes = serialize(data)
|
||||||
@ -180,9 +163,18 @@ proc toLeaves*(rateCommitments: seq[RateCommitment]): RlnRelayResult[seq[seq[byt
|
|||||||
leaves.add(leaf)
|
leaves.add(leaf)
|
||||||
return ok(leaves)
|
return ok(leaves)
|
||||||
|
|
||||||
|
proc generateExternalNullifier*(
|
||||||
|
epoch: Epoch, rlnIdentifier: RlnIdentifier
|
||||||
|
): RlnRelayResult[ExternalNullifier] =
|
||||||
|
let epochHash = keccak.keccak256.digest(@(epoch))
|
||||||
|
let rlnIdentifierHash = keccak.keccak256.digest(@(rlnIdentifier))
|
||||||
|
let externalNullifier = poseidon(@[@(epochHash), @(rlnIdentifierHash)]).valueOr:
|
||||||
|
return err("Failed to compute external nullifier: " & error)
|
||||||
|
return ok(externalNullifier)
|
||||||
|
|
||||||
proc extractMetadata*(proof: RateLimitProof): RlnRelayResult[ProofMetadata] =
|
proc extractMetadata*(proof: RateLimitProof): RlnRelayResult[ProofMetadata] =
|
||||||
let externalNullifier = poseidon(@[@(proof.epoch), @(proof.rlnIdentifier)]).valueOr:
|
let externalNullifier = generateExternalNullifier(proof.epoch, proof.rlnIdentifier).valueOr:
|
||||||
return err("could not construct the external nullifier")
|
return err("Failed to compute external nullifier: " & error)
|
||||||
return ok(
|
return ok(
|
||||||
ProofMetadata(
|
ProofMetadata(
|
||||||
nullifier: proof.nullifier,
|
nullifier: proof.nullifier,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user