Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Mã hóa toàn đĩa

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

Mã hóa toàn đĩa đã được giới thiệu cho Android trong phiên bản 4.4, nhưng Android 5.0 đã giới thiệu các tính năng mới này:

  • Đã tạo mã hóa nhanh, chỉ mã hóa các khối đã sử dụng trên phân vùng dữ liệu để tránh việc khởi động lần đầu mất nhiều thời gian. Hiện chỉ có hệ thống tệp ext4 và f2fs hỗ trợ mã hóa nhanh.
  • Đã thêm cờ forceencrypt fstab để mã hóa trong lần khởi động đầu tiên.
  • Đã thêm hỗ trợ cho các mẫu và mã hóa mà không cần mật khẩu.
  • Đã thêm khả năng lưu trữ khóa mã hóa được hỗ trợ bởi phần cứng bằng khả năng ký của Môi trường thực thi đáng tin cậy (TEE) (chẳng hạn như trong TrustZone). Xem Lưu trữ khóa đã mã hóa để 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 và sau đó được mã hóa có thể bị trả về trạng thái không mã hóa bằng cách khôi phục dữ liệu ban đầu. Không thể đưa các thiết bị Android 5.0 mới được mã hóa vào lần khởi động đầu tiên về trạng thái không được mã hóa.

Cách hoạt động của mã hóa toàn đĩa Android

Mã hóa toàn đĩa của Android dựa trên dm-crypt , là một tính năng hạt nhân hoạt động ở lớp thiết bị khối. Do đó, mã hóa hoạt động với Thẻ đa phương tiện nhúng ( eMMC) và các thiết bị flash tương tự hiện diện với hạt nhân dưới dạng thiết bị khối. Không thể mã hóa với YAFFS, nó nói chuyện trực tiếp với chip flash NAND thô.

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

Lưu ý: OEM có thể sử dụng 128-bit hoặc cao hơn để mã hóa khóa chính.

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

  • mặc định
  • GHIM
  • mật khẩu mở khóa
  • mẫu

Khi khởi động lần đầu, thiết bị sẽ tạo một khóa chính 128-bit được tạo ngẫu nhiên và sau đó băm nó 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 kết quả cũng được ký thông qua TEE (chẳng hạn như TrustZone), sử dụng hàm băm của chữ ký để mã hóa khóa 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 hoặc mật khẩu trên thiết bị, chỉ khóa 128 bit được mã hóa lại và lưu trữ. (ví dụ: thay đổi mã PIN / mật khẩu / hình mở khóa của người dùng KHÔNG gây ra mã hóa lại dữ liệu người dùng.) Lưu ý rằng thiết bị được quản lý có thể bị giới hạn về mã PIN, hình mở khóa hoặc mật khẩu.

Mã hóa được quản lý bởi initvold . init gọi vold và vold đặt thuộc tính để kích hoạt các sự kiện trong init. Các bộ phận khác của hệ thống cũng xem xét các thuộc tính để tiến hành 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 khôi phục cài đặt gốc trong trường hợp xảy ra lỗi nghiêm trọng. Để gọi các tính năng mã hóa trong vold , hệ thống sử dụng công cụ dòng lệnh các lệnh cryptfs của vdc : checkpw , restart , enablecrypto , changepw , cryptocomplete , verifypw , setfield , getfield , mountdefaultencrypted , getpwtype , getpwclearpw .

Để mã hóa, giải mã hoặc xóa /data , /data không được gắn kết. Tuy nhiên, để hiển thị bất kỳ giao diện người dùng (UI) nào, khung công tác phải khởi động và khung công tác yêu cầu /data để chạy. Để giải quyết vấn đề hóc búa 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 xóa dữ liệu nếu cần. Nó đặt ra hạn chế 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 quá trình với các tệp đang mở trên hệ thống tệp tạm thời và khởi động lại các quá trình đó trên hệ thống tệp /data thực. Để làm được điều này, tất cả các dịch vụ phải thuộc 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 đĩa.
  • late_start : Không bắt đầu cho đến khi sau khi /data đã được giải mã và gắn kết.

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

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

Chảy

