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.

Lược đồ chữ ký APK v4

Android 11 hỗ trợ sơ đồ ký tương thích với luồng với Sơ đồ chữ ký APK v4. Chữ ký v4 dựa trên cây băm Merkle được tính toán trên tất cả các byte của APK. Nó tuân theo chính xác cấu trúc của cây băm fs-verity (ví dụ: không đệm muối và không đệm khối cuối cùng). Android 11 lưu trữ chữ ký trong một tệp riêng, <apk name>.apk.idsig Chữ ký v4 yêu cầu chữ ký v2 hoặc v3 bổ sung.

Định dạng tệp

Tất cả các trường số đều ở dạng endian nhỏ. Tất cả các trường chiếm chính xác số byte như là sizeof() , không có phần đệm hoặc căn chỉnh ngầm nào được thêm vào.

Dưới đây là cấu trúc trình trợ giúp để đơn giản hóa các định nghĩa.

template <class SizeT>
struct sized_bytes {
        SizeT size;
        byte bytes[size];
};

Nội dung tệp chính:

struct V4Signature {
        int32 version; // only version 2 is supported as of now
        sized_bytes<int32> hashing_info;
        sized_bytes<int32> signing_info;
        sized_bytes<int32> merkle_tree;  // optional
};

hashing_info là các tham số được sử dụng để tạo cây băm + băm gốc:

struct hashing_info.bytes {
    int32 hash_algorithm;    // only 1 == SHA256 supported
    int8 log2_blocksize;     // only 12 (block size 4096) supported now
    sized_bytes<int32> salt; // used exactly as in fs-verity, 32 bytes max
    sized_bytes<int32> raw_root_hash; // salted digest of the first Merkle tree page
};

signing_info là cấu trúc sau:

struct signing_info.bytes {
    sized_bytes<int32> apk_digest;  // used to match with the corresponding APK
    sized_bytes<int32> x509_certificate; // ASN.1 DER form
    sized_bytes<int32> additional_data; // a free-form binary data blob
    sized_bytes<int32> public_key; // ASN.1 DER, must match the x509_certificate
    int32 signature_algorithm_id; // see the APK v2 doc for the list
    sized_bytes<int32> signature;
};
  • apk_digest được lấy từ khối ký v3 của APK hoặc nếu không có, từ khối v2 (xem apk_digest )

Để tạo và xác minh mã signature phải tuần tự hóa dữ liệu sau đây thành khối nhị phân và chuyển nó vào thuật toán ký / xác minh dưới dạng dữ liệu đã ký :

struct V4DataForSigning {
        int32 size;
        int64 file_size; // the size of the file that's been hashed.
        hashing_info.hash_algorithm;
        hashing_info.log2_blocksize;
        hashing_info.salt;
        hashing_info.raw_root_hash;
        signing_info.apk_digest;
        signing_info.x509_certificate;
        signing_info.additional_data;
};
  1. merkle_treetoàn bộ cây Merkle của APK, được tính toán như mô tả trong tài liệu fs-verity .

Người sản xuất và người tiêu dùng

Công cụ apksigner Android SDK hiện tạo tệp chữ ký v4 nếu bạn chạy nó với các tham số mặc định. Ký v4 có thể bị vô hiệu hóa theo cách tương tự như các chương trình ký khác. Nó cũng có thể xác minh xem chữ ký v4 có hợp lệ hay không.

adb mong đợi tệp .apk.idsig hiện diện bên cạnh .apk khi chạy adb install --incremental
Nó cũng sẽ sử dụng tệp .idsig để thử cài đặt Tăng dần theo mặc định và sẽ trở lại cài đặt thông thường nếu nó bị thiếu hoặc không hợp lệ.

Khi một phiên cài đặt được tạo, API cài đặt phát trực tuyến mới trong PackageInstaller chấp nhận chữ ký v4 bị tước bỏ làm đối số riêng biệt khi thêm tệp vào phiên. Tại thời điểm này, signing_info được chuyển vào incfs dưới dạng toàn bộ blob. Incfs trích xuất mã băm gốc từ đốm màu.

Khi phiên cài đặt đang được cam kết, PackageManagerService thực hiện một ioctl để truy xuất blob sign_info từ incfs, phân tích cú pháp nó và xác minh chữ ký.

Thành phần của Trình tải dữ liệu tăng dần sẽ truyền trực tuyến phần cây Merkle của chữ ký thông qua API gốc của trình tải dữ liệu.
package service shell command install-incremental chấp nhận tệp chữ ký v4 tước được mã hóa dưới dạng base64 làm tham số cho mỗi tệp được thêm vào. Cây Merkle tương ứng phải được gửi vào stdin của lệnh.

apk_digest

apk_digest là thông báo nội dung có sẵn đầu tiên theo thứ tự:

  1. V3, khối 1MB, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
  2. V3, khối 4KB, SHA2-256 (CONTENT_DIGEST_VERITY_CHUNKED_SHA256),
  3. V3, khối 1MB, SHA2-256 (CONTENT_DIGEST_CHUNKED_SHA256),
  4. V2, SHA2-512,
  5. V2, SHA2-256.

Xem chuỗi chữ ký có tiền tố độ dài có tiền tố độ dài trong Sơ đồ chữ ký APK v3.

quy trình xác thực apk v4
Hình 1 : Quy trình xác thực APK v4

Xác nhận và thử nghiệm

Xác thực việc triển khai bằng Kiểm tra Đơn vị Tính năng và CTS.

  • CtsIncrementalInstallHostTestCases
    • / android / cts / hostsidetests / incrementalinstall

Kiểm tra định dạng chữ ký

Để kiểm tra định dạng chữ ký, hãy thiết lập môi trường phát triển và chạy các kiểm tra thủ công sau:

$ atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest

Kiểm tra định dạng chữ ký với Android SDK (ADB và apksigner)

Để kiểm tra định dạng chữ ký với Android SDK, hãy thiết lập môi trường phát triển và đảm bảo bạn đã hoàn thành việc triển khai IncFS . Sau đó, flash bản dựng trên thiết bị vật lý mục tiêu hoặc trình mô phỏng. Bạn cần tạo hoặc lấy APK hiện có và sau đó tạo khóa ký gỡ lỗi . Cuối cùng, ký và cài đặt apk với định dạng chữ ký v4 từ thư mục công cụ xây dựng.

Ký tên

$ ./apksigner sign --ks debug.keystore game.apk

Tải về

$ ./adb install game.apk

Có thể tìm thấy những bài kiểm tra này ở đâu?

/android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java