Mã hoá toàn bộ đĩa

Mã hoá toàn bộ ổ đĩa là quá trình mã hoá tất cả dữ liệu người dùng trên thiết bị Android bằng một khoá đã mã hoá. Sau khi thiết bị được mã hoá, tất cả dữ liệu do người dùng tạo sẽ tự động được mã hoá trước khi ghi vào ổ đĩa và tất cả các lượt đọc sẽ tự động giải mã dữ liệu trước khi trả về cho quy trình gọi.

Tính năng mã hoá toàn bộ ổ đĩa được giới thiệu cho Android trong phiên bản 4.4, nhưng Android 5.0 đã ra mắt các tính năng mới sau:

  • Tạo phương thức mã hoá nhanh, chỉ mã hoá các khối đã sử dụng trên phân vùng dữ liệu để tránh mất nhiều thời gian khởi động lần đầu. Chỉ hệ thống tệp ext4 và f2fs mới hỗ trợ tính năng mã hoá nhanh.
  • Thêm cờ fstab forceencrypt để mã hoá trong lần khởi động đầu tiên.
  • Thêm tính năng hỗ trợ cho các mẫu và mã hoá mà không cần mật khẩu.
  • Thêm bộ nhớ được hỗ trợ phần cứng của khoá mã hoá bằng cách sử dụng tính năng ký của Môi trường thực thi đáng tin cậy (TEE) (chẳng hạn như trong TrustZone). Hãy xem phần Lưu trữ khoá đã mã hoá để biết thêm chi tiết.

Thận trọng: Các thiết bị được nâng cấp lên Android 5.0 rồi mã hoá có thể được đưa về trạng thái chưa mã hoá bằng cách đặt lại dữ liệu về trạng thái ban đầu. Không thể đưa các thiết bị Android 5.0 mới được mã hoá ở lần khởi động đầu tiên về trạng thái chưa mã hoá.

Cách hoạt động của tính năng mã hoá toàn bộ ổ đĩa trên Android

Phương thức mã hoá toàn bộ đĩa của Android dựa trên dm-crypt, đây là một tính năng hạt nhân hoạt động ở lớp thiết bị khối. Do đó, tính năng mã hoá hoạt động với Embedded MultiMediaCard (eMMC) và các thiết bị flash tương tự hiển thị với hạt nhân dưới dạng thiết bị khối. Không thể mã hoá bằng YAFFS, vì giao thức này giao tiếp trực tiếp với chip flash NAND thô.

Thuật toán mã hoá là Tiêu chuẩn mã hoá nâng cao (AES) 128 bit với chuỗi khối mật mã (CBC) và ESSIV:SHA256. Khoá chính được mã hoá bằng AES 128 bit thông qua các lệnh gọi đến thư viện OpenSSL. Bạn phải sử dụng 128 bit trở lên cho khoá (không bắt buộc phải dùng 256 bit).

Lưu ý: Nhà sản xuất thiết bị gốc (OEM) có thể sử dụng 128 bit trở lên để mã hoá khoá gốc.

Trong bản phát hành Android 5.0, có 4 loại trạng thái mã hoá:

  • mặc định
  • Mã PIN
  • mật khẩu
  • hình mở khóa

Trong lần khởi động đầu tiên, thiết bị sẽ tạo một khoá chính 128 bit được tạo ngẫu nhiên, sau đó băm khoá đó bằng mật khẩu mặc định và muối được lưu trữ. Mật khẩu mặc định là: "default_password". Tuy nhiên, hàm băm thu được cũng được ký thông qua một TEE (chẳng hạn như TrustZone). TEE này sử dụng hàm băm của chữ ký để mã hoá khoá chính.

Bạn có thể tìm thấy mật khẩu mặc định được xác định trong tệp cryptfs.cpp của Dự án nguồn mở Android.

Khi người dùng đặt mã PIN/mật khẩu trên thiết bị, chỉ khoá 128 bit mới được mã hoá lại và lưu trữ. (tức là các thay đổi về mã PIN/mật khẩu/hình mở khoá của người dùng KHÔNG gây ra việc mã hoá lại dữ liệu người dùng.) Xin lưu ý rằng thiết bị được quản lý có thể phải tuân theo các quy định hạn chế về mã PIN, hình mở khoá hoặc mật khẩu.

