Im trying to port a legacy app which has some basic bit shifting to decrypt a buffer, but im lost with this powerpc code - i tried my best to understand it and added comments and created a pseudo c function however something is obviously not right.

This is the PPC function, it has one argument i think the buffer (params are: void *,int)

.set var_30, -0x30
.set var_2C, -0x2C
.set var_20, -0x20
.set arg_8,  8
.set arg_1C,  0x1C
cryptLower%r29 = %r29
cryptUpper%r30 = %r30
data%r31 = %r31
                mflr      r0
                stmw      r24, var_20(r1) # function arg data to r24
                mr        r24, r3
                lwz      r3, crypt
                mr        r31, r24      # copy r24 data to r31
                li        r28, 0
                srwi      r27, r4, 3    # r27 = r4 >> 3
                stw      r0, arg_8(r1)
                stwu      r1, -0x70(r1)
                stw      r4, 0x70+arg_1C(r1)
                lwz      r29, 0(r3)
                lwz      r30, 4(r3)
                b        loc_22F1F4
# ---------------------------------------------------------------------------

loc_22F134:                            #
                lwz      r0, 0(r31)
                addi      r3, r1, 0x70+var_30
                lwz      r4, 4(r31)
                stw      r4, 0x70+var_2C(r1)
                stw      r0, 0x70+var_30(r1)
                bl        .SwapDouble__FPv # SwapDouble(void *)
                lwz      r3, 0x70+var_2C(r1)
                lis      r7, -0x6593 # 0x9A6C9A19
                lwz      r0, 0x70+var_30(r1)
                lis      r5, -0x6593 # 0x9A6C9A19
                addc      r10, r3, r30
                li        r3, 0
                adde      r0, r0, r29
                addi      r7, r7, -0x65E7 # 0x9A6C9A19
                rotrwi    r11, r10, 14  # r11 = (r10 << 18) | (r10 >> 14)
                mr        r9, r10
                slwi      r10, r9, 18  # r10 = r9 << 18
                li        r8, -1
                insrwi    r11, r0, 14,0 # r11 = r0 << 18
                li        r6, 0
                or        r9, r11, r3
                inslwi    r10, r0, 18,14 # r10 = r0 >> 14
                addc      r7, r9, r7
                addi      r5, r5, -0x65E7 # 0x9A6C9A19
                adde      r9, r10, r8
                li        r4, -1
                rotlwi    r8, r7, 3    # r8 = (r7 << 3) | (r7 >> 29)
                mr        r0, r7
                slwi      r7, r0, 3    # r7 = r0 << 3
                addi      r3, r1, 0x70+var_30
                insrwi    r8, r9, 29,0  # r8 = r9 << 3
                or        r0, r8, r6
                inslwi    r7, r9, 3,29  # r7 = r9 >> 29
                addc      r6, r30, r0
                stw      r0, 0x70+var_2C(r1)
                adde      r0, r29, r7
                addc      r30, r6, r5
                stw      r7, 0x70+var_30(r1)
                adde      r29, r0, r4
                bl        .SwapDouble__FPv # SwapDouble(void *)
                lwz      r0, 0x70+var_30(r1)
                addi      r3, r1, 0x70+var_30
                lwz      r4, 0x70+var_2C(r1)
                stw      r4, 4(r31)
                stw      r0, 0(r31)
                bl        .SwapDouble__FPv # SwapDouble(void *)
                addi      r31, r31, 8
                addi      r28, r28, 1

                cmpw      r28, r27
                blt      loc_22F134
                srwi      r0, r27, 31  # r0 = r27 >> 31
                mr        r31, r24
                add      r3, r0, r27
                srwi      r0, r27, 31  # r0 = r27 >> 31
                srawi    r3, r3, 1
                lwz      r25, 0(r24)
                slwi      r3, r3, 3    # r3 = r3 << 3
                add      r0, r0, r27
                add      r6, r31, r3
                lwz      r26, 4(r24)
                lwz      r5, 0(r6)
                srawi    r0, r0, 1
                lwz      r6, 4(r6)
                slwi      r0, r0, 3    # r0 = r0 << 3
                add      r4, r31, r0
                li        r3, 1
                stw      r6, 4(r24)
                stw      r5, 0(r24)
                stw      r26, 4(r4)
                stw      r25, 0(r4)
                lwz      r0, 0x70+arg_8(r1)
                addi      r1, r1, 0x70
                mtlr      r0
                lmw      r24, var_20(r1)

this is as far as my pseudo c has advanced:

unsigned long long* data=(unsigned long long*)pBuffer; // file data
unsigned long long crypt = 0x0000;
unsigned long long next_crypt;
unsigned int len = size >> 3;

for(unsigned int i=0; i<len;i++) {
    next_crypt = crypt+data-0x9A6C9A19;     
    data = ((data<<0x18)|(data>>0x14))+0x9A6C9A19;
    data =  (data<<0x3)|(data>>0x29);
    data = data - crypt;
    crypt = next_crypt;   

I dont even know why is crypt split into two registers r29 & r30

Any assistance would be greatly appreciated.
Posted on 2011-08-18 16:25:59 by Majin