অ্যান্ড্রয়েড ১১ APK সিগনেচার স্কিম v4 এর সাথে একটি স্ট্রিমিং-সামঞ্জস্যপূর্ণ সাইনিং স্কিম সমর্থন করে। v4 সিগনেচারটি APK-এর সমস্ত বাইট জুড়ে গণনা করা Merkle হ্যাশ ট্রির উপর ভিত্তি করে তৈরি। এই স্কিমটি fs-verity হ্যাশ ট্রির কাঠামোটি হুবহু অনুসরণ করে (উদাহরণস্বরূপ, সল্টটি জিরো-প্যাডিং এবং শেষ ব্লকটি জিরো-প্যাডিং)। অ্যান্ড্রয়েড ১১ স্বাক্ষরটি একটি পৃথক ফাইলে সংরক্ষণ করে, <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_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;
}; merkle_tree হল APK-এর সম্পূর্ণ Merkle ট্রি, যা fs-verity ডকুমেন্টেশনে বর্ণিত হিসাবে গণনা করা হয়েছে।
উৎপাদক এবং ভোক্তা
apksigner Android SDK টুলটি ডিফল্ট প্যারামিটার দিয়ে চালালে v4 স্বাক্ষর ফাইল তৈরি করে। আপনি অন্যান্য স্বাক্ষর স্কিমের মতো একইভাবে v4 স্বাক্ষর অক্ষম করতে পারেন। এই টুলটি v4 স্বাক্ষরটি বৈধ কিনা তাও যাচাই করতে পারে।
adb adb install --incremental কমান্ড চালানোর সময় .apk.idsig ফাইলটি APK-এর পাশে উপস্থিত থাকবে বলে আশা করে। adb ডিফল্টভাবে ক্রমবর্ধমান ইনস্টলেশন চেষ্টা করার জন্য IDSIG ফাইলটিও ব্যবহার করে, এবং যদি এটি অনুপস্থিত বা অবৈধ থাকে তবে এটি একটি নিয়মিত ইনস্টলেশনে ফিরে যায়।
যখন একটি ইনস্টলেশন সেশন তৈরি করা হয়, তখন PackageInstaller এর নতুন স্ট্রিমিং ইনস্টলেশন API সেশনে একটি ফাইল যোগ করার সময় স্ট্রিপড v4 স্বাক্ষরটিকে একটি পৃথক আর্গুমেন্ট হিসেবে গ্রহণ করে। এই সময়ে, signing_info সম্পূর্ণ ব্লব হিসেবে IncFS-এ পাস করা হয়। IncFS ব্লব থেকে রুট হ্যাশ বের করে।
যখন ইনস্টলেশন সেশনটি সম্পন্ন করা হচ্ছে, তখন PackageManagerService IncFS থেকে signing_info ব্লবটি পুনরুদ্ধার করার জন্য একটি ioctl কল করে, এটি পার্স করে এবং স্বাক্ষর যাচাই করে।
ইনক্রিমেন্টাল ডেটা লোডার কম্পোনেন্টটি ডেটা লোডার নেটিভ API এর মাধ্যমে স্বাক্ষরের Merkle ট্রি অংশটি স্ট্রিম করে। package সার্ভিস শেল কমান্ড install-incremental প্রতিটি যোগ করা ফাইলের জন্য একটি প্যারামিটার হিসেবে Base64 হিসাবে এনকোড করা স্ট্রিপড v4 স্বাক্ষর ফাইল গ্রহণ করে। সংশ্লিষ্ট Merkle ট্রি কমান্ডের stdin এ পাঠাতে হবে।
apk_digest সম্পর্কে
apk_digest হল প্রথম উপলব্ধ কন্টেন্ট ডাইজেস্ট যা ক্রমানুসারে:
- V3, 1 MB ব্লক, SHA2-512 (
CONTENT_DIGEST_CHUNKED_SHA512) - V3, 4 KB ব্লক, SHA2-256 (
CONTENT_DIGEST_VERITY_CHUNKED_SHA256) - V3, ১ MB ব্লক, SHA2-256 (
CONTENT_DIGEST_CHUNKED_SHA256) - ভি২, এসএইচএ২-৫১২
- ভি২, এসএইচএ২-২৫৬
APK স্বাক্ষর স্কিম v3-তে দৈর্ঘ্য-উপসর্গযুক্ত স্বাক্ষরকারীর দৈর্ঘ্য-উপসর্গযুক্ত ক্রম দেখুন।
যাচাইকরণ এবং পরীক্ষা
APK যাচাইকরণ প্রক্রিয়া v4 নিম্নলিখিত চিত্রে দেখানো হয়েছে:

চিত্র ১. APK যাচাইকরণ প্রক্রিয়া v4.
বৈশিষ্ট্য ইউনিট পরীক্ষা এবং CTS ব্যবহার করে বাস্তবায়ন যাচাই করুন:
-
CtsIncrementalInstallHostTestCases -
/android/cts/hostsidetests/incrementalinstall
স্বাক্ষর বিন্যাস পরীক্ষা করুন
স্বাক্ষর বিন্যাস পরীক্ষা করার জন্য, একটি বিল্ড পরিবেশ সেট আপ করুন এবং নিম্নলিখিত ম্যানুয়াল পরীক্ষাগুলি চালান:
$ atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
অ্যান্ড্রয়েড 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