-
Notifications
You must be signed in to change notification settings - Fork 310
Description
It would be handy to have some access to internals of e.g. SHA256/512, Blake2 family and Sha3 family to be able to manually update a state by "absorbing" a proper rate in every case. All hash families named above anyway follow a logic that some internal state is updated by processing potentially >1 round, but each round only a fixed amount of bytes is processed.
To clarify - such trait can even be made "unsafe" as the caller would be responsible to:
- somehow create an "empty" state (that would be great to have as a part of the trait if "raw" internal state is not
pub. By "raw" I mean e.g. 512 bits of internal state of Sha256 without any extra information such as what length was processed before this point, etc) - call "round function" as many times as necessary, ideally using
[u8; RATE]as an input, but in principle for e.g. Sha3 family[u64; RATE_IN_WORDS]may be ok. For whatever reason caller uses such a functionality, he would have to take care of all the paddings! - take a "state" and either provide some
as_ref()for it to be able to take inner information to produce a final hash value manually (caller is 100% responsible) or (more convenient, but more work and a lot of diversities here) have some "into_hash(state)" function that would produce a hash from the state (functions with extendable output are out of the scope of this feature request, so it's kind of expected that final state will be used only once)
It may be possible to use some feature flags, and e.g. just expose a raw "compress" function for sha256 and do it all by hands (not sure about other families if their internals are exposed to the necessary degree under feature flags), but consistent way for cases where such workflow is possible would be great (and will allow to avoid forking and butchering a crate to just add more pub)