Tam Disk Şifreleme

Tam disk şifreleme, bir Android cihazdaki tüm kullanıcı verilerini şifrelenmiş bir anahtar kullanarak kodlama işlemidir. Bir cihaz şifrelendikten sonra, kullanıcı tarafından oluşturulan tüm veriler diske aktarılmadan önce otomatik olarak şifrelenir ve tüm okumalar, arama işlemine geri dönmeden önce otomatik olarak verilerin şifresini çözer.

Tam disk şifreleme, Android'e 4.4'te sunuldu, ancak Android 5.0 şu yeni özellikleri getirdi:

  • İlk önyüklemenin uzun sürmesini önlemek için yalnızca veri bölümündeki kullanılan blokları şifreleyen hızlı şifreleme oluşturuldu. Şu anda yalnızca ext4 ve f2fs dosya sistemleri hızlı şifrelemeyi desteklemektedir.
  • İlk açılışta şifrelemek için forceencrypt fstab bayrağı eklendi.
  • Kalıplar ve şifresiz şifreleme için destek eklendi.
  • Trusted Execution Environment'ın (TEE) imzalama yeteneği (TrustZone'da olduğu gibi) kullanılarak şifreleme anahtarının donanım destekli depolaması eklendi. Daha fazla ayrıntı için bkz . Şifrelenmiş anahtarı saklama .

Dikkat: Android 5.0'a yükseltilen ve daha sonra şifrelenen cihazlar, fabrika verilerine sıfırlama ile şifrelenmemiş bir duruma döndürülebilir. İlk açılışta şifrelenen yeni Android 5.0 cihazları şifrelenmemiş bir duruma döndürülemez.

Android tam disk şifrelemesi nasıl çalışır?

Android tam disk şifrelemesi, blok cihaz katmanında çalışan bir çekirdek özelliği olan dm-crypt dayalıdır. Bu nedenle şifreleme, Embedded MultiMediaCard ( eMMC) ve kendilerini çekirdeğe blok aygıtları olarak sunan benzer flash aygıtlarla çalışır. Doğrudan bir ham NAND flash yongasıyla konuşan YAFFS ile şifreleme mümkün değildir.

Şifreleme algoritması, şifre bloğu zincirleme (CBC) ve ESSIV:SHA256 ile 128 Gelişmiş Şifreleme Standardı'dır (AES). Ana anahtar, OpenSSL kitaplığına yapılan çağrılar aracılığıyla 128 bit AES ile şifrelenir. Anahtar için 128 bit veya daha fazlasını kullanmalısınız (256 isteğe bağlıdır).

Not: OEM'ler, ana anahtarı şifrelemek için 128 bit veya üzerini kullanabilir.

Android 5.0 sürümünde dört tür şifreleme durumu vardır:

  • varsayılan
  • TOPLU İĞNE
  • şifre
  • model

İlk açılışta, cihaz rasgele oluşturulmuş 128 bitlik bir ana anahtar oluşturur ve ardından bunu varsayılan bir parola ve depolanan salt ile hashler. Varsayılan parola şöyledir: "default_password" Ancak, ortaya çıkan karma aynı zamanda, ana anahtarı şifrelemek için imzanın bir sağlamasını kullanan bir TEE (TrustZone gibi) aracılığıyla da imzalanır.

Android Açık Kaynak Projesi cryptfs.cpp dosyasında tanımlanan varsayılan şifreyi bulabilirsiniz.

