ISO 8583 Parser
Free ยท Reference ยท ~7 min read ยท Updated 2026-08-09
emv ยท cardholder verification

CVM List (Tag 8E): Why One Payment Asks for a PIN and Another Doesn't

Two purchases at the same till: one wants a PIN, the other sails through with no verification at all. Neither the terminal nor the cashier improvised. The card carries a ranked list of verification methods โ€” the CVM List, EMV tag 8E โ€” and the terminal simply walks it from the top until one rule sticks. The code tables tell you what each byte means, but the behaviour you see at the till comes from the traversal โ€” so the walk itself is what this article takes apart, step by step.

On this page: Start with a real value ยท The structure of tag 8E ยท How the terminal walks the list ยท The example, four purchases ยท 8E vs 9F34 in a dispute

Start with a real value

Here is a CVM List the way you meet it in a card profile or a DE55 dump: 000003E8000000001F0642031E031F02. Paste it into the CVM List Decoder and it comes back as two amounts and four rules:

That one value already answers the question in the title. In a two-decimal currency X = 1000 means 10.00: below it, rule 1 fires and nobody is asked for anything; above it, rule 1's condition fails and the PIN pad lights up for rule 2. The rest of the article is how the terminal turns those four lines into that behaviour โ€” keep the decoder open and follow along.

The structure: two amounts, then two-byte rules

Tag 8E has a fixed head and a repeating body. The first four bytes are amount X, the next four are amount Y โ€” plain binary integers (not BCD), expressed in the application currency with its usual implied decimals, so 000003E8 is 1000, i.e. 10.00 with exponent 2. The amounts do nothing by themselves; they exist so that conditions like "under X" or "over Y" have something to compare against. Everything after byte 8 is rules, exactly two bytes each:

Tag 8E byte layout: four bytes amount X, four bytes amount Y, then two-byte CVM rules โ€” the first eight bytes are not rules fixed header โ€” always 8 bytes CVM rules โ€” 2 bytes each 00 00 03 E8 00 00 00 00 1F 06 42 03 1E 03 1F 02 Amount X = 1000 (10.00) Amount Y = 0 rule 1 rule 2 rule 3 rule 4 per rule: byte 1 = CVM code (b7 = continue after failure) ยท byte 2 = condition
The example value on a byte ruler: the first eight bytes are the two amounts โ€” only after them do the two-byte rules begin.

The layout explains the classic decoding accident: paste a full 8E into something that expects bare rules and the amounts get read as "rules" โ€” you see a run of impossible 00 00 entries before the real ones. The reverse happens with logs that store only the rule bytes. If a decoded list starts with four nonsense rules, you are almost certainly looking at the amounts.

How the terminal walks the list

The selection is a plain loop, top to bottom, first match wins. For each rule:

  1. Take the next rule.
  2. Is the condition satisfied? The terminal checks the transaction against the condition byte โ€” amount versus X or Y, cash or cashback, and so on. If not satisfied, the rule is skipped: the walk moves on and the failure flag is never consulted. A skipped rule is not a failed rule.
  3. Can the terminal perform the method? It compares the CVM code against its own capabilities (tag 9F33). A method it does not support, or does not recognise, counts as a failed attempt.
  4. Attempt the CVM. Success ends the walk โ€” the result is recorded in CVM Results (tag 9F34). On failure, bit b7 of the method byte decides: set, take the next rule; clear, cardholder verification fails then and there, and TVR byte 3 records why.
  5. Out of rules? If the list is exhausted without a success, verification fails โ€” "cardholder verification was not successful", TVR byte 3 b8.
CVM rule walk: take the next rule, check its condition, attempt the method, and on failure let bit b7 decide between the next rule and overall failureno โ€” skip ityesno โ€” counts as a failureyessuccessfailureyesnoyesno

Take the next rule
(2 bytes: method + condition)

Condition satisfied?
(amount vs X / Y, cash,
cashback, attendedโ€ฆ)

Any rules left?

Terminal able to perform
this method? (tag 9F33)

b7 of the method byte set โ€”
apply next rule on failure?

Attempt the CVM
(PIN prompt, signature line, nothing)

Verification done
outcome recorded in 9F34

Cardholder verification fails
TVR byte 3, b8 set

The CVM selection loop. Note the two different exits from a rule: an unsatisfied condition skips it silently, while a failed attempt consults b7.

A failed verification is still not a declined transaction. The failure is written into TVR byte 3, and the Terminal / Issuer Action Codes then decide whether that observation forces a decline, forces the transaction online, or gets waved through. Plenty of signature-preferring cards complete happily every day with "verification unsuccessful" style bits set.

The example, four purchases

Walk the value from the top of the page through four everyday situations:

Same card, same sixteen bytes, four different outcomes โ€” all of them deterministic once you read the list as a program rather than a table.

8E is the policy โ€” 9F34 is what actually happened

Tag 8E tells you what could happen; it proves nothing about a specific transaction. The outcome lives in CVM Results, tag 9F34 โ€” three bytes: the CVM code that was applied, the condition it was applied under, and the result (00 unknown, 01 failed, 02 successful; a first byte of 3F means no CVM was performed at all). Look it and its neighbours up in the EMV tag lookup โ€” 8E is the candidate list, 9F34 is the verdict, and they answer different questions.

That distinction settles a familiar dispute. A chargeback lands: the receipt prints "PIN VERIFIED", the cardholder swears no PIN was ever entered. The receipt line is a template printed by the terminal application โ€” it is not evidence. The evidence is in DE55: if 9F34 reads 1F0602, rule 1 of our list was applied and the cardholder is right โ€” the amount was under X and no PIN was ever prompted. If 9F34 reads 420300, a PIN was taken and sent online โ€” and you can corroborate it: the authorisation request carried a PIN block in DE52, and TVR byte 3 shows "online PIN entered".

The same pair works on the acquiring side. A merchant reports that one terminal never asks for PIN: decode the card's 8E and the terminal's 9F33 side by side. If the terminal's capabilities do not claim enciphered PIN support, rule 2's condition is never satisfied, every sale slides to the signature rule, and 9F34 keeps reading 1E03โ€ฆ. The card is executing its policy exactly; the fix is terminal configuration, not a card replacement.

In short: eight bytes of amounts, then two-byte rules โ€” method plus condition. The terminal walks top to bottom; an unsatisfied condition skips the rule, a failed attempt consults b7, and b7 decides between "next rule" and "verification failed". 8E is the ballot paper, 9F34 is the count: quote the first when you argue about what should happen, the second when you argue about what did.

Read next