Skip to content

Commit

Permalink
Fix make_self for the newer firmwares
Browse files Browse the repository at this point in the history
There was some mixup in the flag handling producing invalid
crypt data header
  • Loading branch information
bgK committed Dec 31, 2012
1 parent a8bb7c8 commit 5b7a4e8
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 24 deletions.
6 changes: 3 additions & 3 deletions tools/geohot/include/self.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,11 @@ typedef struct {
typedef struct {
u64 segment_offset;
u64 segment_size;
u32 segment_crypt_flag;
u32 segment_type;
u32 segment_number;
u32 unknown2;
u32 segment_hashed_flag;
u32 segment_sha1_index;
u32 unknown3;
u32 segment_encrypted_flag;
u32 segment_erk_index;
u32 segment_riv_index;
u32 segment_compressed_flag;
Expand Down
26 changes: 5 additions & 21 deletions tools/geohot/make_self.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,26 +185,14 @@ void enumerate_segments() {

memset(segment_ptr, 0, sizeof(Self_Segment));

// these are choices you can make
/*segment_ptr->compressed = (i<2);
segment_ptr->incrypt = (i<6); // **TESTING
segment_ptr->encrypted = (i<5);*/
segment_ptr->rlen = get_u64(&(elf_segment->p_filesz));

#ifdef NPDRM
segment_ptr->encrypted = (i<5);
segment_ptr->compressed = (i<4);
segment_ptr->incrypt = (i<7);
#else
segment_ptr->encrypted = 1;
segment_ptr->compressed = 1;
segment_ptr->compressed = segment_ptr->rlen != 0;
segment_ptr->incrypt = 1;
#endif

set_u32(&(segment_ptr->enc_segment.segment_number), i);

set_u32(&(segment_ptr->enc_segment.unknown2), 2);
set_u32(&(segment_ptr->enc_segment.unknown3), 3);

mpz_urandomb(hmac, r_state, 512);
mpz_export(segment_ptr->crypt_segment.hmac, &countp, 1, 0x40, 1, 0, hmac);

Expand All @@ -215,8 +203,6 @@ void enumerate_segments() {
mpz_export(segment_ptr->crypt_segment.riv, &countp, 1, 0x10, 1, 0, riv);
}

segment_ptr->rlen = get_u64(&(elf_segment->p_filesz));

u32 in_data_offset = get_u64(&(elf_segment->p_offset));
u8* in_data = &input_elf_data[in_data_offset];

Expand Down Expand Up @@ -252,7 +238,9 @@ void enumerate_segments() {
//hexdump((u8*)elf_segment, sizeof(Elf64_Phdr));

set_u64(&(segment_ptr->enc_segment.segment_size), segment_ptr->len);
set_u32(&(segment_ptr->enc_segment.segment_crypt_flag), 1+segment_ptr->encrypted);
set_u32(&(segment_ptr->enc_segment.segment_type), 2);
set_u32(&(segment_ptr->enc_segment.segment_hashed_flag), 2);
set_u32(&(segment_ptr->enc_segment.segment_encrypted_flag), segment_ptr->encrypted ? 3 : 1);
set_u32(&(segment_ptr->enc_segment.segment_compressed_flag), 1+segment_ptr->compressed);

set_u64(&(segment_ptr->pmhdr.pm_size), segment_ptr->len);
Expand Down Expand Up @@ -494,10 +482,6 @@ int main(int argc, char* argv[]) {
// 0x*** -- Self_SDKversion
set_u64(&(output_extended_self_header.e_svoff), running_size);
add_file_section(&sdkversion, sizeof(sdkversion));
// 0x*** -- ???
#ifdef NPDRM
add_file_section(zero_padding, 0x20);
#endif
// 0x*** -- Self_Cflags
set_u64(&(output_extended_self_header.e_cfoff), running_size);
add_file_section(&cflags, sizeof(cflags));
Expand Down

0 comments on commit 5b7a4e8

Please sign in to comment.