Android 11, APK के साथ स्ट्रीमिंग के साथ काम करने वाली साइनिंग स्कीम के साथ काम करता है
सिग्नेचर स्कीम v4. v4 सिग्नेचर, Mercle हैश ट्री पर आधारित है
APK की सभी बाइट पर कैलकुलेट की गई है. यह fs-verity हैश ट्री के स्ट्रक्चर का पूरी तरह से पालन करता है. उदाहरण के लिए, ज़ीरो-पैडिंग
सॉल्ट और ज़ीरो-पैडिंग वाला आखिरी ब्लॉक). Android 11 में उपयोगकर्ता का हस्ताक्षर सेव किया जाता है
एक अलग फ़ाइल में, <apk name>.apk.idsig
एक v4 हस्ताक्षर
इसके लिए, v2 या v3 हस्ताक्षर की ज़रूरत होती है.
फ़ाइल फ़ॉर्मैट
सभी न्यूमेरिक फ़ील्ड, लिटिल एंडियन में हैं. सभी फ़ील्ड में ठीक संख्या है
बाइट होना चाहिए, उनके sizeof()
के तौर पर, कोई इंप्लिसिट पैडिंग नहीं या
अलाइनमेंट जोड़ा गया.
नीचे परिभाषाओं को आसान बनाने के लिए एक सहायक निर्देश दिया गया है.
template <class SizeT> struct sized_bytes { SizeT size; byte bytes[size]; };
मुख्य फ़ाइल सामग्री:
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
हैं
जनरेशन + रूट हैश:
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
नीचे दिया गया निर्देश है:
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
को APK के v3 साइनिंग ब्लॉक से लिया गया है या अगर नहीं, तो लिया गया है v2 ब्लॉक से मौजूद है (apk_डाइजेस्ट देखें)
signature
कोड बनाने और उसकी पुष्टि करने के लिए, कोड को क्रम से लगाना ज़रूरी है
नीचे दिए गए डेटा को बाइनरी ब्लॉब में बदल देता है और उसे
साइन इन करने / पुष्टि करने वाला एल्गोरिदम, साइन किए गए डेटा के तौर पर इस्तेमाल किया जाता है:
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
, APK का पूरा मर्कल ट्री है. इसका हिसाब fs-verity दस्तावेज़ में दिए गए तरीके से लगाया जाता है.
निर्माता और उपभोक्ता
Android SDK टूल का apksigner
टूल अब v4 सिग्नेचर फ़ाइल जनरेट करता है
का इस्तेमाल करें. v4 साइनिंग की सुविधा को भी उसी तरह बंद किया जा सकता है
साइन करने की दूसरी स्कीम की तरह हैं. इससे यह भी पुष्टि की जा सकती है कि v4 सिग्नेचर,
मान्य.
adb
के लिए यह ज़रूरी है कि जब .apk.idsig फ़ाइल, .apk के बगल में मौजूद हो
adb install --incremental
निर्देश चला रहा है
यह .idsig फ़ाइल का इस्तेमाल करके, इंक्रीमेंटल इंस्टॉलेशन को भी आज़माएगा
डिफ़ॉल्ट रूप से इंस्टॉल किया जाता है. अगर इंस्टॉल नहीं होता है, तो यह वापस सामान्य रूप से इंस्टॉल हो जाएगा या
अमान्य.
जब कोई इंस्टॉलेशन सेशन बनाया जाता है, तो नया स्ट्रीमिंग इंस्टॉलेशन एपीआई
PackageInstaller
में स्ट्रिप्ड को स्वीकार किया जाता है
v4 हस्ताक्षर का इस्तेमाल करें.
इस समय, signing_info
को
. Incfs, BLOB से रूट हैश निकालता है.
इंस्टॉलेशन सेशन के दौरान, PackageManagerService यह काम करता है incfs सेsign_info ब्लॉब को पाने के लिए एक ioctl, इसे पार्स करता है और पुष्टि करता है हस्ताक्षर होने चाहिए.
इंंक्रीमेंटल डेटा लोडर कॉम्पोनेंट से, मर्कल ट्री वाले हिस्से को स्ट्रीम करने की उम्मीद की जाती है
साइन इन करने के लिए, डेटा लोडर नेटिव एपीआई का इस्तेमाल करना होगा.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
package
सर्विस शेल कमांड install-incremental
हर एक के लिए पैरामीटर के तौर पर, base64 के तौर पर कोड में बदली गई v4 हस्ताक्षर फ़ाइल को स्वीकार करता है
जोड़ी गई फ़ाइल. इससे संबंधित मर्कल ट्री को
stdin
.
apk_डाइजेस्ट
कॉन्टेंट का ब्यौरा देने के लिए, apk_digest
पहला उपलब्ध है. यह क्रम इस तरह का होता है:
- V3, 1 एमबी ब्लॉक, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
- V3, 4 केबी ब्लॉक, SHA2-256 (CONTENT_DIGEST_VERITY_CHUNKED_SHA256),
- V3, 1 एमबी ब्लॉक, SHA2-256 (CONTENT_DIGEST_CHUNKED_SHA256),
- V2, SHA2-512,
- वर्शन 2, SHA2-256.
अवधि-प्रीफ़िक्स्ड देखें APK सिग्नेचर स्कीम v3 में, लंबाई के प्रीफ़िक्स वाले हस्ताक्षरों का क्रम होगा.
पुष्टि और जांच करना
फ़ीचर यूनिट टेस्ट और सीटीएस का इस्तेमाल करके लागू किए जाने की पुष्टि करें.
CtsIncrementalInstallHostTestCases
- /android/cts/hostsidetests/incrementalinstall
हस्ताक्षर के फ़ॉर्मैट की जांच करना
हस्ताक्षर के फ़ॉर्मैट की जांच करने के लिए, सेटअप करें डेवलपमेंट एनवायरमेंट हो और इन मैन्युअल तरीके से टेस्ट किया जा सके:
$ atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
Android SDK (ADB और apksigner) के साथ सिग्नेचर फ़ॉर्मैट की जांच करना
Android SDK के साथ हस्ताक्षर के फ़ॉर्मैट की जांच करने के लिए, डेवलपमेंट एनवायरमेंट सेटअप करें और यह पक्का करेगा कि आपने IncFS. इसके बाद, टारगेट किए गए फ़िज़िकल डिवाइस या एम्युलेटर पर बिल्ड को फ़्लैश करें. आपको इनकी ज़रूरत होगी का इस्तेमाल करके, मौजूदा APK जनरेट करें या उसे ऐक्सेस करें. इसके बाद, डीबग साइनिंग पासकोड बनाएं. आखिर में, v4 सिग्नेचर फ़ॉर्मैट में apk साइन करें और इंस्टॉल करें बिल्ड-टूल फ़ोल्डर से कॉपी किया जा सकता है.
हस्ताक्षर
$ ./apksigner sign --ks debug.keystore game.apk
इंस्टॉल करें
$ ./adb install game.apk
ये टेस्ट कहां मिल सकते हैं?
/android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java