Skip to content

Gamestats2 encryption

sepalani edited this page Aug 1, 2017 · 4 revisions

DWCi_EncSessionEncrypt

struct data_info
{
  uint32_le pid;
  uint32_le data_size;
};
DWCi_EncSessionEncrypt(char* dest, struct data_info* info, uint32_t info_size, char* data, uint32_t data_size);

This function is used to encrypt Gamestats2 data payload.

PowerPC assembly code C++ pseudo code
; 0x80354b04 DWCi_EncSessionEncrypt
stwu    sp, -0x0030 (sp)
mflr    r0
stw     r0, 0x0034 (sp)
addi    r11, sp, 48
bl      -> _savegpr_23 (0x803F1310)
add     r30, r7, r5
mr      r23, r3
addi    r31, r30, 4
mr      r24, r4
mr      r25, r5
mr      r26, r6
mr      r27, r7
mr      r4, r31
li      r28, 0
li      r3, 8
bl      -> DWC_Alloc (0x80335390)
cmpwi   r3, 0
mr      r29, r3
bne-    ->0x80354B58
li      r3, 2
b       ->0x803550D8
cmpwi   cr1, r25, 0
li      r4, 0
ble-    cr1 ->0x80354C24
cmpwi   r25, 8
subi    r6, r25, 8
ble-    ->0x80354BF8
li      r7, 0
blt-    cr1 ->0x80354B8C
lis     r5, 0x8000
subi    r0, r5, 2
cmpw    r25, r0
bgt-    ->0x80354B8C
li      r7, 1
cmpwi   r7, 0
beq-    ->0x80354BF8
addi    r0, r6, 7
rlwinm  r0, r0, 29, 3, 31 (fffffff8)
mtctr   r0
cmpwi   r6, 0
ble-    ->0x80354BF8
lbzx    r5, r24, r4
add     r6, r24, r4
add     r7, r3, r4
lbz     r0, 0x0001 (r6)
stb     r5, 0x0004 (r7)
addi    r4, r4, 8
lbz     r5, 0x0002 (r6)
stb     r0, 0x0005 (r7)
lbz     r0, 0x0003 (r6)
stb     r5, 0x0006 (r7)
lbz     r5, 0x0004 (r6)
stb     r0, 0x0007 (r7)
lbz     r0, 0x0005 (r6)
stb     r5, 0x0008 (r7)
lbz     r5, 0x0006 (r6)
stb     r0, 0x0009 (r7)
lbz     r0, 0x0007 (r6)
stb     r5, 0x000A (r7)
stb     r0, 0x000B (r7)
bdnz+   ->0x80354BA8
sub     r0, r25, r4
add     r5, r24, r4
mtctr   r0
cmpw    r4, r25
bge-    ->0x80354C24
lbz     r0, 0 (r5)
add     r6, r3, r4
addi    r4, r4, 1
addi    r5, r5, 1
stb     r0, 0x0004 (r6)
bdnz+   ->0x80354C0C
cmpwi   cr1, r27, 0
li      r4, 0
ble-    cr1 ->0x80354CF8
cmpwi   r27, 8
subi    r6, r27, 8
ble-    ->0x80354CC8
li      r7, 0
blt-    cr1 ->0x80354C58
lis     r5, 0x8000
subi    r0, r5, 2
cmpw    r27, r0
bgt-    ->0x80354C58
li      r7, 1
cmpwi   r7, 0
beq-    ->0x80354CC8
addi    r0, r6, 7
add     r7, r3, r25
rlwinm  r0, r0, 29, 3, 31 (fffffff8)
mtctr   r0
cmpwi   r6, 0
ble-    ->0x80354CC8
lbzx    r5, r26, r4
add     r8, r26, r4
add     r6, r7, r4
lbz     r0, 0x0001 (r8)
stb     r5, 0x0004 (r6)
addi    r4, r4, 8
lbz     r5, 0x0002 (r8)
stb     r0, 0x0005 (r6)
lbz     r0, 0x0003 (r8)
stb     r5, 0x0006 (r6)
lbz     r5, 0x0004 (r8)
stb     r0, 0x0007 (r6)
lbz     r0, 0x0005 (r8)
stb     r5, 0x0008 (r6)
lbz     r5, 0x0006 (r8)
stb     r0, 0x0009 (r6)
lbz     r0, 0x0007 (r8)
stb     r5, 0x000A (r6)
stb     r0, 0x000B (r6)
bdnz+   ->0x80354C78
sub     r0, r27, r4
add     r7, r3, r25
add     r5, r26, r4
mtctr   r0
cmpw    r4, r27
bge-    ->0x80354CF8
lbz     r0, 0 (r5)
add     r6, r7, r4
addi    r4, r4, 1
addi    r5, r5, 1
stb     r0, 0x0004 (r6)
bdnz+   ->0x80354CE0
cmpwi   cr1, r30, 0
li      r7, 0
ble-    cr1 ->0x80354DB8
cmpwi   r30, 8
subi    r5, r30, 8
ble-    ->0x80354D94
li      r6, 0
blt-    cr1 ->0x80354D2C
lis     r4, 0x8000
subi    r0, r4, 2
cmpw    r30, r0
bgt-    ->0x80354D2C
li      r6, 1
cmpwi   r6, 0
beq-    ->0x80354D94
addi    r0, r5, 7
rlwinm  r0, r0, 29, 3, 31 (fffffff8)
mtctr   r0
cmpwi   r5, 0
ble-    ->0x80354D94
add     r5, r3, r7
addi    r7, r7, 8
lbz     r4, 0x0004 (r5)
lbz     r0, 0x0005 (r5)
add     r28, r28, r4
lbz     r4, 0x0006 (r5)
add     r28, r28, r0
lbz     r0, 0x0007 (r5)
add     r28, r28, r4
lbz     r4, 0x0008 (r5)
add     r28, r28, r0
lbz     r0, 0x0009 (r5)
add     r28, r28, r4
lbz     r4, 0x000A (r5)
add     r28, r28, r0
lbz     r0, 0x000B (r5)
add     r28, r28, r4
add     r28, r28, r0
bdnz+   ->0x80354D48
sub     r0, r30, r7
mtctr   r0
cmpw    r7, r30
bge-    ->0x80354DB8
add     r4, r3, r7
addi    r7, r7, 1
lbz     r0, 0x0004 (r4)
add     r28, r28, r0
bdnz+   ->0x80354DA4
rlwinm  r0, r28, 16, 0, 15 (0000ffff)
cmpwi   cr1, r30, 0
or      r0, r28, r0
li      r6, 0
stw     r0, -0x343C (r13)
ble-    cr1 ->0x80355044
cmpwi   r30, 8
subi    r5, r30, 8
ble-    ->0x80354FE8
li      r7, 0
blt-    cr1 ->0x80354DF8
lis     r4, 0x8000
subi    r0, r4, 2
cmpw    r30, r0
bgt-    ->0x80354DF8
li      r7, 1
cmpwi   r7, 0
beq-    ->0x80354FE8
addi    r0, r5, 7
lis     r4, 0x8049
rlwinm  r0, r0, 29, 3, 31 (fffffff8)
subi    r4, r4, 9208
mtctr   r0
cmpwi   r5, 0
ble-    ->0x80354FE8

