Rename Parse EMV TLV → EMV Parse TLV (naming convention)
Domain prefix must come first per AGENTS.md convention. All references updated: op file, Categories.json, tests, PAYMENT_RECIPES.md, lib comment. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
040da1fd92
commit
c7a4b6358a
@ -118,7 +118,7 @@ Operations:
|
||||
- `EMV Generate ARPC`
|
||||
- `EMV Build ARPC Data`
|
||||
- `EMV Parse ARPC Data`
|
||||
- `Parse EMV TLV`
|
||||
- `EMV Parse TLV`
|
||||
|
||||
Use this when:
|
||||
- you want to assemble or inspect ARQC/ARPC preimage data by named field
|
||||
@ -130,7 +130,7 @@ Input:
|
||||
- `EMV Build ARQC Data` / `EMV Build ARPC Data`: all fields supplied via args; ignores the input field — use as the first step in a chained recipe
|
||||
- `EMV Parse ARQC Data` / `EMV Parse ARPC Data`: flat hex preimage
|
||||
- `EMV Generate ARQC` / `EMV Verify ARQC` / `EMV Generate ARPC`: preassembled EMV data as hex
|
||||
- `Parse EMV TLV`: BER-TLV encoded hex (DE 55, ICC response, GPO response)
|
||||
- `EMV Parse TLV`: BER-TLV encoded hex (DE 55, ICC response, GPO response)
|
||||
|
||||
Important assumptions:
|
||||
- CDOL1 structure is network-agnostic: the same 10-field 33-byte layout applies across Visa, Mastercard, Amex, Discover, and JCB
|
||||
@ -457,7 +457,7 @@ Release guidance: `Publish` = safe with normal guardrails; `Publish with guardra
|
||||
| `EMV Generate ARPC` | Vendor-aligned | AWS `VerifyAuthRequestCryptogram` issuer flow | Publish with guardrails |
|
||||
| `EMV Build ARPC Data` | Verified | EMV Book 2 §8.2 (Method 1); Mastercard M/Chip (Method 2) | Publish |
|
||||
| `EMV Parse ARPC Data` | Verified | EMV Book 2 §8.2 (Method 1); Mastercard M/Chip (Method 2) | Publish |
|
||||
| `Parse EMV TLV` | Verified | ISO 8825-1 BER-TLV; EMV Books 1–4; EMVCo contactless Book C | Publish |
|
||||
| `EMV Parse TLV` | Verified | ISO 8825-1 BER-TLV; EMV Books 1–4; EMVCo contactless Book C | Publish |
|
||||
| `Card Validation Data Generate` | Vendor-aligned | AWS `GenerateCardValidationData` | Publish with guardrails |
|
||||
| `Card Validation Data Verify` | Vendor-aligned | AWS `VerifyCardValidationData` | Publish with guardrails |
|
||||
| `PIN IBM 3624 Offset Generate` | Vendor-aligned | AWS IBM 3624 PIN verification object | Publish with guardrails |
|
||||
|
||||
@ -599,7 +599,7 @@
|
||||
"EMV Generate ARQC",
|
||||
"EMV Parse ARPC Data",
|
||||
"EMV Parse ARQC Data",
|
||||
"Parse EMV TLV",
|
||||
"EMV Parse TLV",
|
||||
"EMV Generate MAC",
|
||||
"EMV Generate MAC (PIN Change)",
|
||||
"EMV Verify ARQC",
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
*
|
||||
* EMV tag dictionary covering EMV Books 1-4, EMVCo contactless, Nexo, and
|
||||
* common acquirer/terminal tags. Each entry carries metadata used by the
|
||||
* Parse EMV TLV operation.
|
||||
* EMV Parse TLV operation.
|
||||
*
|
||||
* Sources: EMV Book 1 §A; EMV Book 3 §A; Nexo FAST 3.x; ISO 8583 DE 55 common tags.
|
||||
*/
|
||||
|
||||
@ -7,7 +7,7 @@ import Operation from "../Operation.mjs";
|
||||
import { parseEmvTlv, EMV_TAG_DICTIONARY } from "../lib/EmvTlv.mjs";
|
||||
|
||||
/**
|
||||
* Parse EMV TLV operation.
|
||||
* EMV Parse TLV operation.
|
||||
*/
|
||||
class ParseEMVTLV extends Operation {
|
||||
|
||||
@ -15,7 +15,7 @@ class ParseEMVTLV extends Operation {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.name = "Parse EMV TLV";
|
||||
this.name = "EMV Parse TLV";
|
||||
this.module = "Payment";
|
||||
this.description = "Parse hex-encoded BER-TLV data (e.g., DE 55 field, ICC response, terminal data, ARQC preimage in TLV form) and annotate each tag using the built-in EMV tag dictionary.<br><br><b>Input:</b> hex-encoded BER-TLV data.<br><b>Output:</b> JSON tree. Each record includes the tag hex value, name from the EMV tag dictionary, source (ICC / Terminal / Host / Both), value format, length, value in hex, and — for constructed tags — a <code>children</code> array with the recursively parsed inner TLVs.<br><br><b>Tag dictionary:</b> covers EMV Books 1–4, EMVCo contactless Book C, and common Nexo/acquirer tags (~90 entries). Unknown tags are decoded structurally but marked with name <code>Unknown</code>.<br><br><b>Constructed tags:</b> tags with the constructed bit set (e.g., <code>70</code>, <code>77</code>, <code>6F</code>, <code>A5</code>, <code>BF0C</code>) are recursively parsed into child arrays.<br><br><b>Note:</b> indefinite-length BER encoding is not supported; this covers the definite short- and long-form lengths used by all standard EMV cards.";
|
||||
this.inlineHelp = "<strong>Input:</strong> hex-encoded BER-TLV (DE 55, ICC response, GPO reply, etc.). Outputs annotated JSON with EMV tag names and nested children.";
|
||||
|
||||
@ -1539,7 +1539,7 @@ TestRegister.addTests([
|
||||
|
||||
// ── Parse EMV TLV ─────────────────────────────────────────────────────────
|
||||
{
|
||||
name: "Parse EMV TLV: GPO Format 2 (constructed 77 > AIP + AFL)",
|
||||
name: "EMV Parse TLV: GPO Format 2 (constructed 77 > AIP + AFL)",
|
||||
input: "770A82025900940408010401",
|
||||
expectedOutput: JSON.stringify([
|
||||
{
|
||||
@ -1552,35 +1552,35 @@ TestRegister.addTests([
|
||||
],
|
||||
},
|
||||
], null, 4),
|
||||
recipeConfig: [{ op: "Parse EMV TLV", args: [false] }]
|
||||
recipeConfig: [{ op: "EMV Parse TLV", args: [false] }]
|
||||
},
|
||||
{
|
||||
name: "Parse EMV TLV: primitive tags (ARQC / CID / ATC)",
|
||||
name: "EMV Parse TLV: primitive tags (ARQC / CID / ATC)",
|
||||
input: "9F2608A1B2C3D4E5F607089F2701809F360200 01",
|
||||
expectedOutput: JSON.stringify([
|
||||
{ tag: "9F26", name: "Application Cryptogram (ARQC/TC/AAC)", constructed: false, class: "Application", source: "ICC", format: "b", length: 8, valueHex: "A1B2C3D4E5F60708" },
|
||||
{ tag: "9F27", name: "Cryptogram Information Data (CID)", constructed: false, class: "Application", source: "ICC", format: "b", length: 1, valueHex: "80" },
|
||||
{ tag: "9F36", name: "Application Transaction Counter (ATC)", constructed: false, class: "Application", source: "ICC", format: "b", length: 2, valueHex: "0001" },
|
||||
], null, 4),
|
||||
recipeConfig: [{ op: "Parse EMV TLV", args: [false] }]
|
||||
recipeConfig: [{ op: "EMV Parse TLV", args: [false] }]
|
||||
},
|
||||
{
|
||||
name: "Parse EMV TLV: unknown tag decoded structurally",
|
||||
name: "EMV Parse TLV: unknown tag decoded structurally",
|
||||
input: "FF0203AABBCC",
|
||||
expectedMatch: /"name":\s*"Unknown"/,
|
||||
recipeConfig: [{ op: "Parse EMV TLV", args: [false] }]
|
||||
recipeConfig: [{ op: "EMV Parse TLV", args: [false] }]
|
||||
},
|
||||
{
|
||||
name: "Parse EMV TLV: dictionary mode returns tag index",
|
||||
name: "EMV Parse TLV: dictionary mode returns tag index",
|
||||
input: "",
|
||||
expectedMatch: /"9F26":/,
|
||||
recipeConfig: [{ op: "Parse EMV TLV", args: [true] }]
|
||||
recipeConfig: [{ op: "EMV Parse TLV", args: [true] }]
|
||||
},
|
||||
{
|
||||
name: "Parse EMV TLV: bad hex throws",
|
||||
name: "EMV Parse TLV: bad hex throws",
|
||||
input: "GG",
|
||||
expectedOutput: "Input is not valid hex (odd length or non-hex chars).",
|
||||
recipeConfig: [{ op: "Parse EMV TLV", args: [false] }]
|
||||
recipeConfig: [{ op: "EMV Parse TLV", args: [false] }]
|
||||
},
|
||||
|
||||
// ── EMV Build Script Data ─────────────────────────────────────────────────
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user