예제 #1
0
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);
}
예제 #2
0
파일: scekrit.c 프로젝트: lyvius/ps3tools
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);
}
예제 #3
0
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");
}
예제 #4
0
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);
}
예제 #5
0
파일: unpkg.c 프로젝트: Arikado/SCEkrit
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();
}