All Tools
Tools/CVM List Decoder
🔏
EMV & ChipAvailable

CVM List Decoder

Parse the Cardholder Verification Method List (EMV tag 8E) into its priority-ordered rules. Shows each CVM method, condition, and fallback behaviour with Amount X/Y thresholds.

Follows EMV 4.4 Book 3 Annex C3CVM List (tag 8E): CV Rule codes and conditions·verified Oct 2026· double-checked Oct 2026— method and condition codes checked against openemv/emv-utils and proxmark3

</> Code Implementation
def parse_cvm_list(hex_str: str):
    data = bytes.fromhex(hex_str.replace(' ', ''))
    if not 10 <= len(data) <= 252 or len(data) % 2:
        raise ValueError("CVM List must be 10-252 bytes: X, Y and 2-byte CV Rules")

    amount_x = int.from_bytes(data[0:4], 'big')
    amount_y = int.from_bytes(data[4:8], 'big')

    rules = []
    rule_bytes = data[8:]
    for i in range(0, len(rule_bytes), 2):
        b1, b2 = rule_bytes[i], rule_bytes[i + 1]
        try_next = bool(b1 & 0x40)
        method_code = b1 & 0x3F
        rules.append({
            'index': i // 2 + 1,
            'method_code': method_code,
            'condition_code': b2,
            'try_next': try_next,
        })

    return {
        'amount_x': amount_x,
        'amount_y': amount_y,
        'rules': rules,
    }

# Example
result = parse_cvm_list('0000000000000000410342031F00')
print(f"Amount X: {result['amount_x']}, Rules: {len(result['rules'])}")
for rule in result['rules']:
    fallback = 'Try next' if rule['try_next'] else 'Fail'
    print(f"  Rule {rule['index']}: method=0x{rule['method_code']:02X} "
          f"cond=0x{rule['condition_code']:02X} [{fallback}]")
Something wrong or missing? Report a problem— we check reports against the specs and fix them.