Quá trình mã hoá do initvold quản lý. init gọi vold và vold đặt các thuộc tính để kích hoạt các sự kiện trong quá trình khởi động. Các phần khác của hệ thống cũng xem xét các thuộc tính để thực hiện các tác vụ như báo cáo trạng thái, yêu cầu mật khẩu hoặc nhắc đặt lại về trạng thái ban đầu trong trường hợp xảy ra lỗi nghiêm trọng. Để gọi các tính năng mã hoá trong vold, hệ thống sử dụng các lệnh cryptfs của công cụ dòng lệnh vdc: checkpw, restart, enablecrypto, changepw, cryptocomplete, verifypw, setfield, getfield, mountdefaultencrypted, getpwtype, getpwclearpw.

Để mã hoá, giải mã hoặc xoá sạch /data, bạn không được gắn /data. Tuy nhiên, để hiển thị bất kỳ giao diện người dùng (UI) nào, khung phải bắt đầu và khung này yêu cầu /data chạy. Để giải quyết vấn đề này, một hệ thống tệp tạm thời được gắn trên /data. Điều này cho phép Android nhắc nhập mật khẩu, hiển thị tiến trình hoặc đề xuất xoá dữ liệu nếu cần. Phương thức này có giới hạn là để chuyển từ hệ thống tệp tạm thời sang hệ thống tệp /data thực, hệ thống phải dừng mọi quy trình có tệp đang mở trên hệ thống tệp tạm thời và khởi động lại các quy trình đó trên hệ thống tệp /data thực. Để làm việc này, tất cả các dịch vụ phải nằm trong một trong ba nhóm: core, mainlate_start.

  • core: Không bao giờ tắt sau khi khởi động.
  • main: Tắt rồi khởi động lại sau khi nhập mật khẩu của ổ đĩa.
  • late_start: Không bắt đầu cho đến khi /data được giải mã và gắn.

Để kích hoạt các hành động này, thuộc tính vold.decrypt được đặt thành nhiều chuỗi. Để tắt và khởi động lại các dịch vụ, lệnh init là:

  • class_reset: Dừng một dịch vụ nhưng cho phép khởi động lại dịch vụ đó bằng class_start.
  • class_start: Khởi động lại một dịch vụ.
  • class_stop: Dừng một dịch vụ và thêm cờ SVC_DISABLED. Các dịch vụ đã dừng không phản hồi class_start.

Luồng

Có 4 luồng cho một thiết bị được mã hoá. Thiết bị chỉ được mã hoá một lần rồi tuân theo quy trình khởi động thông thường.

  • Mã hoá một thiết bị chưa được mã hoá trước đó:
    • Mã hoá thiết bị mới bằng forceencrypt: Mã hoá bắt buộc trong lần khởi động đầu tiên (kể từ Android L).
    • Mã hoá thiết bị hiện có: Mã hoá do người dùng khởi tạo (Android K trở xuống).
  • Khởi động thiết bị đã mã hoá:
    • Khởi động thiết bị đã mã hoá không có mật khẩu: Khởi động thiết bị đã mã hoá không có mật khẩu được đặt (liên quan đến các thiết bị chạy Android 5.0 trở lên).
    • Khởi động thiết bị đã mã hoá bằng mật khẩu: Khởi động thiết bị đã mã hoá đã đặt mật khẩu.

Ngoài các luồng này, thiết bị cũng có thể không mã hoá được /data. Mỗi luồng sẽ được giải thích chi tiết bên dưới.

Mã hoá thiết bị mới bằng forceencrypt

