|
1 year ago | |
---|---|---|
.. | ||
_blake2 | 1 year ago | |
_fiat | 2 years ago | |
_sha3 | 1 year ago | |
_tiger | 1 year ago | |
blake | 2 years ago | |
blake2b | 2 years ago | |
blake2s | 2 years ago | |
chacha20 | 2 years ago | |
chacha20poly1305 | 2 years ago | |
gost | 2 years ago | |
groestl | 2 years ago | |
haval | 2 years ago | |
jh | 2 years ago | |
keccak | 2 years ago | |
md2 | 2 years ago | |
md4 | 2 years ago | |
md5 | 2 years ago | |
poly1305 | 2 years ago | |
ripemd | 2 years ago | |
sha1 | 2 years ago | |
sha2 | 2 years ago | |
sha3 | 2 years ago | |
shake | 2 years ago | |
siphash | 3 years ago | |
sm3 | 2 years ago | |
streebog | 2 years ago | |
tiger | 2 years ago | |
tiger2 | 2 years ago | |
util | 2 years ago | |
whirlpool | 2 years ago | |
x25519 | 2 years ago | |
README.md | 3 years ago | |
crypto.odin | 2 years ago | |
rand_generic.odin | 1 year ago | |
rand_js.odin | 1 year ago | |
rand_linux.odin | 1 year ago | |
rand_openbsd.odin | 3 years ago | |
rand_windows.odin | 3 years ago |
A crypto library for the Odin language
This library offers various algorithms implemented in Odin. Please see the chart below for the options.
Algorithm | |
---|---|
BLAKE | ✔️ |
BLAKE2B | ✔️ |
BLAKE2S | ✔️ |
GOST | ✔️ |
Grøstl | ✔️ |
HAVAL | ✔️ |
JH | ✔️ |
Keccak | ✔️ |
MD2 | ✔️ |
MD4 | ✔️ |
MD5 | ✔️ |
RIPEMD | ✔️ |
SHA-1 | ✔️ |
SHA-2 | ✔️ |
SHA-3 | ✔️ |
SHAKE | ✔️ |
SM3 | ✔️ |
Streebog | ✔️ |
Tiger | ✔️ |
Tiger2 | ✔️ |
Whirlpool | ✔️ |
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 six procedures.
hash_string
- Hash a given string and return the computed hash. Just calls hash_bytes
internallyhash_bytes
- Hash a given byte slice and return the computed hashhash_string_to_buffer
- Hash a given string and put the computed hash in the second proc parameter. Just calls hash_bytes_to_buffer
internallyhash_bytes_to_buffer
- Hash a given string and put the computed hash in the second proc parameter. The destination buffer has to be at least as big as the digest size of the hashhash_stream
- Takes a stream from io.Stream and returns the computed hash from ithash_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.
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(...)
.
The above mentioned procedures internally call three procedures: init
, update
and final
.
You may also directly call them, if you wish.
package crypto_example
// Import the desired package
import "core:crypto/md4"
main :: proc() {
input := "foo"
// Compute the hash, using the high level API
computed_hash := md4.hash(input)
// Variant that takes a destination buffer, instead of returning the computed hash
hash := make([]byte, md4.DIGEST_SIZE) // @note: Destination buffer has to be at least as big as the digest size of the hash
md4.hash(input, hash[:])
// 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
.
The crypto package is not thread-safe at the moment. This may change in the future.
The algorithms were ported out of curiosity and due to interest in the field. We have not had any of the code verified by a third party or tested/fuzzed by any automatic means. Wherever we were able to find official test vectors, those were used to verify the implementation. We do not recommend using them in a production environment, without any additional testing and/or verification.
This library is made available under the BSD-3 license.