Hash#

Hash algorithms in HACL Packages can be used through two APIs: a (simple) One-shot API, and a (more flexible) Streaming API.

Note: HACL Packages supports MD5 but does not document it here because it should not be used.

One-shot API

If you want to hash a complete messages, i.e., can provide a slice of memory that already contains all the bytes you want to hash, you can use the one-shot API and hash to easily calculate the digest of that message.

Streaming API

If you need to provide a message chunk-by-chunk, e.g., because you read the message from network or similar, it could be more appropriate to use the streaming API.

The streaming API has roughly three phases: init, update, and finish. Typically, you create a state element by using malloc, call update as often as needed, and then call digest to obtain the final digest. Finally, you free the state element.

Streaming API (with intermediate digests)

It is also possible to obtain all intermediate digests by calling digest more than once. You can call update("Hello, "), and digest to obtain the hash of "Hello, ". Then you can call update("World!"), and digest again to obtain the hash of "Hello, World!". You only need to call malloc and free once to obtain both digests.