mirror of
https://github.com/pret/pokeplatinum.git
synced 2026-03-21 17:55:13 -05:00
4751 lines
78 KiB
ArmAsm
4751 lines
78 KiB
ArmAsm
.include "macros/function.inc"
|
|
.include "include/sign.inc"
|
|
|
|
.text
|
|
|
|
|
|
arm_func_start CRYPTO_VerifySignature
|
|
CRYPTO_VerifySignature: ; 0x02239498
|
|
stmfd sp!, {r4, r5, lr}
|
|
sub sp, sp, #0x14
|
|
mov ip, r0
|
|
mov r4, r1
|
|
mov r5, r2
|
|
mov r2, r4
|
|
add r0, sp, #0
|
|
mov r1, ip
|
|
mov r4, r3
|
|
bl MATH_CalcSHA1
|
|
add r0, sp, #0
|
|
mov r1, r5
|
|
mov r2, r4
|
|
bl CRYPTO_VerifySignatureWithHash
|
|
add sp, sp, #0x14
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
arm_func_end CRYPTO_VerifySignature
|
|
|
|
arm_func_start CRYPTO_VerifySignatureWithHash
|
|
CRYPTO_VerifySignatureWithHash: ; 0x022394DC
|
|
stmfd sp!, {r4, lr}
|
|
sub sp, sp, #0x120
|
|
mov r3, #0
|
|
str r3, [sp, #0x10]
|
|
str r3, [sp, #0x18]
|
|
str r2, [sp]
|
|
mov r3, #0x80
|
|
mov r4, r0
|
|
mov r2, r1
|
|
ldr ip, _022395D8 ; =0x00010001
|
|
str r3, [sp, #4]
|
|
add r0, sp, #0x1c
|
|
mov r1, #0x100
|
|
str ip, [sp, #8]
|
|
bl CRYPTOi_RSA
|
|
mov r1, r0
|
|
add r0, sp, #0x1c
|
|
add r2, sp, #0xc
|
|
add r3, sp, #0x10
|
|
bl SkipPadding
|
|
cmp r0, #0
|
|
addeq sp, sp, #0x120
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, lr}
|
|
bxeq lr
|
|
add r1, sp, #0x14
|
|
add r0, sp, #0x18
|
|
str r1, [sp]
|
|
str r0, [sp, #4]
|
|
mov r2, #0
|
|
ldr r0, [sp, #0xc]
|
|
ldr r1, [sp, #0x10]
|
|
mov r3, r2
|
|
bl ParseSignHash
|
|
cmp r0, #0
|
|
addeq sp, sp, #0x120
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, lr}
|
|
bxeq lr
|
|
ldr r0, [sp, #0x18]
|
|
cmp r0, #0x14
|
|
addne sp, sp, #0x120
|
|
movne r0, #0
|
|
ldmneia sp!, {r4, lr}
|
|
bxne lr
|
|
ldr r2, [sp, #0x14]
|
|
mov r3, #0
|
|
_02239598:
|
|
ldrb r1, [r2]
|
|
ldrb r0, [r4]
|
|
cmp r1, r0
|
|
addne sp, sp, #0x120
|
|
movne r0, #0
|
|
ldmneia sp!, {r4, lr}
|
|
bxne lr
|
|
add r3, r3, #1
|
|
cmp r3, #0x14
|
|
add r4, r4, #1
|
|
add r2, r2, #1
|
|
blt _02239598
|
|
mov r0, #1
|
|
add sp, sp, #0x120
|
|
ldmia sp!, {r4, lr}
|
|
bx lr
|
|
; .align 2, 0
|
|
_022395D8: .word 0x00010001
|
|
arm_func_end CRYPTO_VerifySignatureWithHash
|
|
|
|
arm_func_start ParseSignHash
|
|
ParseSignHash: ; 0x022395DC
|
|
stmfd sp!, {r0, r1, r2, r3}
|
|
stmfd sp!, {r4, r5, lr}
|
|
sub sp, sp, #4
|
|
mov r5, r2
|
|
mov r4, r3
|
|
add r0, sp, #0x10
|
|
add r1, sp, #0x14
|
|
mov r2, #0x30
|
|
mov r3, #0
|
|
bl ASN1Skip
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
addeq sp, sp, #0x10
|
|
bxeq lr
|
|
add r0, sp, #0x10
|
|
add r1, sp, #0x14
|
|
mov r2, #0x30
|
|
mov r3, #0
|
|
bl ASN1Skip
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
addeq sp, sp, #0x10
|
|
bxeq lr
|
|
add r0, sp, #0x10
|
|
add r1, sp, #0x14
|
|
add r3, sp, #0
|
|
mov r2, #6
|
|
bl ASN1Skip
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
addeq sp, sp, #0x10
|
|
bxeq lr
|
|
cmp r5, #0
|
|
ldrne r0, [sp, #0x10]
|
|
strne r0, [r5]
|
|
cmp r4, #0
|
|
ldrne r0, [sp]
|
|
strne r0, [r4]
|
|
ldr r2, [sp]
|
|
ldr r0, [sp, #0x10]
|
|
ldr r1, [sp, #0x14]
|
|
add r0, r0, r2
|
|
str r0, [sp, #0x10]
|
|
cmp r1, r2
|
|
addlo sp, sp, #4
|
|
movlo r0, #0
|
|
ldmloia sp!, {r4, r5, lr}
|
|
addlo sp, sp, #0x10
|
|
bxlo lr
|
|
sub ip, r1, r2
|
|
add r0, sp, #0x10
|
|
add r1, sp, #0x14
|
|
add r3, sp, #0
|
|
mov r2, #5
|
|
str ip, [sp, #0x14]
|
|
bl ASN1Skip
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
addeq sp, sp, #0x10
|
|
bxeq lr
|
|
ldr r2, [sp]
|
|
ldr r0, [sp, #0x10]
|
|
ldr r1, [sp, #0x14]
|
|
add r0, r0, r2
|
|
str r0, [sp, #0x10]
|
|
cmp r1, r2
|
|
addlo sp, sp, #4
|
|
movlo r0, #0
|
|
ldmloia sp!, {r4, r5, lr}
|
|
addlo sp, sp, #0x10
|
|
bxlo lr
|
|
sub ip, r1, r2
|
|
add r0, sp, #0x10
|
|
add r1, sp, #0x14
|
|
add r3, sp, #0
|
|
mov r2, #4
|
|
str ip, [sp, #0x14]
|
|
bl ASN1Skip
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
addeq sp, sp, #0x10
|
|
bxeq lr
|
|
ldr r1, [sp, #0x20]
|
|
cmp r1, #0
|
|
ldrne r0, [sp, #0x10]
|
|
strne r0, [r1]
|
|
ldr r1, [sp, #0x24]
|
|
cmp r1, #0
|
|
ldrne r0, [sp]
|
|
strne r0, [r1]
|
|
mov r0, #1
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, lr}
|
|
add sp, sp, #0x10
|
|
bx lr
|
|
arm_func_end ParseSignHash
|
|
|
|
arm_func_start SkipPadding
|
|
SkipPadding: ; 0x02239780
|
|
stmdb sp!, {lr}
|
|
sub sp, sp, #4
|
|
cmp r1, #0xa
|
|
addlo sp, sp, #4
|
|
movlo r0, #0
|
|
ldmloia sp!, {lr}
|
|
bxlo lr
|
|
ldrb ip, [r0]
|
|
add lr, r0, r1
|
|
cmp ip, #1
|
|
addne sp, sp, #4
|
|
movne r0, #0
|
|
ldmneia sp!, {lr}
|
|
bxne lr
|
|
add ip, r0, #1
|
|
mov r1, #0
|
|
_022397C0:
|
|
ldrb r0, [ip], #1
|
|
cmp r0, #0xff
|
|
addne sp, sp, #4
|
|
movne r0, #0
|
|
ldmneia sp!, {lr}
|
|
bxne lr
|
|
add r1, r1, #1
|
|
cmp r1, #8
|
|
blt _022397C0
|
|
cmp ip, lr
|
|
beq _02239804
|
|
_022397EC:
|
|
ldrb r0, [ip]
|
|
cmp r0, #0xff
|
|
bne _02239804
|
|
add ip, ip, #1
|
|
cmp ip, lr
|
|
bne _022397EC
|
|
_02239804:
|
|
cmp ip, lr
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {lr}
|
|
bxeq lr
|
|
ldrb r0, [ip]
|
|
cmp r0, #0
|
|
movne r0, #0
|
|
addeq r0, ip, #1
|
|
subeq r1, lr, r0
|
|
streq r1, [r3]
|
|
streq r0, [r2]
|
|
moveq r0, #1
|
|
add sp, sp, #4
|
|
ldmia sp!, {lr}
|
|
bx lr
|
|
arm_func_end SkipPadding
|
|
|
|
arm_func_start ASN1Skip
|
|
ASN1Skip: ; 0x02239844
|
|
stmfd sp!, {r4, r5, r6, lr}
|
|
ldr r5, [r0, #0]
|
|
mov r6, #0
|
|
ldrb r4, [r5]
|
|
add r5, r5, #1
|
|
mov ip, r6
|
|
cmp r4, r2
|
|
ldr r2, [r1, #0]
|
|
movne r0, r6
|
|
ldmneia sp!, {r4, r5, r6, lr}
|
|
bxne lr
|
|
cmp r2, #1
|
|
movlo r0, r6
|
|
ldmloia sp!, {r4, r5, r6, lr}
|
|
bxlo lr
|
|
ldrb lr, [r5]
|
|
sub r4, r2, #1
|
|
ands r2, lr, #0x80
|
|
beq _022398E0
|
|
and r2, lr, #0x7f
|
|
and lr, r2, #0xff
|
|
add r2, lr, #1
|
|
cmp r4, r2
|
|
movlo r0, r6
|
|
ldmloia sp!, {r4, r5, r6, lr}
|
|
bxlo lr
|
|
cmp r3, #0
|
|
sub r6, r4, lr
|
|
beq _022398D8
|
|
ldrb r2, [r5, #1]
|
|
add r5, r5, #1
|
|
and r4, r2, #0x7f
|
|
_022398C4:
|
|
sub r2, lr, #1
|
|
add ip, r4, ip, lsl #7
|
|
ands lr, r2, #0xff
|
|
bne _022398C4
|
|
b _022398FC
|
|
_022398D8:
|
|
add r5, r5, lr
|
|
b _022398FC
|
|
_022398E0:
|
|
add r5, r5, #1
|
|
cmp r4, #1
|
|
mov ip, lr
|
|
movlo r0, r6
|
|
ldmloia sp!, {r4, r5, r6, lr}
|
|
bxlo lr
|
|
sub r6, r4, #1
|
|
_022398FC:
|
|
str r5, [r0, #0]
|
|
str r6, [r1, #0]
|
|
cmp r3, #0
|
|
strne ip, [r3]
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, lr}
|
|
bx lr
|
|
arm_func_end ASN1Skip
|
|
|
|
arm_func_start CRYPTOi_RSA
|
|
CRYPTOi_RSA: ; 0x02239918
|
|
stmfd sp!, {r4, r5, r6, r7, r8, lr}
|
|
sub sp, sp, #0x58
|
|
movs r6, r0
|
|
mov r5, r1
|
|
mov r8, r2
|
|
mov r7, r3
|
|
beq _02239948
|
|
cmp r8, #0
|
|
beq _02239948
|
|
ldr r0, [sp, #0x70]
|
|
cmp r0, #0
|
|
bne _02239958
|
|
_02239948:
|
|
add sp, sp, #0x58
|
|
mvn r0, #2
|
|
ldmia sp!, {r4, r5, r6, r7, r8, lr}
|
|
bx lr
|
|
_02239958:
|
|
bl BN_CTX_new
|
|
mov r4, r0
|
|
add r0, sp, #4
|
|
bl BN_init
|
|
add r0, sp, #0x18
|
|
bl BN_init
|
|
add r0, sp, #0x2c
|
|
bl BN_init
|
|
add r0, sp, #0x40
|
|
bl BN_init
|
|
cmp r4, #0
|
|
mvneq r5, #1
|
|
beq _02239A34
|
|
add r2, sp, #4
|
|
mov r0, r8
|
|
mov r1, r7
|
|
bl BN_bin2bn
|
|
cmp r0, #0
|
|
mvneq r5, #1
|
|
beq _02239A34
|
|
ldr r1, [sp, #0x78]
|
|
add r0, sp, #0x2c
|
|
bl BN_set_word
|
|
cmp r0, #0
|
|
mvneq r5, #1
|
|
beq _02239A34
|
|
ldr r0, [sp, #0x70]
|
|
ldr r1, [sp, #0x74]
|
|
add r2, sp, #0x40
|
|
bl BN_bin2bn
|
|
cmp r0, #0
|
|
mvneq r5, #1
|
|
beq _02239A34
|
|
add r0, sp, #0x18
|
|
add r1, sp, #4
|
|
add r2, sp, #0x2c
|
|
add r3, sp, #0x40
|
|
str r4, [sp]
|
|
bl BN_mod_exp
|
|
cmp r0, #0
|
|
mvneq r5, #1
|
|
beq _02239A34
|
|
add r0, sp, #0x18
|
|
bl BN_num_bits
|
|
add r1, r0, #7
|
|
mov r0, r1, asr #2
|
|
add r0, r1, r0, lsr #29
|
|
mov r0, r0, asr #3
|
|
cmp r0, r5
|
|
mvngt r5, #0
|
|
bgt _02239A34
|
|
add r0, sp, #0x18
|
|
mov r1, r6
|
|
bl BN_bn2bin
|
|
mov r5, r0
|
|
_02239A34:
|
|
add r0, sp, #4
|
|
bl BN_free
|
|
add r0, sp, #0x18
|
|
bl BN_free
|
|
add r0, sp, #0x2c
|
|
bl BN_free
|
|
add r0, sp, #0x40
|
|
bl BN_free
|
|
cmp r4, #0
|
|
beq _02239A64
|
|
mov r0, r4
|
|
bl BN_CTX_free
|
|
_02239A64:
|
|
mov r0, r5
|
|
add sp, sp, #0x58
|
|
ldmia sp!, {r4, r5, r6, r7, r8, lr}
|
|
bx lr
|
|
arm_func_end CRYPTOi_RSA
|
|
|
|
arm_func_start BN_mod_exp_mont
|
|
BN_mod_exp_mont: ; 0x02239A74
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
sub sp, sp, #0x7c
|
|
mov r4, #0
|
|
mov r5, r3
|
|
mov r3, r4
|
|
str r3, [sp, #0x34]
|
|
ldr r3, [r5, #0]
|
|
str r0, [sp, #4]
|
|
mov r0, r4
|
|
ldr r3, [r3, #0]
|
|
str r0, [sp, #0x1c]
|
|
str r0, [sp, #0x20]
|
|
ands r0, r3, #1
|
|
ldr r0, [sp, #0xa0]
|
|
str r4, [sp, #8]
|
|
str r0, [sp, #0xa0]
|
|
mov r7, r1
|
|
mov r6, r2
|
|
addeq sp, sp, #0x7c
|
|
moveq r0, r4
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bxeq lr
|
|
ldr r1, [r7, #4]
|
|
ldr r0, [r0, #0]
|
|
cmp r1, #0
|
|
str r0, [sp, #0xc]
|
|
beq _02239AF8
|
|
cmp r1, #1
|
|
bne _02239B14
|
|
ldr r0, [r7, #0]
|
|
ldr r0, [r0, #0]
|
|
cmp r0, #0
|
|
bne _02239B14
|
|
_02239AF8:
|
|
ldr r0, [sp, #4]
|
|
mov r1, #0
|
|
bl BN_set_word
|
|
add sp, sp, #0x7c
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
_02239B14:
|
|
ldr r1, [r6, #4]
|
|
cmp r1, #0
|
|
beq _02239B38
|
|
cmp r1, #1
|
|
bne _02239B54
|
|
ldr r0, [r6, #0]
|
|
ldr r0, [r0, #0]
|
|
cmp r0, #0
|
|
bne _02239B54
|
|
_02239B38:
|
|
ldr r0, [sp, #4]
|
|
mov r1, #1
|
|
bl BN_set_word
|
|
add sp, sp, #0x7c
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
_02239B54:
|
|
cmp r1, #1
|
|
bne _02239B88
|
|
ldr r0, [r6, #0]
|
|
ldr r0, [r0, #0]
|
|
cmp r0, #1
|
|
bne _02239B88
|
|
ldr r0, [sp, #4]
|
|
mov r1, r7
|
|
bl BN_copy
|
|
add sp, sp, #0x7c
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
_02239B88:
|
|
ldr r0, [sp, #0xa4]
|
|
str r0, [sp, #0x18]
|
|
cmp r0, #0
|
|
bne _02239BBC
|
|
bl BN_MONT_CTX_new
|
|
str r0, [sp, #0x18]
|
|
cmp r0, #0
|
|
beq _0223A218
|
|
ldr r2, [sp, #0xa0]
|
|
mov r1, r5
|
|
bl BN_MONT_CTX_set_word
|
|
cmp r0, #0
|
|
beq _0223A218
|
|
_02239BBC:
|
|
ldr r3, [sp, #0xa0]
|
|
add r1, sp, #0x34
|
|
mov r4, r3
|
|
ldr r4, [r4, #0x10c]
|
|
mov r0, r6
|
|
mov r2, #0
|
|
str r4, [sp, #0x1c]
|
|
bl BN_gen_exp_bits
|
|
cmp r0, #0
|
|
beq _0223A218
|
|
ldr r0, [sp, #0xa0]
|
|
ldr r0, [r0, #0]
|
|
add r1, r0, #1
|
|
ldr r0, [sp, #0xa0]
|
|
str r1, [r0, #0]
|
|
ldr r0, [sp, #0x34]
|
|
ldrb r1, [r0, #2]
|
|
ldrb r0, [r0, #3]
|
|
str r0, [sp, #0x10]
|
|
add r0, r1, #0x3f
|
|
bl _s32_div_f
|
|
ldr r1, [sp, #0x34]
|
|
mov r4, r0
|
|
add r0, r1, #4
|
|
str r0, [sp, #0x34]
|
|
ldr r0, [sp, #0x18]
|
|
ldr r3, [r7, #4]
|
|
ldr sl, [r0, #0x24]
|
|
cmp r3, sl
|
|
bne _02239C54
|
|
ldr r1, [r7, #0]
|
|
sub r2, sl, #1
|
|
ldr r0, [r5, #0]
|
|
ldr r1, [r1, r2, lsl #2]
|
|
ldr r0, [r0, r2, lsl #2]
|
|
cmp r1, r0
|
|
strlo r7, [sp, #0x14]
|
|
blo _02239D0C
|
|
_02239C54:
|
|
cmp r3, sl
|
|
bge _02239CC8
|
|
ldr r0, [sp, #0xa0]
|
|
ldr r3, [r0, #0]
|
|
add r1, r0, #4
|
|
add r2, r3, #1
|
|
str r2, [r0, #0]
|
|
mov r0, #0x14
|
|
mla r0, r3, r0, r1
|
|
ldr r2, [r7, #4]
|
|
mov r1, r0
|
|
str r2, [r1, #4]
|
|
mov r1, sl
|
|
str r0, [sp, #0x14]
|
|
bl bn_zexpand
|
|
ldr r0, [r7, #4]
|
|
mov r2, #0
|
|
cmp r0, #0
|
|
ble _02239D0C
|
|
_02239CA0:
|
|
ldr r1, [r7, #0]
|
|
ldr r0, [sp, #0x14]
|
|
ldr r1, [r1, r2, lsl #2]
|
|
ldr r0, [r0, #0]
|
|
str r1, [r0, r2, lsl #2]
|
|
ldr r0, [r7, #4]
|
|
add r2, r2, #1
|
|
cmp r2, r0
|
|
blt _02239CA0
|
|
b _02239D0C
|
|
_02239CC8:
|
|
ldr r0, [sp, #0xa0]
|
|
mov r2, r5
|
|
ldr r3, [r0, #0]
|
|
mov r1, r7
|
|
add r5, r3, #1
|
|
str r5, [r0, #0]
|
|
add r5, r0, #4
|
|
mov r0, #0x14
|
|
mla r0, r3, r0, r5
|
|
ldr r3, [sp, #0xa0]
|
|
str r0, [sp, #0x14]
|
|
bl BN_mod
|
|
cmp r0, #0
|
|
beq _0223A218
|
|
ldr r0, [sp, #0x14]
|
|
mov r1, sl
|
|
bl bn_zexpand
|
|
_02239D0C:
|
|
ldr r0, [sp, #0xa0]
|
|
ldr r3, [r0, #0]
|
|
ldr r0, [r6, #4]
|
|
add r1, r3, #1
|
|
mul r2, r0, r4
|
|
ldr r0, [sp, #0xa0]
|
|
mov r4, r2, lsl #1
|
|
str r1, [r0, #0]
|
|
ldr r1, [r0, #0]
|
|
add r4, r4, #7
|
|
add r2, r1, #1
|
|
str r2, [r0, #0]
|
|
ldr r2, [sp, #0x10]
|
|
ldr r0, [r0, #0]
|
|
mul r5, r2, sl
|
|
mov r2, r4, asr #1
|
|
add r2, r4, r2, lsr #30
|
|
add r5, r5, r2, asr #2
|
|
ldr r2, [sp, #0xa0]
|
|
mov r6, #0x14
|
|
add r2, r2, #4
|
|
mla r8, r1, r6, r2
|
|
mla r4, r3, r6, r2
|
|
ldr r1, [sp, #0xa0]
|
|
add r3, r0, #1
|
|
mla r7, r0, r6, r2
|
|
str r3, [r1, #0]
|
|
mov r0, r1
|
|
ldr r0, [r0, #0]
|
|
mla r6, r0, r6, r2
|
|
add r1, r0, #1
|
|
ldr r0, [sp, #0xa0]
|
|
str r1, [r0, #0]
|
|
ldr r0, [sp, #4]
|
|
ldr r0, [r0, #8]
|
|
cmp sl, r0
|
|
ldrle r0, [sp, #4]
|
|
ble _02239DB0
|
|
ldr r0, [sp, #4]
|
|
mov r1, sl
|
|
bl bn_expand2
|
|
_02239DB0:
|
|
cmp r0, #0
|
|
beq _0223A218
|
|
ldr r0, [r8, #8]
|
|
mov r1, sl, lsl #2
|
|
cmp r1, r0
|
|
movle r0, r8
|
|
ble _02239DD4
|
|
mov r0, r8
|
|
bl bn_expand2
|
|
_02239DD4:
|
|
cmp r0, #0
|
|
beq _0223A218
|
|
ldr r1, [r7, #8]
|
|
mov r0, sl, lsl #1
|
|
str r0, [sp, #0x24]
|
|
cmp r0, r1
|
|
movle r0, r7
|
|
ble _02239E00
|
|
ldr r1, [sp, #0x24]
|
|
mov r0, r7
|
|
bl bn_expand2
|
|
_02239E00:
|
|
cmp r0, #0
|
|
beq _0223A218
|
|
ldr r0, [r4, #8]
|
|
cmp r5, r0
|
|
movle r0, r4
|
|
ble _02239E24
|
|
mov r1, r5
|
|
mov r0, r4
|
|
bl bn_expand2
|
|
_02239E24:
|
|
cmp r0, #0
|
|
beq _0223A218
|
|
ldr r1, [r6, #8]
|
|
ldr r0, [sp, #0x24]
|
|
cmp r0, r1
|
|
movle r0, r6
|
|
ble _02239E4C
|
|
ldr r1, [sp, #0x24]
|
|
mov r0, r6
|
|
bl bn_expand2
|
|
_02239E4C:
|
|
cmp r0, #0
|
|
beq _0223A218
|
|
ldr r0, [sp, #0x18]
|
|
ldr fp, [r8]
|
|
ldr r8, [r7]
|
|
ldr r6, [r6, #0]
|
|
ldr r1, [r4, #0]
|
|
ldr r7, [r0, #0x48]
|
|
ldr r5, [r0, #0x20]
|
|
ldr r3, [sp, #0x18]
|
|
str r1, [sp, #0x38]
|
|
str sl, [sp]
|
|
ldr r1, [sp, #0x14]
|
|
ldr r3, [r3, #0xc]
|
|
ldr r1, [r1, #0]
|
|
mov r0, r6
|
|
mov r2, sl
|
|
bl bn_mul_normal
|
|
str r7, [sp]
|
|
ldr r0, [sp, #0x38]
|
|
mov r1, r6
|
|
mov r2, r5
|
|
mov r3, sl
|
|
bl bn_from_montgomery_words
|
|
ldr r0, [sp, #0x10]
|
|
cmp r0, #1
|
|
ble _02239F54
|
|
ldr r1, [sp, #0x38]
|
|
mov r0, r6
|
|
mov r2, sl
|
|
mov r3, fp
|
|
bl bn_sqr_normal
|
|
mov r0, fp
|
|
mov r1, r6
|
|
mov r2, r5
|
|
mov r3, sl
|
|
str r7, [sp]
|
|
bl bn_from_montgomery_words
|
|
ldr r0, [sp, #0x10]
|
|
mov r4, #1
|
|
cmp r0, #1
|
|
ble _02239F54
|
|
mov r0, sl, lsl #2
|
|
str r0, [sp, #0x28]
|
|
add sb, sp, #0x38
|
|
_02239F00:
|
|
sub r3, r4, #1
|
|
ldr r2, [sb, r3, lsl #2]
|
|
ldr r1, [sp, #0x28]
|
|
mov r0, r6
|
|
add r1, r2, r1
|
|
str r1, [sb, r4, lsl #2]
|
|
str sl, [sp]
|
|
ldr r1, [sb, r3, lsl #2]
|
|
mov r2, sl
|
|
mov r3, fp
|
|
bl bn_mul_normal
|
|
str r7, [sp]
|
|
ldr r0, [sb, r4, lsl #2]
|
|
mov r1, r6
|
|
mov r2, r5
|
|
mov r3, sl
|
|
bl bn_from_montgomery_words
|
|
ldr r0, [sp, #0x10]
|
|
add r4, r4, #1
|
|
cmp r4, r0
|
|
blt _02239F00
|
|
_02239F54:
|
|
ldr r3, [sp, #0x34]
|
|
add r0, r3, #1
|
|
str r0, [sp, #0x34]
|
|
add r2, r0, #1
|
|
ldrb r1, [r3]
|
|
str r2, [sp, #0x34]
|
|
ldrb sb, [r3, #1]
|
|
cmp sb, #0xff
|
|
bne _02239FD4
|
|
cmp r1, #0
|
|
bne _02239FD4
|
|
add r0, r2, #1
|
|
str r0, [sp, #0x34]
|
|
ldrb r1, [r2]
|
|
b _02239FA4
|
|
_02239F90:
|
|
add sb, sb, #0x100
|
|
ldr r1, [sp, #0x34]
|
|
add r1, r1, #2
|
|
str r1, [sp, #0x34]
|
|
ldrb r1, [r0, #1]
|
|
_02239FA4:
|
|
ldr r0, [sp, #0x34]
|
|
ldrb r2, [r0]
|
|
cmp r2, #0xff
|
|
bne _02239FBC
|
|
cmp r1, #0
|
|
beq _02239F90
|
|
_02239FBC:
|
|
ldr r2, [sp, #0x34]
|
|
add r2, r2, #1
|
|
str r2, [sp, #0x34]
|
|
ldrb r0, [r0]
|
|
add r0, r0, #1
|
|
add sb, sb, r0
|
|
_02239FD4:
|
|
mov r2, r1, asr #1
|
|
add r0, sp, #0x38
|
|
ldr r0, [r0, r2, lsl #2]
|
|
mov r1, r8
|
|
mov r2, sl, lsl #2
|
|
bl MI_CpuCopy8
|
|
cmp sb, #0
|
|
beq _0223A1AC
|
|
mov r0, #0xff
|
|
str r0, [sp, #0x2c]
|
|
mov r0, #0
|
|
str r0, [sp, #0x30]
|
|
_0223A004:
|
|
ldr r0, [sp, #0x1c]
|
|
cmp r0, #0
|
|
beq _0223A038
|
|
mov r3, r0
|
|
ldr r1, [sp, #0x2c]
|
|
ldr r2, [sp, #0x20]
|
|
ldr r3, [r3, #0]
|
|
blx r3
|
|
cmp r0, #0
|
|
ldr r0, [sp, #0x20]
|
|
add r0, r0, #1
|
|
str r0, [sp, #0x20]
|
|
bne _0223A218
|
|
_0223A038:
|
|
ldr r0, [sp, #0xa0]
|
|
ldr r0, [r0, #0x108]
|
|
ands r0, r0, #0x4000
|
|
bne _0223A218
|
|
cmp sb, #0
|
|
ldr r4, [sp, #0x30]
|
|
ble _0223A08C
|
|
_0223A054:
|
|
mov r0, r6
|
|
mov r1, r8
|
|
mov r2, sl
|
|
mov r3, fp
|
|
bl bn_sqr_normal
|
|
str r7, [sp]
|
|
mov r0, r8
|
|
mov r1, r6
|
|
mov r2, r5
|
|
mov r3, sl
|
|
bl bn_from_montgomery_words
|
|
add r4, r4, #1
|
|
cmp r4, sb
|
|
blt _0223A054
|
|
_0223A08C:
|
|
ldr r2, [sp, #0x34]
|
|
add r0, r2, #1
|
|
str r0, [sp, #0x34]
|
|
add r1, r0, #1
|
|
ldrb r0, [r2]
|
|
str r1, [sp, #0x34]
|
|
ldrb sb, [r2, #1]
|
|
cmp sb, #0xff
|
|
bne _0223A10C
|
|
cmp r0, #0
|
|
bne _0223A10C
|
|
add r0, r1, #1
|
|
str r0, [sp, #0x34]
|
|
ldrb r0, [r1]
|
|
b _0223A0DC
|
|
_0223A0C8:
|
|
add sb, sb, #0x100
|
|
ldr r0, [sp, #0x34]
|
|
add r0, r0, #2
|
|
str r0, [sp, #0x34]
|
|
ldrb r0, [r1, #1]
|
|
_0223A0DC:
|
|
ldr r1, [sp, #0x34]
|
|
ldrb r2, [r1]
|
|
cmp r2, #0xff
|
|
bne _0223A0F4
|
|
cmp r0, #0
|
|
beq _0223A0C8
|
|
_0223A0F4:
|
|
ldr r2, [sp, #0x34]
|
|
add r2, r2, #1
|
|
str r2, [sp, #0x34]
|
|
ldrb r1, [r1]
|
|
add r1, r1, #1
|
|
add sb, sb, r1
|
|
_0223A10C:
|
|
cmp r0, #0
|
|
bne _0223A11C
|
|
cmp sb, #0
|
|
beq _0223A1AC
|
|
_0223A11C:
|
|
cmp sb, #0
|
|
bne _0223A12C
|
|
cmp r0, #1
|
|
beq _0223A168
|
|
_0223A12C:
|
|
mov r1, r0, asr #1
|
|
str sl, [sp]
|
|
add r0, sp, #0x38
|
|
ldr r3, [r0, r1, lsl #2]
|
|
mov r0, r6
|
|
mov r1, r8
|
|
mov r2, sl
|
|
bl bn_mul_normal
|
|
mov r0, r8
|
|
mov r1, r6
|
|
mov r2, r5
|
|
mov r3, sl
|
|
str r7, [sp]
|
|
bl bn_from_montgomery_words
|
|
b _0223A1A4
|
|
_0223A168:
|
|
ldr r0, [sp, #0x14]
|
|
str sl, [sp]
|
|
ldr r3, [r0, #0]
|
|
mov r0, r6
|
|
mov r1, r8
|
|
mov r2, sl
|
|
bl bn_mul_normal
|
|
ldr r0, [sp, #4]
|
|
str r7, [sp]
|
|
ldr r0, [r0, #0]
|
|
mov r1, r6
|
|
mov r2, r5
|
|
mov r3, sl
|
|
bl bn_from_montgomery_words
|
|
b _0223A1F0
|
|
_0223A1A4:
|
|
cmp sb, #0
|
|
bne _0223A004
|
|
_0223A1AC:
|
|
ldr r0, [sp, #0x24]
|
|
mov r2, sl
|
|
cmp sl, r0
|
|
bge _0223A1D4
|
|
mov r1, #0
|
|
_0223A1C0:
|
|
ldr r0, [sp, #0x24]
|
|
str r1, [r8, r2, lsl #2]
|
|
add r2, r2, #1
|
|
cmp r2, r0
|
|
blt _0223A1C0
|
|
_0223A1D4:
|
|
ldr r0, [sp, #4]
|
|
str r7, [sp]
|
|
ldr r0, [r0, #0]
|
|
mov r1, r8
|
|
mov r2, r5
|
|
mov r3, sl
|
|
bl bn_from_montgomery_words
|
|
_0223A1F0:
|
|
ldr r0, [sp, #0xa0]
|
|
ldr r0, [r0, #0x108]
|
|
ands r0, r0, #0x4000
|
|
bne _0223A218
|
|
ldr r0, [sp, #4]
|
|
mov r1, r0
|
|
str sl, [r1, #4]
|
|
bl bn_fix_top
|
|
mov r0, #1
|
|
str r0, [sp, #8]
|
|
_0223A218:
|
|
ldr r0, [sp, #0x1c]
|
|
cmp r0, #0
|
|
beq _0223A240
|
|
ldr r3, [r0, #0]
|
|
mov r1, #0xff
|
|
mvn r2, #0
|
|
blx r3
|
|
cmp r0, #0
|
|
movne r0, #0
|
|
strne r0, [sp, #8]
|
|
_0223A240:
|
|
ldr r0, [sp, #0xa4]
|
|
cmp r0, #0
|
|
bne _0223A25C
|
|
ldr r0, [sp, #0x18]
|
|
cmp r0, #0
|
|
beq _0223A25C
|
|
bl BN_MONT_CTX_free
|
|
_0223A25C:
|
|
ldr r2, [sp, #0xc]
|
|
ldr r1, [sp, #0xa0]
|
|
ldr r0, [sp, #8]
|
|
str r2, [r1, #0]
|
|
add sp, sp, #0x7c
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
arm_func_end BN_mod_exp_mont
|
|
|
|
arm_func_start BN_mod_exp_recp
|
|
BN_mod_exp_recp: ; 0x0223A278
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
sub sp, sp, #0x18c
|
|
mov sl, r0
|
|
mov r0, #0
|
|
str r0, [sp, #8]
|
|
mov r5, r1
|
|
ldr r1, [sp, #8]
|
|
mov r0, r2
|
|
str r2, [sp, #4]
|
|
mov r4, r3
|
|
str r1, [sp, #0xc]
|
|
ldr sb, [sp, #0x1b0]
|
|
bl BN_num_bits
|
|
ldr r1, [r5, #4]
|
|
mov r8, r0
|
|
cmp r1, #0
|
|
beq _0223A2D4
|
|
cmp r1, #1
|
|
bne _0223A2F0
|
|
ldr r0, [r5, #0]
|
|
ldr r0, [r0, #0]
|
|
cmp r0, #0
|
|
bne _0223A2F0
|
|
_0223A2D4:
|
|
mov r0, sl
|
|
mov r1, #0
|
|
bl BN_set_word
|
|
add sp, sp, #0x18c
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
_0223A2F0:
|
|
ldr r0, [sp, #4]
|
|
ldr r1, [r0, #4]
|
|
cmp r1, #0
|
|
beq _0223A318
|
|
cmp r1, #1
|
|
bne _0223A334
|
|
ldr r0, [r0, #0]
|
|
ldr r0, [r0, #0]
|
|
cmp r0, #0
|
|
bne _0223A334
|
|
_0223A318:
|
|
mov r0, sl
|
|
mov r1, #1
|
|
bl BN_set_word
|
|
add sp, sp, #0x18c
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
_0223A334:
|
|
cmp r1, #1
|
|
bne _0223A36C
|
|
ldr r0, [sp, #4]
|
|
ldr r0, [r0, #0]
|
|
ldr r0, [r0, #0]
|
|
cmp r0, #1
|
|
bne _0223A36C
|
|
mov r0, sl
|
|
mov r1, r5
|
|
bl BN_copy
|
|
add sp, sp, #0x18c
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
_0223A36C:
|
|
add r0, sp, #0x18
|
|
bl BN_RECP_CTX_init
|
|
add r0, sp, #0x18
|
|
mov r1, r4
|
|
mov r2, sb
|
|
bl BN_RECP_CTX_set
|
|
cmp r0, #0
|
|
ble _0223A5B8
|
|
add r0, sp, #0x4c
|
|
bl BN_init
|
|
ldr r2, [sb]
|
|
add r1, sb, #4
|
|
mov r0, #0x14
|
|
mla r6, r2, r0, r1
|
|
add r1, r2, #1
|
|
str r1, [sb]
|
|
mov r2, r4
|
|
mov r4, #1
|
|
add r0, sp, #0x4c
|
|
mov r1, r5
|
|
mov r3, sb
|
|
str r4, [sp, #0xc]
|
|
bl BN_mod
|
|
cmp r0, #0
|
|
beq _0223A5B8
|
|
add r1, sp, #0x4c
|
|
add r3, sp, #0x18
|
|
mov r0, r6
|
|
mov r2, r1
|
|
str sb, [sp]
|
|
bl BN_mod_mul_reciprocal
|
|
cmp r0, #0
|
|
beq _0223A5B8
|
|
cmp r8, #0x11
|
|
movle fp, r4
|
|
ble _0223A414
|
|
cmp r8, #0x100
|
|
movge fp, #5
|
|
bge _0223A414
|
|
cmp r8, #0x80
|
|
movge fp, #4
|
|
movlt fp, #3
|
|
_0223A414:
|
|
sub r0, fp, #1
|
|
mov r4, #1
|
|
mov r7, r4, lsl r0
|
|
cmp r7, #1
|
|
ble _0223A470
|
|
add r5, sp, #0x60
|
|
_0223A42C:
|
|
mov r0, r5
|
|
bl BN_init
|
|
sub r3, r4, #1
|
|
mov r2, #0x14
|
|
add r1, sp, #0x4c
|
|
mla r1, r3, r2, r1
|
|
mov r0, r5
|
|
mov r2, r6
|
|
add r3, sp, #0x18
|
|
str sb, [sp]
|
|
bl BN_mod_mul_reciprocal
|
|
cmp r0, #0
|
|
beq _0223A5B8
|
|
add r4, r4, #1
|
|
cmp r4, r7
|
|
add r5, r5, #0x14
|
|
blt _0223A42C
|
|
_0223A470:
|
|
mov r5, #1
|
|
mov r0, sl
|
|
mov r1, r5
|
|
str r4, [sp, #0xc]
|
|
sub r8, r8, #1
|
|
bl BN_set_word
|
|
cmp r0, #0
|
|
beq _0223A5B8
|
|
mov r0, r5
|
|
str r0, [sp, #0x10]
|
|
mov r0, #0
|
|
str r0, [sp, #0x14]
|
|
_0223A4A0:
|
|
ldr r0, [sp, #4]
|
|
mov r1, r8
|
|
bl BN_is_bit_set
|
|
cmp r0, #0
|
|
bne _0223A4EC
|
|
cmp r5, #0
|
|
bne _0223A4DC
|
|
mov r0, sl
|
|
mov r1, sl
|
|
mov r2, sl
|
|
add r3, sp, #0x18
|
|
str sb, [sp]
|
|
bl BN_mod_mul_reciprocal
|
|
cmp r0, #0
|
|
beq _0223A5B8
|
|
_0223A4DC:
|
|
cmp r8, #0
|
|
beq _0223A5B0
|
|
sub r8, r8, #1
|
|
b _0223A4A0
|
|
_0223A4EC:
|
|
ldr r6, [sp, #0x10]
|
|
ldr r7, [sp, #0x14]
|
|
cmp fp, #1
|
|
mov r4, r6
|
|
ble _0223A530
|
|
_0223A500:
|
|
subs r1, r8, r4
|
|
bmi _0223A530
|
|
ldr r0, [sp, #4]
|
|
bl BN_is_bit_set
|
|
cmp r0, #0
|
|
subne r0, r4, r7
|
|
movne r0, r6, lsl r0
|
|
movne r7, r4
|
|
add r4, r4, #1
|
|
orrne r6, r0, #1
|
|
cmp r4, fp
|
|
blt _0223A500
|
|
_0223A530:
|
|
cmp r5, #0
|
|
add r5, r7, #1
|
|
bne _0223A574
|
|
cmp r5, #0
|
|
ldr r4, [sp, #0x14]
|
|
ble _0223A574
|
|
_0223A548:
|
|
mov r0, sl
|
|
mov r1, sl
|
|
mov r2, sl
|
|
add r3, sp, #0x18
|
|
str sb, [sp]
|
|
bl BN_mod_mul_reciprocal
|
|
cmp r0, #0
|
|
beq _0223A5B8
|
|
add r4, r4, #1
|
|
cmp r4, r5
|
|
blt _0223A548
|
|
_0223A574:
|
|
mov r3, r6, asr #1
|
|
mov r1, #0x14
|
|
add r0, sp, #0x4c
|
|
mla r2, r3, r1, r0
|
|
mov r0, sl
|
|
mov r1, sl
|
|
add r3, sp, #0x18
|
|
str sb, [sp]
|
|
bl BN_mod_mul_reciprocal
|
|
cmp r0, #0
|
|
beq _0223A5B8
|
|
add r0, r7, #1
|
|
ldr r5, [sp, #0x14]
|
|
subs r8, r8, r0
|
|
bpl _0223A4A0
|
|
_0223A5B0:
|
|
mov r0, #1
|
|
str r0, [sp, #8]
|
|
_0223A5B8:
|
|
ldr r0, [sp, #0xc]
|
|
ldr r1, [sb]
|
|
cmp r0, #0
|
|
sub r0, r1, #1
|
|
str r0, [sb]
|
|
mov r4, #0
|
|
ble _0223A5F4
|
|
add r5, sp, #0x4c
|
|
_0223A5D8:
|
|
mov r0, r5
|
|
bl BN_clear_free
|
|
ldr r0, [sp, #0xc]
|
|
add r4, r4, #1
|
|
cmp r4, r0
|
|
add r5, r5, #0x14
|
|
blt _0223A5D8
|
|
_0223A5F4:
|
|
add r0, sp, #0x18
|
|
bl BN_RECP_CTX_free
|
|
ldr r0, [sp, #8]
|
|
add sp, sp, #0x18c
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
arm_func_end BN_mod_exp_recp
|
|
|
|
arm_func_start bn_div_words
|
|
bn_div_words: ; 0x0223A60C
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
sub sp, sp, #4
|
|
movs r8, r2
|
|
mov sl, r0
|
|
mov sb, r1
|
|
mov fp, #0
|
|
mov r5, #2
|
|
addeq sp, sp, #4
|
|
mvneq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bxeq lr
|
|
mov r0, r8
|
|
bl BN_num_bits_word
|
|
cmp r0, #0x20
|
|
beq _0223A660
|
|
mov r1, #1
|
|
cmp sl, r1, lsl r0
|
|
addhi sp, sp, #4
|
|
movhi r0, fp
|
|
ldmhiia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bxhi lr
|
|
_0223A660:
|
|
cmp sl, r8
|
|
rsb r2, r0, #0x20
|
|
subhs sl, sl, r8
|
|
cmp r2, #0
|
|
movne r1, sl, lsl r2
|
|
rsbne r0, r2, #0x20
|
|
orrne sl, r1, sb, lsr r0
|
|
movne r8, r8, lsl r2
|
|
ldr r4, _0223A748 ; =0x0000FFFF
|
|
movne sb, sb, lsl r2
|
|
and r7, r4, r8, lsr #16
|
|
and r6, r8, r4
|
|
_0223A690:
|
|
mov r0, sl, lsr #0x10
|
|
cmp r0, r7
|
|
moveq r0, r4
|
|
beq _0223A6AC
|
|
mov r0, sl
|
|
mov r1, r7
|
|
bl _u32_div_f
|
|
_0223A6AC:
|
|
mul ip, r0, r7
|
|
mul r3, r0, r6
|
|
and r2, r4, sb, lsr #16
|
|
_0223A6B8:
|
|
mov lr, #0x10000
|
|
sub r1, sl, ip
|
|
rsb lr, lr, #0
|
|
ands lr, r1, lr
|
|
bne _0223A6E4
|
|
add r1, r2, r1, lsl #16
|
|
cmp r3, r1
|
|
subhi ip, ip, r7
|
|
subhi r3, r3, r6
|
|
subhi r0, r0, #1
|
|
bhi _0223A6B8
|
|
_0223A6E4:
|
|
mul r2, r0, r6
|
|
and r1, r2, r4
|
|
mul r3, r0, r7
|
|
mov r1, r1, lsl #0x10
|
|
cmp sb, r1
|
|
add r2, r3, r2, lsr #16
|
|
addlo r2, r2, #1
|
|
cmp sl, r2
|
|
addlo sl, sl, r8
|
|
sub sb, sb, r1
|
|
sublo r0, r0, #1
|
|
sub r1, sl, r2
|
|
subs r5, r5, #1
|
|
beq _0223A738
|
|
and r2, r0, r4
|
|
mov r1, r1, lsl #0x10
|
|
and r0, sb, r4
|
|
orr sl, r1, sb, lsr #16
|
|
mov fp, r2, lsl #0x10
|
|
mov sb, r0, lsl #0x10
|
|
b _0223A690
|
|
_0223A738:
|
|
orr r0, fp, r0
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
; .align 2, 0
|
|
_0223A748: .word 0x0000FFFF
|
|
arm_func_end bn_div_words
|
|
|
|
arm_func_start BN_reciprocal
|
|
BN_reciprocal: ; 0x0223A74C
|
|
stmfd sp!, {r4, r5, r6, r7, r8, lr}
|
|
sub sp, sp, #0x18
|
|
mov r8, r0
|
|
add r0, sp, #4
|
|
mov r7, r1
|
|
mov r6, r2
|
|
mov r5, r3
|
|
mvn r4, #0
|
|
bl BN_init
|
|
add r0, sp, #4
|
|
mov r1, #0
|
|
bl BN_set_word
|
|
add r0, sp, #4
|
|
mov r1, r6
|
|
bl BN_set_bit
|
|
cmp r0, #0
|
|
beq _0223A7B0
|
|
add r2, sp, #4
|
|
mov r0, r8
|
|
mov r3, r7
|
|
mov r1, #0
|
|
str r5, [sp]
|
|
bl BN_div
|
|
cmp r0, #0
|
|
movne r4, r6
|
|
_0223A7B0:
|
|
add r0, sp, #4
|
|
bl BN_free
|
|
mov r0, r4
|
|
add sp, sp, #0x18
|
|
ldmia sp!, {r4, r5, r6, r7, r8, lr}
|
|
bx lr
|
|
arm_func_end BN_reciprocal
|
|
|
|
arm_func_start BN_div_recp
|
|
BN_div_recp: ; 0x0223A7C8
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
sub sp, sp, #0xc
|
|
ldr r6, [sp, #0x30]
|
|
mov sb, r1
|
|
ldr fp, [r6]
|
|
movs sl, r0
|
|
add r0, fp, #1
|
|
str r0, [r6, #0]
|
|
ldr r7, [r6, #0]
|
|
add r4, r6, #4
|
|
mov r0, #0x14
|
|
mla r5, fp, r0, r4
|
|
add ip, r7, #1
|
|
mov r1, #0
|
|
str r5, [sp, #4]
|
|
mla r5, r7, r0, r4
|
|
str ip, [r6]
|
|
str r1, [sp]
|
|
ldreq r1, [r6]
|
|
mov r8, r2
|
|
mlaeq sl, r1, r0, r4
|
|
addeq r0, r1, #1
|
|
streq r0, [r6]
|
|
mov r7, r3
|
|
cmp sb, #0
|
|
bne _0223A848
|
|
ldr r2, [r6, #0]
|
|
add r1, r6, #4
|
|
mov r0, #0x14
|
|
mla sb, r2, r0, r1
|
|
add r0, r2, #1
|
|
str r0, [r6, #0]
|
|
_0223A848:
|
|
mov r0, r8
|
|
mov r1, r7
|
|
bl BN_ucmp
|
|
cmp r0, #0
|
|
bge _0223A888
|
|
mov r0, sl
|
|
mov r1, #0
|
|
bl BN_set_word
|
|
mov r0, sb
|
|
mov r1, r8
|
|
bl BN_copy
|
|
add sp, sp, #0xc
|
|
str fp, [r6]
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
_0223A888:
|
|
mov r0, r8
|
|
bl BN_num_bits
|
|
ldr r1, [r7, #0x28]
|
|
mov r2, r0
|
|
mov r0, r1, lsl #1
|
|
cmp r0, r2
|
|
movgt r2, r0
|
|
suble r0, r2, r0
|
|
movgt r4, #0
|
|
addle r0, r0, r0, lsr #31
|
|
movle r4, r0, asr #1
|
|
ldr r1, [r7, #0x2c]
|
|
add r0, r2, r2, lsr #31
|
|
mov r0, r0, asr #1
|
|
cmp r2, r1
|
|
str r0, [sp, #8]
|
|
beq _0223A8E0
|
|
mov r1, r7
|
|
mov r3, r6
|
|
add r0, r7, #0x14
|
|
bl BN_reciprocal
|
|
str r0, [r7, #0x2c]
|
|
_0223A8E0:
|
|
ldr r2, [sp, #8]
|
|
ldr r0, [sp, #4]
|
|
mov r1, r8
|
|
sub r2, r2, r4
|
|
bl BN_rshift
|
|
cmp r0, #0
|
|
beq _0223AA30
|
|
ldr r1, [sp, #4]
|
|
mov r0, r5
|
|
mov r3, r6
|
|
add r2, r7, #0x14
|
|
bl BN_mul
|
|
cmp r0, #0
|
|
beq _0223AA30
|
|
ldr r2, [sp, #8]
|
|
mov r0, sl
|
|
mov r1, r5
|
|
add r2, r2, r4
|
|
bl BN_rshift
|
|
cmp r0, #0
|
|
beq _0223AA30
|
|
mov r4, #0
|
|
mov r0, r5
|
|
mov r1, r7
|
|
mov r2, sl
|
|
mov r3, r6
|
|
str r4, [sl, #0xc]
|
|
bl BN_mul
|
|
cmp r0, #0
|
|
beq _0223AA30
|
|
mov r0, sb
|
|
mov r1, r8
|
|
mov r2, r5
|
|
bl BN_usub
|
|
cmp r0, #0
|
|
beq _0223AA30
|
|
mov r5, r4
|
|
mov r0, sb
|
|
mov r1, r7
|
|
str r5, [sb, #0xc]
|
|
bl BN_ucmp
|
|
cmp r0, #0
|
|
blt _0223A9DC
|
|
mov r4, #1
|
|
_0223A990:
|
|
cmp r5, #2
|
|
add r5, r5, #1
|
|
bgt _0223AA30
|
|
mov r0, sb
|
|
mov r1, sb
|
|
mov r2, r7
|
|
bl BN_usub
|
|
cmp r0, #0
|
|
beq _0223AA30
|
|
mov r0, sl
|
|
mov r1, r4
|
|
bl BN_add_word
|
|
cmp r0, #0
|
|
beq _0223AA30
|
|
mov r0, sb
|
|
mov r1, r7
|
|
bl BN_ucmp
|
|
cmp r0, #0
|
|
bge _0223A990
|
|
_0223A9DC:
|
|
ldr r0, [sb, #4]
|
|
mov r1, #1
|
|
cmp r0, #0
|
|
beq _0223AA08
|
|
cmp r0, #1
|
|
bne _0223AA04
|
|
ldr r0, [sb]
|
|
ldr r0, [r0, #0]
|
|
cmp r0, #0
|
|
beq _0223AA08
|
|
_0223AA04:
|
|
mov r1, #0
|
|
_0223AA08:
|
|
cmp r1, #0
|
|
movne r0, #0
|
|
ldreq r0, [r8, #0xc]
|
|
str r0, [sb, #0xc]
|
|
mov r0, #1
|
|
ldr r2, [r8, #0xc]
|
|
ldr r1, [r7, #0xc]
|
|
str r0, [sp]
|
|
eor r0, r2, r1
|
|
str r0, [sl, #0xc]
|
|
_0223AA30:
|
|
ldr r0, [sp]
|
|
str fp, [r6]
|
|
add sp, sp, #0xc
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
arm_func_end BN_div_recp
|
|
|
|
arm_func_start BN_mod_mul_reciprocal
|
|
BN_mod_mul_reciprocal: ; 0x0223AA44
|
|
stmfd sp!, {r4, r5, r6, r7, r8, lr}
|
|
sub sp, sp, #8
|
|
ldr r4, [sp, #0x20]
|
|
mov ip, #0x14
|
|
ldr r5, [r4, #0]
|
|
add lr, r4, #4
|
|
mla r6, r5, ip, lr
|
|
add ip, r5, #1
|
|
mov r8, r0
|
|
mov r7, r3
|
|
str ip, [r4]
|
|
cmp r2, #0
|
|
mov r5, #0
|
|
beq _0223AAB4
|
|
cmp r1, r2
|
|
bne _0223AA9C
|
|
mov r0, r6
|
|
mov r2, r4
|
|
bl BN_sqr
|
|
cmp r0, #0
|
|
bne _0223AAB8
|
|
b _0223AAD4
|
|
_0223AA9C:
|
|
mov r0, r6
|
|
mov r3, r4
|
|
bl BN_mul
|
|
cmp r0, #0
|
|
bne _0223AAB8
|
|
b _0223AAD4
|
|
_0223AAB4:
|
|
mov r6, r1
|
|
_0223AAB8:
|
|
mov r1, r8
|
|
mov r2, r6
|
|
mov r3, r7
|
|
mov r0, #0
|
|
str r4, [sp]
|
|
bl BN_div_recp
|
|
mov r5, #1
|
|
_0223AAD4:
|
|
ldr r1, [r4, #0]
|
|
mov r0, r5
|
|
sub r1, r1, #1
|
|
str r1, [r4, #0]
|
|
add sp, sp, #8
|
|
ldmia sp!, {r4, r5, r6, r7, r8, lr}
|
|
bx lr
|
|
arm_func_end BN_mod_mul_reciprocal
|
|
|
|
arm_func_start BN_RECP_CTX_set
|
|
BN_RECP_CTX_set: ; 0x0223AAF0
|
|
stmfd sp!, {r4, r5, lr}
|
|
sub sp, sp, #4
|
|
mov r5, r0
|
|
mov r4, r1
|
|
bl BN_copy
|
|
add r0, r5, #0x14
|
|
mov r1, #0
|
|
bl BN_set_word
|
|
mov r0, r4
|
|
bl BN_num_bits
|
|
str r0, [r5, #0x28]
|
|
mov r0, #0
|
|
str r0, [r5, #0x2c]
|
|
mov r0, #1
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
arm_func_end BN_RECP_CTX_set
|
|
|
|
arm_func_start BN_RECP_CTX_free
|
|
BN_RECP_CTX_free: ; 0x0223AB34
|
|
stmfd sp!, {r4, lr}
|
|
mov r4, r0
|
|
bl BN_free
|
|
add r0, r4, #0x14
|
|
bl BN_free
|
|
ldr r0, [r4, #0x30]
|
|
ands r0, r0, #1
|
|
ldmeqia sp!, {r4, lr}
|
|
bxeq lr
|
|
mov r0, r4
|
|
bl CRYPTOi_MyFree
|
|
ldmia sp!, {r4, lr}
|
|
bx lr
|
|
arm_func_end BN_RECP_CTX_free
|
|
|
|
arm_func_start BN_RECP_CTX_init
|
|
BN_RECP_CTX_init: ; 0x0223AB68
|
|
stmfd sp!, {r4, lr}
|
|
mov r4, r0
|
|
bl BN_init
|
|
add r0, r4, #0x14
|
|
bl BN_init
|
|
mov r0, #0
|
|
str r0, [r4, #0x28]
|
|
str r0, [r4, #0x30]
|
|
ldmia sp!, {r4, lr}
|
|
bx lr
|
|
arm_func_end BN_RECP_CTX_init
|
|
|
|
arm_func_start BN_MONT_CTX_free
|
|
BN_MONT_CTX_free: ; 0x0223AB90
|
|
stmfd sp!, {r4, lr}
|
|
mov r4, r0
|
|
add r0, r4, #0xc
|
|
bl BN_free
|
|
add r0, r4, #0x20
|
|
bl BN_free
|
|
add r0, r4, #0x34
|
|
bl BN_free
|
|
ldr r0, [r4, #0x4c]
|
|
ands r0, r0, #1
|
|
ldmeqia sp!, {r4, lr}
|
|
bxeq lr
|
|
mov r0, r4
|
|
bl CRYPTOi_MyFree
|
|
ldmia sp!, {r4, lr}
|
|
bx lr
|
|
arm_func_end BN_MONT_CTX_free
|
|
|
|
arm_func_start BN_MONT_CTX_init
|
|
BN_MONT_CTX_init: ; 0x0223ABD0
|
|
stmfd sp!, {r4, lr}
|
|
mov r4, r0
|
|
mov r1, #0
|
|
str r1, [r4, #0]
|
|
add r0, r4, #0xc
|
|
str r1, [r4, #8]
|
|
bl BN_init
|
|
add r0, r4, #0x20
|
|
bl BN_init
|
|
add r0, r4, #0x34
|
|
bl BN_init
|
|
mov r0, #0
|
|
str r0, [r4, #0x4c]
|
|
ldmia sp!, {r4, lr}
|
|
bx lr
|
|
arm_func_end BN_MONT_CTX_init
|
|
|
|
arm_func_start BN_MONT_CTX_new
|
|
BN_MONT_CTX_new: ; 0x0223AC0C
|
|
stmfd sp!, {r4, lr}
|
|
mov r0, #0x50
|
|
bl CRYPTOi_MyAlloc
|
|
movs r4, r0
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, lr}
|
|
bxeq lr
|
|
bl BN_MONT_CTX_init
|
|
mov r1, #1
|
|
mov r0, r4
|
|
str r1, [r4, #0x4c]
|
|
ldmia sp!, {r4, lr}
|
|
bx lr
|
|
arm_func_end BN_MONT_CTX_new
|
|
|
|
arm_func_start BN_MONT_CTX_set_word
|
|
BN_MONT_CTX_set_word: ; 0x0223AC40
|
|
stmfd sp!, {r4, r5, r6, r7, lr}
|
|
sub sp, sp, #0x14
|
|
mov r6, r1
|
|
ldr r3, [r6, #4]
|
|
mov r7, r0
|
|
cmp r3, #0
|
|
mov r5, r2
|
|
addeq sp, sp, #0x14
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, lr}
|
|
bxeq lr
|
|
add r0, r7, #0x20
|
|
add r4, r7, #0xc
|
|
bl BN_copy
|
|
cmp r0, #0
|
|
addeq sp, sp, #0x14
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, lr}
|
|
bxeq lr
|
|
add r0, sp, #0
|
|
bl BN_init
|
|
mov r1, #1
|
|
mov r0, r6
|
|
str r1, [r7, #0]
|
|
bl BN_num_bits
|
|
add r1, r0, #0x1f
|
|
mov r0, r1, asr #4
|
|
add r0, r1, r0, lsr #27
|
|
mov r2, r0, asr #5
|
|
mov r0, r4
|
|
mov r1, #0
|
|
str r2, [r7, #8]
|
|
bl BN_set_word
|
|
cmp r0, #0
|
|
addeq sp, sp, #0x14
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, lr}
|
|
bxeq lr
|
|
mov r0, r4
|
|
mov r1, #0x20
|
|
bl BN_set_bit
|
|
cmp r0, #0
|
|
beq _0223ADE4
|
|
ldr r0, [r6, #0]
|
|
ldr r4, [r0, #0]
|
|
mov r0, r4
|
|
bl BN_mod_inverse_word
|
|
mov r1, r0
|
|
add r0, sp, #0
|
|
bl BN_set_word
|
|
cmp r0, #0
|
|
beq _0223ADE4
|
|
add r0, sp, #0
|
|
mov r2, #0x20
|
|
mov r1, r0
|
|
bl BN_lshift
|
|
cmp r0, #0
|
|
beq _0223ADE4
|
|
ldr r0, [sp, #4]
|
|
cmp r0, #0
|
|
beq _0223AD5C
|
|
cmp r0, #1
|
|
bne _0223AD4C
|
|
ldr r0, [sp]
|
|
ldr r0, [r0, #0]
|
|
cmp r0, #0
|
|
beq _0223AD5C
|
|
_0223AD4C:
|
|
add r0, sp, #0
|
|
mov r1, #1
|
|
bl BN_sub_word
|
|
b _0223AD70
|
|
_0223AD5C:
|
|
add r0, sp, #0
|
|
mvn r1, #0
|
|
bl BN_set_word
|
|
cmp r0, #0
|
|
beq _0223ADE4
|
|
_0223AD70:
|
|
ldr r2, [sp, #4]
|
|
cmp r2, #1
|
|
ldrge r0, [sp]
|
|
ldrge r1, [r0]
|
|
movlt r1, #0
|
|
cmp r2, #2
|
|
ldrge r0, [sp]
|
|
mov r2, r4
|
|
ldrge r0, [r0, #4]
|
|
movlt r0, #0
|
|
bl bn_div_words
|
|
str r0, [r7, #0x48]
|
|
add r0, r7, #0xc
|
|
mov r1, #0
|
|
bl BN_set_word
|
|
ldr r1, [r7, #8]
|
|
add r0, r7, #0xc
|
|
mov r1, r1, lsl #6
|
|
bl BN_set_bit
|
|
cmp r0, #0
|
|
beq _0223ADE4
|
|
add r0, r7, #0xc
|
|
mov r1, r0
|
|
mov r3, r5
|
|
add r2, r7, #0x20
|
|
bl BN_mod
|
|
ldr r1, [r7, #8]
|
|
add r0, r7, #0xc
|
|
bl bn_zexpand
|
|
_0223ADE4:
|
|
add r0, sp, #0
|
|
bl BN_free
|
|
mov r0, #1
|
|
add sp, sp, #0x14
|
|
ldmia sp!, {r4, r5, r6, r7, lr}
|
|
bx lr
|
|
arm_func_end BN_MONT_CTX_set_word
|
|
|
|
arm_func_start BN_gen_exp_string
|
|
BN_gen_exp_string: ; 0x0223ADFC
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
sub sp, sp, #0xc
|
|
mov r4, r2
|
|
mov r7, r1
|
|
cmp r4, #6
|
|
mov r5, r0
|
|
movgt r4, #6
|
|
mov r1, #1
|
|
mov r2, r1, lsl r4
|
|
ldr r0, [r7, #4]
|
|
sub r2, r2, #1
|
|
add r0, r4, r0, lsl #5
|
|
ldr r3, _0223AFD0 ; =0x0223F158
|
|
str r2, [sp]
|
|
ldr r2, [r3, r4, lsl #2]
|
|
mov r1, r4
|
|
sub r0, r0, #1
|
|
str r2, [sp, #4]
|
|
mov r6, #0
|
|
bl _s32_div_f
|
|
mov ip, #0
|
|
mov r0, r0, lsl #1
|
|
add r0, r0, #2
|
|
mov r8, r6
|
|
add r1, r5, r0
|
|
strb r8, [r5, r0]
|
|
strb r8, [r1, #-1]
|
|
ldr r0, [r7, #0]
|
|
ldr r2, [r7, #4]
|
|
ldr r7, [r0, #0]
|
|
add lr, r0, #4
|
|
cmp r2, #1
|
|
sub sb, r1, #2
|
|
ldrgt r8, [lr], #4
|
|
mov sl, r7
|
|
mov r0, ip
|
|
str ip, [sp, #8]
|
|
mov r1, #0xff
|
|
mov fp, ip
|
|
_0223AE98:
|
|
ldr r3, [sp]
|
|
and r3, sl, r3
|
|
ldr sl, [sp, #4]
|
|
ldrb sl, [sl, r3]
|
|
cmp sl, #0
|
|
beq _0223AEF8
|
|
add ip, ip, sl
|
|
add r6, r6, sl
|
|
cmp r6, #0x20
|
|
blo _0223AEE0
|
|
cmp r2, #1
|
|
ble _0223AEF8
|
|
sub r2, r2, #1
|
|
mov r7, r8
|
|
cmp r2, #1
|
|
movle r8, fp
|
|
ldrgt r8, [lr], #4
|
|
sub r6, r6, #0x20
|
|
_0223AEE0:
|
|
cmp r6, #0
|
|
moveq sl, r7
|
|
movne sl, r7, lsr r6
|
|
rsbne r3, r6, #0x20
|
|
orrne sl, sl, r8, lsl r3
|
|
b _0223AE98
|
|
_0223AEF8:
|
|
cmp r3, #0
|
|
beq _0223AF7C
|
|
strb ip, [sb]
|
|
strb r3, [sb, #-1]
|
|
cmp ip, #0x100
|
|
sub sb, sb, #2
|
|
blo _0223AF34
|
|
cmp ip, #0x100
|
|
blo _0223AF34
|
|
_0223AF1C:
|
|
strb r1, [sb]
|
|
sub ip, ip, #0x100
|
|
strb r0, [sb, #-1]
|
|
sub sb, sb, #2
|
|
cmp ip, #0x100
|
|
bhs _0223AF1C
|
|
_0223AF34:
|
|
mov ip, r4
|
|
add r6, r6, r4
|
|
cmp r6, #0x20
|
|
blo _0223AF64
|
|
cmp r2, #1
|
|
ble _0223AF7C
|
|
sub r2, r2, #1
|
|
mov r7, r8
|
|
cmp r2, #1
|
|
ldrle r8, [sp, #8]
|
|
sub r6, r6, #0x20
|
|
ldrgt r8, [lr], #4
|
|
_0223AF64:
|
|
cmp r6, #0
|
|
moveq sl, r7
|
|
movne sl, r7, lsr r6
|
|
rsbne r3, r6, #0x20
|
|
orrne sl, sl, r8, lsl r3
|
|
b _0223AE98
|
|
_0223AF7C:
|
|
add sb, sb, #1
|
|
mov r0, #2
|
|
b _0223AFA0
|
|
_0223AF88:
|
|
strb r2, [r5]
|
|
ldrb r1, [sb, #1]
|
|
add sb, sb, #2
|
|
add r0, r0, #2
|
|
strb r1, [r5, #1]
|
|
add r5, r5, #2
|
|
_0223AFA0:
|
|
ldrb r2, [sb]
|
|
cmp r2, #0
|
|
bne _0223AF88
|
|
ldrb r1, [sb, #1]
|
|
cmp r1, #0
|
|
bne _0223AF88
|
|
mov r1, #0
|
|
strb r1, [r5]
|
|
strb r1, [r5, #1]
|
|
add sp, sp, #0xc
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
; .align 2, 0
|
|
_0223AFD0: .word Unk_ov97_0223F158
|
|
arm_func_end BN_gen_exp_string
|
|
|
|
arm_func_start BN_gen_exp_bits
|
|
BN_gen_exp_bits: ; 0x0223AFD4
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
sub sp, sp, #4
|
|
ldr r5, [r3, #0], #4
|
|
mov r2, #0x14
|
|
mla r4, r5, r2, r3
|
|
mov sb, r0
|
|
ldr r0, [sb, #4]
|
|
mov r8, r1
|
|
cmp r0, #0
|
|
mov r5, #0
|
|
mov r1, r0, lsl #5
|
|
addeq sp, sp, #4
|
|
moveq r0, r5
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bxeq lr
|
|
cmp r0, #1
|
|
bne _0223B074
|
|
cmp r0, #1
|
|
bne _0223B038
|
|
ldr r2, [sb]
|
|
ldr r1, _0223B138 ; =0x00010001
|
|
ldr r2, [r2, #0]
|
|
cmp r2, r1
|
|
ldreq r5, _0223B13C ; =0x0223DEC4
|
|
beq _0223B064
|
|
_0223B038:
|
|
ldr r1, [sb]
|
|
ldr r1, [r1, #0]
|
|
cmp r1, #0x11
|
|
bne _0223B054
|
|
cmp r0, #1
|
|
ldreq r5, _0223B140 ; =0x0223DEDC
|
|
beq _0223B064
|
|
_0223B054:
|
|
cmp r1, #3
|
|
bne _0223B064
|
|
cmp r0, #1
|
|
ldreq r5, _0223B144 ; =0x0223DED0
|
|
_0223B064:
|
|
mov r7, #1
|
|
mov r6, r7
|
|
mov r1, #0x20
|
|
b _0223B0A4
|
|
_0223B074:
|
|
cmp r1, #0x100
|
|
movge r7, #5
|
|
movge r6, #0x10
|
|
movge r1, #7
|
|
bge _0223B0A4
|
|
cmp r1, #0x80
|
|
movge r6, #8
|
|
movge r1, r6
|
|
movge r7, #4
|
|
movlt r7, #3
|
|
movlt r6, #4
|
|
movlt r1, #0xb
|
|
_0223B0A4:
|
|
mul r1, r0, r1
|
|
mov r0, r1, lsl #1
|
|
add r1, r0, #7
|
|
mov r0, r1, asr #1
|
|
add r0, r1, r0, lsr #30
|
|
cmp r5, #0
|
|
mov r1, r0, asr #2
|
|
bne _0223B120
|
|
ldr r0, [r4, #8]
|
|
cmp r1, r0
|
|
movle r0, r4
|
|
ble _0223B0DC
|
|
mov r0, r4
|
|
bl bn_expand2
|
|
_0223B0DC:
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bxeq lr
|
|
ldr r5, [r4, #0]
|
|
mov r1, sb
|
|
mov r2, r7
|
|
add r0, r5, #4
|
|
bl BN_gen_exp_string
|
|
add r1, r0, #2
|
|
mov r0, r1, asr #8
|
|
strb r0, [r5]
|
|
strb r1, [r5, #1]
|
|
strb r7, [r5, #2]
|
|
strb r6, [r5, #3]
|
|
b _0223B124
|
|
_0223B120:
|
|
mov r1, #8
|
|
_0223B124:
|
|
str r5, [r8]
|
|
add r0, r1, #2
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bx lr
|
|
; .align 2, 0
|
|
_0223B138: .word 0x00010001
|
|
_0223B13C: .word Unk_ov97_0223DEC4
|
|
_0223B140: .word Unk_ov97_0223DEDC
|
|
_0223B144: .word Unk_ov97_0223DED0
|
|
arm_func_end BN_gen_exp_bits
|
|
|
|
arm_func_start BN_mod_inverse_word
|
|
BN_mod_inverse_word: ; 0x0223B148
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
|
|
mov sl, r0
|
|
mov r1, sl
|
|
rsb r0, sl, #0
|
|
bl _u32_div_f
|
|
movs r8, r1
|
|
mov r7, sl
|
|
mov r5, #0
|
|
mov r6, #1
|
|
mvn r4, #0
|
|
beq _0223B1B0
|
|
_0223B174:
|
|
mov r0, r7
|
|
mov r1, r8
|
|
bl _u32_div_f
|
|
mov sb, r1
|
|
mov r0, r7
|
|
mov r1, r8
|
|
bl _u32_div_f
|
|
mla r1, r0, r6, r5
|
|
mov r5, r6
|
|
mov r7, r8
|
|
mov r6, r1
|
|
mov r8, sb
|
|
cmp sb, #0
|
|
rsb r4, r4, #0
|
|
bne _0223B174
|
|
_0223B1B0:
|
|
cmp r4, #0
|
|
sublt r5, sl, r5
|
|
cmp r7, #1
|
|
movne r1, #0
|
|
bne _0223B1D0
|
|
mov r0, r5
|
|
mov r1, sl
|
|
bl _u32_div_f
|
|
_0223B1D0:
|
|
mov r0, r1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
|
|
bx lr
|
|
arm_func_end BN_mod_inverse_word
|
|
|
|
arm_func_start bn_from_montgomery_words
|
|
bn_from_montgomery_words: ; 0x0223B1DC
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
sub sp, sp, #0xc
|
|
mov r7, r3
|
|
mov sb, r1
|
|
mov r6, #0
|
|
mov sl, r0
|
|
mov r8, r2
|
|
mov r4, r6
|
|
cmp r7, #0
|
|
add r5, sb, r7, lsl #2
|
|
ldr fp, [sp, #0x30]
|
|
ble _0223B26C
|
|
mov r0, #1
|
|
str r6, [sp, #4]
|
|
str r0, [sp]
|
|
_0223B218:
|
|
ldr r1, [sb]
|
|
mov r0, sb
|
|
mul r3, r1, fp
|
|
mov r1, r8
|
|
mov r2, r7
|
|
bl bn_mul_add_words
|
|
add r1, r0, r6
|
|
ldr r0, [r5, #0]
|
|
cmp r1, r6
|
|
ldrlo r6, [sp]
|
|
add r0, r0, r1
|
|
str r0, [r5, #0]
|
|
ldr r0, [r5, #0]
|
|
ldrhs r6, [sp, #4]
|
|
cmp r0, r1
|
|
add r4, r4, #1
|
|
addlo r6, r6, #1
|
|
cmp r4, r7
|
|
add sb, sb, #4
|
|
add r5, r5, #4
|
|
blt _0223B218
|
|
_0223B26C:
|
|
cmp r6, #0
|
|
sub r2, r7, #1
|
|
bne _0223B2C0
|
|
ldr r1, [sb, r2, lsl #2]
|
|
ldr r0, [r8, r2, lsl #2]
|
|
cmp r1, r0
|
|
bne _0223B2AC
|
|
cmp r2, #0
|
|
ble _0223B2AC
|
|
_0223B290:
|
|
ldr r1, [sb, r2, lsl #2]
|
|
ldr r0, [r8, r2, lsl #2]
|
|
cmp r1, r0
|
|
bne _0223B2AC
|
|
sub r2, r2, #1
|
|
cmp r2, #0
|
|
bgt _0223B290
|
|
_0223B2AC:
|
|
ldr r1, [sb, r2, lsl #2]
|
|
ldr r0, [r8, r2, lsl #2]
|
|
cmp r1, r0
|
|
movhs r6, #1
|
|
movlo r6, #0
|
|
_0223B2C0:
|
|
cmp r6, #0
|
|
beq _0223B2E8
|
|
mov r0, sl
|
|
mov r1, sb
|
|
mov r2, r8
|
|
mov r3, r7
|
|
bl bn_sub_words
|
|
add sp, sp, #0xc
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
_0223B2E8:
|
|
cmp r7, #0
|
|
addle sp, sp, #0xc
|
|
mov r1, #0
|
|
ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bxle lr
|
|
_0223B2FC:
|
|
ldr r0, [sb, r1, lsl #2]
|
|
str r0, [sl, r1, lsl #2]
|
|
add r1, r1, #1
|
|
cmp r1, r7
|
|
blt _0223B2FC
|
|
add sp, sp, #0xc
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
arm_func_end bn_from_montgomery_words
|
|
|
|
arm_func_start bn_sqr_normal
|
|
bn_sqr_normal: ; 0x0223B31C
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
sub sp, sp, #4
|
|
mov fp, r2
|
|
mov r6, fp, lsl #1
|
|
mov sl, r0
|
|
mov r7, fp
|
|
mov sb, r1
|
|
sub r7, r7, #1
|
|
sub r2, r6, #1
|
|
mov r0, #0
|
|
str r0, [sl, r2, lsl #2]
|
|
ldr r0, [sl, r2, lsl #2]
|
|
str r3, [sp]
|
|
mov r5, sb
|
|
str r0, [sl]
|
|
cmp r7, #0
|
|
add r4, sl, #4
|
|
ble _0223B384
|
|
add r5, r5, #4
|
|
ldr r3, [sb]
|
|
mov r0, r4
|
|
mov r1, r5
|
|
mov r2, r7
|
|
bl bn_mul_words
|
|
str r0, [r4, r7, lsl #2]
|
|
add r4, r4, #8
|
|
_0223B384:
|
|
sub r8, fp, #2
|
|
cmp r8, #0
|
|
ble _0223B3C4
|
|
_0223B390:
|
|
mov r0, r5
|
|
sub r7, r7, #1
|
|
add r5, r5, #4
|
|
ldr r3, [r0, #0]
|
|
mov r0, r4
|
|
mov r1, r5
|
|
mov r2, r7
|
|
bl bn_mul_add_words
|
|
sub r8, r8, #1
|
|
str r0, [r4, r7, lsl #2]
|
|
cmp r8, #0
|
|
add r4, r4, #8
|
|
bgt _0223B390
|
|
_0223B3C4:
|
|
mov r0, sl
|
|
mov r1, sl
|
|
mov r2, sl
|
|
mov r3, r6
|
|
bl bn_add_words
|
|
ldr r0, [sp]
|
|
mov r1, sb
|
|
mov r2, fp
|
|
bl bn_sqr_words
|
|
ldr r2, [sp]
|
|
mov r0, sl
|
|
mov r1, sl
|
|
mov r3, r6
|
|
bl bn_add_words
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
arm_func_end bn_sqr_normal
|
|
|
|
arm_func_start BN_sqr
|
|
BN_sqr: ; 0x0223B408
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
sub sp, sp, #0x64
|
|
ldr r5, [r2, #0]
|
|
mov sb, r0
|
|
mov r8, r1
|
|
cmp r8, sb
|
|
add r3, r2, #4
|
|
mov r2, #0x14
|
|
movne r7, sb
|
|
addeq r0, r5, #1
|
|
mla r4, r5, r2, r3
|
|
mlaeq r7, r0, r2, r3
|
|
ldr r5, [r8, #4]
|
|
cmp r5, #0
|
|
movle r0, #0
|
|
strle r0, [sb, #4]
|
|
addle sp, sp, #0x64
|
|
movle r0, #1
|
|
ldmleia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bxle lr
|
|
ldr r0, [r7, #8]
|
|
mov r6, r5, lsl #1
|
|
cmp r6, r0
|
|
movle r0, r7
|
|
ble _0223B478
|
|
mov r0, r7
|
|
mov r1, r6
|
|
bl bn_expand2
|
|
_0223B478:
|
|
cmp r0, #0
|
|
addeq sp, sp, #0x64
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bxeq lr
|
|
str r6, [r7, #4]
|
|
mov r0, #0
|
|
str r0, [r7, #0xc]
|
|
cmp r5, #4
|
|
bne _0223B4B8
|
|
ldr r0, [r7, #0]
|
|
ldr r1, [r8]
|
|
add r3, sp, #0
|
|
mov r2, #4
|
|
bl bn_sqr_normal
|
|
b _0223B51C
|
|
_0223B4B8:
|
|
cmp r5, #8
|
|
bne _0223B4D8
|
|
ldr r0, [r7, #0]
|
|
ldr r1, [r8]
|
|
add r3, sp, #0x20
|
|
mov r2, #8
|
|
bl bn_sqr_normal
|
|
b _0223B51C
|
|
_0223B4D8:
|
|
ldr r0, [r4, #8]
|
|
cmp r6, r0
|
|
movle r0, r4
|
|
ble _0223B4F4
|
|
mov r0, r4
|
|
mov r1, r6
|
|
bl bn_expand2
|
|
_0223B4F4:
|
|
cmp r0, #0
|
|
addeq sp, sp, #0x64
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bxeq lr
|
|
ldr r0, [r7, #0]
|
|
ldr r1, [r8]
|
|
ldr r3, [r4, #0]
|
|
mov r2, r5
|
|
bl bn_sqr_normal
|
|
_0223B51C:
|
|
cmp r6, #0
|
|
ble _0223B540
|
|
ldr r1, [r7, #0]
|
|
sub r0, r6, #1
|
|
ldr r0, [r1, r0, lsl #2]
|
|
cmp r0, #0
|
|
ldreq r0, [r7, #4]
|
|
subeq r0, r0, #1
|
|
streq r0, [r7, #4]
|
|
_0223B540:
|
|
cmp r7, sb
|
|
beq _0223B554
|
|
mov r0, sb
|
|
mov r1, r7
|
|
bl BN_copy
|
|
_0223B554:
|
|
mov r0, #1
|
|
add sp, sp, #0x64
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bx lr
|
|
arm_func_end BN_sqr
|
|
|
|
arm_func_start BN_mod_exp
|
|
BN_mod_exp: ; 0x0223B564
|
|
stmdb sp!, {lr}
|
|
sub sp, sp, #0xc
|
|
ldr ip, [r3, #4]
|
|
cmp ip, #0
|
|
ble _0223B5A8
|
|
ldr ip, [r3]
|
|
ldr ip, [ip]
|
|
ands ip, ip, #1
|
|
beq _0223B5A8
|
|
ldr lr, [sp, #0x10]
|
|
mov ip, #0
|
|
str lr, [sp]
|
|
str ip, [sp, #4]
|
|
bl BN_mod_exp_mont
|
|
add sp, sp, #0xc
|
|
ldmia sp!, {lr}
|
|
bx lr
|
|
_0223B5A8:
|
|
ldr ip, [sp, #0x10]
|
|
str ip, [sp]
|
|
bl BN_mod_exp_recp
|
|
add sp, sp, #0xc
|
|
ldmia sp!, {lr}
|
|
bx lr
|
|
arm_func_end BN_mod_exp
|
|
|
|
arm_func_start BN_mod
|
|
BN_mod: ; 0x0223B5C0
|
|
stmdb sp!, {lr}
|
|
sub sp, sp, #4
|
|
mov lr, r1
|
|
mov ip, r2
|
|
str r3, [sp]
|
|
mov r1, r0
|
|
mov r2, lr
|
|
mov r3, ip
|
|
mov r0, #0
|
|
bl BN_div
|
|
add sp, sp, #4
|
|
ldmia sp!, {lr}
|
|
bx lr
|
|
arm_func_end BN_mod
|
|
|
|
arm_func_start BN_div
|
|
BN_div: ; 0x0223B5F4
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
sub sp, sp, #0x4c
|
|
mov r6, r3
|
|
ldr r3, [r6, #4]
|
|
mov r8, r0
|
|
str r1, [sp]
|
|
str r2, [sp, #4]
|
|
cmp r3, #0
|
|
ldr r4, [sp, #0x70]
|
|
beq _0223B634
|
|
cmp r3, #1
|
|
bne _0223B644
|
|
ldr r0, [r6, #0]
|
|
ldr r0, [r0, #0]
|
|
cmp r0, #0
|
|
bne _0223B644
|
|
_0223B634:
|
|
add sp, sp, #0x4c
|
|
mov r0, #0
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
_0223B644:
|
|
ldr r0, [sp, #4]
|
|
mov r1, r6
|
|
bl BN_ucmp
|
|
cmp r0, #0
|
|
bge _0223B6A4
|
|
ldr r0, [sp]
|
|
cmp r0, #0
|
|
beq _0223B680
|
|
ldr r1, [sp, #4]
|
|
bl BN_copy
|
|
cmp r0, #0
|
|
addeq sp, sp, #0x4c
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bxeq lr
|
|
_0223B680:
|
|
cmp r8, #0
|
|
beq _0223B694
|
|
mov r0, r8
|
|
mov r1, #0
|
|
bl BN_set_word
|
|
_0223B694:
|
|
add sp, sp, #0x4c
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
_0223B6A4:
|
|
ldr r3, [r4, #0]
|
|
add r0, r4, #4
|
|
mov r2, #0x14
|
|
mla r1, r3, r2, r0
|
|
mov r3, #0
|
|
str r3, [r1, #0xc]
|
|
ldr r5, [r4, #0]
|
|
str r1, [sp, #0x14]
|
|
add r4, r5, #1
|
|
mla r1, r4, r2, r0
|
|
add r3, r5, #2
|
|
str r1, [sp, #0x18]
|
|
mla r1, r3, r2, r0
|
|
cmp r8, #0
|
|
str r1, [sp, #0x1c]
|
|
addeq r1, r5, #3
|
|
mlaeq r8, r1, r2, r0
|
|
mov r0, r6
|
|
bl BN_num_bits
|
|
mov r1, r0, lsr #0x1f
|
|
rsb r0, r1, r0, lsl #27
|
|
add r0, r1, r0, ror #27
|
|
rsb r0, r0, #0x20
|
|
str r0, [sp, #8]
|
|
ldr r0, [sp, #0x1c]
|
|
ldr r2, [sp, #8]
|
|
mov r1, r6
|
|
bl BN_lshift
|
|
cmp r0, #0
|
|
addeq sp, sp, #0x4c
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bxeq lr
|
|
ldr r2, [sp, #8]
|
|
ldr r0, [sp, #0x18]
|
|
ldr r1, [sp, #4]
|
|
ldr r3, [sp, #0x1c]
|
|
mov r4, #0
|
|
add r2, r2, #0x20
|
|
str r4, [r3, #0xc]
|
|
bl BN_lshift
|
|
cmp r0, #0
|
|
addeq sp, sp, #0x4c
|
|
moveq r0, r4
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bxeq lr
|
|
ldr r0, [sp, #0x18]
|
|
mov r1, r4
|
|
str r1, [r0, #0xc]
|
|
ldr r0, [sp, #0x1c]
|
|
ldr r0, [r0, #4]
|
|
str r0, [sp, #0x28]
|
|
ldr r0, [sp, #0x18]
|
|
ldr r1, [sp, #0x28]
|
|
ldr r4, [r0, #4]
|
|
add r0, sp, #0x38
|
|
sub r1, r4, r1
|
|
str r1, [sp, #0x10]
|
|
bl BN_init
|
|
ldr r0, [sp, #0x18]
|
|
ldr r2, [r0, #0]
|
|
ldr r0, [sp, #0x28]
|
|
sub r1, r0, #1
|
|
ldr r0, [sp, #0x10]
|
|
add r0, r2, r0, lsl #2
|
|
str r0, [sp, #0x38]
|
|
ldr r0, [sp, #0x28]
|
|
str r0, [sp, #0x3c]
|
|
ldr r0, [sp, #0x18]
|
|
ldr r2, [r0, #8]
|
|
ldr r0, [sp, #0x28]
|
|
cmp r0, #1
|
|
add r0, r2, #1
|
|
str r0, [sp, #0x40]
|
|
ldr r0, [sp, #0x1c]
|
|
moveq r5, #0
|
|
ldr r2, [r0, #0]
|
|
ldr r0, [r2, r1, lsl #2]
|
|
str r0, [sp, #0x24]
|
|
ldrne r0, [sp, #0x28]
|
|
subne r0, r0, #2
|
|
ldrne r5, [r2, r0, lsl #2]
|
|
ldr r0, [sp, #0x18]
|
|
ldr r2, [r8, #8]
|
|
ldr r1, [r0, #0]
|
|
sub r0, r4, #1
|
|
add r7, r1, r0, lsl #2
|
|
ldr r0, [sp, #0x10]
|
|
add r1, r0, #1
|
|
cmp r1, r2
|
|
movle r0, r8
|
|
ble _0223B81C
|
|
mov r0, r8
|
|
bl bn_expand2
|
|
_0223B81C:
|
|
cmp r0, #0
|
|
beq _0223BB80
|
|
ldr r0, [sp, #4]
|
|
ldr r1, [r6, #0xc]
|
|
ldr r3, [r0, #0xc]
|
|
ldr r0, [sp, #0x10]
|
|
sub r2, r0, #1
|
|
eor r0, r3, r1
|
|
str r0, [r8, #0xc]
|
|
ldr r0, [sp, #0x10]
|
|
str r0, [r8, #4]
|
|
ldr r0, [sp, #0x28]
|
|
ldr r3, [r8]
|
|
add r1, r0, #1
|
|
add r0, r3, r2, lsl #2
|
|
str r0, [sp, #0x20]
|
|
ldr r0, [sp, #0x14]
|
|
ldr r0, [r0, #8]
|
|
cmp r1, r0
|
|
ldrle r0, [sp, #0x14]
|
|
ble _0223B878
|
|
ldr r0, [sp, #0x14]
|
|
bl bn_expand2
|
|
_0223B878:
|
|
cmp r0, #0
|
|
beq _0223BB80
|
|
ldr r1, [sp, #0x1c]
|
|
add r0, sp, #0x38
|
|
bl BN_ucmp
|
|
cmp r0, #0
|
|
blt _0223B8CC
|
|
add r0, sp, #0x38
|
|
ldr r2, [sp, #0x1c]
|
|
mov r1, r0
|
|
bl BN_usub
|
|
cmp r0, #0
|
|
beq _0223BB80
|
|
ldr r0, [sp, #0x20]
|
|
mov r2, #1
|
|
str r2, [r0, #0]
|
|
ldr r0, [r8, #4]
|
|
ldr r1, [r8]
|
|
sub r0, r0, #1
|
|
str r2, [r1, r0, lsl #2]
|
|
b _0223B8D8
|
|
_0223B8CC:
|
|
ldr r0, [r8, #4]
|
|
sub r0, r0, #1
|
|
str r0, [r8, #4]
|
|
_0223B8D8:
|
|
ldr r0, [sp, #0x10]
|
|
sub r1, r0, #1
|
|
ldr r0, [sp, #0x20]
|
|
cmp r1, #0
|
|
sub r0, r0, #4
|
|
str r0, [sp, #0x20]
|
|
mov r0, #0
|
|
str r0, [sp, #0xc]
|
|
ble _0223BB28
|
|
ldr r8, _0223BB90 ; =0x0000FFFF
|
|
cmp r1, #0
|
|
and r0, r5, r8
|
|
str r0, [sp, #0x2c]
|
|
and r0, r8, r5, lsr #16
|
|
str r0, [sp, #0x30]
|
|
ldr r0, [sp, #0x24]
|
|
and r4, r0, r8
|
|
ble _0223BB28
|
|
and sb, r8, r0, lsr #16
|
|
mvn r0, #0
|
|
str r0, [sp, #0x34]
|
|
_0223B92C:
|
|
ldr r1, [sp, #0x38]
|
|
ldr r0, [sp, #0x3c]
|
|
sub r1, r1, #4
|
|
add r0, r0, #1
|
|
str r0, [sp, #0x3c]
|
|
str r1, [sp, #0x38]
|
|
ldr fp, [r7]
|
|
ldr r0, [sp, #0x24]
|
|
ldr r5, [r7, #-4]
|
|
cmp fp, r0
|
|
ldreq r6, [sp, #0x34]
|
|
beq _0223B970
|
|
ldr r2, [sp, #0x24]
|
|
mov r0, fp
|
|
mov r1, r5
|
|
bl bn_div_words
|
|
mov r6, r0
|
|
_0223B970:
|
|
ldr r0, [sp, #0x2c]
|
|
and r2, r6, r8
|
|
mul ip, r0, r2
|
|
ldr r0, [sp, #0x30]
|
|
and lr, r8, r6, lsr #16
|
|
ldr r1, [sp, #0x30]
|
|
mul r0, r2, r0
|
|
mul r3, r1, lr
|
|
ldr r1, [sp, #0x2c]
|
|
mul sl, sb, lr
|
|
mla r1, lr, r1, r0
|
|
cmp r1, r0
|
|
addlo r3, r3, #0x10000
|
|
and r0, r8, r1, lsr #16
|
|
add r3, r3, r0
|
|
and r0, r1, r8
|
|
add ip, ip, r0, lsl #16
|
|
cmp ip, r0, lsl #16
|
|
mul r0, r2, sb
|
|
mul r1, r4, r2
|
|
mla r2, lr, r4, r0
|
|
addlo r3, r3, #1
|
|
cmp r2, r0
|
|
addlo sl, sl, #0x10000
|
|
and r0, r8, r2, lsr #16
|
|
add sl, sl, r0
|
|
and r0, r2, r8
|
|
add r1, r1, r0, lsl #16
|
|
cmp r1, r0, lsl #16
|
|
addlo sl, sl, #1
|
|
sub r1, r5, r1
|
|
cmp r1, r5
|
|
addhi sl, sl, #1
|
|
subs r0, fp, sl
|
|
bne _0223BA20
|
|
cmp r3, r1
|
|
blo _0223BA20
|
|
cmp r3, r1
|
|
bne _0223BA18
|
|
ldr r0, [r7, #-8]
|
|
cmp ip, r0
|
|
bls _0223BA20
|
|
_0223BA18:
|
|
sub r6, r6, #1
|
|
b _0223B970
|
|
_0223BA20:
|
|
ldr r0, [sp, #0x14]
|
|
ldr r1, [sp, #0x1c]
|
|
ldr r0, [r0, #0]
|
|
ldr r1, [r1, #0]
|
|
ldr r2, [sp, #0x28]
|
|
mov r3, r6
|
|
bl bn_mul_words
|
|
ldr r1, [sp, #0x14]
|
|
ldr r2, [sp, #0x28]
|
|
ldr r3, [r1, #0]
|
|
ldr r1, [sp, #0x28]
|
|
str r0, [r3, r2, lsl #2]
|
|
add r1, r1, #1
|
|
cmp r1, #0
|
|
ble _0223BA80
|
|
ldr r0, [sp, #0x14]
|
|
ldr r2, [r0, #0]
|
|
_0223BA64:
|
|
sub r0, r1, #1
|
|
ldr r0, [r2, r0, lsl #2]
|
|
cmp r0, #0
|
|
bne _0223BA80
|
|
sub r1, r1, #1
|
|
cmp r1, #0
|
|
bgt _0223BA64
|
|
_0223BA80:
|
|
ldr r0, [sp, #0x14]
|
|
ldr r2, [sp, #0x14]
|
|
str r1, [r0, #4]
|
|
add r0, sp, #0x38
|
|
mov r1, r0
|
|
ldr r5, [sp, #0x3c]
|
|
bl BN_sub
|
|
ldr r0, [sp, #0x18]
|
|
ldr r1, [r0, #4]
|
|
ldr r0, [sp, #0x3c]
|
|
add r0, r1, r0
|
|
sub r1, r0, r5
|
|
ldr r0, [sp, #0x18]
|
|
str r1, [r0, #4]
|
|
ldr r0, [sp, #0x44]
|
|
cmp r0, #0
|
|
beq _0223BAF8
|
|
add r0, sp, #0x38
|
|
ldr r2, [sp, #0x1c]
|
|
mov r1, r0
|
|
sub r6, r6, #1
|
|
ldr r5, [sp, #0x3c]
|
|
bl BN_add
|
|
ldr r0, [sp, #0x18]
|
|
ldr r1, [r0, #4]
|
|
ldr r0, [sp, #0x3c]
|
|
sub r0, r0, r5
|
|
add r1, r1, r0
|
|
ldr r0, [sp, #0x18]
|
|
str r1, [r0, #4]
|
|
_0223BAF8:
|
|
ldr r0, [sp, #0x20]
|
|
sub r7, r7, #4
|
|
str r6, [r0, #0], #-4
|
|
str r0, [sp, #0x20]
|
|
ldr r0, [sp, #0xc]
|
|
add r0, r0, #1
|
|
str r0, [sp, #0xc]
|
|
ldr r0, [sp, #0x10]
|
|
sub r1, r0, #1
|
|
ldr r0, [sp, #0xc]
|
|
cmp r0, r1
|
|
blt _0223B92C
|
|
_0223BB28:
|
|
ldr r0, [sp, #0x18]
|
|
bl bn_fix_top
|
|
ldr r0, [sp]
|
|
cmp r0, #0
|
|
beq _0223BB70
|
|
ldr r2, [sp, #8]
|
|
ldr r3, [sp, #4]
|
|
ldr r1, [sp, #0x18]
|
|
add r2, r2, #0x20
|
|
ldr r4, [r3, #0xc]
|
|
bl BN_rshift
|
|
cmp r0, #0
|
|
addeq sp, sp, #0x4c
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bxeq lr
|
|
ldr r0, [sp]
|
|
str r4, [r0, #0xc]
|
|
_0223BB70:
|
|
add sp, sp, #0x4c
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
_0223BB80:
|
|
mov r0, #0
|
|
add sp, sp, #0x4c
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
; .align 2, 0
|
|
_0223BB90: .word 0x0000FFFF
|
|
arm_func_end BN_div
|
|
|
|
arm_func_start bn_mul_normal
|
|
bn_mul_normal: ; 0x0223BB94
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
sub sp, sp, #4
|
|
ldr r5, [sp, #0x20]
|
|
mov r7, r2
|
|
mov sb, r0
|
|
mov r8, r1
|
|
mov r6, r3
|
|
cmp r7, r5
|
|
bge _0223BBD0
|
|
mov r1, r7
|
|
mov r0, r8
|
|
mov r7, r5
|
|
mov r8, r6
|
|
mov r5, r1
|
|
mov r6, r0
|
|
_0223BBD0:
|
|
ldr r3, [r6, #0]
|
|
mov r0, sb
|
|
mov r1, r8
|
|
mov r2, r7
|
|
add r4, sb, r7, lsl #2
|
|
bl bn_mul_words
|
|
str r0, [sb, r7, lsl #2]
|
|
_0223BBEC:
|
|
sub r0, r5, #1
|
|
cmp r0, #0
|
|
addle sp, sp, #4
|
|
ldmleia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bxle lr
|
|
ldr r3, [r6, #4]
|
|
mov r1, r8
|
|
mov r2, r7
|
|
add r0, sb, #4
|
|
bl bn_mul_add_words
|
|
sub r1, r5, #2
|
|
cmp r1, #0
|
|
addle sp, sp, #4
|
|
str r0, [r4, #4]
|
|
ldmleia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bxle lr
|
|
ldr r3, [r6, #8]
|
|
mov r1, r8
|
|
mov r2, r7
|
|
add r0, sb, #8
|
|
bl bn_mul_add_words
|
|
sub r1, r5, #3
|
|
cmp r1, #0
|
|
addle sp, sp, #4
|
|
str r0, [r4, #8]
|
|
ldmleia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bxle lr
|
|
ldr r3, [r6, #0xc]
|
|
mov r1, r8
|
|
mov r2, r7
|
|
add r0, sb, #0xc
|
|
bl bn_mul_add_words
|
|
sub r5, r5, #4
|
|
cmp r5, #0
|
|
addle sp, sp, #4
|
|
str r0, [r4, #0xc]
|
|
ldmleia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bxle lr
|
|
ldr r3, [r6, #0x10]
|
|
mov r1, r8
|
|
mov r2, r7
|
|
add r0, sb, #0x10
|
|
bl bn_mul_add_words
|
|
str r0, [r4, #0x10]
|
|
add r4, r4, #0x10
|
|
add sb, sb, #0x10
|
|
add r6, r6, #0x10
|
|
b _0223BBEC
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bx lr
|
|
arm_func_end bn_mul_normal
|
|
|
|
arm_func_start BN_mul
|
|
BN_mul: ; 0x0223BCB8
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
sub sp, sp, #4
|
|
mov sb, r1
|
|
ldr r6, [sb, #4]
|
|
mov r8, r2
|
|
mov sl, r0
|
|
cmp r6, #0
|
|
ldr r5, [r8, #4]
|
|
beq _0223BCE4
|
|
cmp r5, #0
|
|
bne _0223BD00
|
|
_0223BCE4:
|
|
mov r0, sl
|
|
mov r1, #0
|
|
bl BN_set_word
|
|
add sp, sp, #4
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
_0223BD00:
|
|
ldr r1, [sb, #0xc]
|
|
ldr r0, [r8, #0xc]
|
|
cmp sl, sb
|
|
add r7, r6, r5
|
|
eor fp, r1, r0
|
|
beq _0223BD20
|
|
cmp sl, r8
|
|
bne _0223BD38
|
|
_0223BD20:
|
|
ldr r0, [r3, #0]
|
|
add r2, r3, #4
|
|
add r1, r0, #1
|
|
mov r0, #0x14
|
|
mla r4, r1, r0, r2
|
|
b _0223BD3C
|
|
_0223BD38:
|
|
mov r4, sl
|
|
_0223BD3C:
|
|
ldr r0, [r4, #8]
|
|
cmp r7, r0
|
|
movle r0, r4
|
|
ble _0223BD58
|
|
mov r0, r4
|
|
mov r1, r7
|
|
bl bn_expand2
|
|
_0223BD58:
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bxeq lr
|
|
str r7, [r4, #4]
|
|
str r5, [sp]
|
|
ldr r0, [r4, #0]
|
|
ldr r1, [sb]
|
|
ldr r3, [r8]
|
|
mov r2, r6
|
|
bl bn_mul_normal
|
|
mov r0, r4
|
|
str fp, [sl, #0xc]
|
|
bl bn_fix_top
|
|
cmp sl, r4
|
|
beq _0223BDA8
|
|
mov r0, sl
|
|
mov r1, r4
|
|
bl BN_copy
|
|
_0223BDA8:
|
|
mov r0, #1
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
arm_func_end BN_mul
|
|
|
|
arm_func_start BN_sub
|
|
BN_sub: ; 0x0223BDB8
|
|
stmfd sp!, {r4, r5, r6, r7, lr}
|
|
sub sp, sp, #4
|
|
mov r6, r1
|
|
ldr r1, [r6, #0xc]
|
|
mov r3, #0
|
|
mov r7, r0
|
|
mov r5, r2
|
|
mov r4, r3
|
|
cmp r1, #0
|
|
beq _0223BE00
|
|
ldr r0, [r5, #0xc]
|
|
cmp r0, #0
|
|
movne r0, r6
|
|
moveq r3, #1
|
|
movne r6, r5
|
|
movne r5, r0
|
|
moveq r4, r3
|
|
b _0223BE0C
|
|
_0223BE00:
|
|
ldr r0, [r5, #0xc]
|
|
cmp r0, #0
|
|
movne r3, #1
|
|
_0223BE0C:
|
|
cmp r3, #0
|
|
beq _0223BE40
|
|
mov r0, r7
|
|
mov r1, r6
|
|
mov r2, r5
|
|
bl BN_uadd
|
|
cmp r0, #0
|
|
moveq r0, #0
|
|
add sp, sp, #4
|
|
strne r4, [r7, #0xc]
|
|
movne r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, lr}
|
|
bx lr
|
|
_0223BE40:
|
|
ldr r0, [r5, #4]
|
|
ldr r1, [r6, #4]
|
|
cmp r1, r0
|
|
movle r1, r0
|
|
ldr r0, [r7, #8]
|
|
cmp r1, r0
|
|
movle r0, r7
|
|
ble _0223BE68
|
|
mov r0, r7
|
|
bl bn_expand2
|
|
_0223BE68:
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, lr}
|
|
bxeq lr
|
|
mov r0, r6
|
|
mov r1, r5
|
|
bl BN_ucmp
|
|
cmp r0, #0
|
|
bge _0223BEC0
|
|
mov r0, r7
|
|
mov r1, r5
|
|
mov r2, r6
|
|
bl BN_usub
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, lr}
|
|
bxeq lr
|
|
mov r0, #1
|
|
str r0, [r7, #0xc]
|
|
b _0223BEEC
|
|
_0223BEC0:
|
|
mov r0, r7
|
|
mov r1, r6
|
|
mov r2, r5
|
|
bl BN_usub
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, lr}
|
|
bxeq lr
|
|
mov r0, #0
|
|
str r0, [r7, #0xc]
|
|
_0223BEEC:
|
|
mov r0, #1
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, r6, r7, lr}
|
|
bx lr
|
|
arm_func_end BN_sub
|
|
|
|
arm_func_start BN_usub
|
|
BN_usub: ; 0x0223BEFC
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
|
|
mov r8, r1
|
|
mov r7, r2
|
|
ldr r5, [r7, #4]
|
|
ldr r6, [r8, #4]
|
|
mov r4, r0
|
|
cmp r6, r5
|
|
movlt r0, #0
|
|
ldmltia sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
|
|
bxlt lr
|
|
ldr r1, [r4, #8]
|
|
cmp r6, r1
|
|
ble _0223BF38
|
|
mov r1, r6
|
|
bl bn_expand2
|
|
_0223BF38:
|
|
cmp r0, #0
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
|
|
bxeq lr
|
|
mov r3, #0
|
|
mov r0, r3
|
|
cmp r5, #0
|
|
ldr r2, [r8]
|
|
ldr sb, [r7]
|
|
ldr r1, [r4, #0]
|
|
ble _0223BFB8
|
|
mov ip, r3
|
|
mov r7, r3
|
|
mov lr, #1
|
|
_0223BF70:
|
|
cmp r3, #0
|
|
ldr sl, [r2], #4
|
|
ldr r8, [sb], #4
|
|
beq _0223BF98
|
|
cmp sl, r8
|
|
movls r3, lr
|
|
sub r8, sl, r8
|
|
movhi r3, ip
|
|
sub sl, r8, #1
|
|
b _0223BFA8
|
|
_0223BF98:
|
|
cmp sl, r8
|
|
movlo r3, lr
|
|
movhs r3, r7
|
|
sub sl, sl, r8
|
|
_0223BFA8:
|
|
add r0, r0, #1
|
|
cmp r0, r5
|
|
str sl, [r1], #4
|
|
blt _0223BF70
|
|
_0223BFB8:
|
|
cmp r3, #0
|
|
beq _0223BFE8
|
|
cmp r0, r6
|
|
bge _0223BFE8
|
|
_0223BFC8:
|
|
ldr r5, [r2, #0], #4
|
|
add r0, r0, #1
|
|
sub r3, r5, #1
|
|
cmp r5, r3
|
|
str r3, [r1, #0], #4
|
|
bhi _0223BFE8
|
|
cmp r0, r6
|
|
blt _0223BFC8
|
|
_0223BFE8:
|
|
cmp r1, r2
|
|
beq _0223C048
|
|
_0223BFF0:
|
|
cmp r0, r6
|
|
bge _0223C048
|
|
ldr r5, [r2, #0]
|
|
add r3, r0, #1
|
|
str r5, [r1, #0]
|
|
cmp r3, r6
|
|
bge _0223C048
|
|
ldr r5, [r2, #4]
|
|
add r3, r0, #2
|
|
str r5, [r1, #4]
|
|
cmp r3, r6
|
|
bge _0223C048
|
|
ldr r5, [r2, #8]
|
|
add r3, r0, #3
|
|
str r5, [r1, #8]
|
|
cmp r3, r6
|
|
ldrlt r3, [r2, #0xc]
|
|
add r0, r0, #4
|
|
strlt r3, [r1, #0xc]
|
|
addlt r2, r2, #0x10
|
|
addlt r1, r1, #0x10
|
|
blt _0223BFF0
|
|
_0223C048:
|
|
mov r0, r4
|
|
str r6, [r4, #4]
|
|
bl bn_fix_top
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
|
|
bx lr
|
|
arm_func_end BN_usub
|
|
|
|
arm_func_start BN_uadd
|
|
BN_uadd: ; 0x0223C060
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
sub sp, sp, #4
|
|
mov r4, r1
|
|
mov r8, r2
|
|
ldr r2, [r4, #4]
|
|
ldr r1, [r8, #4]
|
|
mov sb, r0
|
|
cmp r2, r1
|
|
movlt r0, r4
|
|
movlt r4, r8
|
|
movlt r8, r0
|
|
ldr r6, [r4, #4]
|
|
ldr r0, [sb, #8]
|
|
add r1, r6, #1
|
|
cmp r1, r0
|
|
ldr r7, [r8, #4]
|
|
movle r0, sb
|
|
ble _0223C0B0
|
|
mov r0, sb
|
|
bl bn_expand2
|
|
_0223C0B0:
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bxeq lr
|
|
str r6, [sb, #4]
|
|
ldr r5, [r4, #0]
|
|
ldr r4, [sb]
|
|
ldr r2, [r8]
|
|
mov r0, r4
|
|
mov r1, r5
|
|
mov r3, r7
|
|
bl bn_add_words
|
|
cmp r0, #0
|
|
add r4, r4, r7, lsl #2
|
|
add r5, r5, r7, lsl #2
|
|
beq _0223C148
|
|
cmp r7, r6
|
|
bge _0223C128
|
|
_0223C0FC:
|
|
ldr r2, [r5, #0], #4
|
|
mov r3, r4
|
|
add r1, r2, #1
|
|
str r1, [r4, #0], #4
|
|
ldr r1, [r3, #0]
|
|
add r7, r7, #1
|
|
cmp r1, r2
|
|
movhs r0, #0
|
|
bhs _0223C128
|
|
cmp r7, r6
|
|
blt _0223C0FC
|
|
_0223C128:
|
|
cmp r7, r6
|
|
blt _0223C148
|
|
cmp r0, #0
|
|
movne r0, #1
|
|
strne r0, [r4], #4
|
|
ldrne r0, [sb, #4]
|
|
addne r0, r0, #1
|
|
strne r0, [sb, #4]
|
|
_0223C148:
|
|
cmp r4, r5
|
|
beq _0223C16C
|
|
cmp r7, r6
|
|
bge _0223C16C
|
|
_0223C158:
|
|
ldr r0, [r5, #0], #4
|
|
add r7, r7, #1
|
|
cmp r7, r6
|
|
str r0, [r4, #0], #4
|
|
blt _0223C158
|
|
_0223C16C:
|
|
mov r0, #1
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bx lr
|
|
arm_func_end BN_uadd
|
|
|
|
arm_func_start BN_add
|
|
BN_add: ; 0x0223C17C
|
|
stmfd sp!, {r4, r5, r6, lr}
|
|
mov r5, r1
|
|
mov r4, r2
|
|
ldr r2, [r5, #0xc]
|
|
ldr r1, [r4, #0xc]
|
|
mov r6, r0
|
|
eors r0, r2, r1
|
|
beq _0223C220
|
|
cmp r2, #0
|
|
movne r0, r5
|
|
movne r5, r4
|
|
movne r4, r0
|
|
mov r0, r5
|
|
mov r1, r4
|
|
bl BN_ucmp
|
|
cmp r0, #0
|
|
bge _0223C1EC
|
|
mov r0, r6
|
|
mov r1, r4
|
|
mov r2, r5
|
|
bl BN_usub
|
|
cmp r0, #0
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, lr}
|
|
bxeq lr
|
|
mov r0, #1
|
|
str r0, [r6, #0xc]
|
|
b _0223C214
|
|
_0223C1EC:
|
|
mov r0, r6
|
|
mov r1, r5
|
|
mov r2, r4
|
|
bl BN_usub
|
|
cmp r0, #0
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, lr}
|
|
bxeq lr
|
|
mov r0, #0
|
|
str r0, [r6, #0xc]
|
|
_0223C214:
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, lr}
|
|
bx lr
|
|
_0223C220:
|
|
cmp r2, #0
|
|
movne r0, #1
|
|
strne r0, [r6, #0xc]
|
|
moveq r0, #0
|
|
streq r0, [r6, #0xc]
|
|
mov r0, r6
|
|
mov r1, r5
|
|
mov r2, r4
|
|
bl BN_uadd
|
|
cmp r0, #0
|
|
moveq r0, #0
|
|
movne r0, #1
|
|
ldmia sp!, {r4, r5, r6, lr}
|
|
bx lr
|
|
arm_func_end BN_add
|
|
|
|
arm_func_start BN_sub_word
|
|
BN_sub_word: ; 0x0223C258
|
|
stmfd sp!, {r4, r5, lr}
|
|
sub sp, sp, #4
|
|
movs r4, r1
|
|
mov r5, r0
|
|
addeq sp, sp, #4
|
|
moveq r0, #1
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
bxeq lr
|
|
ldr r2, [r5, #0xc]
|
|
cmp r2, #0
|
|
beq _0223C2A4
|
|
mov r2, #0
|
|
str r2, [r5, #0xc]
|
|
bl BN_add_word
|
|
mov r1, #1
|
|
add sp, sp, #4
|
|
str r1, [r5, #0xc]
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
_0223C2A4:
|
|
ldr r1, [r5, #4]
|
|
cmp r1, #1
|
|
bgt _0223C348
|
|
cmp r1, #0
|
|
bne _0223C300
|
|
ldr r1, [r5, #8]
|
|
cmp r1, #1
|
|
bge _0223C2CC
|
|
mov r1, #1
|
|
bl bn_expand2
|
|
_0223C2CC:
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
bxeq lr
|
|
ldr r1, [r5, #0]
|
|
mov r0, #1
|
|
str r4, [r1, #0]
|
|
str r0, [r5, #0xc]
|
|
add sp, sp, #4
|
|
str r0, [r5, #4]
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
_0223C300:
|
|
ldr r2, [r5, #0]
|
|
ldr r1, [r2, #0]
|
|
cmp r1, r4
|
|
moveq r0, #0
|
|
streq r0, [r5, #4]
|
|
beq _0223C338
|
|
cmp r1, r4
|
|
subhi r0, r1, r4
|
|
strhi r0, [r2]
|
|
movls r0, #1
|
|
strls r0, [r5, #0xc]
|
|
ldrls r0, [r5]
|
|
subls r1, r4, r1
|
|
strls r1, [r0]
|
|
_0223C338:
|
|
add sp, sp, #4
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
_0223C348:
|
|
mov r0, #0
|
|
mov r1, #1
|
|
_0223C350:
|
|
ldr ip, [r5]
|
|
mov r3, r0, lsl #2
|
|
ldr r2, [ip, r0, lsl #2]
|
|
cmp r2, r4
|
|
ldrhs r1, [ip, r3]
|
|
subhs r1, r1, r4
|
|
strhs r1, [ip, r3]
|
|
bhs _0223C388
|
|
ldr r2, [ip, r3]
|
|
add r0, r0, #1
|
|
sub r2, r2, r4
|
|
mov r4, r1
|
|
str r2, [ip, r3]
|
|
b _0223C350
|
|
_0223C388:
|
|
ldr r1, [r5, #0]
|
|
ldr r1, [r1, r3]
|
|
cmp r1, #0
|
|
bne _0223C3A8
|
|
ldr r1, [r5, #4]
|
|
sub r1, r1, #1
|
|
cmp r0, r1
|
|
streq r1, [r5, #4]
|
|
_0223C3A8:
|
|
mov r0, #1
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
arm_func_end BN_sub_word
|
|
|
|
arm_func_start BN_add_word
|
|
BN_add_word: ; 0x0223C3B8
|
|
stmfd sp!, {r4, r5, lr}
|
|
sub sp, sp, #4
|
|
movs r4, r1
|
|
mov r5, r0
|
|
addeq sp, sp, #4
|
|
moveq r0, #1
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
bxeq lr
|
|
ldr r2, [r5, #0xc]
|
|
cmp r2, #0
|
|
beq _0223C460
|
|
ldr r2, [r5, #4]
|
|
cmp r2, #1
|
|
ble _0223C410
|
|
mov r2, #0
|
|
str r2, [r5, #0xc]
|
|
bl BN_sub_word
|
|
mov r1, #1
|
|
add sp, sp, #4
|
|
str r1, [r5, #0xc]
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
_0223C410:
|
|
ldr r2, [r5, #0]
|
|
ldr r1, [r2, #0]
|
|
cmp r1, r4
|
|
subhi r0, r1, r4
|
|
strhi r0, [r2]
|
|
bhi _0223C450
|
|
cmp r1, r4
|
|
movhs r0, #0
|
|
strhs r0, [r5, #0xc]
|
|
strhs r0, [r5, #4]
|
|
bhs _0223C450
|
|
mov r0, #0
|
|
str r0, [r5, #0xc]
|
|
ldr r0, [r5, #0]
|
|
sub r1, r4, r1
|
|
str r1, [r0, #0]
|
|
_0223C450:
|
|
add sp, sp, #4
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
_0223C460:
|
|
ldr r1, [r5, #4]
|
|
ldr r2, [r5, #8]
|
|
add r1, r1, #1
|
|
cmp r1, r2
|
|
ble _0223C478
|
|
bl bn_expand2
|
|
_0223C478:
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
bxeq lr
|
|
ldr r1, [r5, #0]
|
|
ldr r0, [r5, #4]
|
|
mov r3, #0
|
|
str r3, [r1, r0, lsl #2]
|
|
mov r0, #1
|
|
_0223C4A0:
|
|
ldr r2, [r5, #0]
|
|
ldr r1, [r2, r3, lsl #2]
|
|
add r1, r4, r1
|
|
cmp r4, r1
|
|
str r1, [r2, r3, lsl #2]
|
|
movhi r4, r0
|
|
addhi r3, r3, #1
|
|
bhi _0223C4A0
|
|
ldr r0, [r5, #4]
|
|
cmp r3, r0
|
|
addge r0, r0, #1
|
|
strge r0, [r5, #4]
|
|
mov r0, #1
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
arm_func_end BN_add_word
|
|
|
|
arm_func_start BN_rshift
|
|
BN_rshift: ; 0x0223C4E0
|
|
stmfd sp!, {r4, r5, r6, r7, r8, lr}
|
|
mov r7, r1
|
|
mov r1, r2, asr #4
|
|
mov r3, r2, lsr #0x1f
|
|
add r1, r2, r1, lsr #27
|
|
rsb r2, r3, r2, lsl #27
|
|
add r4, r3, r2, ror #27
|
|
ldr r2, [r7, #4]
|
|
mov r6, r1, asr #5
|
|
mov r8, r0
|
|
cmp r6, r2
|
|
rsb r5, r4, #0x20
|
|
ble _0223C528
|
|
mov r1, #0
|
|
bl BN_set_word
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, lr}
|
|
bx lr
|
|
_0223C528:
|
|
cmp r8, r7
|
|
beq _0223C560
|
|
sub r1, r2, r6
|
|
ldr r2, [r8, #8]
|
|
add r1, r1, #2
|
|
cmp r1, r2
|
|
ble _0223C548
|
|
bl bn_expand2
|
|
_0223C548:
|
|
cmp r0, #0
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, lr}
|
|
bxeq lr
|
|
ldr r0, [r7, #0xc]
|
|
str r0, [r8, #0xc]
|
|
_0223C560:
|
|
ldr r0, [r7, #0]
|
|
ldr r1, [r7, #4]
|
|
add r2, r0, r6, lsl #2
|
|
ldr r0, [r8]
|
|
sub r7, r1, r6
|
|
mov r6, r2
|
|
str r7, [r8, #4]
|
|
cmp r4, #0
|
|
bne _0223C5A8
|
|
add r2, r7, #1
|
|
cmp r2, #0
|
|
ble _0223C5E8
|
|
_0223C590:
|
|
ldr r1, [r6, #0], #4
|
|
sub r2, r2, #1
|
|
cmp r2, #0
|
|
str r1, [r0, #0], #4
|
|
bgt _0223C590
|
|
b _0223C5E8
|
|
_0223C5A8:
|
|
cmp r7, #1
|
|
add r6, r2, #4
|
|
ldr r3, [r2, #0]
|
|
mov r2, #1
|
|
ble _0223C5D8
|
|
_0223C5BC:
|
|
mov r1, r3, lsr r4
|
|
ldr r3, [r6, #0], #4
|
|
add r2, r2, #1
|
|
orr r1, r1, r3, lsl r5
|
|
cmp r2, r7
|
|
str r1, [r0, #0], #4
|
|
blt _0223C5BC
|
|
_0223C5D8:
|
|
mov r1, r3, lsr r4
|
|
str r1, [r0, #0]
|
|
mov r1, #0
|
|
str r1, [r0, #4]
|
|
_0223C5E8:
|
|
mov r0, r8
|
|
bl bn_fix_top
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, lr}
|
|
bx lr
|
|
arm_func_end BN_rshift
|
|
|
|
arm_func_start BN_lshift
|
|
BN_lshift: ; 0x0223C5FC
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
|
|
mov r4, r1
|
|
mov r7, r2
|
|
mov r1, r7, asr #4
|
|
mov r5, r0
|
|
add r2, r7, r1, lsr #27
|
|
ldr r1, [r4, #4]
|
|
ldr r3, [r5, #8]
|
|
add r1, r1, r2, asr #5
|
|
add r1, r1, #1
|
|
cmp r1, r3
|
|
mov r6, r2, asr #5
|
|
ble _0223C634
|
|
bl bn_expand2
|
|
_0223C634:
|
|
cmp r0, #0
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
|
|
bxeq lr
|
|
ldr r0, [r4, #0xc]
|
|
mov r1, r7, lsr #0x1f
|
|
str r0, [r5, #0xc]
|
|
ldr r3, [r4, #4]
|
|
rsb r0, r1, r7, lsl #27
|
|
adds ip, r1, r0, ror #27
|
|
ldr r2, [r4, #0]
|
|
ldr r0, [r5, #0]
|
|
add r1, r3, r6
|
|
mov r3, #0
|
|
str r3, [r0, r1, lsl #2]
|
|
rsb r3, ip, #0x20
|
|
bne _0223C69C
|
|
ldr r1, [r4, #4]
|
|
subs r7, r1, #1
|
|
bmi _0223C6D0
|
|
_0223C684:
|
|
ldr r3, [r2, r7, lsl #2]
|
|
add r1, r6, r7
|
|
str r3, [r0, r1, lsl #2]
|
|
subs r7, r7, #1
|
|
bpl _0223C684
|
|
b _0223C6D0
|
|
_0223C69C:
|
|
ldr r1, [r4, #4]
|
|
subs r1, r1, #1
|
|
bmi _0223C6D0
|
|
_0223C6A8:
|
|
add sb, r6, r1
|
|
add r8, sb, #1
|
|
ldr sl, [r2, r1, lsl #2]
|
|
ldr lr, [r0, r8, lsl #2]
|
|
mov r7, sl, lsl ip
|
|
orr lr, lr, sl, lsr r3
|
|
str lr, [r0, r8, lsl #2]
|
|
str r7, [r0, sb, lsl #2]
|
|
subs r1, r1, #1
|
|
bpl _0223C6A8
|
|
_0223C6D0:
|
|
mov r2, r6, lsl #2
|
|
mov r1, #0
|
|
bl MI_CpuFill8
|
|
ldr r1, [r4, #4]
|
|
mov r0, r5
|
|
add r1, r1, r6
|
|
add r1, r1, #1
|
|
str r1, [r5, #4]
|
|
bl bn_fix_top
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
|
|
bx lr
|
|
arm_func_end BN_lshift
|
|
|
|
arm_func_start bn_sub_words
|
|
bn_sub_words: ; 0x0223C700
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
|
|
cmp r3, #0
|
|
movle r0, #0
|
|
ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
|
|
bxle lr
|
|
mov r6, #0
|
|
mov r4, r6
|
|
mov lr, r6
|
|
mov ip, r6
|
|
mov r7, r6
|
|
mov r5, #1
|
|
_0223C72C:
|
|
ldr sl, [r1]
|
|
ldr sb, [r2]
|
|
sub r8, sl, sb
|
|
sub r8, r8, r6
|
|
str r8, [r0]
|
|
cmp sl, sb
|
|
beq _0223C754
|
|
cmp sl, sb
|
|
movlo r6, r5
|
|
movhs r6, r4
|
|
_0223C754:
|
|
sub r8, r3, #1
|
|
cmp r8, #0
|
|
ble _0223C808
|
|
ldr sl, [r1, #4]
|
|
ldr sb, [r2, #4]
|
|
sub r8, sl, sb
|
|
sub r8, r8, r6
|
|
str r8, [r0, #4]
|
|
cmp sl, sb
|
|
beq _0223C788
|
|
cmp sl, sb
|
|
movlo r6, r5
|
|
movhs r6, lr
|
|
_0223C788:
|
|
sub r8, r3, #2
|
|
cmp r8, #0
|
|
ble _0223C808
|
|
ldr sl, [r1, #8]
|
|
ldr sb, [r2, #8]
|
|
sub r8, sl, sb
|
|
sub r8, r8, r6
|
|
str r8, [r0, #8]
|
|
cmp sl, sb
|
|
beq _0223C7BC
|
|
cmp sl, sb
|
|
movlo r6, r5
|
|
movhs r6, ip
|
|
_0223C7BC:
|
|
sub r8, r3, #3
|
|
cmp r8, #0
|
|
ble _0223C808
|
|
ldr sl, [r1, #0xc]
|
|
ldr sb, [r2, #0xc]
|
|
sub r8, sl, sb
|
|
sub r8, r8, r6
|
|
str r8, [r0, #0xc]
|
|
cmp sl, sb
|
|
beq _0223C7F0
|
|
cmp sl, sb
|
|
movlo r6, r5
|
|
movhs r6, r7
|
|
_0223C7F0:
|
|
sub r3, r3, #4
|
|
cmp r3, #0
|
|
addgt r1, r1, #0x10
|
|
addgt r2, r2, #0x10
|
|
addgt r0, r0, #0x10
|
|
bgt _0223C72C
|
|
_0223C808:
|
|
mov r0, r6
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
|
|
bx lr
|
|
arm_func_end bn_sub_words
|
|
|
|
arm_func_start bn_add_words
|
|
bn_add_words: ; 0x0223C814
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
sub sp, sp, #0xc
|
|
cmp r3, #0
|
|
addle sp, sp, #0xc
|
|
movle r0, #0
|
|
ldmleia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bxle lr
|
|
mov ip, #0
|
|
mov r7, ip
|
|
mov r6, ip
|
|
mov r5, ip
|
|
mov r4, ip
|
|
mov lr, ip
|
|
mov fp, ip
|
|
str ip, [sp]
|
|
str ip, [sp, #4]
|
|
mov r8, #1
|
|
_0223C858:
|
|
ldr sb, [r1]
|
|
add sl, sb, ip
|
|
ldr sb, [r2]
|
|
cmp sl, ip
|
|
movlo ip, r8
|
|
add sb, sl, sb
|
|
movhs ip, r7
|
|
cmp sb, sl
|
|
movlo sl, r8
|
|
movhs sl, r6
|
|
str sb, [r0]
|
|
sub sb, r3, #1
|
|
add ip, ip, sl
|
|
cmp sb, #0
|
|
ble _0223C954
|
|
ldr sb, [r1, #4]
|
|
ldr sl, [r2, #4]
|
|
add sb, sb, ip
|
|
cmp sb, ip
|
|
movlo ip, r8
|
|
add sl, sb, sl
|
|
movhs ip, r5
|
|
cmp sl, sb
|
|
movlo sb, r8
|
|
movhs sb, r4
|
|
add ip, ip, sb
|
|
sub sb, r3, #2
|
|
str sl, [r0, #4]
|
|
cmp sb, #0
|
|
ble _0223C954
|
|
ldr sb, [r1, #8]
|
|
ldr sl, [r2, #8]
|
|
add sb, sb, ip
|
|
cmp sb, ip
|
|
movlo ip, r8
|
|
add sl, sb, sl
|
|
movhs ip, lr
|
|
cmp sl, sb
|
|
movlo sb, r8
|
|
movhs sb, fp
|
|
add ip, ip, sb
|
|
sub sb, r3, #3
|
|
str sl, [r0, #8]
|
|
cmp sb, #0
|
|
ble _0223C954
|
|
ldr sb, [r1, #0xc]
|
|
ldr sl, [r2, #0xc]
|
|
add sb, sb, ip
|
|
cmp sb, ip
|
|
movlo ip, r8
|
|
add sl, sb, sl
|
|
ldrhs ip, [sp]
|
|
cmp sl, sb
|
|
movlo sb, r8
|
|
ldrhs sb, [sp, #4]
|
|
sub r3, r3, #4
|
|
cmp r3, #0
|
|
str sl, [r0, #0xc]
|
|
add ip, ip, sb
|
|
addgt r1, r1, #0x10
|
|
addgt r2, r2, #0x10
|
|
addgt r0, r0, #0x10
|
|
bgt _0223C858
|
|
_0223C954:
|
|
mov r0, ip
|
|
add sp, sp, #0xc
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
bx lr
|
|
arm_func_end bn_add_words
|
|
|
|
arm_func_start bn_sqr_words
|
|
bn_sqr_words: ; 0x0223C964
|
|
stmfd sp!, {r4, r5, r6, r7, r8, lr}
|
|
cmp r2, #0
|
|
ldmleia sp!, {r4, r5, r6, r7, r8, lr}
|
|
bxle lr
|
|
mov r3, #0x8000
|
|
ldr lr, _0223CAB4 ; =0x0000FFFF
|
|
rsb ip, r3, #0
|
|
_0223C980:
|
|
ldr r5, [r1, #0]
|
|
mov r3, #0x8000
|
|
and r4, r5, lr
|
|
and r7, lr, r5, lsr #16
|
|
mul r6, r4, r7
|
|
mul r5, r4, r4
|
|
and r4, r6, lr
|
|
add r8, r5, r4, lsl #17
|
|
rsb r3, r3, #0
|
|
mul r5, r7, r7
|
|
and r3, r6, r3
|
|
add r3, r5, r3, lsr #15
|
|
cmp r8, r4, lsl #17
|
|
addlo r3, r3, #1
|
|
str r8, [r0]
|
|
str r3, [r0, #4]
|
|
subs r3, r2, #1
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, lr}
|
|
bxeq lr
|
|
ldr r4, [r1, #4]
|
|
and r7, lr, r4, lsr #16
|
|
and r3, r4, lr
|
|
mul r6, r3, r7
|
|
mul r4, r3, r3
|
|
and r3, r6, lr
|
|
add r8, r4, r3, lsl #17
|
|
mul r5, r7, r7
|
|
and r4, r6, ip
|
|
cmp r8, r3, lsl #17
|
|
add r3, r5, r4, lsr #15
|
|
addlo r3, r3, #1
|
|
str r8, [r0, #8]
|
|
str r3, [r0, #0xc]
|
|
subs r3, r2, #2
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, lr}
|
|
bxeq lr
|
|
ldr r5, [r1, #8]
|
|
mov r3, #0x8000
|
|
and r4, r5, lr
|
|
and r7, lr, r5, lsr #16
|
|
mul r6, r4, r7
|
|
mul r5, r4, r4
|
|
and r4, r6, lr
|
|
add r8, r5, r4, lsl #17
|
|
rsb r3, r3, #0
|
|
mul r5, r7, r7
|
|
and r3, r6, r3
|
|
add r3, r5, r3, lsr #15
|
|
cmp r8, r4, lsl #17
|
|
addlo r3, r3, #1
|
|
str r8, [r0, #0x10]
|
|
str r3, [r0, #0x14]
|
|
subs r3, r2, #3
|
|
ldmeqia sp!, {r4, r5, r6, r7, r8, lr}
|
|
bxeq lr
|
|
ldr r5, [r1, #0xc]
|
|
mov r3, #0x8000
|
|
and r4, r5, lr
|
|
and r7, lr, r5, lsr #16
|
|
mul r6, r4, r7
|
|
mul r5, r4, r4
|
|
and r4, r6, lr
|
|
add r8, r5, r4, lsl #17
|
|
rsb r3, r3, #0
|
|
mul r5, r7, r7
|
|
and r3, r6, r3
|
|
add r3, r5, r3, lsr #15
|
|
cmp r8, r4, lsl #17
|
|
addlo r3, r3, #1
|
|
str r8, [r0, #0x18]
|
|
subs r2, r2, #4
|
|
str r3, [r0, #0x1c]
|
|
addne r1, r1, #0x10
|
|
addne r0, r0, #0x20
|
|
bne _0223C980
|
|
ldmia sp!, {r4, r5, r6, r7, r8, lr}
|
|
bx lr
|
|
; .align 2, 0
|
|
_0223CAB4: .word 0x0000FFFF
|
|
arm_func_end bn_sqr_words
|
|
|
|
arm_func_start bn_mul_words
|
|
bn_mul_words: ; 0x0223CAB8
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
sub sp, sp, #4
|
|
cmp r2, #0
|
|
mov r4, #0
|
|
addle sp, sp, #4
|
|
movle r0, r4
|
|
ldmleia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bxle lr
|
|
ldr r5, _0223CC54 ; =0x0000FFFF
|
|
and lr, r3, r5
|
|
and ip, r5, r3, lsr #16
|
|
_0223CAE4:
|
|
ldr r3, [r1, #0]
|
|
and r7, r5, r3, lsr #16
|
|
mul r6, lr, r7
|
|
and r3, r3, r5
|
|
mla sb, ip, r3, r6
|
|
mul r8, r3, lr
|
|
mul r3, r7, ip
|
|
cmp sb, r6
|
|
and r6, sb, r5
|
|
addlo r3, r3, #0x10000
|
|
and r7, r5, sb, lsr #16
|
|
add r8, r8, r6, lsl #16
|
|
cmp r8, r6, lsl #16
|
|
add r3, r3, r7
|
|
add r6, r8, r4
|
|
addlo r3, r3, #1
|
|
cmp r6, r4
|
|
addlo r3, r3, #1
|
|
str r6, [r0, #0]
|
|
mov r4, r3
|
|
subs r6, r2, #1
|
|
beq _0223CC44
|
|
ldr r4, [r1, #4]
|
|
and r7, r5, r4, lsr #16
|
|
mul r6, lr, r7
|
|
and r4, r4, r5
|
|
mla sb, ip, r4, r6
|
|
mul r8, r4, lr
|
|
mul r4, r7, ip
|
|
cmp sb, r6
|
|
and r6, sb, r5
|
|
addlo r4, r4, #0x10000
|
|
and r7, r5, sb, lsr #16
|
|
add r8, r8, r6, lsl #16
|
|
cmp r8, r6, lsl #16
|
|
add r4, r4, r7
|
|
add r6, r8, r3
|
|
addlo r4, r4, #1
|
|
cmp r6, r3
|
|
addlo r4, r4, #1
|
|
str r6, [r0, #4]
|
|
subs r3, r2, #2
|
|
beq _0223CC44
|
|
ldr r3, [r1, #8]
|
|
and r7, r5, r3, lsr #16
|
|
mul r6, lr, r7
|
|
and r3, r3, r5
|
|
mla sb, ip, r3, r6
|
|
mul r8, r3, lr
|
|
mul r3, r7, ip
|
|
cmp sb, r6
|
|
and r6, sb, r5
|
|
addlo r3, r3, #0x10000
|
|
and r7, r5, sb, lsr #16
|
|
add r8, r8, r6, lsl #16
|
|
cmp r8, r6, lsl #16
|
|
add r3, r3, r7
|
|
add r6, r8, r4
|
|
addlo r3, r3, #1
|
|
cmp r6, r4
|
|
addlo r3, r3, #1
|
|
str r6, [r0, #8]
|
|
mov r4, r3
|
|
subs r6, r2, #3
|
|
beq _0223CC44
|
|
ldr r4, [r1, #0xc]
|
|
and r7, r5, r4, lsr #16
|
|
mul r6, lr, r7
|
|
and r4, r4, r5
|
|
mla sb, ip, r4, r6
|
|
mul r8, r4, lr
|
|
mul r4, r7, ip
|
|
cmp sb, r6
|
|
and r6, sb, r5
|
|
addlo r4, r4, #0x10000
|
|
and r7, r5, sb, lsr #16
|
|
add r8, r8, r6, lsl #16
|
|
cmp r8, r6, lsl #16
|
|
add r4, r4, r7
|
|
add r6, r8, r3
|
|
addlo r4, r4, #1
|
|
cmp r6, r3
|
|
addlo r4, r4, #1
|
|
subs r2, r2, #4
|
|
str r6, [r0, #0xc]
|
|
addne r1, r1, #0x10
|
|
addne r0, r0, #0x10
|
|
bne _0223CAE4
|
|
_0223CC44:
|
|
mov r0, r4
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bx lr
|
|
; .align 2, 0
|
|
_0223CC54: .word 0x0000FFFF
|
|
arm_func_end bn_mul_words
|
|
|
|
arm_func_start bn_mul_add_words
|
|
bn_mul_add_words: ; 0x0223CC58
|
|
stmfd sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
sub sp, sp, #4
|
|
cmp r2, #0
|
|
mov ip, #0
|
|
addle sp, sp, #4
|
|
movle r0, ip
|
|
ldmleia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bxle lr
|
|
ldr r5, _0223CE34 ; =0x0000FFFF
|
|
and r4, r3, r5
|
|
and lr, r5, r3, lsr #16
|
|
_0223CC84:
|
|
ldr r3, [r1, #0]
|
|
and r7, r5, r3, lsr #16
|
|
mul r6, r4, r7
|
|
and r3, r3, r5
|
|
mla sb, lr, r3, r6
|
|
mul r8, r3, r4
|
|
mul r3, r7, lr
|
|
cmp sb, r6
|
|
and r6, sb, r5
|
|
addlo r3, r3, #0x10000
|
|
and r7, r5, sb, lsr #16
|
|
add r8, r8, r6, lsl #16
|
|
cmp r8, r6, lsl #16
|
|
add r3, r3, r7
|
|
ldr r6, [r0, #0]
|
|
addlo r3, r3, #1
|
|
add r7, r8, ip
|
|
cmp r7, ip
|
|
add r7, r7, r6
|
|
addlo r3, r3, #1
|
|
cmp r7, r6
|
|
addlo r3, r3, #1
|
|
mov ip, r3
|
|
str r7, [r0, #0]
|
|
subs r6, r2, #1
|
|
beq _0223CE24
|
|
ldr ip, [r1, #4]
|
|
and r7, r5, ip, lsr #16
|
|
mul r6, r4, r7
|
|
and ip, ip, r5
|
|
mla sb, lr, ip, r6
|
|
mul r8, ip, r4
|
|
mul ip, r7, lr
|
|
cmp sb, r6
|
|
and r6, sb, r5
|
|
addlo ip, ip, #0x10000
|
|
and r7, r5, sb, lsr #16
|
|
add r8, r8, r6, lsl #16
|
|
cmp r8, r6, lsl #16
|
|
add ip, ip, r7
|
|
add r6, r8, r3
|
|
addlo ip, ip, #1
|
|
cmp r6, r3
|
|
ldr r3, [r0, #4]
|
|
addlo ip, ip, #1
|
|
add r6, r6, r3
|
|
cmp r6, r3
|
|
addlo ip, ip, #1
|
|
str r6, [r0, #4]
|
|
subs r3, r2, #2
|
|
beq _0223CE24
|
|
ldr r3, [r1, #8]
|
|
and r7, r5, r3, lsr #16
|
|
mul r6, r4, r7
|
|
and r3, r3, r5
|
|
mla sb, lr, r3, r6
|
|
mul r8, r3, r4
|
|
mul r3, r7, lr
|
|
cmp sb, r6
|
|
and r6, sb, r5
|
|
addlo r3, r3, #0x10000
|
|
and r7, r5, sb, lsr #16
|
|
add r8, r8, r6, lsl #16
|
|
cmp r8, r6, lsl #16
|
|
add r3, r3, r7
|
|
ldr r6, [r0, #8]
|
|
addlo r3, r3, #1
|
|
add r7, r8, ip
|
|
cmp r7, ip
|
|
add r7, r7, r6
|
|
addlo r3, r3, #1
|
|
cmp r7, r6
|
|
addlo r3, r3, #1
|
|
mov ip, r3
|
|
str r7, [r0, #8]
|
|
subs r6, r2, #3
|
|
beq _0223CE24
|
|
ldr ip, [r1, #0xc]
|
|
and r7, r5, ip, lsr #16
|
|
mul r6, r4, r7
|
|
and ip, ip, r5
|
|
mla sb, lr, ip, r6
|
|
mul r8, ip, r4
|
|
mul ip, r7, lr
|
|
cmp sb, r6
|
|
and r6, sb, r5
|
|
addlo ip, ip, #0x10000
|
|
and r7, r5, sb, lsr #16
|
|
add r8, r8, r6, lsl #16
|
|
cmp r8, r6, lsl #16
|
|
add ip, ip, r7
|
|
add r6, r8, r3
|
|
addlo ip, ip, #1
|
|
cmp r6, r3
|
|
ldr r3, [r0, #0xc]
|
|
addlo ip, ip, #1
|
|
add r6, r6, r3
|
|
cmp r6, r3
|
|
addlo ip, ip, #1
|
|
subs r2, r2, #4
|
|
str r6, [r0, #0xc]
|
|
addne r1, r1, #0x10
|
|
addne r0, r0, #0x10
|
|
bne _0223CC84
|
|
_0223CE24:
|
|
mov r0, ip
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, r6, r7, r8, sb, lr}
|
|
bx lr
|
|
; .align 2, 0
|
|
_0223CE34: .word 0x0000FFFF
|
|
arm_func_end bn_mul_add_words
|
|
|
|
arm_func_start BN_is_bit_set
|
|
BN_is_bit_set: ; 0x0223CE38
|
|
stmdb sp!, {lr}
|
|
sub sp, sp, #4
|
|
cmp r1, #0
|
|
addlt sp, sp, #4
|
|
movlt r0, #0
|
|
ldmltia sp!, {lr}
|
|
bxlt lr
|
|
mov r2, r1, asr #4
|
|
add r2, r1, r2, lsr #27
|
|
mov r3, r1, lsr #0x1f
|
|
ldr ip, [r0, #4]
|
|
mov lr, r2, asr #5
|
|
cmp ip, lr
|
|
rsb r1, r3, r1, lsl #27
|
|
addle sp, sp, #4
|
|
add r2, r3, r1, ror #27
|
|
movle r0, #0
|
|
ldmleia sp!, {lr}
|
|
bxle lr
|
|
ldr r1, [r0, #0]
|
|
mov r0, #1
|
|
mov r2, r0, lsl r2
|
|
ldr r1, [r1, lr, lsl #2]
|
|
ands r1, r2, r1
|
|
moveq r0, #0
|
|
add sp, sp, #4
|
|
ldmia sp!, {lr}
|
|
bx lr
|
|
arm_func_end BN_is_bit_set
|
|
|
|
arm_func_start BN_set_bit
|
|
BN_set_bit: ; 0x0223CEA8
|
|
stmfd sp!, {r4, r5, r6, lr}
|
|
mov r6, r0
|
|
mov r2, r1, asr #4
|
|
add r2, r1, r2, lsr #27
|
|
mov r3, r1, lsr #0x1f
|
|
rsb r1, r3, r1, lsl #27
|
|
ldr r4, [r6, #4]
|
|
mov r5, r2, asr #5
|
|
cmp r4, r5
|
|
add r4, r3, r1, ror #27
|
|
bgt _0223CF28
|
|
ldr r2, [r6, #8]
|
|
add r1, r5, #1
|
|
cmp r1, r2
|
|
ble _0223CEE8
|
|
bl bn_expand2
|
|
_0223CEE8:
|
|
cmp r0, #0
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, lr}
|
|
bxeq lr
|
|
ldr r3, [r6, #4]
|
|
add r2, r5, #1
|
|
cmp r3, r2
|
|
bge _0223CF20
|
|
mov r1, #0
|
|
_0223CF0C:
|
|
ldr r0, [r6, #0]
|
|
str r1, [r0, r3, lsl #2]
|
|
add r3, r3, #1
|
|
cmp r3, r2
|
|
blt _0223CF0C
|
|
_0223CF20:
|
|
add r0, r5, #1
|
|
str r0, [r6, #4]
|
|
_0223CF28:
|
|
ldr r2, [r6, #0]
|
|
mov r0, #1
|
|
ldr r1, [r2, r5, lsl #2]
|
|
orr r1, r1, r0, lsl r4
|
|
str r1, [r2, r5, lsl #2]
|
|
ldmia sp!, {r4, r5, r6, lr}
|
|
bx lr
|
|
arm_func_end BN_set_bit
|
|
|
|
arm_func_start BN_ucmp
|
|
BN_ucmp: ; 0x0223CF44
|
|
ldr r3, [r0, #4]
|
|
ldr r2, [r1, #4]
|
|
subs r2, r3, r2
|
|
movne r0, r2
|
|
bxne lr
|
|
subs r2, r3, #1
|
|
ldr ip, [r0]
|
|
ldr r3, [r1, #0]
|
|
bmi _0223CF90
|
|
_0223CF68:
|
|
ldr r1, [ip, r2, lsl #2]
|
|
ldr r0, [r3, r2, lsl #2]
|
|
cmp r1, r0
|
|
beq _0223CF88
|
|
cmp r1, r0
|
|
movhi r0, #1
|
|
mvnls r0, #0
|
|
bx lr
|
|
_0223CF88:
|
|
subs r2, r2, #1
|
|
bpl _0223CF68
|
|
_0223CF90:
|
|
mov r0, #0
|
|
bx lr
|
|
arm_func_end BN_ucmp
|
|
|
|
arm_func_start BN_bn2bin
|
|
BN_bn2bin: ; 0x0223CF98
|
|
stmfd sp!, {r4, r5, lr}
|
|
sub sp, sp, #4
|
|
mov r5, r0
|
|
mov r4, r1
|
|
bl BN_num_bits
|
|
add r1, r0, #7
|
|
mov r0, r1, asr #2
|
|
add r0, r1, r0, lsr #29
|
|
mov r0, r0, asr #3
|
|
cmp r0, #0
|
|
addle sp, sp, #4
|
|
sub ip, r0, #1
|
|
ldmleia sp!, {r4, r5, lr}
|
|
bxle lr
|
|
_0223CFD0:
|
|
mov r3, ip, lsr #0x1f
|
|
mov r1, ip, asr #1
|
|
rsb r2, r3, ip, lsl #30
|
|
add r1, ip, r1, lsr #30
|
|
add r2, r3, r2, ror #30
|
|
ldr r3, [r5, #0]
|
|
mov r1, r1, asr #2
|
|
ldr r3, [r3, r1, lsl #2]
|
|
mov r1, r2, lsl #3
|
|
mov r1, r3, lsr r1
|
|
cmp ip, #0
|
|
strb r1, [r4], #1
|
|
sub ip, ip, #1
|
|
bgt _0223CFD0
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
arm_func_end BN_bn2bin
|
|
|
|
arm_func_start BN_bin2bn
|
|
BN_bin2bn: ; 0x0223D014
|
|
stmfd sp!, {r4, r5, r6, r7, lr}
|
|
sub sp, sp, #4
|
|
movs r5, r2
|
|
mov r7, r0
|
|
mov r6, r1
|
|
bne _0223D034
|
|
bl BN_new
|
|
mov r5, r0
|
|
_0223D034:
|
|
cmp r5, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, lr}
|
|
bxeq lr
|
|
cmp r6, #0
|
|
mov r4, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, r5
|
|
streq r4, [r5, #4]
|
|
ldmeqia sp!, {r4, r5, r6, r7, lr}
|
|
bxeq lr
|
|
add r0, r6, #2
|
|
mov r2, r0, lsl #3
|
|
add r1, r2, #0x1f
|
|
mov r0, r1, asr #4
|
|
add r0, r1, r0, lsr #27
|
|
ldr r1, [r5, #8]
|
|
mov r0, r0, asr #5
|
|
cmp r0, r1
|
|
movle r0, r5
|
|
ble _0223D0A4
|
|
mov r0, r2, asr #4
|
|
add r0, r2, r0, lsr #27
|
|
mov r1, r0, asr #5
|
|
mov r0, r5
|
|
add r1, r1, #1
|
|
bl bn_expand2
|
|
_0223D0A4:
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, r7, lr}
|
|
bxeq lr
|
|
sub r0, r6, #1
|
|
mov r1, r0, lsr #2
|
|
add ip, r1, #1
|
|
cmp r6, #0
|
|
str ip, [r5, #4]
|
|
and r3, r0, #3
|
|
sub r6, r6, #1
|
|
beq _0223D110
|
|
mov r1, #0
|
|
mov r0, #3
|
|
_0223D0E0:
|
|
ldrb r2, [r7], #1
|
|
cmp r3, #0
|
|
sub r3, r3, #1
|
|
orr r4, r2, r4, lsl #8
|
|
ldreq r2, [r5]
|
|
subeq ip, ip, #1
|
|
streq r4, [r2, ip, lsl #2]
|
|
moveq r4, r1
|
|
moveq r3, r0
|
|
cmp r6, #0
|
|
sub r6, r6, #1
|
|
bne _0223D0E0
|
|
_0223D110:
|
|
mov r0, r5
|
|
bl bn_fix_top
|
|
mov r0, r5
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, r6, r7, lr}
|
|
bx lr
|
|
arm_func_end BN_bin2bn
|
|
|
|
arm_func_start BN_set_word
|
|
BN_set_word: ; 0x0223D128
|
|
stmfd sp!, {r4, r5, lr}
|
|
sub sp, sp, #4
|
|
mov r4, r0
|
|
ldr r2, [r4, #8]
|
|
mov r5, r1
|
|
cmp r2, #1
|
|
bge _0223D14C
|
|
mov r1, #2
|
|
bl bn_expand2
|
|
_0223D14C:
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
bxeq lr
|
|
mov r0, #0
|
|
str r0, [r4, #0xc]
|
|
str r0, [r4, #4]
|
|
ldr r0, [r4, #0]
|
|
str r5, [r0, #0]
|
|
ldr r0, [r4, #0]
|
|
ldr r0, [r0, #0]
|
|
cmp r0, #0
|
|
movne r0, #1
|
|
strne r0, [r4, #4]
|
|
mov r0, #1
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
arm_func_end BN_set_word
|
|
|
|
arm_func_start BN_clear
|
|
BN_clear: ; 0x0223D198
|
|
stmfd sp!, {r4, lr}
|
|
mov r4, r0
|
|
ldr r0, [r4, #0]
|
|
cmp r0, #0
|
|
beq _0223D1BC
|
|
ldr r2, [r4, #8]
|
|
mov r1, #0
|
|
mov r2, r2, lsl #2
|
|
bl MI_CpuFill8
|
|
_0223D1BC:
|
|
mov r0, #0
|
|
str r0, [r4, #4]
|
|
str r0, [r4, #0xc]
|
|
ldmia sp!, {r4, lr}
|
|
bx lr
|
|
arm_func_end BN_clear
|
|
|
|
arm_func_start BN_copy
|
|
BN_copy: ; 0x0223D1D0
|
|
stmfd sp!, {r4, r5, lr}
|
|
sub sp, sp, #4
|
|
mov r5, r0
|
|
mov r4, r1
|
|
cmp r5, r4
|
|
addeq sp, sp, #4
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
bxeq lr
|
|
ldr r1, [r4, #4]
|
|
ldr r2, [r5, #8]
|
|
cmp r1, r2
|
|
ble _0223D204
|
|
bl bn_expand2
|
|
_0223D204:
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
bxeq lr
|
|
ldr r2, [r4, #4]
|
|
ldr r0, [r4, #0]
|
|
ldr r1, [r5, #0]
|
|
mov r2, r2, lsl #2
|
|
bl MI_CpuCopy8
|
|
ldr r0, [r4, #4]
|
|
str r0, [r5, #4]
|
|
ldr r0, [r5, #4]
|
|
cmp r0, #0
|
|
bne _0223D250
|
|
ldr r1, [r5, #0]
|
|
cmp r1, #0
|
|
movne r0, #0
|
|
strne r0, [r1]
|
|
_0223D250:
|
|
ldr r1, [r4, #0xc]
|
|
mov r0, r5
|
|
str r1, [r5, #0xc]
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
arm_func_end BN_copy
|
|
|
|
arm_func_start bn_expand2
|
|
bn_expand2: ; 0x0223D268
|
|
stmfd sp!, {r4, r5, r6, lr}
|
|
mov r5, r0
|
|
ldr r0, [r5, #8]
|
|
mov r4, r1
|
|
cmp r4, r0
|
|
ble _0223D2DC
|
|
ldr r0, [r5, #0x10]
|
|
ands r0, r0, #2
|
|
movne r0, #0
|
|
ldmneia sp!, {r4, r5, r6, lr}
|
|
bxne lr
|
|
add r0, r4, #1
|
|
mov r0, r0, lsl #2
|
|
bl CRYPTOi_MyAlloc
|
|
movs r6, r0
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, r5, r6, lr}
|
|
bxeq lr
|
|
ldr r0, [r5, #0]
|
|
cmp r0, #0
|
|
beq _0223D2D4
|
|
ldr r2, [r5, #4]
|
|
mov r1, r6
|
|
mov r2, r2, lsl #2
|
|
bl MI_CpuCopy8
|
|
ldr r0, [r5, #0]
|
|
bl CRYPTOi_MyFree
|
|
_0223D2D4:
|
|
str r6, [r5, #0]
|
|
str r4, [r5, #8]
|
|
_0223D2DC:
|
|
mov r0, r5
|
|
ldmia sp!, {r4, r5, r6, lr}
|
|
bx lr
|
|
arm_func_end bn_expand2
|
|
|
|
arm_func_start BN_CTX_free
|
|
BN_CTX_free: ; 0x0223D2E8
|
|
stmfd sp!, {r4, r5, r6, lr}
|
|
mov r6, r0
|
|
add r4, r6, #4
|
|
mov r5, #0
|
|
_0223D2F8:
|
|
mov r0, r4
|
|
bl BN_clear_free
|
|
add r5, r5, #1
|
|
cmp r5, #0xc
|
|
add r4, r4, #0x14
|
|
blt _0223D2F8
|
|
ldr r0, [r6, #0x108]
|
|
ands r0, r0, #1
|
|
ldmeqia sp!, {r4, r5, r6, lr}
|
|
bxeq lr
|
|
mov r0, r6
|
|
bl CRYPTOi_MyFree
|
|
ldmia sp!, {r4, r5, r6, lr}
|
|
bx lr
|
|
arm_func_end BN_CTX_free
|
|
|
|
arm_func_start BN_CTX_init
|
|
BN_CTX_init: ; 0x0223D330
|
|
stmfd sp!, {r4, lr}
|
|
mov r1, #0
|
|
mov r2, #0x110
|
|
mov r4, r0
|
|
bl MI_CpuFill8
|
|
mov r0, #0
|
|
str r0, [r4, #0]
|
|
str r0, [r4, #0x108]
|
|
ldmia sp!, {r4, lr}
|
|
bx lr
|
|
arm_func_end BN_CTX_init
|
|
|
|
arm_func_start BN_CTX_new
|
|
BN_CTX_new: ; 0x0223D358
|
|
stmfd sp!, {r4, lr}
|
|
mov r0, #0x110
|
|
bl CRYPTOi_MyAlloc
|
|
movs r4, r0
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, lr}
|
|
bxeq lr
|
|
bl BN_CTX_init
|
|
mov r1, #1
|
|
mov r0, r4
|
|
str r1, [r4, #0x108]
|
|
ldmia sp!, {r4, lr}
|
|
bx lr
|
|
arm_func_end BN_CTX_new
|
|
|
|
arm_func_start BN_new
|
|
BN_new: ; 0x0223D38C
|
|
stmdb sp!, {lr}
|
|
sub sp, sp, #4
|
|
mov r0, #0x14
|
|
bl CRYPTOi_MyAlloc
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
moveq r0, #0
|
|
ldmeqia sp!, {lr}
|
|
bxeq lr
|
|
mov r1, #1
|
|
str r1, [r0, #0x10]
|
|
mov r1, #0
|
|
str r1, [r0, #4]
|
|
str r1, [r0, #0xc]
|
|
str r1, [r0, #8]
|
|
str r1, [r0, #0]
|
|
add sp, sp, #4
|
|
ldmia sp!, {lr}
|
|
bx lr
|
|
arm_func_end BN_new
|
|
|
|
arm_func_start BN_init
|
|
BN_init: ; 0x0223D3D8
|
|
ldr ip, _0223D3E8 ; =MI_CpuFill8
|
|
mov r1, #0
|
|
mov r2, #0x14
|
|
bx ip
|
|
; .align 2, 0
|
|
_0223D3E8: .word MI_CpuFill8
|
|
arm_func_end BN_init
|
|
|
|
arm_func_start bn_fix_top
|
|
bn_fix_top: ; 0x0223D3EC
|
|
ldr r3, [r0, #4]
|
|
cmp r3, #0
|
|
bxle lr
|
|
ldr r2, [r0, #0]
|
|
sub r1, r3, #1
|
|
cmp r3, #0
|
|
add r3, r2, r1, lsl #2
|
|
bxle lr
|
|
add r2, r0, #4
|
|
_0223D410:
|
|
ldr r1, [r3, #0], #-4
|
|
cmp r1, #0
|
|
bxne lr
|
|
ldr r1, [r2, #0]
|
|
sub r1, r1, #1
|
|
str r1, [r2, #0]
|
|
ldr r1, [r0, #4]
|
|
cmp r1, #0
|
|
bgt _0223D410
|
|
bx lr
|
|
arm_func_end bn_fix_top
|
|
|
|
arm_func_start bn_zexpand
|
|
bn_zexpand: ; 0x0223D438
|
|
stmfd sp!, {r4, r5, lr}
|
|
sub sp, sp, #4
|
|
mov r5, r0
|
|
ldr r2, [r5, #4]
|
|
mov r4, r1
|
|
cmp r2, r4
|
|
addge sp, sp, #4
|
|
ldmgeia sp!, {r4, r5, lr}
|
|
bxge lr
|
|
ldr r2, [r5, #8]
|
|
cmp r4, r2
|
|
ble _0223D46C
|
|
bl bn_expand2
|
|
_0223D46C:
|
|
ldr r0, [r5, #0]
|
|
cmp r0, #0
|
|
addeq sp, sp, #4
|
|
ldmeqia sp!, {r4, r5, lr}
|
|
bxeq lr
|
|
ldr r2, [r5, #4]
|
|
cmp r2, r4
|
|
addge sp, sp, #4
|
|
ldmgeia sp!, {r4, r5, lr}
|
|
bxge lr
|
|
mov r1, #0
|
|
_0223D498:
|
|
ldr r0, [r5, #0]
|
|
str r1, [r0, r2, lsl #2]
|
|
add r2, r2, #1
|
|
cmp r2, r4
|
|
blt _0223D498
|
|
add sp, sp, #4
|
|
ldmia sp!, {r4, r5, lr}
|
|
bx lr
|
|
arm_func_end bn_zexpand
|
|
|
|
arm_func_start BN_free
|
|
BN_free: ; 0x0223D4B8
|
|
stmfd sp!, {r4, lr}
|
|
movs r4, r0
|
|
ldmeqia sp!, {r4, lr}
|
|
bxeq lr
|
|
ldr r0, [r4, #0]
|
|
cmp r0, #0
|
|
beq _0223D4E4
|
|
ldr r1, [r4, #0x10]
|
|
ands r1, r1, #2
|
|
bne _0223D4E4
|
|
bl CRYPTOi_MyFree
|
|
_0223D4E4:
|
|
ldr r0, [r4, #0x10]
|
|
orr r0, r0, #0x8000
|
|
str r0, [r4, #0x10]
|
|
ldr r0, [r4, #0x10]
|
|
ands r0, r0, #1
|
|
ldmeqia sp!, {r4, lr}
|
|
bxeq lr
|
|
mov r0, r4
|
|
bl CRYPTOi_MyFree
|
|
ldmia sp!, {r4, lr}
|
|
bx lr
|
|
arm_func_end BN_free
|
|
|
|
arm_func_start BN_clear_free
|
|
BN_clear_free: ; 0x0223D510
|
|
stmfd sp!, {r4, lr}
|
|
movs r4, r0
|
|
ldmeqia sp!, {r4, lr}
|
|
bxeq lr
|
|
bl BN_clear
|
|
mov r0, r4
|
|
bl BN_free
|
|
ldmia sp!, {r4, lr}
|
|
bx lr
|
|
arm_func_end BN_clear_free
|
|
|
|
arm_func_start BN_num_bits
|
|
BN_num_bits: ; 0x0223D534
|
|
stmfd sp!, {r4, lr}
|
|
ldr r1, [r0, #4]
|
|
cmp r1, #0
|
|
moveq r0, #0
|
|
ldmeqia sp!, {r4, lr}
|
|
bxeq lr
|
|
ldr r0, [r0, #0]
|
|
sub r4, r1, #1
|
|
ldr r0, [r0, r4, lsl #2]
|
|
bl BN_num_bits_word
|
|
add r0, r0, r4, lsl #5
|
|
ldmia sp!, {r4, lr}
|
|
bx lr
|
|
arm_func_end BN_num_bits
|
|
|
|
arm_func_start BN_num_bits_word
|
|
BN_num_bits_word: ; 0x0223D568
|
|
mov r1, #0x10000
|
|
rsb r1, r1, #0
|
|
ands r1, r0, r1
|
|
beq _0223D588
|
|
ands r1, r0, #0xff000000
|
|
movne r2, #0x18
|
|
moveq r2, #0x10
|
|
b _0223D594
|
|
_0223D588:
|
|
ands r1, r0, #0xff00
|
|
movne r2, #8
|
|
moveq r2, #0
|
|
_0223D594:
|
|
mov r1, r0, lsr r2
|
|
ands r0, r1, #0xf0
|
|
ldreq r0, _0223D5C4 ; =0x0223DEE8
|
|
ldreqsb r0, [r0, r1]
|
|
addeq r0, r0, r2
|
|
bxeq lr
|
|
ldr r0, _0223D5C4 ; =0x0223DEE8
|
|
mov r1, r1, lsr #4
|
|
ldrsb r0, [r0, r1]
|
|
add r0, r0, r2
|
|
add r0, r0, #4
|
|
bx lr
|
|
; .align 2, 0
|
|
_0223D5C4: .word Unk_ov97_0223DEE8
|
|
arm_func_end BN_num_bits_word
|
|
|
|
|
|
.rodata
|
|
|
|
|
|
.global Unk_ov97_0223DEC4
|
|
Unk_ov97_0223DEC4: ; 0x0223DEC4
|
|
.byte 0x0, 0x8, 0x1, 0x1, 0x1, 0x10, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0
|
|
|
|
.global Unk_ov97_0223DED0
|
|
Unk_ov97_0223DED0: ; 0x0223DED0
|
|
.byte 0x0, 0x8, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0
|
|
|
|
.global Unk_ov97_0223DEDC
|
|
Unk_ov97_0223DEDC: ; 0x0223DEDC
|
|
.byte 0x0, 0x8, 0x1, 0x1, 0x1, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0
|
|
|
|
.global Unk_ov97_0223DEE8
|
|
Unk_ov97_0223DEE8: ; 0x0223DEE8
|
|
.byte 0x0, 0x1, 0x2, 0x2, 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4
|
|
|
|
.global Unk_ov97_0223DEF8
|
|
Unk_ov97_0223DEF8: ; 0x0223DEF8
|
|
.short 0x6, 0x1, 0x2, 0x1, 0x3, 0x1
|
|
.short 0x2, 0x1, 0x4, 0x1, 0x2, 0x1, 0x3, 0x1
|
|
.short 0x2, 0x1,
|
|
|
|
.global Unk_ov97_0223DF18
|
|
Unk_ov97_0223DF18: ; 0x0223DF18
|
|
.short 0x5, 0x1, 0x2, 0x1, 0x3, 0x1, 0x2, 0x1
|
|
|
|
.global Unk_ov97_0223DF28
|
|
Unk_ov97_0223DF28: ; 0x0223DF28
|
|
.short 0x4, 0x1, 0x2, 0x1,
|
|
|
|
.global Unk_ov97_0223DF30
|
|
Unk_ov97_0223DF30: ; 0x0223DF30
|
|
.short 0x3, 0x1
|
|
|
|
.global Unk_ov97_0223DF34
|
|
Unk_ov97_0223DF34: ; 0x0223DF34
|
|
.short 0x2
|
|
|
|
.global Unk_ov97_0223DF36
|
|
Unk_ov97_0223DF36: ; 0x0223DF36
|
|
.byte 0x1
|
|
|
|
.global Unk_ov97_0223DF37
|
|
Unk_ov97_0223DF37: ; 0x0223DF37
|
|
.byte 0x0
|
|
|
|
|
|
.data
|
|
|
|
|
|
.global Unk_ov97_0223F158
|
|
Unk_ov97_0223F158: ; 0x0223F158
|
|
.word Unk_ov97_0223DF37
|
|
.word Unk_ov97_0223DF36
|
|
.word Unk_ov97_0223DF34
|
|
.word Unk_ov97_0223DF30
|
|
.word Unk_ov97_0223DF28
|
|
.word Unk_ov97_0223DF18
|
|
.word Unk_ov97_0223DEF8
|