API change. Cox::Blake2b renamed to Cox::Digest::Blake2b

This commit is contained in:
Didactic Drunk 2019-06-28 13:58:55 -07:00
parent b50e068b43
commit 8e939b9518
4 changed files with 30 additions and 30 deletions

View File

@ -65,16 +65,16 @@ dependencies:
| Class | |
| --- | --- |
| `CryptoBox` `Sign` `SecretBox` | I don't know much about crypto. |
| `Cox::CryptoBox::PrivateKey` | I want to encrypt + authenticate data using public key encryption. |
| `Cox::Sign::PrivateKey` | I want to sign or verify messages without encryption. |
| `Cox::SecretBox` | I have a shared key and want to encrypt + authenticate data. |
| AEAD | I have a shared key and want encrypt + authenticate streamed data. (not implemented yet) |
| `Cox::Blake2b` | I want to hash data fast and securely. |
| `Cox::SipHash` | I want to hash data really fast and less securely. (not implemented yet) |
| [`Cox::CryptoBox::SecretKey`](https://didactic-drunk.github.io/cox/Cox/CryptoBox/SecretKey.html) | I want to encrypt + authenticate data using public key encryption. |
| [`Cox::Sign::SecretKey`](https://didactic-drunk.github.io/cox/Cox/Sign/SecretKey.html) | I want to sign or verify messages without encryption. |
| [`Cox::SecretBox`](https://didactic-drunk.github.io/cox/Cox/SecretBox.html) | I have a shared key and want to encrypt + authenticate data. |
| AEAD | I have a shared key and want encrypt + authenticate streamed data. (Not implemented yet) |
| [`Cox::Digest::Blake2b`](https://didactic-drunk.github.io/cox/Cox/Digest::Blake2b.html) | I want to hash data fast and securely. |
| `Cox::Digest::SipHash` | I want to hash data really fast and less securely. (Not implemented yet) |
| `Cox::Pwhash` | I want to hash a password and store it. |
| `Cox::Pwhash` | I want to derive a key from a password. |
| `Cox::Kdf` | I have a high quality master key and want to make subkeys. |
| `Cox::Cipher::Chalsa` | What goes with guacamole? |
| [`Cox::Cipher::Chalsa`](https://didactic-drunk.github.io/cox/Cox/Cipher/Chalsa.html) | What goes with guacamole? |
| Everything else | I want to design my own crypto protocol and probably do it wrong. |
@ -142,14 +142,14 @@ message = key.decrypt_easy encrypted, nonce
### Blake2b
```crystal
key = Bytes.new Cox::Blake2B::KEY_SIZE
salt = Bytes.new Cox::Blake2B::SALT_SIZE
personal = Bytes.new Cox::Blake2B::PERSONAL_SIZE
out_size = 64 # bytes between Cox::Blake2B::OUT_SIZE_MIN and Cox::Blake2B::OUT_SIZE_MAX
key = Bytes.new Cox::Digest::Blake2B::KEY_SIZE
salt = Bytes.new Cox::Digest::Blake2B::SALT_SIZE
personal = Bytes.new Cox::Digest::Blake2B::PERSONAL_SIZE
out_size = 64 # bytes between Cox::Digest::Blake2B::OUT_SIZE_MIN and Cox::Digest::Blake2B::OUT_SIZE_MAX
data = "data".to_slice
# output_size, key, salt, and personal are optional.
digest = Cox::Blake2b.new out_size, key: key, salt: salt, personal: personal
digest = Cox::Digest::Blake2b.new out_size, key: key, salt: salt, personal: personal
digest.update data
output = d.hexdigest

View File

@ -13,19 +13,19 @@ puts "'crystal run --release benchmarks/blake2b.cr sha1 sha256'"
Benchmark.ips(warmup: 0.5) do |bm|
sizes.each_with_index do |size, i|
bm.report "blake2b new obj per iter #{size}" do
d = Cox::Blake2b.new 64
d = Cox::Digest::Blake2b.new 64
d.update bufs[i]
d.digest
end
d = Cox::Blake2b.new output_size
d = Cox::Digest::Blake2b.new output_size
bm.report "blake2b reset per iter #{size}" do
d.reset
d.update bufs[i]
d.digest
end
d = Cox::Blake2b.new output_size
d = Cox::Digest::Blake2b.new output_size
dst = Bytes.new d.digest_size
bm.report "blake2b reset reusing buffer per iter #{size}" do
d.reset

View File

@ -23,10 +23,10 @@ test_vectors = [
},
]
describe Cox::Blake2b do
describe Cox::Digest::Blake2b do
it "libsodium comparisons" do
libsodium_comparisons.each do |vec|
d = Cox::Blake2b.new vec[:out_size], key: vec[:key].try(&.hexbytes)
d = Cox::Digest::Blake2b.new vec[:out_size], key: vec[:key].try(&.hexbytes)
d.update vec[:input].hexbytes
d.hexdigest.should eq vec[:output]
end
@ -34,31 +34,31 @@ describe Cox::Blake2b do
it "test vectors" do
test_vectors.each do |vec|
d = Cox::Blake2b.new 64, key: vec[:key].hexbytes
d = Cox::Digest::Blake2b.new 64, key: vec[:key].hexbytes
d.update vec[:input].hexbytes
d.hexdigest.should eq vec[:output]
end
end
it "produces different output with different salt or personal params" do
key = Bytes.new Cox::Blake2b::KEY_SIZE
salt = Bytes.new Cox::Blake2b::SALT_SIZE
salt2 = Bytes.new Cox::Blake2b::SALT_SIZE
key = Bytes.new Cox::Digest::Blake2b::KEY_SIZE
salt = Bytes.new Cox::Digest::Blake2b::SALT_SIZE
salt2 = Bytes.new Cox::Digest::Blake2b::SALT_SIZE
salt2 = salt.dup
salt2[0] = 1
personal = Bytes.new Cox::Blake2b::PERSONAL_SIZE
personal = Bytes.new Cox::Digest::Blake2b::PERSONAL_SIZE
personal2 = personal.dup
personal2[0] = 1
d = Cox::Blake2b.new key: key, salt: salt, personal: personal
d = Cox::Digest::Blake2b.new key: key, salt: salt, personal: personal
d.update "foo".to_slice
output = d.hexdigest
d = Cox::Blake2b.new key: key, salt: salt2, personal: personal
d = Cox::Digest::Blake2b.new key: key, salt: salt2, personal: personal
d.update "foo".to_slice
saltout = d.hexdigest
d = Cox::Blake2b.new key: key, salt: salt, personal: personal2
d = Cox::Digest::Blake2b.new key: key, salt: salt, personal: personal2
d.update "foo".to_slice
personalout = d.hexdigest
@ -69,19 +69,19 @@ describe Cox::Blake2b do
it "raises on invalid " do
expect_raises ArgumentError do
Cox::Blake2b.new key: Bytes.new(128)
Cox::Digest::Blake2b.new key: Bytes.new(128)
end
expect_raises ArgumentError do
Cox::Blake2b.new salt: Bytes.new(1)
Cox::Digest::Blake2b.new salt: Bytes.new(1)
end
expect_raises ArgumentError do
Cox::Blake2b.new salt: Bytes.new(128)
Cox::Digest::Blake2b.new salt: Bytes.new(128)
end
expect_raises ArgumentError do
Cox::Blake2b.new personal: Bytes.new(128)
Cox::Digest::Blake2b.new personal: Bytes.new(128)
end
end
end

View File

@ -1,6 +1,6 @@
require "openssl/digest/digest_base"
module Cox
module Cox::Digest
class Blake2b
# provides copying digest/hexdigest methods
include OpenSSL::DigestBase