CRACK Solution
Key Format
CRACK structure validator + check digit

Prerequisites
Unlocks
RE42-1333
Techniquestructure validator + check digit
Rulenonzero
SampleRE42-1333
Walkthrough
Recover the accepted input below, then submit it to the CRACK verifier.
Reject Samples
- RE42-1334
- re42-1333
- RE421-333
- R442-1333
- RE42_1333
- RE42-1330
- RE42-13333
Verifier Listing
; z2_serial_format: product-key style structure validator + check digit. It
; accepts ANY serial that obeys a fixed shape and passes a self-consistency test,
; not one secret string. The shape is L L D D: D D D D (length 9):
; pos 0,1 : uppercase 'A'..'Z'
; pos 2,3 : digit '0'..'9'
; pos 4 : a dash '-'
; pos 5,6,7,8 : digit '0'..'9'
; Then a check digit: (d2 + d3 + d5 + d6 + d7) mod 10 must equal d8 (the last
; digit). Example RE42-1333: 4+2+1+3+3 = 13, 13 mod 10 = 3 = the last digit.
; r0 = 1 on accept; rule: nonzero.
;
; Maps cleanly to the 8-bit core: the sum of five digits is at most 45, well
; under 255, and the mod 10 is a short subtract loop.
len r2
cmp r2, 9
jnz bad ; length must be 9
; pos 0 : 'A'..'Z'
mov r7, 0
ldb r0, [r7]
cmp r0, 0x41
jl bad
cmp r0, 0x5A
jg bad
; pos 1 : 'A'..'Z'
mov r7, 1
ldb r0, [r7]
cmp r0, 0x41
jl bad
cmp r0, 0x5A
jg bad
; pos 4 : '-'
mov r7, 4
ldb r0, [r7]
cmp r0, 0x2D
jnz bad
; pos 2,3,5,6,7,8 : '0'..'9': validate as a small set
mov r7, 2
ldb r0, [r7]
cmp r0, 0x30
jl bad
cmp r0, 0x39
jg bad
mov r7, 3
ldb r0, [r7]
cmp r0, 0x30
jl bad
cmp r0, 0x39
jg bad
mov r7, 5
ldb r0, [r7]
cmp r0, 0x30
jl bad
cmp r0, 0x39
jg bad
mov r7, 6
ldb r0, [r7]
cmp r0, 0x30
jl bad
cmp r0, 0x39
jg bad
mov r7, 7
ldb r0, [r7]
cmp r0, 0x30
jl bad
cmp r0, 0x39
jg bad
mov r7, 8
ldb r0, [r7]
cmp r0, 0x30
jl bad
cmp r0, 0x39
jg bad
; --- check digit: (d2 + d3 + d5 + d6 + d7) mod 10 == d8 -----------
mov r3, 0 ; running sum
mov r7, 2
ldb r0, [r7]
sub r0, 0x30
add r3, r0
mov r7, 3
ldb r0, [r7]
sub r0, 0x30
add r3, r0
mov r7, 5
ldb r0, [r7]
sub r0, 0x30
add r3, r0
mov r7, 6
ldb r0, [r7]
sub r0, 0x30
add r3, r0
mov r7, 7
ldb r0, [r7]
sub r0, 0x30
add r3, r0
red: cmp r3, 10 ; reduce mod 10
jl cmp8
sub r3, 10
jmp red
cmp8: mov r7, 8
ldb r0, [r7]
sub r0, 0x30 ; the supplied check digit
cmp r0, r3
jnz bad
mov r0, 1
ret
bad: mov r0, 0
ret