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.