Có bốn luồng cho một thiết bị được mã hóa. Một thiết bị được mã hóa chỉ một lần và sau đó tuân theo quy trình khởi động bình thường.

  • Mã hóa thiết bị chưa được mã hóa trước đó:
    • Mã hóa thiết bị mới bằng forceencrypt : Mã hóa bắt buộc khi khởi động lần đầu (bắt đầu từ Android L).
    • Mã hóa thiết bị hiện có: Mã hóa do người dùng khởi tạo (Android K trở về trước).
  • Khởi động thiết bị được mã hóa:
    • Khởi động thiết bị được mã hóa không có mật khẩu: Khởi động thiết bị được mã hóa không có mật khẩu đã đặt (phù hợp với các thiết bị chạy Android 5.0 trở lên).
    • Khởi động thiết bị được mã hóa bằng mật khẩu: Khởi động thiết bị được mã hóa có mật khẩu đã đặt.

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

Mã hóa 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 không được mã hóa bằng cờ forceencrypt

    /data không được mã hóa nhưng cần phải được vì forceencrypt yêu cầu nó. Ngắt kết nối /data .

  2. Bắt đầu mã hóa /data

    vold.decrypt = "trigger_encryption" kích hoạt init.rc , điều này sẽ khiến vold mã hóa /data không có mật khẩu. (Không có thiết bị nào được đặt vì đây phải là một thiết bị mới.)

  3. Gắn tmpfs

    vold gắn kết một tmpfs /data (sử dụng các tùy chọn tmpfs từ ro.crypto.tmpfs_options ) và đặt thuộc tính vold.encrypt_progress thành 0. vold dự phòng trước tmpfs /data để khởi động hệ thống được mã hóa và đặt thuộc tính vold.decrypt thành: trigger_restart_min_framework

  4. Đưa ra khuôn khổ để hiển thị tiến trình

    Bởi vì thiết bị hầu như không có dữ liệu để mã hóa, thanh tiến trình thường sẽ không thực sự xuất hiện vì quá trình mã hóa diễn ra quá nhanh. Xem Mã hóa thiết bị hiện có để biết thêm chi tiết về giao diện người dùng tiến trình.

  5. Khi /data được mã hóa, hãy gỡ bỏ khuôn khổ

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

  6. Gắn kết /data

    init sau đó gắn kết /data trên tmpfs RAMDisk bằng cách sử dụng các tham số mà nó lấy từ ro.crypto.tmpfs_options , được đặt trong init.rc

  7. Bắt đầu khuôn khổ

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

Mã hóa thiết bị hiện có

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

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

Cảnh báo: Nếu thiết bị hết nguồn và tắt trước khi hoàn tất quá trình mã hóa, dữ liệu tệp sẽ ở trạng thái được mã hóa một phần. Thiết bị phải được khôi phục cài đặt gốc và tất cả dữ liệu sẽ bị mất.

