CRACK Solution

Key Format

CRACK structure validator + check digit

In-game screenshot of Key Format
In-game view
FamilyCRACK Graph0.605 DifficultyMedium Ring04 IDz2_serial_format

Prerequisites

MULTIPLY FOLD

Unlocks

UNPACKER

Accepted input 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