Kullanıcı, cihazda PIN/şifre veya parola belirlediğinde, yalnızca 128 bitlik anahtar yeniden şifrelenir ve saklanır. (örn. kullanıcı PIN'i/parolası/desen değişiklikleri, kullanıcı verilerinin yeniden şifrelenmesine NEDEN OLMAZ.) Yönetilen cihazın PIN, model veya parola kısıtlamalarına tabi olabileceğini unutmayın.

Şifreleme init ve vold tarafından yönetilir. init , vold çağırır ve vold, init'te olayları tetiklemek için özellikleri ayarlar. Sistemin diğer bölümleri, durumu bildirme, parola isteme veya önemli bir hata durumunda fabrika ayarlarına sıfırlama istemi gibi görevleri yürütmek için özelliklere de bakar. vold şifreleme özelliklerini çağırmak için sistem komut satırı aracı vdc cryptfs komutlarını kullanır: checkpw , restart , enablecrypto , changepw , cryptocomplete , verifypw , setfield , getfield , mountdefaultencrypted , getpwtype , getpw ve clearpw .

/data şifrelemek, şifresini çözmek veya silmek için /data mount edilmemelidir. Ancak, herhangi bir kullanıcı arabirimini (UI) göstermek için, çerçevenin başlaması ve /data çalışmasını gerektirmesi gerekir. Bu muammayı çözmek için /data üzerine geçici bir dosya sistemi bağlanır. Bu, Android'in parola istemesine, ilerlemeyi göstermesine veya gerektiğinde bir veri silme önermesine olanak tanır. Geçici dosya sisteminden gerçek /data dosya sistemine geçmek için, sistemin geçici dosya sistemindeki açık dosyalarla her işlemi durdurması ve bu işlemleri gerçek /data dosya sisteminde yeniden başlatması gerektiği sınırlamasını getirir. Bunu yapmak için tüm hizmetler şu üç gruptan birinde olmalıdır: core , main ve late_start .

  • core : Başladıktan sonra asla kapatmayın.
  • main : Kapatın ve disk şifresi girildikten sonra yeniden başlatın.
  • late_start : /data şifresi çözülüp bağlanıncaya kadar başlamaz.

Bu eylemleri tetiklemek için vold.decrypt özelliği çeşitli dizilere ayarlanmıştır. Hizmetleri sonlandırmak ve yeniden başlatmak için init komutları şunlardır:

  • class_reset : Bir hizmeti durdurur ancak class_start ile yeniden başlatılmasına izin verir.
  • class_start : Bir hizmeti yeniden başlatır.
  • class_stop : Bir hizmeti durdurur ve bir SVC_DISABLED bayrağı ekler. Durdurulan hizmetler class_start yanıt vermiyor.

Akışlar

Şifreli bir cihaz için dört akış vardır. Bir cihaz yalnızca bir kez şifrelenir ve ardından normal bir önyükleme akışını izler.

  • Önceden şifrelenmemiş bir cihazı şifreleyin:
    • Yeni bir cihazı forceencrypt ile şifreleyin: İlk açılışta zorunlu şifreleme (Android L'den başlayarak).
    • Mevcut bir cihazı şifreleyin: Kullanıcı tarafından başlatılan şifreleme (Android K ve öncesi).
  • Şifreli bir cihazı önyükleyin:
    • Şifreli bir cihazı şifresiz başlatma: Ayarlanmış şifresi olmayan şifreli bir cihazı başlatmak (Android 5.0 ve sonraki sürümleri çalıştıran cihazlar için geçerlidir).
    • Şifrelenmiş bir cihazı bir şifre ile başlatmak: Ayarlanmış bir şifreye sahip şifreli bir cihazı başlatmak.

Bu akışlara ek olarak, cihaz ayrıca /data şifrelemede başarısız olabilir. Akışların her biri aşağıda ayrıntılı olarak açıklanmaktadır.

Yeni bir cihazı forceencrypt ile şifreleyin

Bu, bir Android 5.0 aygıtı için normal ilk önyüklemedir.

  1. forceencrypt bayrağıyla şifrelenmemiş dosya sistemini algıla

    /data şifrelenmez ama zorunlu kılındığı için forceencrypt gerekir. /data bağlantısını kesin.

  2. /data şifrelemeye başla

    vold.decrypt = "trigger_encryption" init.rc tetikler, bu da vold /data şifresiz olarak şifrelemesine neden olur. (Bu yeni bir cihaz olması gerektiği için hiçbiri ayarlanmadı.)

  3. tmpfs'yi bağla

    vold bir tmpfs /data bağlar ( ro.crypto.tmpfs_options tmpfs seçeneklerini kullanarak) ve vold.encrypt_progress özelliğini 0 olarak ayarlar. vold , tmpfs /data şifreli bir sistemi başlatmak için hazırlar ve vold.decrypt özelliğini şu şekilde ayarlar: trigger_restart_min_framework

  4. İlerlemeyi göstermek için çerçeveyi getirin

    Cihazda neredeyse hiç şifrelenecek veri bulunmadığından, şifreleme çok hızlı gerçekleştiği için ilerleme çubuğu genellikle görünmez. İlerleme kullanıcı arabirimi hakkında daha fazla ayrıntı için Mevcut bir cihazı şifreleme bölümüne bakın.

  5. /data şifrelendiğinde, çerçeveyi kaldırın

    vold vold.decrypt defaultcrypto hizmetini başlatan trigger_default_encryption olarak ayarlar. (Bu, varsayılan bir şifrelenmiş kullanıcı verisi bağlamak için aşağıdaki akışı başlatır.) trigger_default_encryption /data parola ile mi yoksa parola olmadan mı şifrelendiğini görmek için şifreleme türünü kontrol eder. Android 5.0 cihazları ilk açılışta şifrelendiğinden, herhangi bir şifre ayarlanmamalıdır; bu nedenle /data şifresini çözer ve bağlarız.

  6. Montaj /data

    init daha sonra init.rc ayarlanan ro.crypto.tmpfs_options aldığı parametreleri kullanarak /data bir tmpfs RAMDisk'e bağlar.

  7. Başlangıç ​​çerçevesi

    vold vold.decrypt normal önyükleme işlemine devam eden trigger_restart_framework olarak ayarlar.

Mevcut bir cihazı şifreleyin

L'ye geçirilmiş, şifrelenmemiş bir Android K veya daha eski bir cihazı şifrelediğinizde olan budur.

Bu işlem kullanıcı tarafından başlatılır ve kodda "yerinde şifreleme" olarak adlandırılır. Bir kullanıcı bir cihazı şifrelemeyi seçtiğinde, UI, şifreleme işlemini tamamlamak için yeterli güç olması için pilin tamamen şarj edildiğinden ve AC adaptörünün takılı olduğundan emin olur.

Uyarı: Cihazın gücü biterse ve şifrelemeyi bitirmeden kapanırsa, dosya verileri kısmen şifrelenmiş durumda kalır. Cihaz fabrika ayarlarına sıfırlanmalıdır ve tüm veriler kaybolur.

Yerinde şifrelemeyi etkinleştirmek için vold , gerçek blok cihazının her bir sektörünü okumak ve ardından bunu kripto blok cihazına yazmak için bir döngü başlatır. vold , okumadan ve yazmadan önce bir sektörün kullanımda olup olmadığını kontrol eder, bu da çok az veri içeren veya hiç veri içermeyen yeni bir cihazda şifrelemeyi çok daha hızlı hale getirir.

State of device : ro.crypto.state = "unencrypted" olarak ayarlayın ve önyüklemeye devam etmek için on nonencrypted init tetikleyicisini çalıştırın.

  1. şifreyi kontrol et

    Kullanıcı arabirimi, passwd kullanıcının kilit ekranı parolası olduğu yerde cryptfs enablecrypto inplace komutuyla vold çağırır.

  2. Çerçeveyi indir

    vold hataları kontrol eder, şifreleyemezse -1 döndürür ve günlükte bir neden yazdırır. Şifreleyebiliyorsa, vold.decrypt özelliğini trigger_shutdown_framework olarak ayarlar. Bu, init.rc late_start ve main sınıflarındaki hizmetleri durdurmasına neden olur.

  3. Bir kripto altbilgisi oluşturun
  4. Bir kırıntı dosyası oluşturun
  5. yeniden başlat
  6. Kırıntı dosyasını algıla
  7. /data şifrelemeye başla

    vold daha sonra, gerçek blok cihazıyla eşleşen ancak her sektörü yazıldığı gibi şifreleyen ve her sektörün okunduğu gibi şifresini çözen sanal bir kripto blok cihazı oluşturan kripto eşlemesini kurar. vold daha sonra kripto meta verilerini oluşturur ve yazar.

  8. Şifreleme yaparken, mount tmpfs

    vold bir tmpfs /data bağlar ( ro.crypto.tmpfs_options tmpfs seçeneklerini kullanarak) ve vold.encrypt_progress özelliğini 0 olarak ayarlar. vold , tmpfs /data şifreli bir sistemi başlatmak için hazırlar ve vold.decrypt özelliğini şu şekilde ayarlar: trigger_restart_min_framework

  9. İlerlemeyi göstermek için çerçeveyi getirin

    trigger_restart_min_framework init.rc main hizmet sınıfını başlatmasına neden olur. Çerçeve, vold.encrypt_progress 0 olarak ayarlandığını gördüğünde, bu özelliği her beş saniyede bir sorgulayan ve bir ilerleme çubuğunu güncelleyen ilerleme çubuğu kullanıcı arabirimini getirir. Şifreleme döngüsü, bölümün başka bir yüzdesini her şifrelediğinde vold.encrypt_progress günceller.

  10. /data şifrelendiğinde, kripto altbilgisini güncelleyin

    /data başarılı bir şekilde şifrelendiğinde, vold meta verilerdeki ENCRYPTION_IN_PROGRESS bayrağını temizler.

    Cihazın kilidi başarıyla açıldığında, ana anahtarı şifrelemek için parola kullanılır ve kripto altbilgisi güncellenir.

    Yeniden başlatma herhangi bir nedenle başarısız olursa vold , vold.encrypt_progress özelliğini error_reboot_failed olarak ayarlar ve UI, kullanıcıdan yeniden başlatmak için bir düğmeye basmasını isteyen bir mesaj görüntüler. Bunun gerçekleşmesi hiç beklenmiyor.

Varsayılan şifreleme ile şifrelenmiş bir cihazı başlatma

Şifreli bir cihazı parola olmadan başlattığınızda olan budur. Android 5.0 cihazları ilk açılışta şifrelendiğinden, ayarlanmış bir parola olmamalıdır ve bu nedenle varsayılan şifreleme durumu budur.

  1. Şifreli /data algıla

    /data bağlanamadığı ve encryptable veya forceencrypt işaretlerinden biri ayarlandığı için Android aygıtının şifrelenmiş olduğunu saptayın.

    vold vold.decrypt defaultcrypto hizmetini başlatan trigger_default_encryption olarak ayarlar. trigger_default_encryption , /data parola ile mi yoksa parola olmadan mı şifrelendiğini görmek için şifreleme türünü kontrol eder.

  2. /verinin şifresini çöz

    Cihazın kullanıma hazır olması için blok cihaz üzerinden dm-crypt cihazını oluşturur.

  3. Montaj / veri

    vold daha sonra şifresi çözülmüş gerçek /data bölümünü bağlar ve ardından yeni bölümü hazırlar. vold.post_fs_data_done özelliğini 0 olarak ayarlar ve ardından vold.decrypt trigger_post_fs_data olarak ayarlar. Bu, init.rc post-fs-data komutlarını çalıştırmasına neden olur. Gerekli tüm dizinleri veya bağlantıları oluşturacaklar ve ardından vold.post_fs_data_done 1 olarak ayarlayacaklar.

    vold bu özellikte 1'i gördüğünde, vold.decrypt özelliğini şu şekilde ayarlar: trigger_restart_framework. Bu, init.rc servisleri yeniden main sınıfında başlatmasına ve ayrıca açılıştan bu yana ilk kez late_start sınıfında servisleri başlatmasına neden olur.

  4. Başlangıç ​​çerçevesi

    Artık çerçeve, şifresi çözülmüş /data kullanarak tüm hizmetlerini önyükler ve sistem kullanıma hazırdır.

Varsayılan şifreleme olmadan şifrelenmiş bir cihazı başlatma

Belirlenmiş bir parolası olan şifreli bir aygıtı başlattığınızda olan budur. Cihazın parolası bir pin, desen veya parola olabilir.

  1. Bir şifre ile şifrelenmiş cihazı algıla

    ro.crypto.state = "encrypted" bayrağı nedeniyle Android cihazının şifrelenmiş olduğunu tespit edin

    vold vold.decrypt trigger_restart_min_framework olarak ayarlar çünkü /data bir parola ile şifrelenir.

  2. tmpfs'yi bağla

    init init.rc iletilen parametrelerle /data için verilen ilk bağlama seçeneklerini kaydetmek için beş özellik ayarlar. vold kripto eşlemesini ayarlamak için şu özellikleri kullanır:

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (ASCII 8 basamaklı onaltılık sayı, önünde 0x vardır)
  3. Parola istemek için çerçeveyi başlatın

    Çerçeve başlar ve vold.decrypt trigger_restart_min_framework olarak ayarlandığını görür. Bu, çerçeveye bir tmpfs /data diskinde önyükleme yaptığını ve kullanıcı parolasını alması gerektiğini söyler.

    Ancak öncelikle, diskin düzgün bir şekilde şifrelendiğinden emin olması gerekir. cryptfs cryptocomplete komutunu vold gönderir. vold , şifreleme başarıyla tamamlandıysa 0, dahili hata durumunda -1 veya şifreleme başarıyla tamamlanmadıysa -2 döndürür. vold bunu CRYPTO_ENCRYPTION_IN_PROGRESS bayrağı için kripto meta verilerine bakarak belirler. Ayarlanmışsa, şifreleme işlemi kesintiye uğramıştır ve cihazda kullanılabilir veri yoktur. vold bir hata döndürürse, kullanıcı arabirimi kullanıcıya cihazı yeniden başlatması ve fabrika ayarlarına sıfırlaması için bir mesaj görüntülemeli ve kullanıcıya bunu yapması için basması gereken bir düğme vermelidir.

  4. Şifre ile verilerin şifresini çözün

    cryptfs cryptocomplete başarılı olduğunda, çerçeve, disk parolasını soran bir kullanıcı arabirimi görüntüler. Kullanıcı arabirimi, cryptfs checkpw komutunu vold göndererek parolayı kontrol eder. Parola doğruysa (bu, şifresi çözülmüş /data geçici bir konuma başarıyla bağlayıp ardından bağlantısını kaldırarak belirlenir), vold , şifresi çözülmüş blok aygıtının adını ro.crypto.fs_crypto_blkdev özelliğine kaydeder ve kullanıcı arabirimine 0 durumunu döndürür . Parola yanlışsa, kullanıcı arayüzüne -1 döndürür.

  5. Çerçeveyi durdur

    Kullanıcı arabirimi bir kripto önyükleme grafiği koyar ve ardından cryptfs restart komutuyla vold çağırır. vold vold.decrypt özelliğini trigger_reset_main olarak ayarlar, bu da init.rc class_reset main yapmasına neden olur. Bu, ana sınıftaki tüm hizmetleri durdurur ve bu da tmpfs /data bağlantısının kesilmesine olanak tanır.

  6. Montaj /data

    vold daha sonra şifresi çözülmüş gerçek /data bölümünü bağlar ve yeni bölümü hazırlar (ilk sürümde desteklenmeyen silme seçeneğiyle şifrelenmişse bu bölüm hiç hazırlanmayabilir). vold.post_fs_data_done özelliğini 0 olarak ayarlar ve ardından vold.decrypt trigger_post_fs_data olarak ayarlar. Bu, init.rc post-fs-data komutlarını çalıştırmasına neden olur. Gerekli tüm dizinleri veya bağlantıları oluşturacaklar ve ardından vold.post_fs_data_done 1'e ayarlayacaklar. vold , bu özellikte 1'i gördüğünde, vold.decrypt özelliğini trigger_restart_framework olarak ayarlar. Bu, init.rc servisleri yeniden main sınıfında başlatmasına ve ayrıca açılıştan bu yana ilk kez late_start sınıfında servisleri başlatmasına neden olur.

  7. Tam çerçeveyi başlat

    Artık çerçeve, şifresi çözülmüş /data dosya sistemini kullanarak tüm hizmetlerini önyükler ve sistem kullanıma hazırdır.

Arıza

Şifresini çözemeyen bir cihaz birkaç nedenden dolayı hatalı olabilir. Aygıt, önyükleme için normal bir dizi adımla başlar:

  1. Bir şifre ile şifrelenmiş cihazı algıla
  2. tmpfs'yi bağla
  3. Parola istemek için çerçeveyi başlatın

Ancak çerçeve açıldıktan sonra cihaz bazı hatalarla karşılaşabilir:

  • Parola eşleşir ancak verilerin şifresini çözemez
  • Kullanıcı 30 kez yanlış şifre giriyor

Bu hatalar çözülmezse, kullanıcıdan fabrikada silme işlemini gerçekleştirmesini isteyin :

vold şifreleme işlemi sırasında bir hata algılarsa ve henüz hiçbir veri yok edilmemişse ve çerçeve çalışıyorsa, vold vold.encrypt_progress özelliğini error_not_encrypted olarak ayarlar. Kullanıcı arabirimi, kullanıcıdan yeniden başlatmasını ister ve onları şifreleme işleminin hiç başlamadığı konusunda uyarır. Hata, çerçeve parçalandıktan sonra, ancak ilerleme çubuğu kullanıcı arayüzü yukarı çıkmadan önce ortaya çıkarsa, vold sistemi yeniden başlatır. Yeniden başlatma başarısız olursa vold.encrypt_progress error_shutting_down olarak ayarlar ve -1 döndürür; ama hatayı yakalayacak bir şey olmayacak. Bunun olması beklenmiyor.

vold şifreleme işlemi sırasında bir hata tespit ederse, vold.encrypt_progress error_partially_encrypted olarak ayarlar ve -1 döndürür. Kullanıcı arabirimi daha sonra şifrelemenin başarısız olduğunu belirten bir mesaj görüntülemeli ve kullanıcının cihazı fabrika ayarlarına sıfırlaması için bir düğme sağlamalıdır.

Şifrelenmiş anahtarın saklanması

Şifrelenmiş anahtar, kripto meta verilerinde saklanır. Donanım desteği, Güvenilir Yürütme Ortamı'nın (TEE) imzalama yeteneği kullanılarak uygulanır. Önceden, ana anahtarı, kullanıcının parolasına ve saklanan salt'a scrypt uygulayarak oluşturulan bir anahtarla şifreliyorduk. Anahtarı kutu dışı saldırılara karşı dayanıklı hale getirmek için, elde edilen anahtarı depolanmış bir TEE anahtarıyla imzalayarak bu algoritmayı genişletiyoruz. Ortaya çıkan imza daha sonra bir scrypt uygulamasıyla uygun uzunlukta bir anahtara dönüştürülür. Bu anahtar daha sonra ana anahtarı şifrelemek ve şifresini çözmek için kullanılır. Bu anahtarı saklamak için:

  1. Rastgele 16 baytlık disk şifreleme anahtarı (DEK) ve 16 baytlık tuz oluşturun.
  2. 32 baytlık ara anahtar 1'i (IK1) üretmek için kullanıcı parolasına scrypt ve salt uygulayın.
  3. Donanıma bağlı özel anahtarın (HBK) boyutuna sıfır bayt ile Pad IK1. Özellikle, şu şekilde doldururuz: 00 || IK1 || 00..00; bir sıfır bayt, 32 IK1 bayt, 223 sıfır bayt.
  4. 256 baytlık IK2 üretmek için dolgulu IK1'i HBK ile imzalayın.
  5. 32 bayt IK3 üretmek için IK2'ye scrypt ve tuz (adım 2 ile aynı tuz) uygulayın.
  6. IK3'ün ilk 16 baytını KEK olarak ve son 16 baytı IV olarak kullanın.
  7. DEK'i AES_CBC ile, KEK anahtarıyla ve başlatma vektörü IV ile şifreleyin.

şifreyi değiştirme

Bir kullanıcı ayarlarda parolasını değiştirmeyi veya kaldırmayı seçtiğinde, kullanıcı arabirimi cryptfs changepw to vold komutunu gönderir ve vold , disk ana anahtarını yeni parolayla yeniden şifreler.

Şifreleme özellikleri

vold ve init özellikleri ayarlayarak birbirleriyle iletişim kurar. Şifreleme için kullanılabilir özelliklerin bir listesi aşağıdadır.

cilt özellikleri

Mülk Tanım
vold.decrypt trigger_encryption Sürücüyü parola olmadan şifreleyin.
vold.decrypt trigger_default_encryption Parola olmadan şifrelenip şifrelenmediğini görmek için sürücüyü kontrol edin. Öyleyse, şifresini çözün ve bağlayın, aksi takdirde vold.decrypt öğesini trigger_restart_min_framework olarak ayarlayın.
vold.decrypt trigger_reset_main Disk şifresini soran kullanıcı arayüzünü kapatmak için vold ile ayarlayın.
vold.decrypt trigger_post_fs_data Vold tarafından gerekli dizinlerle /data hazırlamak için ayarlayın, et al.
vold.decrypt trigger_restart_framework Gerçek çerçeveyi ve tüm hizmetleri başlatmak için vol tarafından ayarlayın.
vold.decrypt trigger_shutdown_framework Şifrelemeyi başlatmak için tüm çerçeveyi kapatmak üzere vol ile ayarlayın.
vold.decrypt trigger_restart_min_framework ro.crypto.state değerine bağlı olarak şifreleme veya parola istemi için ilerleme çubuğu kullanıcı arabirimini başlatmak üzere vold ile ayarlayın.
vold.encrypt_progress Çerçeve başladığında, bu özellik ayarlanmışsa, ilerleme çubuğu UI moduna girin.
vold.encrypt_progress 0 to 100 İlerleme çubuğu kullanıcı arayüzü ayarlanan yüzde değerini göstermelidir.
vold.encrypt_progress error_partially_encrypted İlerleme çubuğu kullanıcı arabirimi, şifrelemenin başarısız olduğunu belirten bir mesaj görüntülemeli ve kullanıcıya cihazı fabrika ayarlarına sıfırlama seçeneği vermelidir.
vold.encrypt_progress error_reboot_failed İlerleme çubuğu kullanıcı arayüzü, şifrelemenin tamamlandığını belirten bir mesaj görüntülemeli ve kullanıcıya cihazı yeniden başlatması için bir düğme vermelidir. Bu hatanın gerçekleşmesi beklenmiyor.
vold.encrypt_progress error_not_encrypted İlerleme çubuğu kullanıcı arabirimi, bir hata oluştuğunu, hiçbir verinin şifrelenmediğini veya kaybolmadığını belirten bir mesaj görüntülemeli ve kullanıcıya sistemi yeniden başlatması için bir düğme vermelidir.
vold.encrypt_progress error_shutting_down İlerleme çubuğu kullanıcı arayüzü çalışmıyor, bu nedenle bu hataya kimin yanıt vereceği belli değil. Ve zaten asla olmamalı.
vold.post_fs_data_done 0 vold.decrypt trigger_post_fs_data olarak ayarlamadan hemen önce vold tarafından ayarlayın.
vold.post_fs_data_done 1 post-fs-data görevini tamamladıktan hemen sonra init.rc veya init.rc tarafından ayarlayın.

başlangıç ​​özellikleri

Mülk Tanım
ro.crypto.fs_crypto_blkdev vold komutu checkpw ile daha sonra vold komutu restart tarafından kullanılmak üzere ayarlanır.
ro.crypto.state unencrypted init tarafından bu sistemin şifrelenmemiş bir /data ro.crypto.state encrypted olarak çalıştığını söyleyecek şekilde ayarlanır. Bu sistemin şifreli bir /data ile çalıştığını söylemek için init tarafından ayarlanır.

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

Bu beş özellik, init tarafından init.rc iletilen parametrelerle /data bağlamaya çalıştığında ayarlanır. vold bunları kripto eşlemesini ayarlamak için kullanır.
ro.crypto.tmpfs_options init.rc tarafından init'in tmpfs /data dosya sistemini bağlarken kullanması gereken seçeneklerle ayarlayın.

eylemleri başlat

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
,

Tam disk şifreleme, bir Android cihazdaki tüm kullanıcı verilerini şifrelenmiş bir anahtar kullanarak kodlama işlemidir. Bir cihaz şifrelendikten sonra, kullanıcı tarafından oluşturulan tüm veriler diske aktarılmadan önce otomatik olarak şifrelenir ve tüm okumalar, arama işlemine geri dönmeden önce otomatik olarak verilerin şifresini çözer.

Tam disk şifreleme, Android'e 4.4'te sunuldu, ancak Android 5.0 şu yeni özellikleri getirdi:

  • İlk önyüklemenin uzun sürmesini önlemek için yalnızca veri bölümündeki kullanılan blokları şifreleyen hızlı şifreleme oluşturuldu. Şu anda yalnızca ext4 ve f2fs dosya sistemleri hızlı şifrelemeyi desteklemektedir.
  • İlk açılışta şifrelemek için forceencrypt fstab bayrağı eklendi.
  • Kalıplar ve şifresiz şifreleme için destek eklendi.
  • Trusted Execution Environment'ın (TEE) imzalama yeteneği (TrustZone'da olduğu gibi) kullanılarak şifreleme anahtarının donanım destekli depolaması eklendi. Daha fazla ayrıntı için bkz . Şifrelenmiş anahtarı saklama .

Dikkat: Android 5.0'a yükseltilen ve daha sonra şifrelenen cihazlar, fabrika verilerine sıfırlama ile şifrelenmemiş bir duruma döndürülebilir. İlk açılışta şifrelenen yeni Android 5.0 cihazları şifrelenmemiş bir duruma döndürülemez.

Android tam disk şifrelemesi nasıl çalışır?

Android tam disk şifrelemesi, blok cihaz katmanında çalışan bir çekirdek özelliği olan dm-crypt dayalıdır. Bu nedenle şifreleme, Embedded MultiMediaCard ( eMMC) ve kendilerini çekirdeğe blok aygıtları olarak sunan benzer flash aygıtlarla çalışır. Doğrudan bir ham NAND flash yongasıyla konuşan YAFFS ile şifreleme mümkün değildir.

Şifreleme algoritması, şifre bloğu zincirleme (CBC) ve ESSIV:SHA256 ile 128 Gelişmiş Şifreleme Standardı'dır (AES). Ana anahtar, OpenSSL kitaplığına yapılan çağrılar aracılığıyla 128 bit AES ile şifrelenir. Anahtar için 128 bit veya daha fazlasını kullanmalısınız (256 isteğe bağlıdır).

Not: OEM'ler, ana anahtarı şifrelemek için 128 bit veya üzerini kullanabilir.

Android 5.0 sürümünde dört tür şifreleme durumu vardır:

  • varsayılan
  • TOPLU İĞNE
  • şifre
  • model

İlk açılışta, cihaz rasgele oluşturulmuş 128 bitlik bir ana anahtar oluşturur ve ardından bunu varsayılan bir parola ve depolanan salt ile hashler. Varsayılan parola şöyledir: "default_password" Ancak, ortaya çıkan karma aynı zamanda, ana anahtarı şifrelemek için imzanın bir sağlamasını kullanan bir TEE (TrustZone gibi) aracılığıyla da imzalanır.

Android Açık Kaynak Projesi cryptfs.cpp dosyasında tanımlanan varsayılan şifreyi bulabilirsiniz.

Kullanıcı, cihazda PIN/şifre veya parola belirlediğinde, yalnızca 128 bitlik anahtar yeniden şifrelenir ve saklanır. (örn. kullanıcı PIN'i/parolası/desen değişiklikleri, kullanıcı verilerinin yeniden şifrelenmesine NEDEN OLMAZ.) Yönetilen cihazın PIN, model veya parola kısıtlamalarına tabi olabileceğini unutmayın.

Şifreleme init ve vold tarafından yönetilir. init , vold çağırır ve vold, init'te olayları tetiklemek için özellikleri ayarlar. Sistemin diğer bölümleri, durumu bildirme, parola isteme veya önemli bir hata durumunda fabrika ayarlarına sıfırlama istemi gibi görevleri yürütmek için özelliklere de bakar. vold şifreleme özelliklerini çağırmak için sistem komut satırı aracı vdc cryptfs komutlarını kullanır: checkpw , restart , enablecrypto , changepw , cryptocomplete , verifypw , setfield , getfield , mountdefaultencrypted , getpwtype , getpw ve clearpw .

/data şifrelemek, şifresini çözmek veya silmek için /data mount edilmemelidir. Ancak, herhangi bir kullanıcı arabirimini (UI) göstermek için, çerçevenin başlaması ve /data çalışmasını gerektirmesi gerekir. Bu muammayı çözmek için /data üzerine geçici bir dosya sistemi bağlanır. Bu, Android'in parola istemesine, ilerlemeyi göstermesine veya gerektiğinde bir veri silme önermesine olanak tanır. Geçici dosya sisteminden gerçek /data dosya sistemine geçmek için, sistemin geçici dosya sistemindeki açık dosyalarla her işlemi durdurması ve bu işlemleri gerçek /data dosya sisteminde yeniden başlatması gerektiği sınırlamasını getirir. Bunu yapmak için tüm hizmetler şu üç gruptan birinde olmalıdır: core , main ve late_start .

  • core : Başladıktan sonra asla kapatmayın.
  • main : Kapatın ve disk şifresi girildikten sonra yeniden başlatın.
  • late_start : /data şifresi çözülüp bağlanıncaya kadar başlamaz.

Bu eylemleri tetiklemek için vold.decrypt özelliği çeşitli dizilere ayarlanmıştır. Hizmetleri sonlandırmak ve yeniden başlatmak için init komutları şunlardır:

  • class_reset : Bir hizmeti durdurur ancak class_start ile yeniden başlatılmasına izin verir.
  • class_start : Bir hizmeti yeniden başlatır.
  • class_stop : Bir hizmeti durdurur ve bir SVC_DISABLED bayrağı ekler. Durdurulan hizmetler class_start yanıt vermiyor.

Akışlar

Şifreli bir cihaz için dört akış vardır. Bir cihaz yalnızca bir kez şifrelenir ve ardından normal bir önyükleme akışını izler.

  • Önceden şifrelenmemiş bir cihazı şifreleyin:
    • Yeni bir cihazı forceencrypt ile şifreleyin: İlk açılışta zorunlu şifreleme (Android L'den başlayarak).
    • Mevcut bir cihazı şifreleyin: Kullanıcı tarafından başlatılan şifreleme (Android K ve öncesi).
  • Şifreli bir cihazı önyükleyin:
    • Şifreli bir cihazı şifresiz başlatma: Ayarlanmış şifresi olmayan şifreli bir cihazı başlatmak (Android 5.0 ve sonraki sürümleri çalıştıran cihazlar için geçerlidir).
    • Şifrelenmiş bir cihazı bir şifre ile başlatmak: Ayarlanmış bir şifreye sahip şifreli bir cihazı başlatmak.

Bu akışlara ek olarak, cihaz ayrıca /data şifrelemede başarısız olabilir. Akışların her biri aşağıda ayrıntılı olarak açıklanmaktadır.

Yeni bir cihazı forceencrypt ile şifreleyin

Bu, bir Android 5.0 aygıtı için normal ilk önyüklemedir.

  1. forceencrypt bayrağıyla şifrelenmemiş dosya sistemini algıla

    /data şifrelenmez ama zorunlu kılındığı için forceencrypt gerekir. /data bağlantısını kesin.

  2. /data şifrelemeye başla

    vold.decrypt = "trigger_encryption" init.rc tetikler, bu da vold /data şifresiz olarak şifrelemesine neden olur. (Bu yeni bir cihaz olması gerektiği için hiçbiri ayarlanmadı.)

  3. tmpfs'yi bağla

    vold bir tmpfs /data bağlar ( ro.crypto.tmpfs_options tmpfs seçeneklerini kullanarak) ve vold.encrypt_progress özelliğini 0 olarak ayarlar. vold , tmpfs /data şifreli bir sistemi başlatmak için hazırlar ve vold.decrypt özelliğini şu şekilde ayarlar: trigger_restart_min_framework

  4. İlerlemeyi göstermek için çerçeveyi getirin

    Cihazda neredeyse hiç şifrelenecek veri bulunmadığından, şifreleme çok hızlı gerçekleştiği için ilerleme çubuğu genellikle görünmez. İlerleme kullanıcı arabirimi hakkında daha fazla ayrıntı için Mevcut bir cihazı şifreleme bölümüne bakın.

  5. /data şifrelendiğinde, çerçeveyi kaldırın

    vold vold.decrypt defaultcrypto hizmetini başlatan trigger_default_encryption olarak ayarlar. (Bu, varsayılan bir şifrelenmiş kullanıcı verisi bağlamak için aşağıdaki akışı başlatır.) trigger_default_encryption /data parola ile mi yoksa parola olmadan mı şifrelendiğini görmek için şifreleme türünü kontrol eder. Android 5.0 cihazları ilk açılışta şifrelendiğinden, herhangi bir şifre ayarlanmamalıdır; bu nedenle /data şifresini çözer ve bağlarız.

  6. Montaj /data

    init daha sonra init.rc ayarlanan ro.crypto.tmpfs_options aldığı parametreleri kullanarak /data bir tmpfs RAMDisk'e bağlar.

  7. Başlangıç ​​çerçevesi

    vold vold.decrypt normal önyükleme işlemine devam eden trigger_restart_framework olarak ayarlar.

Mevcut bir cihazı şifreleyin

L'ye geçirilmiş, şifrelenmemiş bir Android K veya daha eski bir cihazı şifrelediğinizde olan budur.

Bu işlem kullanıcı tarafından başlatılır ve kodda "yerinde şifreleme" olarak adlandırılır. Bir kullanıcı bir cihazı şifrelemeyi seçtiğinde, UI, şifreleme işlemini tamamlamak için yeterli güç olması için pilin tamamen şarj edildiğinden ve AC adaptörünün takılı olduğundan emin olur.

Uyarı: Cihazın gücü biterse ve şifrelemeyi bitirmeden kapanırsa, dosya verileri kısmen şifrelenmiş durumda kalır. Cihaz fabrika ayarlarına sıfırlanmalıdır ve tüm veriler kaybolur.

Yerinde şifrelemeyi etkinleştirmek için vold , gerçek blok cihazının her bir sektörünü okumak ve ardından bunu kripto blok cihazına yazmak için bir döngü başlatır. vold , okumadan ve yazmadan önce bir sektörün kullanımda olup olmadığını kontrol eder, bu da çok az veri içeren veya hiç veri içermeyen yeni bir cihazda şifrelemeyi çok daha hızlı hale getirir.

State of device : ro.crypto.state = "unencrypted" olarak ayarlayın ve önyüklemeye devam etmek için on nonencrypted init tetikleyicisini çalıştırın.

  1. şifreyi kontrol et

    Kullanıcı arabirimi, passwd kullanıcının kilit ekranı parolası olduğu yerde cryptfs enablecrypto inplace komutuyla vold çağırır.

  2. Çerçeveyi indir

    vold hataları kontrol eder, şifreleyemezse -1 döndürür ve günlükte bir neden yazdırır. Şifreleyebiliyorsa, vold.decrypt özelliğini trigger_shutdown_framework olarak ayarlar. Bu, init.rc late_start ve main sınıflarındaki hizmetleri durdurmasına neden olur.

  3. Bir kripto altbilgisi oluşturun
  4. Bir kırıntı dosyası oluşturun
  5. yeniden başlat
  6. Kırıntı dosyasını algıla
  7. /data şifrelemeye başla

    vold daha sonra, gerçek blok cihazıyla eşleşen ancak her sektörü yazıldığı gibi şifreleyen ve her sektörün okunduğu gibi şifresini çözen sanal bir kripto blok cihazı oluşturan kripto eşlemesini kurar. vold daha sonra kripto meta verilerini oluşturur ve yazar.

  8. Şifreleme yaparken, mount tmpfs

    vold bir tmpfs /data bağlar ( ro.crypto.tmpfs_options tmpfs seçeneklerini kullanarak) ve vold.encrypt_progress özelliğini 0 olarak ayarlar. vold , tmpfs /data şifreli bir sistemi başlatmak için hazırlar ve vold.decrypt özelliğini şu şekilde ayarlar: trigger_restart_min_framework

  9. İlerlemeyi göstermek için çerçeveyi getirin

    trigger_restart_min_framework init.rc main hizmet sınıfını başlatmasına neden olur. Çerçeve, vold.encrypt_progress 0 olarak ayarlandığını gördüğünde, bu özelliği her beş saniyede bir sorgulayan ve bir ilerleme çubuğunu güncelleyen ilerleme çubuğu kullanıcı arabirimini getirir. Şifreleme döngüsü, bölümün başka bir yüzdesini her şifrelediğinde vold.encrypt_progress günceller.

  10. /data şifrelendiğinde, kripto altbilgisini güncelleyin

    /data başarılı bir şekilde şifrelendiğinde, vold meta verilerdeki ENCRYPTION_IN_PROGRESS bayrağını temizler.

    Cihazın kilidi başarıyla açıldığında, ana anahtarı şifrelemek için parola kullanılır ve kripto altbilgisi güncellenir.

    Yeniden başlatma herhangi bir nedenle başarısız olursa vold , vold.encrypt_progress özelliğini error_reboot_failed olarak ayarlar ve UI, kullanıcıdan yeniden başlatmak için bir düğmeye basmasını isteyen bir mesaj görüntüler. Bunun gerçekleşmesi hiç beklenmiyor.

Varsayılan şifreleme ile şifrelenmiş bir cihazı başlatma

Şifreli bir cihazı parola olmadan başlattığınızda olan budur. Android 5.0 cihazları ilk açılışta şifrelendiğinden, ayarlanmış bir parola olmamalıdır ve bu nedenle varsayılan şifreleme durumu budur.

  1. Şifreli /data algıla

    /data bağlanamadığı ve encryptable veya forceencrypt işaretlerinden biri ayarlandığı için Android aygıtının şifrelenmiş olduğunu saptayın.

    vold vold.decrypt defaultcrypto hizmetini başlatan trigger_default_encryption olarak ayarlar. trigger_default_encryption , /data parola ile mi yoksa parola olmadan mı şifrelendiğini görmek için şifreleme türünü kontrol eder.

  2. /verinin şifresini çöz

    Cihazın kullanıma hazır olması için blok cihaz üzerinden dm-crypt cihazını oluşturur.

  3. Montaj / veri

    vold daha sonra şifresi çözülmüş gerçek /data bölümünü bağlar ve ardından yeni bölümü hazırlar. vold.post_fs_data_done özelliğini 0 olarak ayarlar ve ardından vold.decrypt trigger_post_fs_data olarak ayarlar. Bu, init.rc post-fs-data komutlarını çalıştırmasına neden olur. Gerekli tüm dizinleri veya bağlantıları oluşturacaklar ve ardından vold.post_fs_data_done 1 olarak ayarlayacaklar.

    vold bu özellikte 1'i gördüğünde vold.decrypt özelliğini şu şekilde ayarlar: trigger_restart_framework. Bu, init.rc servisleri yeniden main sınıfında başlatmasına ve ayrıca açılıştan bu yana ilk kez late_start sınıfında servisleri başlatmasına neden olur.

  4. Başlangıç ​​çerçevesi

    Artık çerçeve, şifresi çözülmüş /data kullanarak tüm hizmetlerini önyükler ve sistem kullanıma hazırdır.

Starting an encrypted device without default encryption

This is what happens when you boot up an encrypted device that has a set password. The device's password can be a pin, pattern, or password.

  1. Detect encrypted device with a password

    Detect that the Android device is encrypted because the flag ro.crypto.state = "encrypted"

    vold sets vold.decrypt to trigger_restart_min_framework because /data is encrypted with a password.

  2. Mount tmpfs

    init sets five properties to save the initial mount options given for /data with parameters passed from init.rc . vold uses these properties to set up the crypto mapping:

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (ASCII 8-digit hex number preceded by 0x)
  3. Start framework to prompt for password

    The framework starts up and sees that vold.decrypt is set to trigger_restart_min_framework . This tells the framework that it is booting on a tmpfs /data disk and it needs to get the user password.

    First, however, it needs to make sure that the disk was properly encrypted. It sends the command cryptfs cryptocomplete to vold . vold returns 0 if encryption was completed successfully, -1 on internal error, or -2 if encryption was not completed successfully. vold determines this by looking in the crypto metadata for the CRYPTO_ENCRYPTION_IN_PROGRESS flag. If it's set, the encryption process was interrupted, and there is no usable data on the device. If vold returns an error, the UI should display a message to the user to reboot and factory reset the device, and give the user a button to press to do so.

  4. Decrypt data with password

    Once cryptfs cryptocomplete is successful, the framework displays a UI asking for the disk password. The UI checks the password by sending the command cryptfs checkpw to vold . If the password is correct (which is determined by successfully mounting the decrypted /data at a temporary location, then unmounting it), vold saves the name of the decrypted block device in the property ro.crypto.fs_crypto_blkdev and returns status 0 to the UI. If the password is incorrect, it returns -1 to the UI.

  5. Stop framework

    The UI puts up a crypto boot graphic and then calls vold with the command cryptfs restart . vold sets the property vold.decrypt to trigger_reset_main , which causes init.rc to do class_reset main . This stops all services in the main class, which allows the tmpfs /data to be unmounted.

  6. Mount /data

    vold then mounts the decrypted real /data partition and prepares the new partition (which may never have been prepared if it was encrypted with the wipe option, which is not supported on first release). It sets the property vold.post_fs_data_done to 0 and then sets vold.decrypt to trigger_post_fs_data . This causes init.rc to run its post-fs-data commands. They will create any necessary directories or links and then set vold.post_fs_data_done to 1. Once vold sees the 1 in that property, it sets the property vold.decrypt to trigger_restart_framework . This causes init.rc to start services in class main again and also start services in class late_start for the first time since boot.

  7. Start full framework

    Now the framework boots all its services using the decrypted /data filesystem, and the system is ready for use.

Failure

A device that fails to decrypt might be awry for a few reasons. The device starts with the normal series of steps to boot:

  1. Detect encrypted device with a password
  2. Mount tmpfs
  3. Start framework to prompt for password

But after the framework opens, the device can encounter some errors:

  • Password matches but cannot decrypt data
  • User enters wrong password 30 times

If these errors are not resolved, prompt user to factory wipe :

If vold detects an error during the encryption process, and if no data has been destroyed yet and the framework is up, vold sets the property vold.encrypt_progress to error_not_encrypted . The UI prompts the user to reboot and alerts them the encryption process never started. If the error occurs after the framework has been torn down, but before the progress bar UI is up, vold will reboot the system. If the reboot fails, it sets vold.encrypt_progress to error_shutting_down and returns -1; but there will not be anything to catch the error. This is not expected to happen.

If vold detects an error during the encryption process, it sets vold.encrypt_progress to error_partially_encrypted and returns -1. The UI should then display a message saying the encryption failed and provide a button for the user to factory reset the device.

Storing the encrypted key

The encrypted key is stored in the crypto metadata. Hardware backing is implemented by using Trusted Execution Environment's (TEE) signing capability. Previously, we encrypted the master key with a key generated by applying scrypt to the user's password and the stored salt. In order to make the key resilient against off-box attacks, we extend this algorithm by signing the resultant key with a stored TEE key. The resultant signature is then turned into an appropriate length key by one more application of scrypt. This key is then used to encrypt and decrypt the master key. To store this key:

  1. Generate random 16-byte disk encryption key (DEK) and 16-byte salt.
  2. Apply scrypt to the user password and the salt to produce 32-byte intermediate key 1 (IK1).
  3. Pad IK1 with zero bytes to the size of the hardware-bound private key (HBK). Specifically, we pad as: 00 || IK1 || 00..00; one zero byte, 32 IK1 bytes, 223 zero bytes.
  4. Sign padded IK1 with HBK to produce 256-byte IK2.
  5. Apply scrypt to IK2 and salt (same salt as step 2) to produce 32-byte IK3.
  6. Use the first 16 bytes of IK3 as KEK and the last 16 bytes as IV.
  7. Encrypt DEK with AES_CBC, with key KEK, and initialization vector IV.

Changing the password

When a user elects to change or remove their password in settings, the UI sends the command cryptfs changepw to vold , and vold re-encrypts the disk master key with the new password.

Encryption properties

vold and init communicate with each other by setting properties. Here is a list of available properties for encryption.

Vold properties

Property Tanım
vold.decrypt trigger_encryption Encrypt the drive with no password.
vold.decrypt trigger_default_encryption Check the drive to see if it is encrypted with no password. If it is, decrypt and mount it, else set vold.decrypt to trigger_restart_min_framework.
vold.decrypt trigger_reset_main Set by vold to shutdown the UI asking for the disk password.
vold.decrypt trigger_post_fs_data Set by vold to prep /data with necessary directories, et al.
vold.decrypt trigger_restart_framework Set by vold to start the real framework and all services.
vold.decrypt trigger_shutdown_framework Set by vold to shutdown the full framework to start encryption.
vold.decrypt trigger_restart_min_framework Set by vold to start the progress bar UI for encryption or prompt for password, depending on the value of ro.crypto.state .
vold.encrypt_progress When the framework starts up, if this property is set, enter the progress bar UI mode.
vold.encrypt_progress 0 to 100 The progress bar UI should display the percentage value set.
vold.encrypt_progress error_partially_encrypted The progress bar UI should display a message that the encryption failed, and give the user an option to factory reset the device.
vold.encrypt_progress error_reboot_failed The progress bar UI should display a message saying encryption completed, and give the user a button to reboot the device. This error is not expected to happen.
vold.encrypt_progress error_not_encrypted The progress bar UI should display a message saying an error occurred, no data was encrypted or lost, and give the user a button to reboot the system.
vold.encrypt_progress error_shutting_down The progress bar UI is not running, so it is unclear who will respond to this error. And it should never happen anyway.
vold.post_fs_data_done 0 Set by vold just before setting vold.decrypt to trigger_post_fs_data .
vold.post_fs_data_done 1 Set by init.rc or init.rc just after finishing the task post-fs-data .

init properties

Property Tanım
ro.crypto.fs_crypto_blkdev Set by the vold command checkpw for later use by the vold command restart .
ro.crypto.state unencrypted Set by init to say this system is running with an unencrypted /data ro.crypto.state encrypted . Set by init to say this system is running with an encrypted /data .

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

These five properties are set by init when it tries to mount /data with parameters passed in from init.rc . vold uses these to setup the crypto mapping.
ro.crypto.tmpfs_options Set by init.rc with the options init should use when mounting the tmpfs /data filesystem.

Init actions

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