-Each hash algorithm contains a procedure group named `hash`, or if the algorithm provides more than one digest size `hash_<size>`\*\*\*.
+Each hash algorithm contains a procedure group named `hash`, or if the algorithm provides more than one digest size `hash_<size>`\*.
Included in these groups are four procedures.
Included in these groups are four procedures.
* `hash_string` - Hash a given string and return the computed hash. Just calls `hash_bytes` internally
* `hash_string` - Hash a given string and return the computed hash. Just calls `hash_bytes` internally
* `hash_bytes` - Hash a given byte slice and return the computed hash
* `hash_bytes` - Hash a given byte slice and return the computed hash
* `hash_stream` - Takes a stream from io.Stream and returns the computed hash from it
* `hash_stream` - Takes a stream from io.Stream and returns the computed hash from it
* `hash_file` - Takes a file handle and returns the computed hash from it. A second optional boolean parameter controls if the file is streamed (this is the default) or read at once (set to true)
* `hash_file` - Takes a file handle and returns the computed hash from it. A second optional boolean parameter controls if the file is streamed (this is the default) or read at once (set to true)
-\*\*\* On some algorithms there is another part to the name, since they might offer control about additional parameters.
+\* On some algorithms there is another part to the name, since they might offer control about additional parameters.
For instance, `HAVAL` offers different sizes as well as three different round amounts.
For instance, `HAVAL` offers different sizes as well as three different round amounts.
Computing a 256-bit hash with 3 rounds is therefore achieved by calling `haval.hash_256_3(...)`.
Computing a 256-bit hash with 3 rounds is therefore achieved by calling `haval.hash_256_3(...)`.
@@ -51,13 +46,6 @@ Computing a 256-bit hash with 3 rounds is therefore achieved by calling `haval.h
The above mentioned procedures internally call three procedures: `init`, `update` and `final`.
The above mentioned procedures internally call three procedures: `init`, `update` and `final`.
You may also directly call them, if you wish.
You may also directly call them, if you wish.
-#### Context system
-The library uses a context system internally to be able to switch between Odin / Botan implementations freely.
-When an Odin implementation is available, it is the default.
-You may change what is used during runtime by calling `foo.use_botan()` or `foo.use_odin()`.
-It is also possible to set this during compile time via `USE_BOTAN_LIB=true`.
-Internally a vtable is used to set the appropriate procedures when switching. This works for all the procedures mentioned in the APIs above.
-
#### Example
#### Example
```odin
```odin
package crypto_example
package crypto_example
@@ -67,12 +55,16 @@ import "core:crypto/md4"
main :: proc() {
main :: proc() {
input := "foo"
input := "foo"
- // Compute the hash via Odin implementation
+
+ // Compute the hash, using the high level API
computed_hash := md4.hash(input)
computed_hash := md4.hash(input)
- // Switch to Botan
- md4.use_botan()
- // Compute the hash via Botan bindings
- computed_hash_botan := md4.hash(input)
+
+ // Compute the hash, using the low level API
+ ctx: md4.Md4_Context
+ computed_hash_low: [16]byte
+ md4.init(&ctx)
+ md4.update(&ctx, transmute([]byte)input)
+ md4.final(&ctx, computed_hash_low[:])
}
}
```
```
For example uses of all available algorithms, please see the tests within `tests/core/crypto`.
For example uses of all available algorithms, please see the tests within `tests/core/crypto`.
- Jeroen van Rijn: Context design to be able to change from Odin implementation to bindings.
Implementation of the SHA2 hashing algorithm, as defined in <https://csrc.nist.gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2.pdf>
Implementation of the SHA2 hashing algorithm, as defined in <https://csrc.nist.gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2.pdf>
and in RFC 3874 <https://datatracker.ietf.org/doc/html/rfc3874>
and in RFC 3874 <https://datatracker.ietf.org/doc/html/rfc3874>
@@ -17,72 +16,6 @@ import "core:os"
import "core:io"
import "core:io"
import "../util"
import "../util"
-import "../botan"
-import "../_ctx"
-
-/*
- Context initialization and switching between the Odin implementation and the bindings
- Jeroen van Rijn: Context design to be able to change from Odin implementation to bindings.
Implementation of the Whirlpool hashing algorithm, as defined in <https://web.archive.org/web/20171129084214/http://www.larc.usp.br/~pbarreto/WhirlpoolPage.html>
Implementation of the Whirlpool hashing algorithm, as defined in <https://web.archive.org/web/20171129084214/http://www.larc.usp.br/~pbarreto/WhirlpoolPage.html>
*/
*/
@@ -14,48 +13,8 @@ package whirlpool
import "core:os"
import "core:os"
import "core:io"
import "core:io"
-import "../botan"
-import "../_ctx"
import "../util"
import "../util"
-/*
- Context initialization and switching between the Odin implementation and the bindings