APK স্বাক্ষর স্কিম v4

Android 11 APK স্বাক্ষর স্কিম v4 এর সাথে একটি স্ট্রিমিং-সামঞ্জস্যপূর্ণ স্বাক্ষর স্কিম সমর্থন করে। v4 স্বাক্ষরটি APK-এর সমস্ত বাইটের উপর গণনা করা Merkle হ্যাশ ট্রির উপর ভিত্তি করে। এটা ঠিক fs-verity হ্যাশ ট্রির গঠন অনুসরণ করে (উদাহরণস্বরূপ, লবণকে জিরো-প্যাডিং এবং শেষ ব্লকে জিরো-প্যাডিং)। Android 11 একটি পৃথক ফাইলে স্বাক্ষর সংরক্ষণ করে, <apk name>.apk.idsig একটি v4 স্বাক্ষরের জন্য একটি পরিপূরক v2 বা v3 স্বাক্ষর প্রয়োজন।

ফাইলের বিন্যাস

সমস্ত সাংখ্যিক ক্ষেত্র সামান্য endian হয়. সমস্ত ক্ষেত্র তাদের 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:

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_digest দেখুন)

একটি 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-এর সম্পূর্ণ Merkle ট্রি , fs-verity ডকুমেন্টেশনে বর্ণিত হিসাবে গণনা করা হয়েছে।

উৎপাদক ও ভোক্তা

apksigner Android SDK টুল এখন v4 স্বাক্ষর ফাইল তৈরি করে যদি আপনি এটিকে ডিফল্ট প্যারামিটার দিয়ে চালান। v4 সাইনিং অন্যান্য সাইনিং স্কিমের মতোই অক্ষম করা যেতে পারে। এটি v4 স্বাক্ষর বৈধ কিনা তা যাচাই করতে পারে।

adb আশা করে যে adb install --incremental কমান্ড চালানোর সময় .apk.idsig ফাইলটি .apk-এর পাশে থাকবে
এটি ডিফল্টরূপে ক্রমবর্ধমান ইনস্টলেশন চেষ্টা করার জন্য .idsig ফাইলটি ব্যবহার করবে এবং এটি অনুপস্থিত বা অবৈধ হলে একটি নিয়মিত ইনস্টলেশনে ফিরে আসবে।

যখন একটি ইনস্টলেশন সেশন তৈরি করা হয়, সেশনে একটি ফাইল যুক্ত করার সময় PackageInstaller নতুন স্ট্রিমিং ইনস্টলেশন API স্ট্রাইপড v4 স্বাক্ষরটিকে একটি পৃথক যুক্তি হিসাবে গ্রহণ করে। এই মুহুর্তে, signing_info সম্পূর্ণ ব্লব হিসাবে incfs-এ পাস করা হয়। Incfs ব্লব থেকে রুট হ্যাশ বের করে।

যখন ইনস্টলেশন সেশন করা হচ্ছে, PackageManagerService incfs থেকে signing_info ব্লব পুনরুদ্ধার করার জন্য একটি ioctl করে, এটি পার্স করে এবং স্বাক্ষর যাচাই করে।

ইনক্রিমেন্টাল ডেটা লোডার উপাদানটি ডেটা লোডার নেটিভ API-এর মাধ্যমে স্বাক্ষরের মার্কেল ট্রি অংশ স্ট্রিম করবে বলে আশা করা হচ্ছে।
package সার্ভিস শেল কমান্ড install-incremental প্রতিটি যোগ করা ফাইলের জন্য একটি পরামিতি হিসাবে base64 হিসাবে এনকোড করা stripped v4 স্বাক্ষর ফাইল গ্রহণ করে। সংশ্লিষ্ট Merkle গাছ কমান্ডের stdin এ পাঠাতে হবে।

apk_digest

apk_digest হল প্রথম উপলব্ধ সামগ্রী ডাইজেস্ট ক্রমানুসারে:

  1. V3, 1MB ব্লক, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
  2. V3, 4KB ব্লক, SHA2-256 (CONTENT_DIGEST_VERITY_CHUNKED_SHA256),
  3. V3, 1MB ব্লক, SHA2-256 (CONTENT_DIGEST_CHUNKED_SHA256),
  4. V2, SHA2-512,
  5. V2, SHA2-256।

APK স্বাক্ষর স্কিম v3-এ দৈর্ঘ্য-প্রিফিক্সড স্বাক্ষরগুলির দৈর্ঘ্য-প্রিফিক্সড ক্রম দেখুন।

apk বৈধকরণ প্রক্রিয়া v4
চিত্র 1 : APK যাচাইকরণ প্রক্রিয়া v4

বৈধতা এবং পরীক্ষা

বৈশিষ্ট্য ইউনিট পরীক্ষা এবং CTS ব্যবহার করে বাস্তবায়ন যাচাই করুন।

  • 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