Đây là lần khởi động đầu tiên bình thường cho thiết bị Android 5.0.

  1. Phát hiện hệ thống tệp chưa mã hoá bằng cờ forceencrypt

    /data không được mã hoá nhưng cần được mã hoá vì forceencrypt yêu cầu điều này. Huỷ gắn /data.

  2. Bắt đầu mã hoá /data

    vold.decrypt = "trigger_encryption" kích hoạt init.rc, làm cho vold mã hoá /data mà không cần mật khẩu. (Không có giá trị nào được đặt vì đây là thiết bị mới.)

  3. Gắn tmpfs

    vold gắn một /data tmpfs (sử dụng các tuỳ chọn tmpfs từ ro.crypto.tmpfs_options) và đặt thuộc tính vold.encrypt_progress thành 0. vold chuẩn bị tmpfs /data để khởi động hệ thống đã mã hoá và đặt thuộc tính vold.decrypt thành: trigger_restart_min_framework

  4. Hiện khung để hiển thị tiến trình

    Vì thiết bị hầu như không có dữ liệu để mã hoá nên thanh tiến trình sẽ không xuất hiện thường xuyên vì quá trình mã hoá diễn ra rất nhanh. Hãy xem phần Mã hoá thiết bị hiện có để biết thêm thông tin chi tiết về giao diện người dùng cho tiến trình.

  5. Khi /data được mã hoá, hãy gỡ bỏ khung

    vold đặt vold.decrypt thành trigger_default_encryption để bắt đầu dịch vụ defaultcrypto. (Thao tác này sẽ bắt đầu quy trình bên dưới để gắn dữ liệu người dùng được mã hoá mặc định.) trigger_default_encryption kiểm tra loại mã hoá để xem /data có được mã hoá bằng mật khẩu hay không. Vì các thiết bị Android 5.0 được mã hoá trong lần khởi động đầu tiên, nên bạn không nên đặt mật khẩu; do đó, chúng ta sẽ giải mã và gắn /data.

  6. Gắn /data

    Sau đó, init sẽ gắn /data trên một RAMDisk tmpfs bằng các tham số mà nó lấy từ ro.crypto.tmpfs_options, được đặt trong init.rc.

  7. Khung bắt đầu

    vold đặt vold.decrypt thành trigger_restart_framework, tiếp tục quá trình khởi động thông thường.

Mã hoá thiết bị hiện có

Đây là những gì xảy ra khi bạn mã hoá một thiết bị Android K hoặc thiết bị cũ hơn chưa mã hoá đã được di chuyển sang L.

Quá trình này do người dùng khởi tạo và được gọi là "mã hoá tại chỗ" trong mã. Khi người dùng chọn mã hoá một thiết bị, giao diện người dùng sẽ đảm bảo pin đã sạc đầy và bộ sạc nguồn AC đã được cắm để có đủ nguồn điện hoàn tất quá trình mã hoá.

Cảnh báo: Nếu thiết bị hết pin và tắt trước khi hoàn tất quá trình mã hoá, thì dữ liệu tệp sẽ ở trạng thái mã hoá một phần. Thiết bị phải được đặt lại về trạng thái ban đầu và mọi dữ liệu sẽ bị mất.

Để bật tính năng mã hoá tại chỗ, vold sẽ bắt đầu một vòng lặp để đọc từng phân đoạn của thiết bị khối thực, sau đó ghi phân đoạn đó vào thiết bị khối mã hoá. vold kiểm tra xem một phân đoạn có đang được sử dụng hay không trước khi đọc và ghi phân đoạn đó, giúp quá trình mã hoá nhanh hơn nhiều trên một thiết bị mới có ít hoặc không có dữ liệu.