; Load key constant X
lwz     r7, 0x0044 (r4)
add     r5, r3, r6
; Load seed
lwz     r0, -0x343C (r13)
; Load key constant Y
lwz     r8, 0x0048 (r4)
mullw   r0, r7, r0
; Load key constant Z
lwz     r7, 0x004C (r4)
add     r8, r8, r0
divwu   r0, r8, r7
mullw   r0, r0, r7
sub     r0, r8, r0
; Store seed
stw     r0, -0x343C (r13)
rlwinm  r7, r0, 16, 24, 31 (00ff0000)
; XOR data
lbz     r0, 0x0004 (r5)
xor     r0, r0, r7
stb     r0, 0x0004 (r5)

; Keep going (x2) - Load key constant X
lwz     r7, 0x0044 (r4)
lwz     r0, -0x343C (r13)
lwz     r8, 0x0048 (r4)
mullw   r0, r7, r0
lwz     r7, 0x004C (r4)
add     r8, r8, r0
divwu   r0, r8, r7
mullw   r0, r0, r7
sub     r0, r8, r0
stw     r0, -0x343C (r13)
rlwinm  r7, r0, 16, 24, 31 (00ff0000)
lbz     r0, 0x0005 (r5)
xor     r0, r0, r7
stb     r0, 0x0005 (r5)

; Keep going (x3) - Load key constant X
lwz     r7, 0x0044 (r4)
lwz     r0, -0x343C (r13)
lwz     r8, 0x0048 (r4)
mullw   r0, r7, r0
lwz     r7, 0x004C (r4)
add     r8, r8, r0
divwu   r0, r8, r7
mullw   r0, r0, r7
sub     r0, r8, r0
stw     r0, -0x343C (r13)
rlwinm  r7, r0, 16, 24, 31 (00ff0000)
lbz     r0, 0x0006 (r5)
xor     r0, r0, r7
stb     r0, 0x0006 (r5)

; Keep going (x4) - Load key constant X
lwz     r7, 0x0044 (r4)
lwz     r0, -0x343C (r13)
lwz     r8, 0x0048 (r4)
mullw   r0, r7, r0
lwz     r7, 0x004C (r4)
add     r8, r8, r0
divwu   r0, r8, r7
mullw   r0, r0, r7
sub     r0, r8, r0
stw     r0, -0x343C (r13)
rlwinm  r7, r0, 16, 24, 31 (00ff0000)
lbz     r0, 0x0007 (r5)
xor     r0, r0, r7
stb     r0, 0x0007 (r5)

; Keep going (x5) - Load key constant X
lwz     r7, 0x0044 (r4)
lwz     r0, -0x343C (r13)
lwz     r8, 0x0048 (r4)
mullw   r0, r7, r0
lwz     r7, 0x004C (r4)
add     r8, r8, r0
divwu   r0, r8, r7
mullw   r0, r0, r7
sub     r7, r8, r0
stw     r7, -0x343C (r13)
lbz     r0, 0x0008 (r5)
rlwinm  r7, r7, 16, 24, 31 (00ff0000)
addi    r6, r6, 8
xor     r0, r0, r7
stb     r0, 0x0008 (r5)

