diff options
author | Andreas Schultz <[email protected]> | 2014-06-16 18:46:09 +0200 |
---|---|---|
committer | Andreas Schultz <[email protected]> | 2014-09-03 15:26:00 +0200 |
commit | fb9d36c2c7c1bd4760d0be2801b9c2852d3502bf (patch) | |
tree | 62326d163e0ecc152efe39f1ad1aaff15d592e71 /lib/crypto/src | |
parent | d1dcc88aa5b1c749034570eb7c86db7c58d652f9 (diff) | |
download | otp-fb9d36c2c7c1bd4760d0be2801b9c2852d3502bf.tar.gz otp-fb9d36c2c7c1bd4760d0be2801b9c2852d3502bf.tar.bz2 otp-fb9d36c2c7c1bd4760d0be2801b9c2852d3502bf.zip |
crypto: add support for ChaCha20/Policy1305 AEAD cipher
Diffstat (limited to 'lib/crypto/src')
-rw-r--r-- | lib/crypto/src/crypto.erl | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl index e4ec4f4d19..7f82fa83fd 100644 --- a/lib/crypto/src/crypto.erl +++ b/lib/crypto/src/crypto.erl @@ -283,7 +283,7 @@ hmac_final_n(_Context, _HashLen) -> ? nif_stub. -spec block_encrypt(des_cbc | des_cfb | des3_cbc | des3_cbf | des_ede3 | blowfish_cbc | blowfish_cfb64 | aes_cbc128 | aes_cfb8 | aes_cfb128 | aes_cbc256 | rc2_cbc, Key::iodata(), Ivec::binary(), Data::iodata()) -> binary(); - (aes_gcm, Key::iodata(), Ivec::binary(), {AAD::binary(), Data::iodata()}) -> {binary(), binary()}. + (aes_gcm | chacha20_poly1305, Key::iodata(), Ivec::binary(), {AAD::binary(), Data::iodata()}) -> {binary(), binary()}. block_encrypt(des_cbc, Key, Ivec, Data) -> des_cbc_encrypt(Key, Ivec, Data); @@ -316,6 +316,11 @@ block_encrypt(aes_gcm, Key, Ivec, {AAD, Data}) -> notsup -> erlang:error(notsup); Return -> Return end; +block_encrypt(chacha20_poly1305, Key, Ivec, {AAD, Data}) -> + case chacha20_poly1305_encrypt(Key, Ivec, AAD, Data) of + notsup -> erlang:error(notsup); + Return -> Return + end; block_encrypt(rc2_cbc, Key, Ivec, Data) -> rc2_cbc_encrypt(Key, Ivec, Data). @@ -323,7 +328,7 @@ block_encrypt(rc2_cbc, Key, Ivec, Data) -> blowfish_cfb64 | blowfish_ofb64 | aes_cbc128 | aes_cbc256 | aes_ige256 | aes_cfb8 | aes_cfb128 | rc2_cbc, Key::iodata(), Ivec::binary(), Data::iodata()) -> binary(); - (aes_gcm, Key::iodata(), Ivec::binary(), + (aes_gcm | chacha20_poly1305, Key::iodata(), Ivec::binary(), {AAD::binary(), Data::iodata(), Tag::binary()}) -> binary() | error. block_decrypt(des_cbc, Key, Ivec, Data) -> des_cbc_decrypt(Key, Ivec, Data); @@ -356,6 +361,11 @@ block_decrypt(aes_gcm, Key, Ivec, {AAD, Data, Tag}) -> notsup -> erlang:error(notsup); Return -> Return end; +block_decrypt(chacha20_poly1305, Key, Ivec, {AAD, Data, Tag}) -> + case chacha20_poly1305_decrypt(Key, Ivec, AAD, Data, Tag) of + notsup -> erlang:error(notsup); + Return -> Return + end; block_decrypt(rc2_cbc, Key, Ivec, Data) -> rc2_cbc_decrypt(Key, Ivec, Data). -spec block_encrypt(des_ecb | blowfish_ecb, Key::iodata(), Data::iodata()) -> binary(). @@ -1208,6 +1218,12 @@ aes_gcm_encrypt(_Key, _Ivec, _AAD, _In) -> ?nif_stub. aes_gcm_decrypt(_Key, _Ivec, _AAD, _In, _Tag) -> ?nif_stub. %% +%% Chacha20/Ppoly1305 +%% +chacha20_poly1305_encrypt(_Key, _Ivec, _AAD, _In) -> ?nif_stub. +chacha20_poly1305_decrypt(_Key, _Ivec, _AAD, _In, _Tag) -> ?nif_stub. + +%% %% DES - in cipher block chaining mode (CBC) %% -spec des_cbc_encrypt(iodata(), binary(), iodata()) -> binary(). |