Để kích hoạt mã hóa tại chỗ, vold bắt đầu một vòng lặp để đọc từng sector của thiết bị khối thực và sau đó ghi nó vào thiết bị khối tiền điện tử. vold kiểm tra xem một sector có được sử dụng hay không trước khi đọc và ghi nó, điều này giúp mã hóa 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 on nonencrypted kích hoạt init không được mã hóa để 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 với lệnh cryptfs enablecrypto inplace passwd nơi mật khẩu là mật khẩu màn hình khóa của người dùng.

  2. Gỡ bỏ khuôn khổ

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

  3. Tạo chân trang tiền điện tử
  4. Tạo tệp breadcrumb
  5. Khởi động lại
  6. Phát hiện tệp breadcrumb
  7. Bắt đầu mã hóa /data

    Sau đó vold thiết lập ánh xạ tiền điện tử, tạo ra một thiết bị khối tiền điện tử ảo ánh xạ vào thiết bị khối thực nhưng mã hóa từng khu vực khi nó được viết và giải mã từng khu vực khi nó được đọc. sau đó vold tạo và ghi ra siêu dữ liệu tiền điện tử.

  8. Trong khi mã hóa, hãy gắn kết các tmpfs

    vold gắn kết một tmpfs /data (sử dụng các tùy 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 được mã hóa và đặt thuộc tính vold.decrypt thành: trigger_restart_min_framework

  9. Đưa ra khuôn khổ để 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 khung công tác thấy rằng vold.encrypt_progress được đặt thành 0, nó sẽ hiển thị giao diện người dùng của thanh tiến trình, giao diện người dùng này sẽ truy vấn thuộc tính đó sau mỗi năm giây và cập nhật thanh tiến trình. Vòng lặp mã hóa cập nhật vold.encrypt_progress mỗi khi nó mã hóa một phần trăm phân vùng khác.

  10. Khi /data được mã hóa, hãy cập nhật chân trang tiền điện tử

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

    Khi thiết bị được mở khóa thành công, mật khẩu sau đó sẽ được sử dụng để mã hóa khóa chính và chân mã được cập nhật.

    Nếu khởi động lại không thành công vì lý do nào đó, vold đặ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 dự kiến ​​sẽ không bao giờ xảy ra.

Khởi động thiết bị được mã hóa với mã hóa mặc định

Đây là những gì sẽ xảy ra khi bạn khởi động một thiết bị được mã hóa mà không có mật khẩu. Bởi vì thiết bị Android 5.0 được mã hóa trong lần khởi động đầu tiên, không nên đặt mật khẩu và do đó đây là trạng thái mã hóa mặc định .

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

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

    vold đặt vold.decrypt thành trigger_default_encryption , khởi động dịch vụ defaultcrypto . trigger_default_encryption kiểm tra kiểu mã hóa để xem /data có được mã hóa bằng mật khẩu hay không.

  2. Giải mã / dữ liệu

    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 kết / dữ liệu

    vold sau đó gắn kết phân vùng /data thực được giải mã và sau đó chuẩn bị phân vùng mới. Nó đặt thuộc tính vold.post_fs_data_done thành 0 và 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ủa nó. Họ sẽ tạo bất kỳ thư mục hoặc liên kết cần thiết nào và sau đó đặt vold.post_fs_data_done thành 1.

    Khi vold nhìn thấy giá trị 1 trong thuộc tính đó, nó sẽ đặt thuộc tính vold.decrypt thành: trigger_restart_framework. Điều này khiến init.rc bắt đầu 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. Bắt đầu khuôn khổ

    Bây giờ khung khởi động tất cả các dịch vụ của nó bằng cách sử dụng /data được giải mã và hệ thống đã sẵn sàng để sử dụng.

Khởi động thiết bị được mã hóa mà không có mã hóa mặc định

Đây là những gì sẽ xảy ra khi bạn khởi động một thiết bị được mã hóa có mật khẩu đã đặt. Mật khẩu của thiết bị có thể là mã pin, hình mở khóa hoặc mật khẩu.

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

    Phát hiện rằng thiết bị Android được mã hóa vì cờ ro.crypto.state = "encrypted"

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

  2. Gắn tmpfs

    init đặt năm thuộc tính để lưu các tùy chọn gắn kết 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 này để thiết lập ánh xạ tiền điện tử:

    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ố hex ASCII 8 chữ số đứng trước 0x)
  3. Khởi động khuôn khổ để 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 . Điều này cho khung công tác biết rằng nó đang khởi động trên đĩa tmpfs /data và nó cần lấy mật khẩu người dùng.

    Tuy nhiên, trước tiên, cần đảm bảo rằng đĩa đã được mã hóa đúng cách. Nó gửi lệnh cryptfs cryptocomplete tới vold . vold trả về 0 nếu mã hóa được hoàn thành thành công, -1 đối với lỗi nội bộ hoặc -2 nếu mã hóa không được hoàn tất thành công. vold xác định điều này bằng cách xem siêu dữ liệu tiền điện tử cho cờ CRYPTO_ENCRYPTION_IN_PROGRESS . Nếu nó được đặt, quá trình mã hóa sẽ bị gián đoạn và không có dữ liệu có thể sử dụng 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 để khởi động lại và khôi phục cài đặt gốc cho thiết bị, đồng thời cung cấp cho người dùng một nút để nhấn để làm như vậy.

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

    Sau khi hoàn thành cryptfs cryptocomplete thành công, khung công tác sẽ hiển thị giao diện người dùng yêu cầu mật khẩu đĩ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 tới 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 được giải mã tại vị trí tạm thời, sau đó ngắt kết nối), vold sẽ lưu tên của thiết bị khối được 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, nó sẽ trả về -1 cho giao diện người dùng.

  5. Dừng khuôn khổ

    Giao diện người dùng thiết lập đồ họa khởi động tiền điện tử và sau đó gọi vold với lệnh cryptfs restart . vold đặt thuộc tính vold.decrypt thành trigger_reset_main , điều này khiến init.rc thực hiện class_reset main . Điều này sẽ dừng tất cả các dịch vụ trong lớp chính, điều này cho phép ngắt kết nối tmpfs /data .

  6. Gắn kết /data

    vold sau đó gắn kết phân vùng /data thực đượ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 nó được mã hóa bằng tùy chọn xóa, không được hỗ trợ trên bản phát hành đầu tiên). Nó đặt thuộc tính vold.post_fs_data_done thành 0 và 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ủa nó. Họ sẽ tạo bất kỳ thư mục hoặc liên kết cần thiết nào và sau đó đặt vold.post_fs_data_done thành 1. Khi vold nhìn thấy giá trị 1 trong thuộc tính đó, nó sẽ đặt thuộc tính vold.decrypt thành trigger_restart_framework . Điều này khiến init.rc bắt đầu 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 toàn bộ khuôn khổ

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

