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 を搭載するデバイスの場合は、以下の変更をチェリーピックしてください。
- cryptfs: Adiantum のサポートを追加する
- cryptfs: dm-crypt セクターのサイズの設定を許可する
- cryptfs: dm-crypt デバイスのサイズを crypto セクター境界に合わせて切り捨てる
- cryptfs: dm-crypt デバイスの作成のログを改善する
- libfscrypt: Adiantum のサポートを追加する
- fs_mgr_fstab: Adiantum のサポートを追加する
デバイスでの Adiantum の有効化
まず、デバイス リリース時の Android バージョンに合わせて PRODUCT_SHIPPING_API_LEVEL
が正しく設定されていることを確認します。たとえば Android 11 を搭載してリリースされるデバイスでは、PRODUCT_SHIPPING_API_LEVEL := 30
にする必要があります。一部の暗号化設定ではリリース バージョンごとにデフォルトの設定が異なるため、これは重要です。
ファイルベースの暗号化を使用するデバイス
デバイスの内部ストレージで Adiantum のファイルベースの暗号化を有効にするには、デバイスの fstab
ファイルで、userdata
パーティションの行の最終列(fs_mgr_flags 列)に次のオプションを追加します。
fileencryption=adiantum
Android 11 以降を搭載してリリースされるデバイスの場合は、メタデータの暗号化を有効にする必要もあります。内部ストレージのメタデータ暗号化に Adiantum を使用するには、userdata
の fs_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 のメタデータ暗号化が使用されている場合、メモリ使用量がわずかに削減されます。その前に、fstab
で inlinecrypt
マウント オプションが指定されていないことを確認します。指定されている場合、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)"