Struct schnorrkel::context::XoFTranscript
source · pub struct XoFTranscript<H>(/* private fields */)
where
H: Update + ExtendableOutput + Clone;
Expand description
Very simple transcript construction from a modern hash function.
We provide this transcript type to directly use conventional hash functions with an extensible output mode, like Shake128 and Blake2x.
We recommend using merlin::Transcript
instead because merlin
provides the transcript abstraction natively and might function
better in low memory environments. We therefore do not provide
conveniences like signing_context
for this.
We note that merlin already uses Keccak, upon which Shake128 is based, and that no rust implementation for Blake2x currently exists.
We caution that our transcript abstractions cannot provide the protections against hash collisions that Ed25519 provides via double hashing, but that prehashed Ed25519 variants lose. As such, any hash function used here must be collision resistant. We strongly recommend against building XOFs from weaker hash functions like SHA1 with HKDF constructions or similar.
In XoFTranscript
style, we never expose the hash function H
underlying this type, so that developers cannot circumvent the
domain separation provided by our methods. We do this to make
&mut XoFTranscript : SigningTranscript
safe.
Implementations§
source§impl<H> XoFTranscript<H>
impl<H> XoFTranscript<H>
sourcepub fn new(h: H) -> XoFTranscript<H>
pub fn new(h: H) -> XoFTranscript<H>
Create a XoFTranscript
from a conventional hash functions with an extensible output mode.
We intentionally consume and never reexpose the hash function
provided, so that our domain separation works correctly even
when using &mut XoFTranscript : SigningTranscript
.
Trait Implementations§
source§impl<H> From<H> for XoFTranscript<H>
impl<H> From<H> for XoFTranscript<H>
source§fn from(h: H) -> XoFTranscript<H>
fn from(h: H) -> XoFTranscript<H>
source§impl<H> SigningTranscript for XoFTranscript<H>
impl<H> SigningTranscript for XoFTranscript<H>
source§fn commit_bytes(&mut self, label: &'static [u8], bytes: &[u8])
fn commit_bytes(&mut self, label: &'static [u8], bytes: &[u8])
merlin::Transcript
.source§fn challenge_bytes(&mut self, label: &'static [u8], dest: &mut [u8])
fn challenge_bytes(&mut self, label: &'static [u8], dest: &mut [u8])
merlin::Transcript
.source§fn witness_bytes_rng<R>(
&self,
label: &'static [u8],
dest: &mut [u8],
nonce_seeds: &[&[u8]],
rng: R,
)
fn witness_bytes_rng<R>( &self, label: &'static [u8], dest: &mut [u8], nonce_seeds: &[&[u8]], rng: R, )
source§fn proto_name(&mut self, label: &'static [u8])
fn proto_name(&mut self, label: &'static [u8])
source§fn commit_point(
&mut self,
label: &'static [u8],
compressed: &CompressedRistretto,
)
fn commit_point( &mut self, label: &'static [u8], compressed: &CompressedRistretto, )
source§fn challenge_scalar(&mut self, label: &'static [u8]) -> Scalar
fn challenge_scalar(&mut self, label: &'static [u8]) -> Scalar
e
.