Adiantum の有効化

Adiantum とは、AES 命令を搭載しない CPU を持つ、Android 9 以降を実行するデバイス向けに設計された暗号化手法です。ARMv8 暗号拡張機能を搭載した ARM ベースのデバイスまたは AES-NI を搭載した x86 ベースのデバイスには、Adiantum を使用しないでください。これらのプラットフォームでは AES のほうが高速です。

AES CPU 命令がないデバイスの場合、Adiantum によってごくわずかなパフォーマンス オーバーヘッドで暗号化が可能です。ベンチマークの数値については、Adiantum に関する論文をご覧ください。ハードウェアで実行するベンチマーク ソースについては、GitHub の Adiantum ソースをご覧ください。

Android 9 以降を搭載したデバイスで Adiantum を有効にするには、カーネルとユーザー空間を変更する必要があります。

カーネルの変更

Adiantum は、Android 共通カーネルのバージョン 4.9 以降でサポートされています。

デバイスのカーネルが Adiantum をまだサポートしていない場合は、下記の変更を cherry-pick します。cherry-pick できない場合、フルディスク暗号化(FDE)を使用しているデバイスでは fscrypt: パッチを除外してください。

カーネル バージョン crypto および fscrypt パッチ dm-crypt パッチ
4.19 4.19 カーネル dm-crypt パッチ
4.14 4.14 カーネル dm-crypt パッチ
4.9 4.9 カーネル dm-crypt パッチ

カーネルでの Adiantum の有効化

カーネルの変更を統合したら、次の行を追加してカーネルの設定を変更します。

CONFIG_CRYPTO_ADIANTUM=y
CONFIG_DM_CRYPT=y

デバイスでファイルベースの暗号化(FBE)とカーネル バージョン 5.1 以降を使用する場合は、次の行も追加します。

CONFIG_FS_ENCRYPTION=y

デバイスでファイルベースの暗号化(FBE)とカーネル バージョン 5.0 以前を使用する場合は、次の行も追加します。

CONFIG_F2FS_FS_ENCRYPTION=y

32 ビット ARM カーネルで優れたパフォーマンスを確保するには、カーネルで NEON 命令を有効にします。

CONFIG_CRYPTO_AES_ARM=y
CONFIG_CRYPTO_CHACHA20_NEON=y
CONFIG_CRYPTO_NHPOLY1305_NEON=y
CONFIG_KERNEL_MODE_NEON=y

ユーザー空間の変更

Android 10 以上を搭載するデバイスの場合、Adiantum ユーザー空間の変更はすでに存在します。

Android 9 を搭載するデバイスの場合は、以下の変更を cherry-pick してください。

デバイスでの Adiantum の有効化

ファイルベースの暗号化を使用するデバイス

デバイスの内部ストレージで Adiantum FBE を有効にするには、デバイスの fstab にある userdata パーティションに適した fileencryption オプションを設定します。

fileencryption=adiantum

次に、デバイスが Adoptable Storage をサポートしている場合は、Adoptable Storage でも Adiantum 暗号化を有効にします。そのためには、PRODUCT_PROPERTY_OVERRIDES で次のプロパティを設定します。

Android 11 以降の場合:

ro.crypto.volume.options=adiantum
ro.crypto.volume.metadata.encryption=adiantum

Android 9 および 10 の場合:

ro.crypto.volume.contents_mode=adiantum
ro.crypto.volume.filenames_mode=adiantum
ro.crypto.fde_algorithm=adiantum
ro.crypto.fde_sector_size=4096

実装が機能していることを確認するには、バグレポートを取得するか、次のコマンドを実行します。

adb root
adb shell dmesg

Adiantum が正しく有効になっている場合、カーネルログに次のように表示されます。

fscrypt: Adiantum using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"

Android 11 以降は、内部ストレージのメタデータ暗号化にも Adiantum を使用できるようになっています。詳細については、メタデータ暗号化をご覧ください。

フルディスク暗号化を使用するデバイス

Adiantum を有効にしてパフォーマンスを改善するには、PRODUCT_PROPERTY_OVERRIDES に次のプロパティを設定します。

ro.crypto.fde_algorithm=adiantum
ro.crypto.fde_sector_size=4096

fde_sector_size を 4096 に設定するとパフォーマンスが向上しますが、必須ではありません。この設定を使用するには、ユーザーデータ パーティションがディスク上の 4096 バイトで揃えたオフセットで開始する必要があります。

fstab で、ユーザーデータに以下を設定します。

forceencrypt

実装が機能していることを確認するには、バグレポートを取得するか、次のコマンドを実行します。

adb root
adb shell dmesg

Adiantum が正しく有効になっている場合、カーネルログに次のように表示されます。

device-mapper: crypt: adiantum(xchacha12,aes) using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"