תוכנית חתימות APK v4

אנדרואיד 11 תומך בתוכנית חתימה תואמת סטרימינג באמצעות APK Signature Scheme v4. חתימת ה- v4 מבוססת על עץ החשיש של מרקל המחושב על פני כל הבתים של ה- APK. הוא עוקב אחר מבנה עץ החשיש fs-verity במדויק (למשל, אפס ריפוד המלח ואפס ריפוד הגוש האחרון). אנדרואיד 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 הם הפרמטרים המשמשים לייצור עץ חשיש + hash root:

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 נלקח מחסימת החתימה v3 של ה- APK, או, אם אינו קיים, מחסימת 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 הוא כל עץ merkle_tree של ה- APK, המחושב כמתואר בתיעוד fs-verity .

מפיקים וצרכנים

כלי ה- SDK של אנדרואיד apksigner מייצר כעת את קובץ החתימה v4 אם אתה מריץ אותו עם פרמטרי ברירת מחדל. ניתן להשבית חתימה v4 באותה צורה כמו תוכניות החתימה האחרות. זה יכול גם לאמת אם חתימת v4 תקפה.

adb מצפה שקובץ ה-. apk.idsig יהיה נוכח ליד ה- apk בעת הפעלת הפקודה adb install --incremental
הוא ישתמש גם בקובץ .idsig כדי לנסות להתקין Incremental כברירת מחדל, ויחזור להתקנה רגילה אם הוא חסר או לא חוקי.

כאשר נוצרת הפעלת התקנה, ממשק ה- API של התקנת הזרמת החדשה ב- PackageInstaller מקבל את חתימת ה- v4 המופשטת כארגומנט נפרד בעת הוספת קובץ להפעלה. בשלב זה, signing_info מועברת ל- incfs ככתם שלם. Incfs מחלץ חשיש שורש מהכתם.

כאשר מבצעים את הפעלת ההתקנה, PackageManagerService מבצע ioctl כדי לאחזר את כתם החתימה_ינפו מ- incfs, מנתח אותו ומאמת את החתימה.

רכיב Loader Data Incremental צפוי להזרים את חלק העץ Merkle של החתימה דרך ה- API המקורי של מטעין הנתונים.
שירות פקודת פגז שירות package install-incremental מקבל את קובץ חתימת ה- v4 המופשט שמקודד כ- base64 כפרמטר לכל קובץ נוסף. העץ מרקל המתאים צריך להישלח לתוך של הפקודה 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
    • / אנדרואיד / cts / hostsidetests / incrementalinstall

בדיקת פורמט החתימה

כדי לבדוק את פורמט החתימה, הגדר סביבת פיתוח והפעל את הבדיקות הידניות הבאות:

$ atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest

בדיקת פורמט חתימה עם Android SDK (ADB ו- apksigner)

כדי לבדוק את פורמט החתימה עם Android SDK, הגדר סביבת פיתוח וודא שהשלמת את היישום של IncFS . ואז הבזיק את המבנה על מכשיר פיזי או אמולטור יעד. עליכם ליצור או להשיג APK קיים ואז ליצור מפתח לחתימת ניפוי באגים . לבסוף, חתום והתקן את ה- apk בפורמט חתימת v4 מתיקיית build-tools.

סִימָן

$ ./apksigner sign --ks debug.keystore game.apk

להתקין

$ ./adb install game.apk

היכן ניתן למצוא את הבדיקות הללו?

/android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java