Trạng thái của thiết bị: Đặt ro.crypto.state = "unencrypted" và thực thi trình kích hoạt on nonencrypted init để tiếp tục khởi động.

  1. Kiểm tra mật khẩu

    Giao diện người dùng gọi vold bằng lệnh cryptfs enablecrypto inplace, trong đó passwd là mật khẩu màn hình khoá của người dùng.

  2. Gỡ bỏ khung

    vold kiểm tra lỗi, trả về -1 nếu không thể mã hoá và in lý do trong nhật ký. Nếu có thể mã hoá, phương thức này sẽ đặt thuộc tính vold.decrypt thành trigger_shutdown_framework. Điều này khiến init.rc ngừng các dịch vụ trong lớp late_startmain.

  3. Tạo chân trang mã hoá
  4. Tạo tệp đường dẫn
  5. Khởi động lại
  6. Phát hiện tệp đường dẫn
  7. Bắt đầu mã hoá /data

    Sau đó, vold sẽ thiết lập ánh xạ mã hoá, tạo một thiết bị khối mã hoá ảo ánh xạ đến thiết bị khối thực nhưng mã hoá từng phân đoạn khi được ghi và giải mã từng phân đoạn khi được đọc. Sau đó, vold sẽ tạo và ghi siêu dữ liệu mã hoá.

  8. Trong khi mã hoá, hãy gắn tmpfs

    vold gắn một tmpfs /data (sử dụng các tuỳ chọn tmpfs từ ro.crypto.tmpfs_options) và đặt thuộc tính vold.encrypt_progress thành 0. vold chuẩn bị tmpfs /data để khởi động hệ thống đã mã hoá và đặt thuộc tính vold.decrypt thành: trigger_restart_min_framework

  9. Hiện khung để hiển thị tiến trình

    trigger_restart_min_framework khiến init.rc khởi động lớp dịch vụ main. Khi thấy vold.encrypt_progress được đặt thành 0, khung sẽ hiển thị giao diện người dùng thanh tiến trình. Giao diện này truy vấn thuộc tính đó 5 giây một lần và cập nhật thanh tiến trình. Vòng lặp mã hoá sẽ cập nhật vold.encrypt_progress mỗi khi mã hoá một phần trăm khác của phân vùng.

  10. Khi /data được mã hoá, hãy cập nhật chân trang mã hoá

    Khi /data được mã hoá thành công, vold sẽ xoá cờ ENCRYPTION_IN_PROGRESS trong siêu dữ liệu.

    Khi mở khoá thiết bị thành công, mật khẩu sẽ được dùng để mã hoá khoá chính và chân trang mã hoá sẽ được cập nhật.

    Nếu không khởi động lại được vì lý do nào đó, vold sẽ đặt thuộc tính vold.encrypt_progress thành error_reboot_failed và giao diện người dùng sẽ hiển thị thông báo yêu cầu người dùng nhấn nút để khởi động lại. Điều này không bao giờ xảy ra.

Khởi động thiết bị đã mã hoá bằng phương thức mã hoá mặc định

Đây là điều xảy ra khi bạn khởi động một thiết bị đã mã hoá mà không có mật khẩu. Vì các thiết bị Android 5.0 được mã hoá trong lần khởi động đầu tiên, nên bạn không cần đặt mật khẩu. Do đó, đây là trạng thái mã hoá mặc định.

  1. Phát hiện /data đã mã hoá không có mật khẩu

    Phát hiện thiết bị Android được mã hoá vì không thể gắn /data và một trong các cờ encryptable hoặc forceencrypt được đặt.

    vold đặt vold.decrypt thành trigger_default_encryption, bắt đầu dịch vụ defaultcrypto. trigger_default_encryption kiểm tra loại mã hoá để xem /data có được mã hoá bằng mật khẩu hay không.

  2. Giải mã /data

    Tạo thiết bị dm-crypt trên thiết bị khối để thiết bị sẵn sàng sử dụng.

  3. Gắn /data

    Sau đó, vold sẽ gắn phân vùng /data thực đã giải mã rồi chuẩn bị phân vùng mới. Hàm này đặt thuộc tính vold.post_fs_data_done thành 0, sau đó đặt vold.decrypt thành trigger_post_fs_data. Điều này khiến init.rc chạy các lệnh post-fs-data. Các hàm này tạo mọi thư mục hoặc đường liên kết cần thiết rồi đặt vold.post_fs_data_done thành 1.

    Khi thấy giá trị 1 trong thuộc tính đó, vold sẽ đặt thuộc tính vold.decrypt thành: trigger_restart_framework.. Điều này sẽ khiến init.rc khởi động lại các dịch vụ trong lớp main và cũng khởi động các dịch vụ trong lớp late_start lần đầu tiên kể từ khi khởi động.

  4. Khung bắt đầu

    Giờ đây, khung này sẽ khởi động tất cả dịch vụ bằng /data đã giải mã và hệ thống đã sẵn sàng để sử dụng.

Khởi động thiết bị đã mã hoá mà không cần mã hoá mặc định

