mask

fun mask(value: String, visibleStart: Int = 0, visibleEnd: Int = 4, maskChar: Char = 'X'): String(source)

Masks an AadhaarVID for PII-safe display.

AadhaarVID is Private government PII — same legal protection as Aadhaar. Always mask before displaying in UI or writing to logs.

Masking operates on the raw input string (not normalised). Per OQ-10 contract: the masker never calls isValid or normalize internally.

Default (visibleStart=0, visibleEnd=4, maskChar='X'): Shows last 4 characters of the raw input, masks the rest. "2345678901234561""XXXXXXXXXXXX4561" (12 X's + last 4 digits)

Note on UIDAI-style spaced mask: The UIDAI display form is NOT built-in. To achieve "XXXX XXXX XXXX 4561":

val raw = "2345678901234561"
val uidaiMask = "XXXX XXXX XXXX " + raw.takeLast(4) // -> "XXXX XXXX XXXX 4561"

This is a known limitation of the standard masking signature (consistent with OQ-10 contract).

Edge cases (all safe — never throws):

  • Empty input → returns "".

  • visibleStart + visibleEnd >= value.length → entire string returned unmasked (overlap rule).

  • Non-normalised input → masking applied character-by-character on the raw string.

Return

Masked string. Never throws — display-safe by contract.

Parameters

value

Raw VID string to mask. No normalisation is applied.

visibleStart

Number of leading characters to show unmasked. Default: 0.

visibleEnd

Number of trailing characters to show unmasked. Default: 4.

maskChar

Character to replace masked positions. Default: 'X'.

Samples

val vid = "2345678901240000"
println(AadhaarVID.mask(vid)) // "XXXXXXXXXXXX0000"