Sự thất bại

Một thiết bị không giải mã được có thể bị lỗi vì một vài lý do. Thiết bị bắt đầu với một loạt các bước bình thường để khởi động:

  1. Phát hiện thiết bị được mã hóa bằng mật khẩu
  2. Gắn tmpfs
  3. Khởi động khuôn khổ để nhắc nhập mật khẩu

Nhưng sau khi khung mở, 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 những lỗi này không được giải quyết, hãy nhắc người dùng xóa sạch về cài đặt gốc :

Nếu vold phát hiện ra lỗi trong quá trình mã hóa và nếu chưa có dữ liệu nào bị hủy và khung hoạt động, 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ọ quá trình mã hóa chưa bao giờ bắt đầu. Nếu lỗi xảy ra sau khi khung đã được chia nhỏ, nhưng trước khi giao diện người dùng của thanh tiến trình hoạt động, vold sẽ khởi động lại hệ thống. Nếu khởi động lại không thành công, nó sẽ đặt vold.encrypt_progress thành error_shutting_down và trả về -1; nhưng sẽ không có bất cứ điều gì để bắt lỗi. Điều này không được mong đợi sẽ xảy ra.

Nếu vold phát hiện ra lỗi trong quá trình mã hóa, nó 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 mã hóa không thành công và cung cấp một nút để người dùng khôi phục cài đặt gốc cho thiết bị.

Lưu trữ khóa được mã hóa

Khóa mã hóa được lưu trữ trong siêu dữ liệu tiền điện tử. Hỗ trợ phần cứng được thực hiện bằng cách sử dụng khả năng ký của Môi trường thực thi đáng tin cậy (TEE). Trước đây, chúng tôi đã mã hóa khóa chính bằng khóa được tạo bằng cách áp dụng mã hóa mật khẩu của người dùng và muối được lưu trữ. Để làm cho khóa có khả năng phục hồi trước các cuộc tấn công ngoài hộp, chúng tôi mở rộng thuật toán này bằng cách ký khóa kết quả bằng khóa TEE được lưu trữ. Chữ ký kết quả sau đó được biến thành một khóa có độ dài thích hợp bằng một ứng dụng nữa của scrypt. Sau đó, khóa này được sử dụng để mã hóa và giải mã khóa chính. Để lưu trữ khóa này:

  1. Tạo khóa mã hóa đĩa 16 byte ngẫu nhiên (DEK) và muối 16 byte.
  2. Áp dụng mã scrypt cho mật khẩu người dùng và muối để tạo ra khóa trung gian 32 byte 1 (IK1).
  3. Pad IK1 với kích thước bằng không byte bằng với khóa cá nhân ràng buộc phần cứng (HBK). Cụ thể, chúng tôi đệm là: 00 || IK1 || 00..00; một byte không, 32 byte IK1, 223 byte không.
  4. Ký IK1 được đệm bằng HBK để tạo IK2 256 byte.
  5. Áp dụng scrypt cho IK2 và muối (giống muối ở bước 2) để tạo ra 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ã hóa DEK bằng AES_CBC, với khóa 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 xóa mật khẩu của họ trong cài đặt, giao diện người dùng sẽ gửi lệnh cryptfs changepw tới voldvold mã hóa lại khóa chính của đĩa bằng mật khẩu mới.

