Erlang/OTP 22.0 の crypto モジュールの新しい API

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 を使うメリットは一切ありません。

Written by

Erlang/OTP / 時雨堂 / WebRTC / E2EE

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store