Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Currently the Sphinx library is using
OsRng
(and sometimesThreadRng
) internally in some places that a caller cannot control. For example, inside theadd_padding
method which has non-public visibility. Hence, a caller who wants to use a different (P)RNG cannot easily do so.This diff allows callers to provide a
Rng
for the top-level methods which is then passed through.Following the existing pattern in
EphemeralSecret::new_with_rng
, I have added a newnew_with_rng
function in all places where necessary. We might want to consider to just change the existingnew
function instead, but that would be a breaking change of the public API.See also this existing comment: https://github.com/lambdapioneer/nym-sphinx/blob/develop/src/crypto/keys.rs#L66-L67
P.S. I enjoyed working in the code base :) well structured
Background
My personal motivation for this change is that we have an overlay protocol where multiple participants must generate the same SURB and then distribute it via secret shares. For this purpose I want to pass in a PRNG that's seeded with a nonce.
Test plan
I have added tests that verify that all output bytes rely on the passed-in RNG.