static void decrypt_spkg(void) { u16 flags; u16 type; struct keylist *k; flags = be16(pkg + 0x08); type = be16(pkg + 0x0a); hdr_len = be64(pkg + 0x10); dec_size = be64(pkg + 0x18); if (type != 3) fail("no .spkg file"); k = keys_get(KEY_SPKG); if (k == NULL) fail("no key found"); if (sce_decrypt_header(pkg, k) < 0) fail("header decryption failed"); meta_offset = be32(pkg + 0x0c); n_sections = be32(pkg + meta_offset + 0x60 + 0xc); if (n_sections != 3) fail("invalid section count: %d", n_sections); }
static void decrypt(u8* ptr) { if (keyid < 0) keyid = sce_decrypt_header(ptr, klist); else if (keyid != sce_decrypt_header(ptr, klist)) fail("Both files must have the same key id"); if (keyid < 0) fail("sce_decrypt_header failed"); if (sce_decrypt_data(ptr) < 0) fail("sce_decrypt_data failed"); if (klist->keys[keyid].pub_avail < 0) fail("no public key available"); if (ecdsa_set_curve(klist->keys[keyid].ctype) < 0) fail("ecdsa_set_curve failed"); ecdsa_set_pub(klist->keys[keyid].pub); }
static void self_decrypt(void) { struct keylist *klist; klist = self_load_keys(); if (klist == NULL) fail("no key found"); if (sce_decrypt_header(self, klist) < 0) fail("self_decrypt_header failed"); if (sce_decrypt_data(self) < 0) fail("self_decrypt_data failed"); }
static void decrypt(void) { int keyid; sce_remove_npdrm(ptr, klist); keyid = sce_decrypt_header(ptr, klist); if (keyid < 0) fail("sce_decrypt_header failed"); if (sce_decrypt_data(ptr) < 0) fail("sce_decrypt_data failed"); if (klist->keys[keyid].pub_avail < 0) fail("no public key available"); if (ecdsa_set_curve(klist->keys[keyid].ctype) < 0) fail("ecdsa_set_curve failed"); ecdsa_set_pub(klist->keys[keyid].pub); }
static void parse_pkg_sce(void) { u16 flags; u16 type; u32 hdr_len; u8 *ptr; struct keylist *k; flags = be16(pkg + 0x08); type = be16(pkg + 0x0a); hdr_len = be64(pkg + 0x10); dec_size = be64(pkg + 0x18); if (type != 3) fail("no update .pkg file"); if (flags & 0x8000) { pkg += hdr_len; return parse_pkg(); } k = keys_get(KEY_PKG); if (sce_decrypt_header(pkg, k) < 0) fail("header decryption failed"); if (sce_decrypt_data(pkg) < 0) fail("data decryption failed"); ptr = malloc(dec_size); memset(ptr, 0, dec_size); decompress_pkg(ptr); pkg = ptr; parse_pkg(); }