Android 11 hỗ trợ sơ đồ ký tương thích với tính năng phát trực tuyến với Lược đồ chữ ký APK v4. Chữ ký v4 dựa trên cây băm Merkle được tính trên tất cả byte của APK. Nó tuân theo cấu trúc của cây băm fs-verity một cách chính xác (ví dụ: đệm 0 cho muối và đệm 0 cho khối cuối cùng). Android 11 lưu trữ chữ ký trong một tệp riêng biệt, <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ư sizeof()
của chúng, không thêm phần đệm hoặc căn chỉnh ngầm định.
Dưới đây là cấu trúc 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 tin 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 + hà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 thành blob 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; };
-
merkle_tree
là toà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
apksigner
Công cụ SDK Android 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. Việc 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
yêu cầu tệp .apk.idsig xuất hiện bên cạnh .apk khi chạy lệnh 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ẽ quay lại cài đặt thông thường nếu nó bị thiếu hoặc không hợp lệ.
Khi 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ị loại bỏ làm đối số riêng 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 hàm băm gốc từ blob.
Khi phiên cài đặt đang được cam kết, PackageManagerService thực hiện ioctl để truy xuất blob signature_info từ incfs, phân tích cú pháp và xác minh chữ ký.
Thành phần Trình tải dữ liệu gia tăng dự kiến sẽ truyền phần chữ ký của cây Merkle thông qua API gốc của trình tải dữ liệu.
Lệnh shell package
vụ gói install-incremental
chấp nhận tệp chữ ký v4 bị loại bỏ đượ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à bản tóm tắt nội dung có sẵn đầu tiên theo thứ tự:
- V3, khối 1MB, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
- Khối V3, 4KB, SHA2-256 (CONTENT_DIGEST_VERITY_CHUNKED_SHA256),
- V3, khối 1MB, SHA2-256 (CONTENT_DIGEST_CHUNKED_SHA256),
- V2, SHA2-512,
- V2, SHA2-256.
Xem chuỗi chữ ký có tiền tố độ dài có tiền tố dài trong Lược đồ chữ ký APK v3.
Xác nhận và thử nghiệm
Xác thực việc triển khai bằng cách sử dụng Kiểm tra đơn vị tính năng và CTS.
-
CtsIncrementalInstallHostTestCases
- /android/cts/hostsidetests/cài đặt tăng dần
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 SDK Android (ADB và apksigner)
Để kiểm tra định dạng chữ ký bằng SDK Android, hãy thiết lập môi trường phát triển và đảm bảo bạn đã hoàn tất quá trình triển khai IncFS . Sau đó flash bản dựng trên thiết bị vật lý hoặc trình mô phỏng mục tiêu. Bạn cần tạo hoặc lấy APK hiện có rồi tạo khóa ký gỡ lỗi . Cuối cùng, ký và cài đặt apk có định dạng chữ ký v4 từ thư mục công cụ xây dựng.
Dấu hiệu
$ ./apksigner sign --ks debug.keystore game.apk
Cài đặt
$ ./adb install game.apk
Những bài kiểm tra này có thể được tìm thấy ở đâu?
/android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java