APK सिग्नेचर स्कीम v4

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;
};
  1. 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 पहला उपलब्ध है. यह क्रम इस तरह का होता है:

  1. V3, 1 एमबी ब्लॉक, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
  2. V3, 4 केबी ब्लॉक, SHA2-256 (CONTENT_DIGEST_VERITY_CHUNKED_SHA256),
  3. V3, 1 एमबी ब्लॉक, SHA2-256 (CONTENT_DIGEST_CHUNKED_SHA256),
  4. V2, SHA2-512,
  5. वर्शन 2, SHA2-256.

अवधि-प्रीफ़िक्स्ड देखें APK सिग्नेचर स्कीम v3 में, लंबाई के प्रीफ़िक्स वाले हस्ताक्षरों का क्रम होगा.

apk पुष्टि करने की प्रोसेस v4
पहली इमेज: APK की पुष्टि करने की प्रोसेस v4

पुष्टि और जांच करना

फ़ीचर यूनिट टेस्ट और सीटीएस का इस्तेमाल करके लागू किए जाने की पुष्टि करें.

  • 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