Adiantum の有効化

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

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

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

カーネルの変更

Adiantum を選択すると、カーネルが変更されて追加の dm-crypt パッチが適用されます。選択できない場合、フルディスク暗号化(FDE)を使用しているデバイスでは「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
    

デバイスで 4.4 カーネルを使用している場合は、以下の行も追加します。

CONFIG_CRYPTO_SEQIV=y
    

デバイスでファイルベースの暗号化(FBE)を使用する場合は、次の行も追加します。

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 9 搭載デバイスの場合は、AOSP の pie-platform-release ブランチで userspace_adiantum_support_pie トピックの Adiantum ユーザー空間の変更を選択します。

これらの変更は、AOSP の master ブランチにもあります。

デバイスでの Adiantum の有効化

これらは、デバイスのユーザーデータと Adoptable Storage 向けの設定です。

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

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

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

fde_sector_size を 4096 に設定するとパフォーマンスが向上しますが、Adiantum の動作には必要ありません。

fstab で、ユーザーデータに次のオプションを使用します。

fileencryption=adiantum
    

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

    adb root
    adb shell dmesg
    

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

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

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

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

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

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

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

forceencrypt
    

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

    adb root
    adb shell dmesg
    

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

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