Le chiffrement de disque complet consiste à encoder toutes les données utilisateur sur un appareil Android à l'aide d'une clé chiffrée. Une fois un appareil chiffré, toutes les données créées par l'utilisateur sont automatiquement chiffrées avant d'être écrites sur le disque, et toutes les lectures déchiffrent automatiquement les données avant de les renvoyer au processus appelant.
Le chiffrement de disque a été introduit dans Android 4.4, mais Android 5.0 a introduit ces nouvelles fonctionnalités:
- Création d'un chiffrement rapide, qui ne chiffre que les blocs utilisés sur la partition de données pour éviter que le premier démarrage ne prenne beaucoup de temps. Seuls les systèmes de fichiers ext4 et f2fs sont actuellement compatibles avec le chiffrement rapide.
- Ajout de l'indicateur fstab
forceencrypt
pour le chiffrement au premier démarrage. - Ajout de la compatibilité avec les schémas et le chiffrement sans mot de passe.
- Ajout d'un stockage basé sur le matériel de la clé de chiffrement à l'aide de la fonctionnalité de signature de l'environnement d'exécution sécurisé (TEE) (par exemple, dans une TrustZone). Pour en savoir plus, consultez la section Stocker la clé chiffrée.
Attention:Les appareils mis à niveau vers Android 5.0, puis chiffrés, peuvent être rétablis dans un état non chiffré en rétablissant la configuration d'usine. Les nouveaux appareils Android 5.0 chiffrés au premier démarrage ne peuvent pas être rétablis dans un état non chiffré.
Fonctionnement du chiffrement complet de disque Android
Le chiffrement de disque complet Android est basé sur dm-crypt
, une fonctionnalité du noyau qui fonctionne au niveau de la couche de périphérique de bloc. Par conséquent, le chiffrement fonctionne avec les cartes Embedded MultiMediaCard (eMMC) et les périphériques flash similaires qui se présentent au noyau en tant qu'appareils de bloc. Le chiffrement n'est pas possible avec YAFFS, qui communique directement avec une puce flash NAND brute.
L'algorithme de chiffrement est AES (Advanced Encryption Standard) 128 bits avec CBC (Cipher Block Chaining) et ESSIV:SHA256. La clé principale est chiffrée avec AES 128 bits via des appels à la bibliothèque OpenSSL. Vous devez utiliser au moins 128 bits pour la clé (256 bits étant facultatif).
Remarque:Les OEM peuvent utiliser 128 bits ou plus pour chiffrer la clé principale.
Dans la version Android 5.0, il existe quatre types d'états de chiffrement:
- par défaut
- Code
- mot de passe
- schéma
Lors du premier démarrage, l'appareil crée une clé principale de 128 bits générée de manière aléatoire, puis la hache avec un mot de passe par défaut et un sel stocké. Le mot de passe par défaut est "default_password". Toutefois, le hachage obtenu est également signé via un TEE (tel que TrustZone), qui utilise un hachage de la signature pour chiffrer la clé principale.
Vous trouverez le mot de passe par défaut défini dans le fichier cryptfs.cpp du projet Open Source Android.
Lorsque l'utilisateur définit le code PIN/la carte ou le mot de passe sur l'appareil, seule la clé de 128 bits est re-chiffrée et stockée. (c'est-à-dire que les modifications du code/mot de passe/schéma de l'utilisateur ne provoquent PAS de nouveau chiffrement des données utilisateur.) Notez que les appareils gérés peuvent être soumis à des restrictions de code, de schéma ou de mot de passe.
Le chiffrement est géré par init
et vold
.
init
appelle vold
, et vold définit des propriétés pour déclencher des événements dans init. D'autres parties du système examinent également les propriétés pour effectuer des tâches telles que l'état des rapports, la demande d'un mot de passe ou l'invite de réinitialisation d'usine en cas d'erreur fatale. Pour appeler les fonctionnalités de chiffrement dans vold
, le système utilise les commandes cryptfs
de l'outil de ligne de commande vdc
: checkpw
, restart
, enablecrypto
, changepw
, cryptocomplete
, verifypw
, setfield
, getfield
, mountdefaultencrypted
, getpwtype
, getpw
et clearpw
.
Pour chiffrer, déchiffrer ou effacer /data
, /data
ne doit pas être installé. Toutefois, pour afficher une interface utilisateur (UI), le framework doit démarrer et nécessite /data
pour s'exécuter. Pour résoudre ce casse-tête, un système de fichiers temporaire est installé sur /data
.
Cela permet à Android d'inviter à saisir des mots de passe, d'afficher la progression ou de suggérer une suppression des données si nécessaire. Il impose toutefois la limitation suivante : pour passer du système de fichiers temporaire au système de fichiers /data
réel, le système doit arrêter tous les processus avec des fichiers ouverts sur le système de fichiers temporaire et redémarrer ces processus sur le système de fichiers /data
réel. Pour ce faire, tous les services doivent appartenir à l'un des trois groupes suivants: core
, main
et late_start
.
core
: ne s'arrête jamais après le démarrage.main
: arrêtez, puis redémarrez l'ordinateur après avoir saisi le mot de passe du disque.late_start
: ne démarre qu'après le déchiffrement et le montage de/data
.
Pour déclencher ces actions, la propriété vold.decrypt
est définie sur diverses chaînes.
Pour arrêter et redémarrer des services, les commandes init
sont les suivantes:
class_reset
: arrête un service, mais permet de le redémarrer avec class_start.class_start
: redémarre un service.class_stop
: arrête un service et ajoute un indicateurSVC_DISABLED
. Les services arrêtés ne répondent pas àclass_start
.
Flux
Il existe quatre flux pour un appareil chiffré. Un appareil n'est chiffré qu'une seule fois, puis suit un flux de démarrage normal.
- Chiffrer un appareil qui n'était pas chiffré :
- Chiffrer un nouvel appareil avec
forceencrypt
: chiffrement obligatoire au premier démarrage (à partir d'Android L). - Chiffrer un appareil existant: chiffrement déclenché par l'utilisateur (Android K et versions antérieures).
- Chiffrer un nouvel appareil avec
- Démarrer un appareil chiffré :
- Démarrer un appareil chiffré sans mot de passe: démarrer un appareil chiffré sans mot de passe défini (applicable aux appareils équipés d'Android 5.0 ou version ultérieure).
- Démarrage d'un appareil chiffré avec un mot de passe: démarrage d'un appareil chiffré pour lequel un mot de passe est défini.
En plus de ces flux, l'appareil peut également ne pas réussir à chiffrer /data
.
Chacun de ces flux est expliqué en détail ci-dessous.
Chiffrer un nouvel appareil avec forceencrypt
Il s'agit du premier démarrage normal d'un appareil Android 5.0.
- Détecter un système de fichiers non chiffré avec l'indicateur
forceencrypt
/data
n'est pas chiffré, mais il doit l'être, carforceencrypt
l'exige. Désinstallez/data
. - Démarrer le chiffrement de
/data
vold.decrypt = "trigger_encryption"
déclencheinit.rc
, ce qui entraîne le chiffrement de/data
parvold
sans mot de passe. (Aucune valeur n'est définie, car il s'agit d'un nouvel appareil.) - Monter des tmpfs
vold
monte un/data
tmpfs (à l'aide des options tmpfs dero.crypto.tmpfs_options
) et définit la propriétévold.encrypt_progress
sur 0.vold
prépare les tmpfs/data
pour le démarrage d'un système chiffré et définit la propriétévold.decrypt
sur:trigger_restart_min_framework
- Afficher le framework pour afficher la progression
Étant donné que l'appareil n'a pratiquement aucune donnée à chiffrer, la barre de progression n'apparaîtra pas souvent, car le chiffrement est très rapide. Pour en savoir plus sur l'UI de progression, consultez la section Chiffrer un appareil existant.
- Lorsque
/data
est chiffré, supprimez le framework.vold
définitvold.decrypt
surtrigger_default_encryption
, ce qui démarre le servicedefaultcrypto
. (Cela lance le flux ci-dessous pour monter un userdata chiffré par défaut.)trigger_default_encryption
vérifie le type de chiffrement pour voir si/data
est chiffré avec ou sans mot de passe. Étant donné que les appareils Android 5.0 sont chiffrés au premier démarrage, aucun mot de passe ne doit être défini. Nous déchiffrerons donc et monterons/data
. - Monter
/data
init
installe ensuite/data
sur un disque RAM tmpfs à l'aide des paramètres qu'il récupère à partir dero.crypto.tmpfs_options
, qui est défini dansinit.rc
. - Framework de démarrage
vold
définitvold.decrypt
surtrigger_restart_framework
, ce qui poursuit le processus de démarrage habituel.
Chiffrer un appareil existant
C'est ce qui se produit lorsque vous chiffrez un appareil Android K non chiffré ou antérieur qui a été migré vers L.
Ce processus est lancé par l'utilisateur et est appelé "chiffrement en place" dans le code. Lorsqu'un utilisateur choisit de chiffrer un appareil, l'interface utilisateur s'assure que la batterie est complètement chargée et que l'adaptateur secteur est branché afin qu'il y ait suffisamment d'énergie pour terminer le processus de chiffrement.
Avertissement:Si l'appareil est à court de batterie et s'arrête avant la fin du chiffrement, les données de fichier restent partiellement chiffrées. L'appareil doit être rétabli à ses paramètres d'usine, et toutes les données sont perdues.
Pour activer le chiffrement en place, vold
lance une boucle pour lire chaque secteur de l'appareil de bloc réel, puis l'écrire sur l'appareil de bloc cryptographique. vold
vérifie si un secteur est utilisé avant de le lire et de l'écrire, ce qui accélère considérablement le chiffrement sur un nouvel appareil qui contient peu ou pas de données.
État de l'appareil: définissez ro.crypto.state = "unencrypted"
et exécutez le déclencheur on nonencrypted
init
pour continuer le démarrage.
- Vérifier le mot de passe
L'UI appelle
vold
avec la commandecryptfs enablecrypto inplace
, oùpasswd
correspond au mot de passe de l'écran de verrouillage de l'utilisateur. - Démanteler le framework
vold
recherche les erreurs, renvoie -1 s'il ne peut pas chiffrer et imprime une raison dans le journal. Si elle peut chiffrer, elle définit la propriétévold.decrypt
surtrigger_shutdown_framework
.init.rc
arrête alors les services des classeslate_start
etmain
. - Créer un pied de page de cryptographie
- Créer un fichier de fil d'Ariane
- Redémarrer
- Détecter le fichier de fil d'Ariane
- Démarrer le chiffrement de
/data
vold
configure ensuite le mappage cryptographique, qui crée un dispositif de bloc cryptographique virtuel qui se mappe sur le dispositif de bloc réel, mais qui chiffre chaque secteur au fur et à mesure de son écriture et déchiffre chaque secteur au fur et à mesure de sa lecture.vold
crée ensuite et écrit les métadonnées de chiffrement. - Monter des tmpfs pendant le chiffrement
vold
monte un/data
tmpfs (à l'aide des options tmpfs dero.crypto.tmpfs_options
) et définit la propriétévold.encrypt_progress
sur 0.vold
prépare les tmpfs/data
pour le démarrage d'un système chiffré et définit la propriétévold.decrypt
sur:trigger_restart_min_framework
- Afficher le framework pour afficher la progression
trigger_restart_min_framework
provoque le démarrage de la classe de servicesmain
parinit.rc
. Lorsque le framework voit quevold.encrypt_progress
est défini sur 0, il affiche l'UI de la barre de progression, qui interroge cette propriété toutes les cinq secondes et met à jour une barre de progression. La boucle de chiffrement met à jourvold.encrypt_progress
chaque fois qu'elle chiffre un autre pourcentage de la partition. - Lorsque
/data
est chiffré, mettez à jour le pied de page de chiffrementUne fois
/data
chiffré,vold
efface l'indicateurENCRYPTION_IN_PROGRESS
dans les métadonnées.Une fois l'appareil déverrouillé, le mot de passe est utilisé pour chiffrer la clé principale et le pied de page de chiffrement est mis à jour.
Si le redémarrage échoue pour une raison quelconque,
vold
définit la propriétévold.encrypt_progress
surerror_reboot_failed
et l'UI doit afficher un message demandant à l'utilisateur d'appuyer sur un bouton pour redémarrer. Cette situation ne devrait jamais se produire.
Démarrer un appareil chiffré avec le chiffrement par défaut
C'est ce qui se passe lorsque vous démarrez un appareil chiffré sans mot de passe. Étant donné que les appareils Android 5.0 sont chiffrés au premier démarrage, aucun mot de passe ne doit être défini. Il s'agit donc de l'état de chiffrement par défaut.
- Détecter des
/data
chiffrés sans mot de passeDétecter que l'appareil Android est chiffré, car
/data
ne peut pas être installé et que l'un des indicateursencryptable
ouforceencrypt
est défini.vold
définitvold.decrypt
surtrigger_default_encryption
, ce qui démarre le servicedefaultcrypto
.trigger_default_encryption
vérifie le type de chiffrement pour voir si/data
est chiffré avec ou sans mot de passe. - Déchiffrer /data
Crée l'appareil
dm-crypt
sur l'appareil de blocage afin qu'il soit prêt à l'emploi. - Installer /data
vold
monte ensuite la partition/data
réelle déchiffrée, puis prépare la nouvelle partition. Il définit la propriétévold.post_fs_data_done
sur 0, puisvold.decrypt
surtrigger_post_fs_data
.init.rc
exécute alors ses commandespost-fs-data
. Ils créent les répertoires ou liens nécessaires, puis définissentvold.post_fs_data_done
sur 1.Une fois que
vold
voit le chiffre 1 dans cette propriété, il définit la propriétévold.decrypt
sur:trigger_restart_framework.
.init.rc
redémarre alors les services de la classemain
et démarre également les services de la classelate_start
pour la première fois depuis le démarrage. - Framework de démarrage
Le framework démarre maintenant tous ses services à l'aide de
/data
déchiffré, et le système est prêt à l'emploi.
Démarrer un appareil chiffré sans chiffrement par défaut
C'est ce qui se passe lorsque vous démarrez un appareil chiffré sur lequel un mot de passe est défini. Le mot de passe de l'appareil peut être un code, un schéma ou un mot de passe.
- Détecter un appareil chiffré avec un mot de passe
Détecter que l'appareil Android est chiffré, car l'indicateur
ro.crypto.state = "encrypted"
vold
définitvold.decrypt
surtrigger_restart_min_framework
, car/data
est chiffré avec un mot de passe. - Monter des tmpfs
init
définit cinq propriétés pour enregistrer les options d'installation initiales données pour/data
avec les paramètres transmis à partir deinit.rc
.vold
utilise les propriétés suivantes pour configurer le mappage de cryptographie:ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(nombre hexadécimal ASCII à 8 chiffres précédé de 0x)
- Démarrer le framework pour demander un mot de passe
Le framework démarre et constate que
vold.decrypt
est défini surtrigger_restart_min_framework
. Cela indique au framework qu'il démarre sur un disque/data
tmpfs et qu'il doit obtenir le mot de passe de l'utilisateur.Toutefois, il doit d'abord s'assurer que le disque a été correctement chiffré. Il envoie la commande
cryptfs cryptocomplete
àvold
.vold
renvoie 0 si le chiffrement a réussi, -1 en cas d'erreur interne ou -2 si le chiffrement a échoué.vold
détermine cela en recherchant l'indicateurCRYPTO_ENCRYPTION_IN_PROGRESS
dans les métadonnées de cryptographie. Si cette valeur est définie, le processus de chiffrement a été interrompu et aucune donnée utilisable n'est disponible sur l'appareil. Sivold
renvoie une erreur, l'UI doit afficher un message invitant l'utilisateur à redémarrer et à rétablir la configuration d'usine de l'appareil, et lui fournir un bouton à appuyer pour ce faire. - Déchiffrer des données avec un mot de passe
Une fois
cryptfs cryptocomplete
réussi, le framework affiche une UI demandant le mot de passe du disque. L'UI vérifie le mot de passe en envoyant la commandecryptfs checkpw
àvold
. Si le mot de passe est correct (ce qui est déterminé en montant le/data
déchiffré à un emplacement temporaire, puis en le démontant),vold
enregistre le nom de l'appareil de bloc déchiffré dans la propriétéro.crypto.fs_crypto_blkdev
et renvoie l'état 0 à l'UI. Si le mot de passe est incorrect, -1 est renvoyé à l'UI. - Framework d'arrêt
L'UI affiche un graphique de démarrage cryptographique, puis appelle
vold
avec la commandecryptfs restart
.vold
définit la propriétévold.decrypt
surtrigger_reset_main
, ce qui entraîne l'exécution declass_reset main
parinit.rc
. Cela arrête tous les services de la classe principale, ce qui permet de démonter les/data
tmpfs. - Monter
/data
vold
monte ensuite la partition/data
réelle déchiffrée et prépare la nouvelle partition (qui n'aurait peut-être jamais été préparée si elle était chiffrée avec l'option d'effacement, qui n'est pas prise en charge lors de la première version). Il définit la propriétévold.post_fs_data_done
sur 0, puisvold.decrypt
surtrigger_post_fs_data
.init.rc
exécute alors ses commandespost-fs-data
. Ils créent les répertoires ou liens nécessaires, puis définissentvold.post_fs_data_done
sur 1. Lorsquevold
voit le chiffre 1 dans cette propriété, il définit la propriétévold.decrypt
surtrigger_restart_framework
.init.rc
redémarre alors les services de la classemain
et démarre également les services de la classelate_start
pour la première fois depuis le démarrage. - Démarrer le framework complet
Le framework démarre désormais tous ses services à l'aide du système de fichiers
/data
déchiffré, et le système est prêt à l'emploi.
Échec
Plusieurs raisons peuvent expliquer qu'un appareil ne parvienne pas à déchiffrer les données. L'appareil démarre avec la série d'étapes normale pour le démarrage:
- Détecter un appareil chiffré avec un mot de passe
- Monter des tmpfs
- Démarrer le framework pour demander un mot de passe
Toutefois, une fois le framework ouvert, l'appareil peut rencontrer des erreurs:
- Le mot de passe correspond, mais les données ne peuvent pas être déchiffrées
- L'utilisateur saisit un mot de passe incorrect 30 fois
Si ces erreurs ne sont pas résolues, invitez l'utilisateur à rétablir la configuration d'usine:
Si vold
détecte une erreur lors du processus de chiffrement, et si aucune donnée n'a encore été détruite et que le framework est opérationnel, vold
définit la propriété vold.encrypt_progress
sur error_not_encrypted
.
L'UI invite l'utilisateur à redémarrer et l'informe que le processus de chiffrement n'a jamais commencé. Si l'erreur se produit après la destruction du framework, mais avant que l'UI de la barre de progression ne soit opérationnelle, vold
redémarre le système. Si le redémarrage échoue, il définit vold.encrypt_progress
sur error_shutting_down
et renvoie -1. Toutefois, rien ne permet de détecter l'erreur. Cette situation ne devrait pas se produire.
Si vold
détecte une erreur lors du processus de chiffrement, il définit vold.encrypt_progress
sur error_partially_encrypted
et renvoie -1. L'UI doit ensuite afficher un message indiquant que le chiffrement a échoué et fournir un bouton permettant à l'utilisateur de rétablir la configuration d'usine de l'appareil.
Stocker la clé chiffrée
La clé chiffrée est stockée dans les métadonnées de cryptographie. La sauvegarde matérielle est implémentée à l'aide de la fonctionnalité de signature de l'environnement d'exécution sécurisé (TEE). Auparavant, nous chiffrions la clé principale avec une clé générée en appliquant Scrypt au mot de passe de l'utilisateur et au sel stocké. Pour rendre la clé résiliente aux attaques hors boîte, nous étendons cet algorithme en signant la clé obtenue avec une clé TEE stockée. La signature obtenue est ensuite convertie en clé de longueur appropriée par une autre application de scrypt. Cette clé est ensuite utilisée pour chiffrer et déchiffrer la clé principale. Pour stocker cette clé:
- Générez une clé de chiffrement de disque (DEK) aléatoire de 16 octets et un sel de 16 octets.
- Appliquez scrypt au mot de passe de l'utilisateur et au sel pour générer la clé intermédiaire 1 (IK1) de 32 octets.
- Remplacez IK1 par des zéros jusqu'à la taille de la clé privée liée au matériel (HBK). Plus précisément, nous ajoutons un remplissage de la manière suivante: 00 || IK1 || 00..00 ; un octet de zéro, 32 octets IK1, 223 octets de zéro.
- Signez l'IK1 avec HBK pour générer une IK2 de 256 octets.
- Appliquez scrypt à IK2 et au sel (même sel que l'étape 2) pour générer IK3 de 32 octets.
- Utilisez les 16 premiers octets d'IK3 comme KEK et les 16 derniers octets comme IV.
- Chiffrez la DEK avec AES_CBC, avec la clé KEK et le vecteur d'initialisation IV.
Modifier le mot de passe
Lorsqu'un utilisateur choisit de modifier ou de supprimer son mot de passe dans les paramètres, l'UI envoie la commande cryptfs changepw
à vold
, et vold
réenchiffre la clé principale de disque avec le nouveau mot de passe.
Propriétés de chiffrement
vold
et init
communiquent entre eux en définissant des propriétés. Voici la liste des propriétés disponibles pour le chiffrement.
Propriétés Vold
Propriété | Description |
---|---|
vold.decrypt trigger_encryption |
Chiffrez le disque sans mot de passe. |
vold.decrypt trigger_default_encryption |
Vérifiez si le disque est chiffré sans mot de passe.
Si tel est le cas, déchiffrez-le et montez-le, sinon définissez vold.decrypt sur trigger_restart_min_framework. |
vold.decrypt trigger_reset_main |
Défini par vold pour arrêter l'UI demandant le mot de passe du disque. |
vold.decrypt trigger_post_fs_data |
Défini par vold pour préparer /data avec les répertoires nécessaires, etc. |
vold.decrypt trigger_restart_framework |
Défini par vold pour démarrer le framework réel et tous les services. |
vold.decrypt trigger_shutdown_framework |
Défini par vold pour arrêter le framework complet et démarrer le chiffrement. |
vold.decrypt trigger_restart_min_framework |
Défini par vold pour démarrer l'UI de la barre de progression du chiffrement ou demander un mot de passe, en fonction de la valeur de ro.crypto.state . |
vold.encrypt_progress |
Lorsque le framework démarre, si cette propriété est définie, entrez en mode UI de la barre de progression. |
vold.encrypt_progress 0 to 100 |
L'interface utilisateur de la barre de progression doit afficher la valeur de pourcentage définie. |
vold.encrypt_progress error_partially_encrypted |
L'interface utilisateur de la barre de progression doit afficher un message indiquant que le chiffrement a échoué et donner à l'utilisateur la possibilité de réinitialiser l'appareil en usine. |
vold.encrypt_progress error_reboot_failed |
L'UI de la barre de progression doit afficher un message indiquant que le chiffrement est terminé et fournir à l'utilisateur un bouton pour redémarrer l'appareil. Cette erreur ne devrait pas se produire. |
vold.encrypt_progress error_not_encrypted |
L'interface utilisateur de la barre de progression doit afficher un message indiquant qu'une erreur s'est produite, qu'aucune donnée n'a été chiffrée ni perdue, et fournir à l'utilisateur un bouton pour redémarrer le système. |
vold.encrypt_progress error_shutting_down |
L'UI de la barre de progression n'est pas en cours d'exécution. Il est donc difficile de savoir qui répond à cette erreur. Cela ne devrait jamais se produire. |
vold.post_fs_data_done 0 |
Défini par vold juste avant de définir vold.decrypt sur trigger_post_fs_data . |
vold.post_fs_data_done 1 |
Défini par init.rc ou init.rc juste après la fin de la tâche post-fs-data . |
Propriétés init
Propriété | Description |
---|---|
ro.crypto.fs_crypto_blkdev |
Défini par la commande vold checkpw pour une utilisation ultérieure par la commande vold restart . |
ro.crypto.state unencrypted |
Défini par init pour indiquer que ce système s'exécute avec un /data ro.crypto.state encrypted non chiffré. Défini par init pour indiquer que ce système s'exécute avec un /data chiffré. |
|
Ces cinq propriétés sont définies par init lorsqu'il tente de monter /data avec des paramètres transmis à partir de init.rc . vold s'en sert pour configurer le mappage de cryptographie. |
ro.crypto.tmpfs_options |
Défini par init.rc avec les options que init doit utiliser lors de l'installation du système de fichiers /data tmpfs. |
actions init
on post-fs-data on nonencrypted on property:vold.decrypt=trigger_reset_main on property:vold.decrypt=trigger_post_fs_data on property:vold.decrypt=trigger_restart_min_framework on property:vold.decrypt=trigger_restart_framework on property:vold.decrypt=trigger_shutdown_framework on property:vold.decrypt=trigger_encryption on property:vold.decrypt=trigger_default_encryption