; Keep going (x6) - Load key constant X
lwz     r7, 0x0044 (r4)
lwz     r0, -0x343C (r13)
lwz     r8, 0x0048 (r4)
mullw   r0, r7, r0
lwz     r7, 0x004C (r4)
add     r8, r8, r0
divwu   r0, r8, r7
mullw   r0, r0, r7
sub     r0, r8, r0
stw     r0, -0x343C (r13)
rlwinm  r7, r0, 16, 24, 31 (00ff0000)
lbz     r0, 0x0009 (r5)
xor     r0, r0, r7
stb     r0, 0x0009 (r5)

; Keep going (x7) - Load key constant X
lwz     r7, 0x0044 (r4)
lwz     r0, -0x343C (r13)
lwz     r8, 0x0048 (r4)
mullw   r0, r7, r0
lwz     r7, 0x004C (r4)
add     r8, r8, r0
divwu   r0, r8, r7
mullw   r0, r0, r7
sub     r0, r8, r0
stw     r0, -0x343C (r13)
rlwinm  r7, r0, 16, 24, 31 (00ff0000)
lbz     r0, 0x000A (r5)
xor     r0, r0, r7
stb     r0, 0x000A (r5)

; Keep going (x8) - Load key constant X
lwz     r7, 0x0044 (r4)
lwz     r0, -0x343C (r13)
lwz     r8, 0x0048 (r4)
mullw   r0, r7, r0
lwz     r7, 0x004C (r4)
add     r8, r8, r0
divwu   r0, r8, r7
mullw   r0, r0, r7
sub     r0, r8, r0
stw     r0, -0x343C (r13)
rlwinm  r0, r0, 16, 24, 31 (00ff0000)
lbz     r7, 0x000B (r5)
xor     r0, r7, r0
stb     r0, 0x000B (r5)

bdnz+   ->0x80354E1C
lis     r8, 0x8049
sub     r0, r30, r6
subi    r8, r8, 9208
mtctr   r0
cmpw    r6, r30
bge-    ->0x80355044

; Keep going (last ones) - Load key constant X
lwz     r4, 0x0044 (r8)
add     r5, r3, r6
lwz     r0, -0x343C (r13)
addi    r6, r6, 1
lwz     r7, 0x0048 (r8)
mullw   r0, r4, r0
lwz     r4, 0x004C (r8)
add     r7, r7, r0
divwu   r0, r7, r4
mullw   r0, r0, r4
sub     r0, r7, r0
stw     r0, -0x343C (r13)
rlwinm  r0, r0, 16, 24, 31 (00ff0000)
lbz     r4, 0x0004 (r5)
xor     r0, r4, r0
stb     r0, 0x0004 (r5)

bdnz+   ->0x80355000
lis     r5, 0x8049
addi    r24, r30, 4
subi    r5, r5, 9208
mr      r4, r23
lwz     r0, 0x0050 (r5)
mr      r5, r24
li      r6, 2
xor     r28, r28, r0
rlwinm  r0, r28, 8, 24, 31 (ff000000)
; Store encoded checksum
stb     r0, 0 (r3)
rlwinm  r7, r28, 16, 24, 31 (00ff0000)
rlwinm  r0, r28, 24, 24, 31 (0000ff00)
stb     r7, 0x0001 (r3)
stb     r0, 0x0002 (r3)
stb     r28, 0x0003 (r3)
mr      r3, r29
bl      -> B64Encode (0x8035DAA4)
mr      r4, r29
li      r3, 8
li      r5, 0
bl      -> DWC_Free (0x80335450)
lis     r3, 0xAAAB
li      r6, 0
subi    r4, r3, 21845
mulhwu  r0, r4, r24
li      r3, 0
mulhwu  r4, r4, r31
rlwinm  r0, r0, 31, 1, 31 (fffffffe)
mulli   r0, r0, 3
rlwinm  r5, r4, 31, 1, 31 (fffffffe)
sub     r4, r24, r0
neg     r0, r4
or      r0, r0, r4
rlwinm  r0, r0, 1, 31, 31 (80000000)
add     r0, r5, r0
rlwinm  r4, r0, 2, 0, 29 (3fffffff)
stbx    r6, r4, r23
addi    r11, sp, 48
bl      -> _restgpr_23 (0x803F135C)
lwz     r0, 0x0034 (sp)
mtlr    r0
addi    sp, sp, 48
blr 
    
int DWCi_EncSessionEncrypt(
  char* dest,
  struct data_info* info,
  uint32_t info_size,
  char* data,
  uint32_t data_size
)
{
  _savegpr_23(...);
  uint32_t total_size = 4 + info_size + data_size;
  
  void* ptr = DWC_Alloc(8, total_size);
  if (ptr == nullptr)
    goto label_exit;

  // TODO

  label_exit:
  DWC_Free(8, ptr, 0);
  _restgpr_23(...);
}