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 の有効化

Android 11 以降

Android 11 以降を搭載してリリースされるデバイスの場合は、デバイスのカーネル構成で次の設定を有効にします。

CONFIG_CRYPTO_ADIANTUM=y
CONFIG_FS_ENCRYPTION=y
CONFIG_BLK_INLINE_ENCRYPTION=y
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
CONFIG_DM_DEFAULT_KEY=y

デバイスに 32 ビット ARM カーネルが搭載されている場合は、パフォーマンスを向上させるために NEON 命令も有効にしてください。

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

Android 9 と 10

Android 9 または 10 を搭載したデバイスの場合は、カーネル構成をわずかに変える必要があります。次の設定を有効にします。

CONFIG_CRYPTO_ADIANTUM=y
CONFIG_DM_CRYPT=y

デバイスでファイルベースの暗号化を使用している場合は、次の設定も有効にします。

CONFIG_F2FS_FS_ENCRYPTION=y

最後に、デバイスに 32 ビット ARM カーネルが搭載されている場合は、パフォーマンスを向上させるために NEON 命令を有効にします。

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

ユーザー空間の変更

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

Android 9 を搭載するデバイスの場合は、以下の変更をチェリーピックしてください。

デバイスでの Adiantum の有効化

まず、デバイス リリース時の Android バージョンに合わせて PRODUCT_SHIPPING_API_LEVEL が正しく設定されていることを確認します。たとえば Android 11 を搭載してリリースされるデバイスでは、PRODUCT_SHIPPING_API_LEVEL := 30 にする必要があります。一部の暗号化設定ではリリース バージョンごとにデフォルトの設定が異なるため、これは重要です。

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

デバイスの内部ストレージで Adiantum のファイルベースの暗号化を有効にするには、デバイスの fstab ファイルで、userdata パーティションの行の最終列(fs_mgr_flags 列)に次のオプションを追加します。

fileencryption=adiantum

Android 11 以降を搭載してリリースされるデバイスの場合は、メタデータの暗号化を有効にする必要もあります。内部ストレージのメタデータ暗号化に Adiantum を使用するには、userdatafs_mgr_flags に次のオプションが含まれている必要もあります。

metadata_encryption=adiantum,keydirectory=/metadata/vold/metadata_encryption

次に、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

最後に、オプションとして、blk-crypto-fallback.num_keyslots=1 をカーネルのコマンドラインに追加します。これにより、Adiantum のメタデータ暗号化が使用されている場合、メモリ使用量がわずかに削減されます。その前に、fstabinlinecrypt マウント オプションが指定されていないことを確認します。指定されている場合、Adiantum 暗号化には不要であり、blk-crypto-fallback.num_keyslots=1 と併用するとパフォーマンスの問題が発生するため、削除します。

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

adb root
adb shell dmesg

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

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

メタデータ暗号化を有効にしている場合は、次のコマンドも実行して、Adiantum のメタデータ暗号化が正しく有効になっていることを確認します。

adb root
adb shell dmctl table userdata

出力の 3 番目のフィールドは xchacha12,aes-adiantum-plain64 になります。

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

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

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

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

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

forceencrypt=footer

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

adb root
adb shell dmesg

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

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