2016-08-08 49 views
0

Ich versuche herauszufinden, wie die Pull-Prüfsumme für Pakete in Alpine APK-Paket-Repositories berechnet wird. Die documentation bezüglich des Formats fehlt in jedem Detail.Alpine APK Package Repositories, wie werden die Checksummen berechnet?

Wenn ich apk index -o APKINDEX.unsigned.tar.gz *.apk ausführen, die das Repository generiert. Wenn Sie die txt-Datei aus dem Inneren des gz extrahieren, enthält es die folgenden ...

C:Q17KXT6xFVWz4EZDIbkcvXQ/uz9ys= 
P:redis-server 
V:3.2.3-0 
A:noarch 
S:2784844 
I:102400 
T:An advanced key-value store 
U:http://redis.io/ 
L: 
D:linux-headers 

mich interessiert, wie die erste Zeile erzeugt wird. Ich habe versucht, die tatsächliche Quelle zu lesen, die verwendet wird, um dies zu generieren, aber ich bin kein C-Programmierer, deshalb ist es schwer für mich zu verstehen, wie es überall herumspringt. Die in der Dokumentation erwähnten zwei Dateien sind database.c und package.c.

Incase das etwas hilft, die ursprüngliche APK-Datei, diese verschiedenen Hashes hat ...

CRC32 = ac17ea88 
MD5 = a035ecf940a67a6572ff40afad4f396a 
SHA1 = eca5d3eb11555b3e0464321b91cbd743fbb3f72b 
SHA256 = 24bc1f03409b0856d84758d6d44b2f04737bbc260815c525581258a5b4bf6df4 

Antwort

1

So ...

/* Internal cointainer for MD5 or SHA1 */ 
struct apk_checksum { 
    unsigned char data[20]; 
    unsigned char type; 
}; 

Grundsätzlich nehmen Sie die C: Wert abhacken dann die Q aus die Front dann Base 64 dekodieren. Hacken Sie den letzten Wert ab (geben Sie den Standardwert SHA1 ein), dann haben Sie Ihren sha1. Dies scheint der INHALT des Pakets zu sein, aber das würde weitere Untersuchungen erfordern.

0

Sie müssen hier aussehen: https://git.alpinelinux.org/cgit/apk-tools/tree/src/blob.c#n492

Es apk_blob_pull_csum ist

First 'Q' steht für die Codierung Next '1' für SHA1 steht

Sieht aus wie diese Prüfsumme database.c gemacht in apk_db_unpack_pkg:

apk_sign_ctx_init(&ctx.sctx, APK_SIGN_VERIFY_IDENTITY, &pkg->csum, db->keys_fd); 
tar = apk_bstream_gunzip_mpart(bs, apk_sign_ctx_mpart_cb, &ctx.sctx); 
r = apk_tar_parse(tar, apk_db_install_archive_entry, &ctx, TRUE, &db->id_cache); 

aber ich bin mir nicht sicher, weil ich diesen Code verfolgen ist fehlgeschlagen.

Es ist wirklich nicht einfach zu verstehen, was sie tun.