Le chiffrement complet du disque est le processus de codage de toutes les données utilisateur sur un appareil Android à l'aide d'une clé chiffrée. Une fois qu'un appareil est chiffré, toutes les données créées par l'utilisateur sont automatiquement chiffrées avant de les enregistrer sur le disque et toutes les lectures déchiffrent automatiquement les données avant de les renvoyer au processus appelant.
Le chiffrement complet du disque a été introduit sur Android dans la version 4.4, mais Android 5.0 a introduit ces nouvelles fonctionnalités :
- Création d'un cryptage rapide, qui crypte uniquement 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 prennent actuellement en charge le cryptage rapide.
- Ajout de l' indicateur fstab
forceencrypt
pour chiffrer au premier démarrage. - Ajout de la prise en charge des modèles et du cryptage sans mot de passe.
- Ajout d'un stockage matériel de la clé de chiffrement à l'aide de la capacité de signature de Trusted Execution Environment (TEE) (comme dans une TrustZone). Voir Stockage de la clé chiffrée pour plus de détails.
Attention : les appareils mis à niveau vers Android 5.0 puis chiffrés peuvent revenir à un état non chiffré par réinitialisation des données d'usine. Les nouveaux appareils Android 5.0 chiffrés au premier démarrage ne peuvent pas être remis dans un état non chiffré.
Comment fonctionne le chiffrement complet du disque Android
Le chiffrement complet du disque Android est basé sur dm-crypt
, qui est une fonctionnalité du noyau qui fonctionne au niveau de la couche périphérique bloc. Pour cette raison, le chiffrement fonctionne avec Embedded MultiMediaCard ( eMMC) et des périphériques flash similaires qui se présentent au noyau comme des périphériques de bloc. Le cryptage n'est pas possible avec YAFFS, qui communique directement avec une puce flash NAND brute.
L'algorithme de cryptage est 128 Advanced Encryption Standard (AES) avec chaînage de blocs de chiffrement (CBC) et ESSIV : SHA256. La clé principale est cryptée avec AES 128 bits via des appels à la bibliothèque OpenSSL. Vous devez utiliser 128 bits ou plus pour la clé (256 é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 :
- défaut
- ÉPINGLE
- mot de passe
- modèle
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 du sel stocké. Le mot de passe par défaut est : "default_password". Cependant, le hachage résultant est également signé via un TEE (tel que TrustZone), qui utilise un hachage de la signature pour chiffrer la clé principale.
Vous pouvez trouver 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/pass ou le mot de passe sur l'appareil, seule la clé de 128 bits est rechiffrée et stockée. (c'est-à-dire que les modifications du code PIN/passe/modèle de l'utilisateur n'entraînent PAS le recryptage des données utilisateur.) Notez que le périphérique géré peut être soumis à des restrictions de code PIN, de modèle ou de mot de passe.
Le chiffrement est géré par init
et vold
. init
appelle vold
et vold définit les 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 signaler l'état, demander un mot de passe ou inviter à une 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
.
Afin de chiffrer, déchiffrer ou effacer /data
, /data
ne doit pas être monté. Cependant, pour afficher une interface utilisateur (UI), le framework doit démarrer et le framework nécessite /data
pour s'exécuter. Pour résoudre cette énigme, un système de fichiers temporaire est monté sur /data
. Cela permet à Android de demander des mots de passe, d'afficher la progression ou de suggérer un effacement des données si nécessaire. Cela impose la limitation que pour passer du système de fichiers temporaire au véritable système de fichiers /data
, 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 réel /data
. Pour ce faire, tous les services doivent appartenir à l'un des trois groupes suivants : core
, main
et late_start
.
-
core
: Ne jamais s'arrêter après le démarrage. -
main
: Arrêtez puis redémarrez après la saisie du mot de passe du disque. -
late_start
: ne démarre qu'après que/data
ait été déchiffré et monté.
Pour déclencher ces actions, la propriété vold.decrypt
est définie sur différentes chaînes . Pour arrêter et redémarrer les services, les commandes init
sont :
-
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
.
Les 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 précédemment non chiffré :
- Chiffrer un nouvel appareil avec
forceencrypt
: Chiffrement obligatoire au premier démarrage (à partir d'Android L). - Chiffrer un appareil existant : chiffrement initié par l'utilisateur (Android K et versions antérieures).
- Chiffrer un nouvel appareil avec
- Démarrez un appareil chiffré :
- Démarrage d'un appareil crypté sans mot de passe : démarrer un appareil crypté sans mot de passe défini (pertinent pour les appareils exécutant Android 5.0 et versions ultérieures).
- Démarrage d'un appareil chiffré avec un mot de passe : démarrer un appareil chiffré doté d'un mot de passe défini.
En plus de ces flux, l’appareil peut également échouer à chiffrer /data
. Chacun des flux est expliqué en détail ci-dessous.
Chiffrer un nouvel appareil avec forceencrypt
Il s'agit du premier démarrage normal pour un appareil Android 5.0.
- Détecter le système de fichiers non chiffré avec l'indicateur
forceencrypt
/data
n'est pas chiffré mais doit l'être carforceencrypt
l'exige. Démontez/data
. - Commencer à chiffrer
/data
vold.decrypt = "trigger_encryption"
déclencheinit.rc
, ce qui amèneravold
à chiffrer/data
sans mot de passe. (Aucun n'est défini car il doit s'agir d'un nouvel appareil.) - Monter tmpfs
vold
monte un tmpfs/data
(en utilisant les options tmpfs dero.crypto.tmpfs_options
) et définit la propriétévold.encrypt_progress
sur 0.vold
prépare le tmpfs/data
pour démarrer un système chiffré et définit la propriétévold.decrypt
sur :trigger_restart_min_framework
- Afficher le cadre pour montrer les progrès
Étant donné que l'appareil n'a pratiquement aucune donnée à chiffrer, la barre de progression n'apparaît souvent pas en raison de la rapidité du chiffrement. Voir Chiffrer un appareil existant pour plus de détails sur l'interface utilisateur de progression.
- Lorsque
/data
est chiffré, supprimez le frameworkvold
définitvold.decrypt
surtrigger_default_encryption
qui démarre le servicedefaultcrypto
. (Cela démarre le flux ci-dessous pour monter des données utilisateur chiffrées 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 ; donc nous déchiffrons et montons/data
. - Montage
/data
init
monte ensuite/data
sur un RAMDisk tmpfs en utilisant les paramètres qu'il récupère dero.crypto.tmpfs_options
, qui sont définis dansinit.rc
. - Cadre de démarrage
vold
définitvold.decrypt
surtrigger_restart_framework
, qui continue le processus de démarrage habituel.
Chiffrer un appareil existant
C'est ce qui se produit lorsque vous chiffrez un appareil Android K ou version antérieure non chiffré qui a été migré vers L.
Ce processus est lancé par l'utilisateur et est appelé « cryptage sur 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 cryptage.
Avertissement : Si l'appareil est à court d'énergie et s'éteint avant d'avoir terminé le cryptage, les données du fichier restent dans un état partiellement crypté. L'appareil doit être réinitialisé aux paramètres d'usine et toutes les données sont perdues.
Pour activer le chiffrement sur place, vold
démarre une boucle pour lire chaque secteur du périphérique de bloc réel, puis l'écrire sur le périphérique de bloc de chiffrement. vold
vérifie si un secteur est utilisé avant de le lire et de l'écrire, ce qui rend le cryptage beaucoup plus rapide sur un nouvel appareil contenant peu ou pas de données.
État du périphérique : définissez ro.crypto.state = "unencrypted"
et exécutez le déclencheur init
on nonencrypted
pour continuer le démarrage.
- Vérifier le mot de passe
L'interface utilisateur appelle
vold
avec la commandecryptfs enablecrypto inplace
oùpasswd
est le mot de passe de l'écran de verrouillage de l'utilisateur. - Démontez le cadre
vold
vérifie les erreurs, renvoie -1 s'il ne peut pas chiffrer et imprime une raison dans le journal. S'il peut chiffrer, il définit la propriétévold.decrypt
surtrigger_shutdown_framework
. Cela amèneinit.rc
à arrêter les services dans les classeslate_start
etmain
. - Créer un pied de page crypto
- Créer un fichier fil d'Ariane
- Redémarrer
- Détecter le fichier de fil d'Ariane
- Commencer à chiffrer
/data
vold
configure ensuite le mappage cryptographique, qui crée un périphérique de bloc crypto virtuel qui mappe sur le périphérique bloc réel mais crypte chaque secteur au fur et à mesure de son écriture et déchiffre chaque secteur au fur et à mesure de sa lecture.vold
crée et écrit ensuite les métadonnées cryptographiques. - Pendant le cryptage, montez tmpfs
vold
monte un tmpfs/data
(en utilisant les options tmpfs dero.crypto.tmpfs_options
) et définit la propriétévold.encrypt_progress
sur 0.vold
prépare le tmpfs/data
pour démarrer un système chiffré et définit la propriétévold.decrypt
sur :trigger_restart_min_framework
- Afficher le cadre pour montrer les progrès
trigger_restart_min_framework
amèneinit.rc
à démarrer la classemain
de services. Lorsque le framework voit quevold.encrypt_progress
est défini sur 0, il affiche l'interface utilisateur 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 pour cent de la partition. - Lorsque
/data
est chiffré, mettez à jour le pied de page de chiffrementLorsque
/data
est chiffré avec succès,vold
efface l'indicateurENCRYPTION_IN_PROGRESS
dans les métadonnées.Lorsque l'appareil est déverrouillé avec succès, le mot de passe est ensuite 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'interface utilisateur doit afficher un message demandant à l'utilisateur d'appuyer sur un bouton pour redémarrer. Cela ne devrait jamais se produire.
Démarrage d'un appareil chiffré avec le chiffrement par défaut
C'est ce qui se produit lorsque vous démarrez un appareil crypté 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 et il s'agit donc de l'état de chiffrement par défaut .
- Détecter
/data
cryptées sans mot de passeDétectez que l'appareil Android est chiffré car
/data
ne peut pas être monté et que l'un des indicateursencryptable
ouforceencrypt
est défini.vold
définitvold.decrypt
surtrigger_default_encryption
, qui démarre le servicedefaultcrypto
.trigger_default_encryption
vérifie le type de cryptage pour voir si/data
est crypté avec ou sans mot de passe. - Décrypter /données
Crée le périphérique
dm-crypt
sur le périphérique bloc afin que le périphérique soit prêt à être utilisé. - Montage/données
vold
monte ensuite la partition réelle/data
déchiffrée, puis prépare la nouvelle partition. Il définit la propriétévold.post_fs_data_done
sur 0, puis définitvold.decrypt
surtrigger_post_fs_data
. Cela amèneinit.rc
à exécuter ses commandespost-fs-data
. Ils créeront tous les répertoires ou liens nécessaires, puis définirontvold.post_fs_data_done
sur 1.Une fois que
vold
voit le 1 dans cette propriété, il définit la propriétévold.decrypt
sur :trigger_restart_framework.
Cela amèneinit.rc
à redémarrer les services de la classemain
et à démarrer également les services de la classelate_start
pour la première fois depuis le démarrage. - Cadre de démarrage
Maintenant, le framework démarre tous ses services en utilisant le
/data
déchiffré et le système est prêt à être utilisé.
Démarrage d'un appareil chiffré sans chiffrement par défaut
C'est ce qui se produit lorsque vous démarrez un appareil crypté doté d'un mot de passe défini. Le mot de passe de l'appareil peut être un code PIN, un modèle ou un mot de passe.
- Détecter l'appareil crypté avec un mot de passe
Détecter que l'appareil Android est crypté car le drapeau
ro.crypto.state = "encrypted"
vold
définitvold.decrypt
surtrigger_restart_min_framework
car/data
est chiffré avec un mot de passe. - Monter tmpfs
init
définit cinq propriétés pour enregistrer les options de montage initiales données pour/data
avec les paramètres transmis depuisinit.rc
.vold
utilise ces propriétés pour configurer le mappage cryptographique :-
ro.crypto.fs_type
-
ro.crypto.fs_real_blkdev
-
ro.crypto.fs_mnt_point
-
ro.crypto.fs_options
-
ro.crypto.fs_flags
(numéro 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 voit que
vold.decrypt
est défini surtrigger_restart_min_framework
. Cela indique au framework qu'il démarre sur un disque tmpfs/data
et qu'il doit obtenir le mot de passe utilisateur.Cependant, 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 été terminé avec succès, -1 en cas d'erreur interne ou -2 si le chiffrement n'a pas été terminé avec succès.vold
le détermine en recherchant dans les métadonnées cryptographiques l'indicateurCRYPTO_ENCRYPTION_IN_PROGRESS
. S'il est défini, le processus de cryptage a été interrompu et il n'y a aucune donnée utilisable sur l'appareil. Sivold
renvoie une erreur, l'interface utilisateur doit afficher un message à l'utilisateur pour redémarrer et réinitialiser l'appareil aux paramètres d'usine, et donner à l'utilisateur un bouton sur lequel appuyer pour le faire. - Décrypter les données avec mot de passe
Une fois que
cryptfs cryptocomplete
a réussi, le framework affiche une interface utilisateur demandant le mot de passe du disque. L'interface utilisateur 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 avec succès les/data
déchiffrées à un emplacement temporaire, puis en les démontant),vold
enregistre le nom du périphérique bloc déchiffré dans la propriétéro.crypto.fs_crypto_blkdev
et renvoie l'état 0 à l'interface utilisateur. . Si le mot de passe est incorrect, il renvoie -1 à l'interface utilisateur. - Arrêter le cadre
L'interface utilisateur 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 obligeinit.rc
à effectuerclass_reset main
. Cela arrête tous les services de la classe principale, ce qui permet de démonter le tmpfs/data
. - Montage
/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 avait été chiffrée avec l'option wipe, qui n'est pas prise en charge dans la première version). Il définit la propriétévold.post_fs_data_done
sur 0, puis définitvold.decrypt
surtrigger_post_fs_data
. Cela amèneinit.rc
à exécuter ses commandespost-fs-data
. Ils créeront tous les répertoires ou liens nécessaires, puis définirontvold.post_fs_data_done
sur 1. Une fois quevold
verra le 1 dans cette propriété, il définira la propriétévold.decrypt
surtrigger_restart_framework
. Cela amèneinit.rc
à redémarrer les services de la classemain
et à démarrer é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 à être utilisé.
Échec
Un appareil qui ne parvient pas à déchiffrer peut mal fonctionner pour plusieurs raisons. L'appareil démarre par la série normale d'étapes de démarrage :
- Détecter l'appareil crypté avec un mot de passe
- Monter tmpfs
- Démarrer le framework pour demander un mot de passe
Mais une fois le framework ouvert, l'appareil peut rencontrer des erreurs :
- Le mot de passe correspond mais ne peut pas déchiffrer les données
- L'utilisateur saisit un mot de passe erroné 30 fois
Si ces erreurs ne sont pas résolues, invitez l'utilisateur à effacer les paramètres d'usine :
Si vold
détecte une erreur pendant le 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'interface utilisateur invite l'utilisateur à redémarrer et l'avertit que le processus de cryptage n'a jamais démarré. Si l'erreur se produit après la destruction du framework, mais avant que l'interface utilisateur de la barre de progression ne soit affichée, vold
redémarrera le système. Si le redémarrage échoue, il définit vold.encrypt_progress
sur error_shutting_down
et renvoie -1 ; mais il n'y aura rien pour détecter l'erreur. On ne s’attend pas à ce que cela se produise.
Si vold
détecte une erreur pendant le processus de cryptage, il définit vold.encrypt_progress
sur error_partially_encrypted
et renvoie -1. L'interface utilisateur doit alors afficher un message indiquant que le cryptage a échoué et fournir un bouton permettant à l'utilisateur de réinitialiser l'appareil aux paramètres d'usine.
Stockage de la clé chiffrée
La clé chiffrée est stockée dans les métadonnées cryptographiques. Le support matériel est implémenté à l'aide de la capacité de signature de Trusted Execution Environment (TEE). Auparavant, nous chiffrions la clé principale avec une clé générée en appliquant un scrypt au mot de passe de l'utilisateur et au sel stocké. Afin de rendre la clé résistante aux attaques hors boîte, nous étendons cet algorithme en signant la clé résultante avec une clé TEE stockée. La signature résultante est ensuite transformée en une 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 du sel de 16 octets.
- Appliquez scrypt au mot de passe de l'utilisateur et au sel pour produire une clé intermédiaire 1 de 32 octets (IK1).
- Complétez IK1 avec zéro octet à la taille de la clé privée liée au matériel (HBK). Plus précisément, nous remplissons comme suit : 00 || IK1 || 00..00 ; un octet zéro, 32 octets IK1, 223 octets zéro.
- Signez IK1 complété avec HBK pour produire un IK2 de 256 octets.
- Appliquez le scrypt à IK2 et au sel (même sel qu'à l'étape 2) pour produire un IK3 de 32 octets.
- Utilisez les 16 premiers octets de IK3 comme KEK et les 16 derniers octets comme IV.
- Cryptez DEK avec AES_CBC, avec la clé KEK et le vecteur d'initialisation IV.
Changer le mot de passe
Lorsqu'un utilisateur choisit de modifier ou de supprimer son mot de passe dans les paramètres, l'interface utilisateur envoie la commande cryptfs changepw
à vold
et vold
rechiffre la clé principale du 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 une liste des propriétés disponibles pour le chiffrement.
Propriétés du Vold
Propriété | Description |
---|---|
vold.decrypt trigger_encryption | Cryptez le lecteur sans mot de passe. |
vold.decrypt trigger_default_encryption | Vérifiez le lecteur pour voir s'il est crypté sans mot de passe. Si tel est le cas, décryptez-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'interface utilisateur en 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, et al. |
vold.decrypt trigger_restart_framework | Défini par vold pour démarrer le véritable framework et tous les services. |
vold.decrypt trigger_shutdown_framework | Défini par vold pour arrêter le framework complet pour démarrer le cryptage. |
vold.decrypt trigger_restart_min_framework | Défini par vold pour démarrer l'interface utilisateur de la barre de progression pour le cryptage 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, passez en mode interface utilisateur de la barre de progression. |
vold.encrypt_progress 0 to 100 | L'interface utilisateur de la barre de progression doit afficher la valeur en pourcentage définie. |
vold.encrypt_progress error_partially_encrypted | L'interface utilisateur de la barre de progression doit afficher un message indiquant que le cryptage a échoué et donner à l'utilisateur la possibilité de réinitialiser l'appareil aux paramètres d'usine. |
vold.encrypt_progress error_reboot_failed | L'interface utilisateur de la barre de progression doit afficher un message indiquant que le cryptage est terminé et donner à 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 ou perdue et donner à l'utilisateur un bouton pour redémarrer le système. |
vold.encrypt_progress error_shutting_down | L'interface utilisateur de la barre de progression ne fonctionne pas, il est donc difficile de savoir qui répondra à cette erreur. Et de toute façon, cela ne devrait jamais arriver. |
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 avoir terminé la tâche post-fs-data . |
propriétés d'initialisation
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 fonctionne avec un fichier /data ro.crypto.state encrypted . Défini par init pour indiquer que ce système fonctionne avec un /data crypté. |
| Ces cinq propriétés sont définies par init lorsqu'il tente de monter /data avec les paramètres transmis depuis init.rc . vold les utilise pour configurer le mappage cryptographique. |
ro.crypto.tmpfs_options | Défini par init.rc avec les options qu'init doit utiliser lors du montage du système de fichiers tmpfs /data . |
Actions d'initialisation
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