Đây là điều xảy ra khi bạn khởi động một thiết bị đã mã hoá có mật khẩu đã đặt. Mật khẩu của thiết bị có thể là mã PIN, hình mở khoá hoặc mật khẩu.

  1. Phát hiện thiết bị được mã hoá bằng mật khẩu

    Phát hiện thiết bị Android được mã hoá vì cờ ro.crypto.state = "encrypted"

    vold đặt vold.decrypt thành trigger_restart_min_framework/data được mã hoá bằng mật khẩu.

  2. Gắn tmpfs

    init đặt 5 thuộc tính để lưu các tuỳ chọn gắn ban đầu được cung cấp cho /data với các tham số được truyền từ init.rc. vold sử dụng các thuộc tính sau để thiết lập ánh xạ mã hoá:

    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 (Số thập lục phân gồm 8 chữ số ASCII, đứng trước là 0x)
  3. Bắt đầu khung để nhắc nhập mật khẩu

    Khung khởi động và thấy rằng vold.decrypt được đặt thành trigger_restart_min_framework. Thao tác này cho khung biết rằng khung đang khởi động trên ổ đĩa /data tmpfs và cần lấy mật khẩu người dùng.

    Tuy nhiên, trước tiên, bạn cần đảm bảo rằng ổ đĩa đã được mã hoá đúng cách. Phương thức này gửi lệnh cryptfs cryptocomplete đến vold. vold trả về 0 nếu quá trình mã hoá đã hoàn tất, -1 nếu gặp lỗi nội bộ hoặc -2 nếu quá trình mã hoá chưa hoàn tất. vold xác định điều này bằng cách tìm cờ CRYPTO_ENCRYPTION_IN_PROGRESS trong siêu dữ liệu mã hoá. Nếu bạn đặt giá trị này, quá trình mã hoá sẽ bị gián đoạn và không có dữ liệu nào có thể sử dụng được trên thiết bị. Nếu vold trả về lỗi, giao diện người dùng sẽ hiển thị thông báo cho người dùng về việc khởi động lại và đặt lại thiết bị về trạng thái ban đầu, đồng thời cung cấp cho người dùng một nút để nhấn để thực hiện việc này.

  4. Giải mã dữ liệu bằng mật khẩu

    Sau khi cryptfs cryptocomplete thành công, khung sẽ hiển thị một giao diện người dùng yêu cầu mật khẩu của ổ đĩa. Giao diện người dùng kiểm tra mật khẩu bằng cách gửi lệnh cryptfs checkpw đến vold. Nếu mật khẩu chính xác (được xác định bằng cách gắn thành công /data đã giải mã tại một vị trí tạm thời, sau đó tháo thiết bị đó), vold sẽ lưu tên của thiết bị khối đã giải mã trong thuộc tính ro.crypto.fs_crypto_blkdev và trả về trạng thái 0 cho giao diện người dùng. Nếu mật khẩu không chính xác, hàm này sẽ trả về -1 cho giao diện người dùng.

  5. Khung dừng

    Giao diện người dùng hiển thị một đồ hoạ khởi động mã hoá, sau đó gọi vold bằng lệnh cryptfs restart. vold đặt thuộc tính vold.decrypt thành trigger_reset_main, khiến init.rc thực hiện class_reset main. Thao tác này sẽ dừng tất cả các dịch vụ trong lớp chính, cho phép tháo /data tmpfs.

  6. Gắn /data

    Sau đó, vold sẽ gắn phân vùng /data thực đã giải mã và chuẩn bị phân vùng mới (có thể chưa bao giờ được chuẩn bị nếu phân vùng đó được mã hoá bằng tuỳ chọn xoá, không được hỗ trợ trong bản phát hành đầu tiên). Phương thức này đặt thuộc tính vold.post_fs_data_done thành 0, sau đó đặt vold.decrypt thành trigger_post_fs_data. Điều này khiến init.rc chạy các lệnh post-fs-data. Các hàm này tạo mọi thư mục hoặc đường liên kết cần thiết, sau đó đặt vold.post_fs_data_done thành 1. Khi thấy 1 trong thuộc tính đó, vold sẽ đặt thuộc tính vold.decrypt thành trigger_restart_framework. Điều này khiến init.rc khởi động lại các dịch vụ trong lớp main và cũng khởi động các dịch vụ trong lớp late_start lần đầu tiên kể từ khi khởi động.

  7. Bắt đầu khung đầy đủ

    Giờ đây, khung này sẽ khởi động tất cả dịch vụ bằng cách sử dụng hệ thống tệp /data đã giải mã và hệ thống đã sẵn sàng để sử dụng.