Thuộc tính mã hóa

voldinit giao tiếp với nhau bằng cách thiết lập các thuộc tính. Đây là danh sách các thuộc tính có sẵn để mã hóa.

Thuộc tính Vold

Bất động sản Sự miêu tả
vold.decrypt trigger_encryption Mã hóa ổ đĩa mà không cần mật khẩu.
vold.decrypt trigger_default_encryption Kiểm tra ổ đĩa để xem nó có được mã hóa không có mật khẩu hay không. Nếu có, hãy giải mã và gắn kết nó, nếu không hãy đặt vold.decrypt thành trigger_restart_min_framework.
vold.decrypt trigger_reset_main Đặt bởi vold để tắt giao diện người dùng yêu cầu mật khẩu đĩa.
vold.decrypt trigger_post_fs_data Đặt bởi vold thành prep /data với các thư mục cần thiết, et al.
vold.decrypt trigger_restart_framework Được thiết lập bởi vold để bắt đầu khuôn khổ thực và tất cả các dịch vụ.
vold.decrypt trigger_shutdown_framework Đặt bởi vold để tắt toàn bộ khuôn khổ để bắt đầu mã hóa.
vold.decrypt trigger_restart_min_framework Được vold đặt để bắt đầu giao diện người dùng của thanh tiến trình để mã hóa hoặc nhắc nhập mật khẩu, tùy thuộc vào giá trị của ro.crypto.state .
vold.encrypt_progress Khi khung khởi động, nếu thuộc tính này được đặt, hãy nhập chế độ giao diện người dùng của thanh tiến trình.
vold.encrypt_progress 0 to 100 Giao diện người dùng của thanh tiến trình sẽ hiển thị giá trị phần trăm được đặt.
vold.encrypt_progress error_partially_encrypted Giao diện người dùng của thanh tiến trình sẽ hiển thị thông báo rằng mã hóa không thành công và cung cấp cho người dùng tùy chọn để khôi phục cài đặt gốc cho thiết bị.
vold.encrypt_progress error_reboot_failed Giao diện người dùng của thanh tiến trình sẽ hiển thị thông báo cho biết mã hóa đã 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 được mong đợi xảy ra.
vold.encrypt_progress error_not_encrypted Giao diện người dùng của 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 được mã hóa hoặc bị mất và 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 của thanh tiến trình không chạy, vì vậy không rõ ai sẽ phản hồi lại lỗi này. Và nó sẽ không bao giờ xảy ra.
vold.post_fs_data_done 0 Đặt bởi vold 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

Bất động sản Sự miêu tả
ro.crypto.fs_crypto_blkdev Đặt bằng lệnh vold checkpw để sử dụng sau này bằng lệnh vold restart .
ro.crypto.state unencrypted Được đặt bởi init để nói rằng hệ thống này đang chạy với /data ro.crypto.state encrypted . Được đặt bởi init để nói rằng hệ thống này đang chạy với một /data được mã hóa.

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 được đặt bởi init khi nó cố gắng gắn kết /data với các tham số được truyền vào từ init.rc vold sử dụng những thứ này để thiết lập ánh xạ tiền điện tử.
ro.crypto.tmpfs_options Được thiết lập bởi init.rc với các tùy chọn mà init nên sử dụng khi gắn kết hệ thống tệp /data tmpfs.

Init hành động

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