Erlang/OTP 22.0 がリリースされました。その中で crypto モジュールが全く別 API になっているので、メモがてら適当に書いていきます。
crypto モジュールは block か stream で encrypt と decrypt があるという形式でしたが、これがガラッと変わりました。encrypt か decrypt かは flag 指定になり、block か stream かも意識する必要がなくなりました。
AES-GCM と AES-CTR の例で説明していきます。ChaCha20-Poly1305 はほぼ AES-GCM と同じということもあり省略します。
AES-GCM
今をときめく AEAD はそれ専用の関数が用意されました。
crypto:crypto_one_time_aead/6,7 です。
crypto:crypto_one_time_aead(aes_128_gcm, Key, Iv, PlainText, Aad, true).
特に難しいことはありませんが、暗号の指定が変わっています。
aes_gcm が aes_128_gcm や aes_256_gcm と鍵の長さを含んだ名前になっています。
また encrypt/decrypt は最後の EncryptFlag で切り替えます。true なら暗号化、false なら復号という感じです。
/7 は最後に Tag か TagLength が指定できます。このあたりは {Aad, PlainText, Tag} みたいに指定していた部分ですね。
AES-CTR
AES-CTR はまず最初に状態を作るというのがあるのですが、それが飛ばして一発でも作れるようになっています。
crypto:crypto_one_time(aes_128_ctr, Key, Iv, PlainText, true).
こちらも暗号の指定が鍵の長さを含んだ形になっていますので、注意してください。
それ以外は AES-GCM のときと一緒です。AEAD ではないので AAD がありません。
移行すべきか
すぐに移行すべきです。古い API を使うメリットは一切ありません。