Function at 0x428f10
Capabilities:
Validate payment card number using luhn algorithm

Disassembly:
push ebp
mov ebp, esp
and esp, 0xfffffff8
sub esp, 0x38
push esi
push edi
mov edi, dword [ebp + 8]
mov edx, ecx
xorps xmm0, xmm0
mov dword [esp + 0x24], edx
movsd qword [esp + 0x38], xmm0
mov eax, dword [edi + 0x18]
mov ecx, eax
sub ecx, dword [edi + 0xc]
sar ecx, 1
add ecx, dword [edi + 0x20]
cmp word [eax], 0x2d
mov dword [esp + 0x28], ecx
jne 0x428f56
mov ecx, edi
call fcn.004272d0
mov edx, dword [esp + 0x24]
mov byte [esp + 0xe], 1
jmp 0x428f5b
mov byte [esp + 0xe], 0
mov eax, dword [edi + 0x18]
xorps xmm0, xmm0
movlpd qword [esp + 0x30], xmm0
mov byte [esp + 0xd], 0
mov dword [esp + 0x1c], 0
movzx ecx, word [eax]
mov esi, ecx
cmp ecx, 0x30
jne 0x428fa5
xor esi, esi
mov ecx, edi
mov dword [esp + 0x20], esi
call fcn.004272d0
mov eax, dword [esp + 0x34]
mov dword [esp + 0x10], eax
mov eax, dword [esp + 0x30]
mov byte [esp + 0xc], 0
mov dword [esp + 0x14], eax
jmp 0x42920a
cmp ecx, 0x31
jb 0x4297e9
cmp ecx, 0x39
ja 0x4297e9
mov ecx, edi
call fcn.004272d0
mov ecx, dword [edi + 0x18]
sub esi, 0x30
cmp byte [esp + 0xe], 0
mov dword [esp + 0x20], esi
movzx eax, word [ecx]
mov edx, eax
je 0x42905b
cmp eax, 0x30
jb 0x429029
nop dword [eax]
movzx eax, dx
mov edx, eax
mov dword [esp + 0x2c], edx
cmp eax, 0x39
ja 0x429029
cmp esi, 0xccccccc
jb 0x428ffd
jne 0x429044
cmp eax, 0x38
ja 0x429044
mov ecx, edi
call fcn.004272d0
mov eax, dword [esp + 0x2c]
lea ecx, [esi - 6]
inc dword [esp + 0x1c]
lea ecx, [esi + ecx*4]
movzx eax, ax
lea esi, [eax + ecx*2]
mov ecx, dword [edi + 0x18]
mov dword [esp + 0x20], esi
movzx eax, word [ecx]
mov edx, eax
cmp eax, 0x30
jae 0x428fe0
mov eax, dword [esp + 0x34]
mov dword [esp + 0x10], eax
mov eax, dword [esp + 0x30]
mov esi, eax
mov edx, dword [esp + 0x10]
mov dword [esp + 0x14], eax
jmp 0x4290c1
mov dword [esp + 0x10], 0
mov edx, dword [esp + 0x10]
mov dword [esp + 0x14], esi
mov byte [esp + 0xd], 1
jmp 0x4290c1
cmp eax, 0x30
jb 0x4290b1
movzx eax, dx
mov edx, eax
mov dword [esp + 0x2c], edx
cmp eax, 0x39
ja 0x4290b1
cmp esi, 0x19999999
jb 0x429085
jne 0x42927d
cmp eax, 0x35
ja 0x42927d
mov ecx, edi
call fcn.004272d0
mov eax, dword [esp + 0x2c]
lea ecx, [esi - 6]
inc dword [esp + 0x1c]
lea ecx, [esi + ecx*4]
movzx eax, ax
lea esi, [eax + ecx*2]
mov ecx, dword [edi + 0x18]
mov dword [esp + 0x20], esi
movzx eax, word [ecx]
mov edx, eax
cmp eax, 0x30
jae 0x429060
mov esi, dword [esp + 0x30]
mov edx, dword [esp + 0x34]
mov dword [esp + 0x10], edx
mov dword [esp + 0x14], esi
cmp byte [esp + 0xd], 0
mov byte [esp + 0xc], 0
mov dword [esp + 0x18], ecx
je 0x4291b1
cmp byte [esp + 0xe], 0
mov dword [esp + 0x18], ecx
je 0x4292a8
cmp word [ecx], 0x30
jb 0x4291b1
movzx eax, word [ecx]
mov dword [esp + 0x2c], eax
mov dword [esp + 0x18], ecx
nop dword [eax]
mov eax, dword [esp + 0x2c]
movzx eax, ax
mov ecx, eax
mov dword [esp + 0x2c], ecx
cmp eax, 0x39
ja 0x4291b1
cmp edx, 0xccccccc
jb 0x429149
ja 0x429128
cmp esi, 0xcccccccc
jb 0x429149
cmp esi, 0xcccccccc
jne 0x429289
cmp edx, 0xccccccc
jne 0x429289
cmp eax, 0x38
ja 0x429289
mov ecx, edi
call fcn.004272d0
mov eax, dword [esp + 0x2c]
xor edx, edx
mov ecx, dword [esp + 0x10]
movzx esi, ax
mov eax, dword [esp + 0x14]
sub esi, 0x30
shld ecx, eax, 2
shl eax, 2
add dword [esp + 0x14], eax
mov eax, dword [esp + 0x14]
adc dword [esp + 0x10], ecx
mov ecx, dword [esp + 0x10]
shld ecx, eax, 1
add eax, eax
add esi, eax
mov dword [esp + 0x14], esi
adc edx, ecx
mov ecx, dword [edi + 0x18]
inc dword [esp + 0x1c]
mov dword [esp + 0x10], edx
mov dword [esp + 0x18], ecx
movzx eax, word [ecx]
mov edi, eax
mov dword [esp + 0x2c], edi
mov edi, dword [ebp + 8]
cmp eax, 0x30
jae 0x429100
mov dword [esp + 0x18], ecx
mov ecx, dword [esp + 0x18]
cmp byte [esp + 0xc], 0
je 0x429206
cmp word [ecx], 0x30
jb 0x429206
movzx ecx, word [ecx]
movzx eax, cx
mov esi, eax
cmp eax, 0x39
ja 0x429206
mov ecx, edi
call fcn.004272d0
movsd xmm1, qword [esp + 0x38]
lea eax, [esi - 0x30]
mulsd xmm1, qword [0x4f6018]
movd xmm0, eax
mov eax, dword [edi + 0x18]
cvtdq2pd xmm0, xmm0
movzx eax, word [eax]
mov ecx, eax
addsd xmm1, xmm0
movsd qword [esp + 0x38], xmm1
cmp eax, 0x30
jae 0x4291c5
mov esi, dword [esp + 0x20]
mov edx, dword [edi + 0x18]
mov dword [esp + 0x18], 0
cmp word [edx], 0x2e
jne 0x429415
mov ecx, edi
call fcn.004272d0
mov edx, dword [edi + 0x18]
mov dword [esp + 0x2c], edx
movzx eax, word [edx]
mov ecx, eax
mov dword [esp + 0x30], ecx
cmp eax, 0x30
jb 0x429449
cmp eax, 0x39
ja 0x429449
mov al, byte [esp + 0xc]
test al, al
jne 0x429398
cmp byte [esp + 0xd], al
je 0x429380
mov ecx, dword [esp + 0x14]
mov edx, dword [esp + 0x10]
call fcn.004c76a0
mov edx, dword [esp + 0x2c]
mov ecx, dword [esp + 0x30]
mov byte [esp + 0xc], 1
jmp 0x4293a2
xor edx, edx
mov byte [esp + 0xd], 1
jmp 0x4290b9
mov ecx, esi
call fcn.004c76a0
mov eax, dword [esp + 0x18]
movsd qword [esp + 0x38], xmm0
mov byte [esp + 0xc], 1
mov dword [esp + 0x18], eax
jmp 0x4291b1
cmp word [ecx], 0x30
jb 0x4291b1
movzx eax, word [ecx]
mov dword [esp + 0x18], ecx
nop dword [eax]
movzx eax, ax
mov edi, eax
mov dword [esp + 0x2c], edi
mov edi, dword [ebp + 8]
cmp eax, 0x39
ja 0x4291b5
cmp edx, 0x19999999
jb 0x4292fc
ja 0x4292e7
cmp esi, 0x99999999
jb 0x4292fc
cmp esi, 0x99999999
jne 0x429365
cmp edx, 0x19999999
jne 0x429365
cmp eax, 0x35
ja 0x429365
mov ecx, edi
call fcn.004272d0
mov eax, dword [esp + 0x2c]
xor edx, edx
mov ecx, dword [esp + 0x10]
movzx esi, ax
mov eax, dword [esp + 0x14]
sub esi, 0x30
shld ecx, eax, 2
shl eax, 2
add dword [esp + 0x14], eax
mov eax, dword [esp + 0x14]
adc dword [esp + 0x10], ecx
mov ecx, dword [esp + 0x10]
shld ecx, eax, 1
add eax, eax
add esi, eax
mov dword [esp + 0x14], esi
adc edx, ecx
mov ecx, dword [edi + 0x18]
inc dword [esp + 0x1c]
mov dword [esp + 0x10], edx
mov dword [esp + 0x18], ecx
movzx eax, word [ecx]
mov edi, eax
mov dword [esp + 0x2c], edi
mov edi, dword [ebp + 8]
cmp eax, 0x30
jb 0x429206
jmp 0x4292c0
mov ecx, esi
call fcn.004c76a0
mov ecx, dword [esp + 0x18]
movsd qword [esp + 0x38], xmm0
mov byte [esp + 0xc], 1
jmp 0x4291bc
mov ecx, esi
xor edx, edx
call fcn.004c76a0
mov edx, dword [esp + 0x2c]
mov ecx, dword [esp + 0x30]
mov byte [esp + 0xc], 1
jmp 0x4293a2
movsd xmm0, qword [esp + 0x38]
mov byte [esp + 0xc], al
movsd qword [esp + 0x38], xmm0
movzx ecx, cx
nop dword [eax + eax]
movzx eax, cx
mov ecx, eax
mov dword [esp + 0x30], ecx
cmp eax, 0x39
ja 0x429415
mov ecx, edi
call fcn.004272d0
cmp dword [esp + 0x1c], 0x11
jge 0x429408
mov ecx, dword [esp + 0x30]
movsd xmm1, qword [esp + 0x38]
mulsd xmm1, qword [0x4f6018]
dec dword [esp + 0x18]
movzx eax, cx
sub eax, 0x30
movd xmm0, eax
cvtdq2pd xmm0, xmm0
addsd xmm1, xmm0
comisd xmm1, xmmword [0x4f5ff0]
movsd qword [esp + 0x38], xmm1
jbe 0x429408
inc dword [esp + 0x1c]
mov edx, dword [edi + 0x18]
movzx eax, word [edx]
mov ecx, eax
cmp eax, 0x30
jae 0x4293b0
movzx eax, word [edx]
xor ecx, ecx
mov edx, eax
cmp eax, 0x65
je 0x42942a
cmp edx, 0x45
jne 0x429595
mov ecx, edi
call fcn.004272d0
cmp byte [esp + 0xc], 0
jne 0x42947b
cmp byte [esp + 0xd], 0
je 0x429467
mov ecx, dword [esp + 0x14]
mov edx, dword [esp + 0x10]
jmp 0x42946b
sub edx, dword [edi + 0xc]
mov eax, dword [esp + 0x24]
sar edx, 1
add edx, dword [edi + 0x20]
mov dword [eax + 0x18], 0xe
mov dword [eax + 0x1c], edx
pop edi
pop esi
mov esp, ebp
pop ebp
ret 8
mov ecx, esi
xor edx, edx
call fcn.004c76a0
movsd qword [esp + 0x38], xmm0
mov byte [esp + 0xc], 1
mov ecx, dword [edi + 0x18]
mov byte [esp + 0xf], 0
movzx eax, word [ecx]
mov edx, eax
cmp eax, 0x2b
jne 0x42949c
mov ecx, edi
call fcn.004272d0
mov ecx, dword [edi + 0x18]
movzx eax, word [ecx]
jmp 0x4294b7
cmp edx, 0x2d
jne 0x4294b5
mov ecx, edi
call fcn.004272d0
mov ecx, dword [edi + 0x18]
mov byte [esp + 0xf], 1
movzx eax, word [ecx]
jmp 0x4294b7
mov eax, edx
movzx eax, ax
mov dword [esp + 0x30], eax
add eax, 0xffffffd0
cmp ax, 9
ja 0x429636
mov ecx, edi
call fcn.004272d0
mov eax, dword [esp + 0x30]
movzx ecx, ax
mov eax, dword [edi + 0x18]
sub ecx, 0x30
cmp byte [esp + 0xf], 0
mov dword [esp + 0x1c], ecx
movzx edx, word [eax]
mov dword [esp + 0x30], edx
je 0x4295d7
mov ecx, dword [esp + 0x18]
mov eax, 0x66666667
lea ecx, [ecx + 0x7ffffff7]
imul ecx
sar edx, 2
mov eax, edx
shr eax, 0x1f
add eax, edx
mov dword [esp + 0x2c], eax
mov eax, dword [esp + 0x30]
movzx ecx, ax
cmp ax, 0x30
jb 0x42958f
mov esi, dword [esp + 0x1c]
movzx eax, cx
mov ecx, eax
mov dword [esp + 0x30], ecx
cmp eax, 0x39
ja 0x429587
mov ecx, edi
call fcn.004272d0
mov eax, dword [esp + 0x30]
lea esi, [esi + esi*4]
movzx eax, ax
lea esi, [esi - 0x18]
lea esi, [eax + esi*2]
cmp esi, dword [esp + 0x2c]
jle 0x42957a
mov eax, dword [edi + 0x18]
movzx eax, word [eax]
mov ecx, eax
cmp eax, 0x30
jb 0x42957a
nop dword [eax]
cmp cx, 0x39
ja 0x42957a
mov ecx, edi
call fcn.004272d0
mov eax, dword [edi + 0x18]
movzx eax, word [eax]
mov ecx, eax
cmp eax, 0x30
jae 0x429560
mov eax, dword [edi + 0x18]
movzx eax, word [eax]
mov ecx, eax
cmp eax, 0x30
jae 0x429525
mov dword [esp + 0x1c], esi
mov esi, dword [esp + 0x20]
mov ecx, dword [esp + 0x1c]
neg ecx
cmp byte [esp + 0xc], 0
je 0x4296ff
mov eax, dword [esp + 0x18]
movsd xmm0, qword [esp + 0x38]
add eax, ecx
cmp eax, 0xfffffecc
jge 0x429664
divsd xmm0, qword [0x4f6058]
add eax, 0x134
cmp eax, 0xfffffecc
jge 0x429654
xorps xmm0, xmm0
jmp 0x429684
mov eax, 0x134
sub eax, dword [esp + 0x18]
mov dword [esp + 0x2c], eax
movzx eax, dx
cmp edx, 0x30
jb 0x429595
nop dword [eax]
movzx eax, ax
mov edx, eax
mov dword [esp + 0x30], edx
cmp eax, 0x39
ja 0x429595
mov ecx, edi
call fcn.004272d0
mov eax, dword [esp + 0x1c]
lea ecx, [eax + eax*4]
mov eax, dword [esp + 0x30]
movzx eax, ax
lea ecx, [ecx - 0x18]
lea ecx, [eax + ecx*2]
mov dword [esp + 0x1c], ecx
cmp ecx, dword [esp + 0x2c]
jg 0x42968e
mov eax, dword [edi + 0x18]
movzx eax, word [eax]
mov edx, eax
cmp eax, 0x30
jb 0x429595
jmp 0x4295f0
sub ecx, dword [edi + 0xc]
mov eax, dword [esp + 0x24]
sar ecx, 1
add ecx, dword [edi + 0x20]
mov dword [eax + 0x18], 0xf
mov dword [eax + 0x1c], ecx
pop edi
pop esi
mov esp, ebp
pop ebp
ret 8
shl eax, 3
mov ecx, 0x4f0ec0
sub ecx, eax
divsd xmm0, qword [ecx]
jmp 0x429684
lea ecx, [eax*8]
test eax, eax
js 0x429679
mulsd xmm0, qword [ecx + 0x4f0ec0]
jmp 0x429684
mov eax, 0x4f0ec0
sub eax, ecx
divsd xmm0, qword [eax]
comisd xmm0, xmmword [0x4f6060]
jbe 0x4296a8
mov eax, dword [esp + 0x24]
mov ecx, dword [esp + 0x28]
mov dword [eax + 0x18], 0xd
mov dword [eax + 0x1c], ecx
pop edi
pop esi
mov esp, ebp
pop ebp
ret 8
cmp byte [esp + 0xe], 0
je 0x4296b6
xorps xmm0, xmmword [0x4f60b0]
mov ecx, dword [ebp + 0xc]
mov eax, dword [ecx + 0x28]
lea esi, [ecx + 0x18]
sub eax, dword [esi + 0xc]
movsd qword [esp + 0x38], xmm0
cmp eax, 0x10
jge 0x4296d5
push ecx
mov ecx, esi
call fcn.00429b90
mov ecx, dword [esi + 0xc]
xorps xmm0, xmm0
lea eax, [ecx + 0x10]
mov dword [esi + 0xc], eax
mov eax, 0x216
movups xmmword [ecx], xmm0
mov word [ecx + 0xe], ax
movsd xmm0, qword [esp + 0x38]
movsd qword [ecx], xmm0
pop edi
pop esi
mov esp, ebp
pop ebp
ret 8
cmp byte [esp + 0xd], 0
je 0x42975a
cmp byte [esp + 0xe], 0
je 0x429728
mov eax, dword [esp + 0x14]
mov ecx, dword [esp + 0x10]
neg eax
adc ecx, 0
neg ecx
push ecx
mov ecx, dword [ebp + 0xc]
push eax
call fcn.00429940
jmp 0x429738
push dword [esp + 0x10]
mov ecx, dword [ebp + 0xc]
push dword [esp + 0x18]
call fcn.004298b0
test al, al
jne 0x4297fb
mov eax, dword [esp + 0x24]
mov ecx, dword [esp + 0x28]
mov dword [eax + 0x18], 0x10
mov dword [eax + 0x1c], ecx
pop edi
pop esi
mov esp, ebp
pop ebp
ret 8
mov edi, dword [ebp + 0xc]
mov eax, dword [edi + 0x28]
lea ecx, [edi + 0x18]
sub eax, dword [edi + 0x24]
cmp byte [esp + 0xe], 0
je 0x4297ac
neg esi
cmp eax, 0x10
jge 0x42977a
push ecx
call fcn.00429b90
mov ecx, dword [edi + 0x24]
xorps xmm0, xmm0
test esi, esi
lea eax, [ecx + 0x10]
mov dword [edi + 0x24], eax
mov eax, esi
cdq
movups xmmword [ecx], xmm0
mov dword [ecx], eax
mov eax, 0xb6
mov dword [ecx + 4], edx
mov edx, 0x1f6
cmovns eax, edx
mov word [ecx + 0xe], ax
pop edi
pop esi
mov esp, ebp
pop ebp
ret 8
cmp eax, 0x10
jge 0x4297b7
push ecx
call fcn.00429b90
mov ecx, dword [edi + 0x24]
xorps xmm0, xmm0
lea eax, [ecx + 0x10]
mov dword [edi + 0x24], eax
movups xmmword [ecx], xmm0
mov dword [ecx], esi
shr esi, 0x1a
not esi
mov dword [ecx + 4], 0
and esi, 0x20
or esi, 0x1d6
mov word [ecx + 0xe], si
pop edi
pop esi
mov esp, ebp
pop ebp
ret 8
sub eax, dword [edi + 0xc]
sar eax, 1
add eax, dword [edi + 0x20]
mov dword [edx + 0x18], 3
mov dword [edx + 0x1c], eax
pop edi
pop esi
mov esp, ebp
pop ebp
ret 8