acorn128 NIF
Implementation of ACORN, second choice for use case 1 (Lightweight applications; resource constrained environments) from the CAESAR competition final portfolio.
See “ACORN: A Lightweight Authenticated Cipher (v3)” by Hongjun Wu for more information.
Installation
Add acorn128 to your project's dependencies in mix.exs
defp deps do
[
{:acorn128, "~> 0.0.1"}
]
end
Add acorn128 to your project's dependencies in your Makefile for erlang.mk or the following to your rebar.config
{deps, [
{acorn128, ".*", {git, "git://github.com/potatosalad/erlang-acorn128.git", {branch, "master"}}}
]}.Usage
Simple API
Erlang
%% Encryption
Key = crypto:strong_rand_bytes(16), % Key = <<33,126,75,53,220,99,55,188,229,97,154,128,147,91,14,249>>.
IV = crypto:strong_rand_bytes(16), % IV = <<60,52,165,219,131,60,192,154,183,168,77,231,240,130,245,118>>.
PlainText = <<"hello, world">>,
AAD = <<"test">>,
{CipherText, CipherTag} = acorn128:encrypt(Key, IV, PlainText, AAD).
% CipherText = <<3,105,56,55,26,140,36,60,63,214,228,107>>.
% CipherTag = <<28,8,46,253,158,35,196,249,12,174,189,248,160,215,189,10>>.
%% Decryption
PlainText = acorn128:decrypt(Key, IV, CipherText, AAD, CipherTag).
% PlainText = <<"hello, world">>.Elixir
## Encryption
key = :crypto.strong_rand_bytes(16) # key = <<33,126,75,53,220,99,55,188,229,97,154,128,147,91,14,249>>
iv = :crypto.strong_rand_bytes(16) # iv = <<60,52,165,219,131,60,192,154,183,168,77,231,240,130,245,118>>
plaintext = "hello, world"
aad = "test"
{ciphertext, ciphertag} = :acorn128.encrypt(key, iv, plaintext, aad)
# ciphertext = <<3,105,56,55,26,140,36,60,63,214,228,107>>
# ciphertag = <<28,8,46,253,158,35,196,249,12,174,189,248,160,215,189,10>>
## Decryption
^plaintext = :acorn128.decrypt(key, iv, ciphertext, aad, ciphertag)
# plaintext = "hello, world"New Crypto API
Erlang
%% Encryption
Key = crypto:strong_rand_bytes(16), % Key = <<33,126,75,53,220,99,55,188,229,97,154,128,147,91,14,249>>.
IV = crypto:strong_rand_bytes(16), % IV = <<60,52,165,219,131,60,192,154,183,168,77,231,240,130,245,118>>.
PlainText = <<"hello, world">>,
AAD = <<"test">>,
{CipherText, CipherTag} = acorn128:crypto_one_time_aead(acorn128v3, Key, IV, PlainText, AAD, true).
% CipherText = <<3,105,56,55,26,140,36,60,63,214,228,107>>.
% CipherTag = <<28,8,46,253,158,35,196,249,12,174,189,248,160,215,189,10>>.
%% Decryption
PlainText = acorn128:crypto_one_time_aead(acorn128v3, Key, IV, CipherText, AAD, CipherTag, false).
% PlainText = <<"hello, world">>.Elixir
## Encryption
key = :crypto.strong_rand_bytes(16) # key = <<33,126,75,53,220,99,55,188,229,97,154,128,147,91,14,249>>
iv = :crypto.strong_rand_bytes(16) # iv = <<60,52,165,219,131,60,192,154,183,168,77,231,240,130,245,118>>
plaintext = "hello, world"
aad = "test"
{ciphertext, ciphertag} = :acorn128.crypto_one_time_aead(:acorn128v3, key, iv, plaintext, aad, true)
# ciphertext = <<3,105,56,55,26,140,36,60,63,214,228,107>>
# ciphertag = <<28,8,46,253,158,35,196,249,12,174,189,248,160,215,189,10>>
## Decryption
^plaintext = :acorn128.crypto_one_time_aead(:acorn128v3, key, iv, ciphertext, aad, ciphertag, false)
# plaintext = "hello, world"SUPERCOP API
Erlang
%% Encryption
K = crypto:strong_rand_bytes(16), % K = <<33,126,75,53,220,99,55,188,229,97,154,128,147,91,14,249>>.
NPub = crypto:strong_rand_bytes(16), % NPub = <<60,52,165,219,131,60,192,154,183,168,77,231,240,130,245,118>>.
M = <<"hello, world">>,
AD = <<"test">>,
C = acorn128:crypto_aead_encrypt(M, AD, NPub, K).
% C = <<3,105,56,55,26,140,36,60,63,214,228,107,28,8,46,253,158,35,196,249,12,174,189,248,160,215,189,10>>.
%% Decryption
M = acorn128:crypto_aead_decrypt(C, AD, NPub, K).
% M = <<"hello, world">>.Elixir
## Encryption
k = :crypto.strong_rand_bytes(16) # k = <<33,126,75,53,220,99,55,188,229,97,154,128,147,91,14,249>>
npub = :crypto.strong_rand_bytes(16) # npub = <<60,52,165,219,131,60,192,154,183,168,77,231,240,130,245,118>>
m = "hello, world"
ad = "test"
c = :acorn128.crypto_aead_encrypt(m, ad, npub, k)
# c = <<3,105,56,55,26,140,36,60,63,214,228,107,28,8,46,253,158,35,196,249,12,174,189,248,160,215,189,10>>
## Decryption
^m = :acorn128.crypto_aead_decrypt(c, ad, npub, k)
# m = "hello, world"