Lỗi

Thiết bị không thể giải mã có thể gặp sự cố vì một số lý do. Thiết bị khởi động bằng một loạt các bước thông thường:

  1. Phát hiện thiết bị được mã hoá bằng mật khẩu
  2. Gắn tmpfs
  3. Bắt đầu khung để nhắc nhập mật khẩu

Tuy nhiên, sau khi khung mở ra, thiết bị có thể gặp một số lỗi:

  • Mật khẩu khớp nhưng không thể giải mã dữ liệu
  • Người dùng nhập sai mật khẩu 30 lần

Nếu không khắc phục được các lỗi này, hãy nhắc người dùng xoá sạch dữ liệu:

Nếu vold phát hiện lỗi trong quá trình mã hoá và nếu chưa có dữ liệu nào bị huỷ và khung đang hoạt động, thì vold sẽ đặt thuộc tính vold.encrypt_progress thành error_not_encrypted. Giao diện người dùng nhắc người dùng khởi động lại và thông báo cho họ rằng quá trình mã hoá chưa bao giờ bắt đầu. Nếu lỗi xảy ra sau khi khung đã bị phá bỏ, nhưng trước khi giao diện người dùng thanh tiến trình xuất hiện, vold sẽ khởi động lại hệ thống. Nếu khởi động lại không thành công, hàm này sẽ đặt vold.encrypt_progress thành error_shutting_down và trả về -1; nhưng sẽ không có gì để phát hiện lỗi. Đây là lỗi ngoài dự kiến.

Nếu phát hiện lỗi trong quá trình mã hoá, vold sẽ đặt vold.encrypt_progress thành error_partially_encrypted và trả về -1. Sau đó, giao diện người dùng sẽ hiển thị thông báo cho biết quá trình mã hoá không thành công và cung cấp một nút để người dùng đặt lại thiết bị về trạng thái ban đầu.

Lưu trữ khoá đã mã hoá

Khoá đã mã hoá được lưu trữ trong siêu dữ liệu mã hoá. Tính năng sao lưu phần cứng được triển khai bằng cách sử dụng tính năng ký của Môi trường thực thi đáng tin cậy (TEE). Trước đây, chúng ta đã mã hoá khoá chính bằng một khoá được tạo bằng cách áp dụng scrypt cho mật khẩu của người dùng và muối được lưu trữ. Để giúp khoá này chống chịu được các cuộc tấn công bên ngoài, chúng tôi mở rộng thuật toán này bằng cách ký khoá thu được bằng khoá TEE đã lưu trữ. Sau đó, chữ ký thu được sẽ được chuyển thành khoá có độ dài thích hợp bằng một ứng dụng scrypt khác. Sau đó, khoá này được dùng để mã hoá và giải mã khoá chính. Cách lưu trữ khoá này:

  1. Tạo khoá mã hoá ổ đĩa (DEK) 16 byte và muối 16 byte ngẫu nhiên.
  2. Áp dụng scrypt cho mật khẩu người dùng và muối để tạo khoá trung gian 1 (IK1) có kích thước 32 byte.
  3. Đổ đệm IK1 bằng 0 byte cho đến kích thước của khoá riêng tư liên kết với phần cứng (HBK). Cụ thể, chúng ta sẽ thêm vào như sau: 00 || IK1 || 00..00; một byte rỗng, 32 byte IK1, 223 byte rỗng.
  4. Ký IK1 được đệm bằng HBK để tạo IK2 256 byte.
  5. Áp dụng scrypt cho IK2 và salt (mã muối giống như bước 2) để tạo IK3 32 byte.
  6. Sử dụng 16 byte đầu tiên của IK3 làm KEK và 16 byte cuối cùng làm IV.
  7. Mã hoá DEK bằng AES_CBC, với khoá KEK và vectơ khởi tạo IV.

Thay đổi mật khẩu

