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

Disassembly:
push ebp
mov ebp, esp
push edi
push esi
xor esi, esi
push ebx
xor ebx, ebx
sub esp, 0x6c
mov dword [ebp - 0x4c], eax
mov dword [ebp - 0x50], edx
mov dword [ebp - 0x3c], ecx
mov eax, dword [ebp - 0x3c]
lea edx, [eax + 1]
mov dword [ebp - 0x3c], edx
mov al, byte [eax]
test al, al
je 0x152213f
cmp al, 0x25
je 0x1521ccb
cmp dword [ebp - 0x50], ebx
jbe 0x1521dbf
mov edi, dword [ebp - 0x4c]
mov byte [edi + ebx], al
jmp 0x1521dbf
lea eax, [esi + 1]
mov edi, esi
mov dword [ebp - 0x6c], eax
mov eax, dword [ebp - 0x3c]
mov byte [ebp - 0x5a], 0
cmp byte [eax], 0x2d
jne 0x1521ce7
inc eax
mov byte [ebp - 0x5a], 1
mov dword [ebp - 0x3c], eax
mov eax, dword [ebp - 0x3c]
movsx edx, byte [eax]
mov ecx, edx
mov byte [ebp - 0x59], dl
sub edx, 0x30
cmp edx, 9
ja 0x1521d2c
cmp cl, 0x30
je 0x1521d03
mov byte [ebp - 0x59], 0x20
lea edx, [ebp - 0x3c]
call fcn.01521b18
mov dword [ebp - 0x64], eax
test edx, edx
je 0x1521d37
push edx
push edx
push 0x63e8
push 0xb
call fcn.01521aef
add esp, 0x10
mov dword [ebp - 0x64], 0xffffffff
jmp 0x1521d37
mov byte [ebp - 0x59], 0x20
mov dword [ebp - 0x64], 0
mov eax, dword [ebp - 0x3c]
cmp byte [eax], 0x2e
jne 0x1521d43
inc eax
mov dword [ebp - 0x3c], eax
mov ecx, dword [ebp - 0x3c]
or eax, 0xffffffff
movsx edx, byte [ecx]
sub edx, 0x30
cmp edx, 9
ja 0x1521d76
lea edx, [ebp - 0x3c]
mov eax, ecx
call fcn.01521b18
test edx, edx
je 0x1521d76
push eax
push eax
push 0x63e8
push 0xb
call fcn.01521aef
add esp, 0x10
or eax, 0xffffffff
mov ecx, dword [ebp - 0x3c]
cmp byte [ecx], 0x24
lea edx, [ecx + 1]
jne 0x1521d8d
mov edi, dword [ebp - 0x64]
mov dword [ebp - 0x3c], edx
dec edi
jmp 0x1521cd3
mov dword [ebp - 0x3c], edx
mov dl, byte [ecx]
cmp dl, 0x6c
jne 0x1521dae
lea edx, [ecx + 2]
mov dword [ebp - 0x3c], edx
mov dl, byte [ecx + 1]
cmp dl, 0x6c
jne 0x1521dae
lea edx, [ecx + 3]
mov dword [ebp - 0x3c], edx
mov dl, byte [ecx + 2]
cmp dl, 0x25
jne 0x1521dc8
cmp dword [ebp - 0x50], ebx
jbe 0x1521dbf
mov eax, dword [ebp - 0x4c]
mov byte [eax + ebx], 0x25
inc ebx
mov dword [ebp - 0x6c], esi
jmp 0x1522137
mov esi, dword [ebp + 8]
cmp dword [esi + 0x104], edi
jbe 0x1522137
mov ecx, dword [esi + 0x100]
cmp dl, 0x70
mov esi, dword [ecx + edi*8]
mov edi, dword [ecx + edi*8 + 4]
je 0x1521e2a
jg 0x1521e09
cmp dl, 0x63
je 0x1522014
jg 0x1521e04
cmp dl, 0x43
je 0x152202a
cmp dl, 0x58
jmp 0x1521e23
cmp dl, 0x64
jmp 0x1521e23
cmp dl, 0x73
je 0x15220a8
cmp dl, 0x72
jle 0x152212b
cmp dl, 0x75
je 0x1521e4b
cmp dl, 0x78
je 0x1521e4b
jmp 0x152212b
cmp dword [ebp - 0x50], ebx
jbe 0x1521e36
mov eax, dword [ebp - 0x4c]
mov byte [eax + ebx], 0x30
lea eax, [ebx + 1]
cmp dword [ebp - 0x50], eax
jbe 0x1521e46
mov eax, dword [ebp - 0x4c]
mov byte [eax + ebx + 1], 0x78
add ebx, 2
mov dl, 0x78
mov al, dl
and eax, 0xffffffdf
cmp al, 0x58
sete al
movzx eax, al
dec eax
and eax, 0xfffffffa
add eax, 0x10
test edi, edi
jns 0x1521e68
cmp dl, 0x64
je 0x1521e6d
lea ecx, [ebp - 0x38]
jmp 0x1521e7b
neg esi
adc edi, 0
mov byte [ebp - 0x38], 0x2d
neg edi
lea ecx, [ebp - 0x37]
mov dword [ebp - 0x60], ecx
cmp eax, 0x10
mov ecx, dword [ebp - 0x60]
mov dword [ebp - 0x68], ecx
jne 0x1521f30
cmp dl, 0x78
sete al
dec eax
and eax, 0xffffffe0
add eax, 0x57
mov cl, al
mov edx, esi
and edx, 0xf
cmp edx, 9
lea eax, [edx + 0x30]
jbe 0x1521ead
mov al, cl
add eax, edx
inc dword [ebp - 0x68]
mov edx, dword [ebp - 0x68]
shrd esi, edi, 4
shr edi, 4
mov byte [edx - 1], al
mov eax, edi
or eax, esi
jne 0x1521e9c
jmp 0x1521f7a
mov eax, dword [ebp - 0x58]
mov edx, dword [ebp - 0x54]
add dword [ebp - 0x58], eax
adc dword [ebp - 0x54], edx
cmp dword [ebp - 0x74], 0
jns 0x1521ee3
mov eax, dword [ebp - 0x58]
or eax, 1
mov dword [ebp - 0x58], eax
add esi, esi
mov eax, dword [ebp - 0x78]
adc edi, edi
add dword [ebp - 0x78], eax
mov edx, dword [ebp - 0x74]
mov eax, 9
adc dword [ebp - 0x74], edx
cmp eax, dword [ebp - 0x58]
mov eax, 0
sbb eax, dword [ebp - 0x54]
jae 0x1521f14
mov eax, esi
or eax, 1
add dword [ebp - 0x58], 0xfffffff6
adc dword [ebp - 0x54], 0xffffffff
mov esi, eax
mov eax, ecx
dec eax
mov ecx, eax
jne 0x1521ec8
inc dword [ebp - 0x68]
mov dl, byte [ebp - 0x58]
mov eax, dword [ebp - 0x68]
add edx, 0x30
mov byte [eax - 1], dl
mov eax, edi
or eax, esi
je 0x1521f7a
mov eax, 0xfffffffe
cmp eax, esi
mov eax, 0
sbb eax, edi
jb 0x1521f5b
mov eax, esi
xor edx, edx
mov esi, 0xa
mov dword [ebp - 0x54], 0
div esi
mov esi, eax
mov dword [ebp - 0x58], edx
xor edi, edi
jmp 0x1521f1b
mov dword [ebp - 0x78], esi
mov dword [ebp - 0x74], edi
mov ecx, 0x41
mov dword [ebp - 0x58], 0
mov dword [ebp - 0x54], 0
xor esi, esi
xor edi, edi
jmp 0x1521f14
mov eax, dword [ebp - 0x68]
mov byte [eax], 0
mov eax, dword [ebp - 0x60]
cmp byte [eax], 0
je 0x1521f8b
inc eax
jmp 0x1521f83
dec eax
cmp dword [ebp - 0x60], eax
jae 0x1521fa3
mov edi, dword [ebp - 0x60]
mov cl, byte [eax]
inc dword [ebp - 0x60]
dec eax
mov dl, byte [edi]
mov byte [edi], cl
mov byte [eax + 1], dl
jmp 0x1521f8c
lea eax, [ebp - 0x38]
mov ecx, dword [ebp - 0x68]
sub ecx, eax
xor eax, eax
cmp dword [ebp - 0x64], ecx
jbe 0x1521fb7
mov eax, dword [ebp - 0x64]
sub eax, ecx
cmp byte [ebp - 0x5a], 0
jne 0x1521fd7
add eax, ebx
cmp ebx, eax
je 0x1521fd4
cmp dword [ebp - 0x50], ebx
jbe 0x1521fd1
mov edi, dword [ebp - 0x4c]
mov cl, byte [ebp - 0x59]
mov byte [edi + ebx], cl
inc ebx
jmp 0x1521fbf
or eax, 0xffffffff
lea edx, [ebp - 0x38]
mov cl, byte [edx]
test cl, cl
je 0x1521fef
inc edx
cmp dword [ebp - 0x50], ebx
jbe 0x1521fec
mov edi, dword [ebp - 0x4c]
mov byte [edi + ebx], cl
inc ebx
jmp 0x1521fda
add eax, ebx
cmp byte [ebp - 0x5a], 0
je 0x1522137
cmp ebx, eax
je 0x1522137
cmp dword [ebp - 0x50], ebx
jbe 0x1522011
mov edi, dword [ebp - 0x4c]
mov cl, byte [ebp - 0x59]
mov byte [edi + ebx], cl
inc ebx
jmp 0x1521ffb
cmp dword [ebp - 0x50], ebx
jbe 0x1522136
mov ecx, dword [ebp - 0x4c]
mov eax, esi
mov byte [ecx + ebx], al
jmp 0x1522136
cmp esi, 0x7f
jbe 0x1522052
cmp esi, 0x7ff
jbe 0x1522058
cmp esi, 0xffff
jbe 0x1522064
cmp esi, 0x10ffff
jbe 0x1522070
xor eax, eax
xor ecx, ecx
mov esi, 0x3f
jmp 0x152207a
xor eax, eax
xor ecx, ecx
jmp 0x152207a
mov eax, 0xc0
mov ecx, 6
jmp 0x152207a
mov eax, 0xe0
mov ecx, 0xc
jmp 0x152207a
mov eax, 0xf0
mov ecx, 0x12
cmp dword [ebp - 0x50], ebx
jbe 0x152208b
mov edx, esi
shr edx, cl
or eax, edx
mov edi, dword [ebp - 0x4c]
mov byte [edi + ebx], al
sub ecx, 6
inc ebx
test ecx, ecx
js 0x1522137
cmp dword [ebp - 0x50], ebx
jbe 0x152208b
mov eax, esi
shr eax, cl
and eax, 0x3f
or eax, 0xffffff80
jmp 0x1522085
mov ecx, edi
mov edx, 0x6411
or ecx, esi
je 0x15220b5
mov edx, esi
xor ecx, ecx
cmp eax, ecx
je 0x15220c4
cmp byte [edx + ecx], 0
je 0x15220c4
inc ecx
jmp 0x15220b7
xor esi, esi
cmp dword [ebp - 0x64], ecx
jbe 0x15220d2
mov eax, dword [ebp - 0x64]
sub eax, ecx
mov esi, eax
cmp byte [ebp - 0x5a], 0
jne 0x15220f2
add esi, ebx
cmp ebx, esi
je 0x15220ef
cmp dword [ebp - 0x50], ebx
jbe 0x15220ec
mov edi, dword [ebp - 0x4c]
mov al, byte [ebp - 0x59]
mov byte [edi + ebx], al
inc ebx
jmp 0x15220da
or esi, 0xffffffff
add ecx, ebx
sub edx, ebx
cmp ebx, ecx
je 0x152210b
cmp dword [ebp - 0x50], ebx
jbe 0x1522108
mov edi, dword [ebp - 0x4c]
mov al, byte [edx + ebx]
mov byte [edi + ebx], al
inc ebx
jmp 0x15220f6
cmp byte [ebp - 0x5a], 0
mov ebx, ecx
je 0x1522137
lea ebx, [esi + ecx]
cmp ecx, ebx
je 0x1522137
cmp dword [ebp - 0x50], ecx
jbe 0x1522128
mov edi, dword [ebp - 0x4c]
mov al, byte [ebp - 0x59]
mov byte [edi + ecx], al
inc ecx
jmp 0x1522116
cmp dword [ebp - 0x50], ebx
jbe 0x1522136
mov eax, dword [ebp - 0x4c]
mov byte [eax + ebx], dl
inc ebx
mov esi, dword [ebp - 0x6c]
jmp 0x1521ca0
cmp dword [ebp - 0x50], ebx
mov eax, dword [ebp - 0x4c]
jbe 0x152214d
mov byte [eax + ebx], 0
jmp 0x1522154
mov edi, dword [ebp - 0x50]
mov byte [eax + edi], 0
lea esp, [ebp - 0xc]
mov eax, ebx
pop ebx
pop esi
pop edi
pop ebp
ret