Khi người dùng chọn thay đổi hoặc xoá mật khẩu trong phần cài đặt, giao diện người dùng sẽ gửi lệnh cryptfs changepw đến voldvold sẽ mã hoá lại khoá chính của ổ đĩa bằng mật khẩu mới.

Thuộc tính mã hoá

voldinit giao tiếp với nhau bằng cách đặt các thuộc tính. Dưới đây là danh sách các thuộc tính có sẵn để mã hoá.

Thuộc tính Vold

Thuộc tính Mô tả
vold.decrypt trigger_encryption Mã hoá ổ đĩa mà không cần mật khẩu.
vold.decrypt trigger_default_encryption Kiểm tra ổ đĩa để xem ổ đĩa có được mã hoá mà không cần mật khẩu hay không. Nếu có, hãy giải mã và gắn tệp đó, nếu không, hãy đặt vold.decrypt thành trigger_restart_min_framework.
vold.decrypt trigger_reset_main Do vold đặt để tắt giao diện người dùng yêu cầu mật khẩu ổ đĩa.
vold.decrypt trigger_post_fs_data Được đặt bởi vold để chuẩn bị /data bằng các thư mục cần thiết, v.v.
vold.decrypt trigger_restart_framework Do vold đặt để bắt đầu khung thực và tất cả dịch vụ.
vold.decrypt trigger_shutdown_framework Được vold đặt để tắt toàn bộ khung để bắt đầu mã hoá.
vold.decrypt trigger_restart_min_framework Do vold đặt để bắt đầu giao diện người dùng thanh tiến trình cho quá trình mã hoá hoặc nhắc nhập mật khẩu, tuỳ thuộc vào giá trị của ro.crypto.state.
vold.encrypt_progress Khi khung khởi động, nếu bạn đặt thuộc tính này, hãy chuyển sang chế độ giao diện người dùng thanh tiến trình.
vold.encrypt_progress 0 to 100 Giao diện người dùng thanh tiến trình sẽ hiển thị giá trị phần trăm đã đặt.
vold.encrypt_progress error_partially_encrypted Giao diện người dùng thanh tiến trình sẽ hiển thị thông báo rằng quá trình mã hoá không thành công và cho phép người dùng đặt lại thiết bị về trạng thái ban đầu.
vold.encrypt_progress error_reboot_failed Giao diện người dùng thanh tiến trình sẽ hiển thị thông báo cho biết quá trình mã hoá đã hoàn tất và cung cấp cho người dùng một nút để khởi động lại thiết bị. Lỗi này không dự kiến sẽ xảy ra.
vold.encrypt_progress error_not_encrypted Giao diện người dùng thanh tiến trình sẽ hiển thị thông báo cho biết đã xảy ra lỗi, không có dữ liệu nào bị mã hoá hoặc bị mất, đồng thời cung cấp cho người dùng một nút để khởi động lại hệ thống.
vold.encrypt_progress error_shutting_down Giao diện người dùng thanh tiến trình không chạy, vì vậy, không rõ ai sẽ phản hồi lỗi này. Và điều này không bao giờ xảy ra.
vold.post_fs_data_done 0 Được vold đặt ngay trước khi đặt vold.decrypt thành trigger_post_fs_data.
vold.post_fs_data_done 1 Được đặt bởi init.rc hoặc init.rc ngay sau khi hoàn thành tác vụ post-fs-data.

thuộc tính init

Thuộc tính Mô tả
ro.crypto.fs_crypto_blkdev Được đặt bởi lệnh vold checkpw để sử dụng sau đó bằng lệnh vold restart.
ro.crypto.state unencrypted Được init đặt để cho biết hệ thống này đang chạy với một /data ro.crypto.state encrypted chưa mã hoá. Do init đặt để cho biết hệ thống này đang chạy bằng /data được mã hoá.

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

Năm thuộc tính này do init đặt khi cố gắng gắn /data bằng các tham số được truyền từ init.rc. vold sử dụng các giá trị này để thiết lập mối liên kết mật mã.
ro.crypto.tmpfs_options Được đặt bởi init.rc với các tuỳ chọn khởi động sẽ sử dụng khi gắn hệ thống tệp /data tmpfs.

hành động khởi tạo

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