{"id":19534863,"url":"https://github.com/coolbong/node-tlv","last_synced_at":"2025-04-26T14:35:30.565Z","repository":{"id":57124110,"uuid":"54966851","full_name":"coolbong/node-tlv","owner":"coolbong","description":"node tlv","archived":false,"fork":false,"pushed_at":"2024-05-10T04:34:36.000Z","size":213,"stargazers_count":21,"open_issues_count":3,"forks_count":8,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-11-02T19:34:38.239Z","etag":null,"topics":["bertlv","dgi","emv","iso7816","javascript","nodejs","smartcard","tlv"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/coolbong.png","metadata":{"files":{"readme":"ReadMe.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":"coolbong","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2016-03-29T10:24:39.000Z","updated_at":"2024-05-08T01:12:10.000Z","dependencies_parsed_at":"2023-11-30T06:26:40.805Z","dependency_job_id":"568b6ada-2f31-47d3-84ca-689448b7e518","html_url":"https://github.com/coolbong/node-tlv","commit_stats":{"total_commits":113,"total_committers":2,"mean_commits":56.5,"dds":"0.017699115044247815","last_synced_commit":"683406582b642c1c9cc2062868afbd8b46078261"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coolbong%2Fnode-tlv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coolbong%2Fnode-tlv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coolbong%2Fnode-tlv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coolbong%2Fnode-tlv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/coolbong","download_url":"https://codeload.github.com/coolbong/node-tlv/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224036195,"owners_count":17245035,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bertlv","dgi","emv","iso7816","javascript","nodejs","smartcard","tlv"],"created_at":"2024-11-11T02:16:21.972Z","updated_at":"2024-11-11T02:16:23.025Z","avatar_url":"https://github.com/coolbong.png","language":"JavaScript","funding_links":["https://ko-fi.com/coolbong"],"categories":[],"sub_categories":[],"readme":"# node-tlv\n\nThis package is based on node-tlv with some additional features like update\n\nYou can find the npm package here: https://www.npmjs.com/package/node-tlv-upgraded\n\n[![NPM](https://nodei.co/npm/node-tlv.png)](https://nodei.co/npm/node-tlv/)\n[![npm version](https://img.shields.io/npm/v/node-tlv.svg?style=flat)](https://www.npmjs.com/package/node-tlv)\n[![Build Status](https://travis-ci.org/coolbong/node-tlv.svg?branch=master)](https://travis-ci.org/coolbong/node-tlv)\n\n## Example for parse FCI\n\n```javascript\nconst TLV = require(\"node-tlv\");\nconst assert = require(\"assert\");\n// 6F20840E315041592E5359532E4444463031A50E8801015F2D046B6F656E9F110101\n\nconst resp = \"6F20840E315041592E5359532E4444463031A50E8801015F2D046B6F656E9F110101\";\nconst tlv = TLV.parse(resp);\n\nassert(tlv.getTag() === \"6F\");\nassert(tlv.getLength() === 0x20);\n\n// find dedicated file name\nconst df_name = tlv.find(\"84\");\n\n// find FCI Proprietary Template\nconst fci_prop_template = tlv.find(\"A5\");\n```\n\n## Example for update a tag\n\n```javascript\nconst TLV = require(\"node-tlv\");\nconst assert = require(\"assert\");\n// 6F20840E315041592E5359532E4444463031A50E8801015F2D046B6F656E9F110101\n\nconst resp = \"6F20840E315041592E5359532E4444463031A50E8801015F2D046B6F656E9F110101\";\nconst tlv = TLV.update(\n\t\"6F3A8407A0000000041010A52F500A4D6173746572436172649F38069F5C089F4005BF0C179F5E095413339000001513019F5D030101009F4D020B0A\",\n\t\"9F5D\",\n\t\"999999\"\n);\nassert(tlv.value === \"999999\");\n```\n\n## Example for parse GPO response\n\n```javascript\nconst TLV = require(\"node-tlv\");\nconst assert = require(\"assert\");\n\n// parse TLV\nconst resp = \"770E8202580094080801010010010301\";\nconst tlv = TLV.parse(resp);\n\n// response message template\nassert(tlv.getTag() === \"77\");\nassert(tlv.getLength() === 14);\nassert(tlv.getValue() == \"8202580094080801010010010301\");\n\n// get TLV array\nconst child = tlv.getChild();\nassert(child.length === 2);\n\nconst first = child[0];\nassert(first.getTag() === \"82\");\n\n// find AIP\nconst aip = tlv.find(0x82);\nassert(aip.getTag() === \"82\");\nassert(aip.getLength() === 2);\nassert(aip.getValue() === \"5800\");\n\n// you can also use a string tag value\nconst afl = tlv.find(\"94\");\nassert(afl.getTag() === \"94\");\nassert(afl.getLength() === 0x08);\nassert(afl.getValue() === \"0801010010010301\");\n```\n\n## Example for parse PSE Record\n\n```javascript\nconst TLV = require(\"node-tlv\");\nconst assert = require(\"assert\");\n\nconst resp = \"702961134F08A0000000250104025004414D455887010161124F07A00000002910105004414D4558870102\";\nconst tlv = TLV.parse(resp);\n\n// find multiple tags\nconst directory_enties = tlv.findAll(\"61\");\nassert(directory_enties.length() === 2);\n\nconst directory_entry_1 = directory_enties[0];\nvar adf_name = directory_entry_1.find(\"4f\");\n\nassert(adf_name.getTag() === \"4F\");\nassert(adf_name.getLength() \u003e 5);\nassert(adf_name.getLength() \u003c 16);\n\nvar application_label = directory_entry_1.find(\"50\");\n\nassert(application_label.getTag() === \"50\");\nassert(application_label.getLength() \u003e 1);\nassert(application_label.getLength() \u003c 16);\n```\n\n## Exmaple for build PPSE FCI\n\n```javascript\n// EMV Contactless Book B Entry Point Specification\n// Table 3-2: SELECT Response Message Data Field (FCI) of the PPSE\n//'6F' FCI Template M\n//    '84' DF Name (‘2PAY.SYS.DDF01’) O\n//    'A5' FCI Proprietary Template M\n//        'BF0C' FCI Issuer Discretionary Data M\n//        '61' Directory Entry M\n//            '4F'   ADF Name M\n//            '50'   Application Label O\n// example for my credit card real data\n// CAPDU: 00A404000E325041592E5359532E4444463031\n// RAPDU: 6F2C840E325041592E5359532E4444463031A51ABF0C1761154F07A0000000031010500A56495341435245444954\n// 6F  2C(44) [FCI Template]\n//     84  0E(14) [DF Name]: 325041592E5359532E4444463031\n//     A5  1A(26) [FCI Proprietary Template]\n//         BF0C  17(23) [FCI Issuer Discretionary Data]\n//            61  15(21) [Directory Entry]\n//                4F  07( 7) [ADF Name]: A0000000031010\n//                50  0A(10) [Application Label]: VISACREDIT\n\nconst TLV = require(\"node-tlv\");\nconst assert = require(\"assert\");\n\n// step 1 build leaf\nconst df_name = new TLV(\"84\", \"325041592E5359532E4444463031\"); // DF name for PPSE\nconst adf_name = new TLV(\"4F\", \"A0000000031010\"); // aid for visa\nconst app_label = new TLV(\"50\", \"56495341435245444954\"); // VISACREDIT\n\n// step 2 build directory entry '61'\nconst dir_entry = new TLV(\"61\", adf_name.getTLV() + app_label.getTLV());\n\n// step 3 build FCI Issuer Discretionary data ' BF0C'\nconst issuer_discretionary_data = new TLV(\"BF0C\", dir_entry.getTLV());\n\n// step 4 build FCI Proprietary Template 'A5'\nconst fci_proprietary_template = new TLV(\"A5\", issuer_discretionary_data.getTLV());\n\n// step 5 build FCI template '6F'\nconst fci_template = new TLV(\"6F\", df_name.getTLV() + fci_proprietary_template.getTLV());\nassert(fci_template.getTLV() === \"6F2C840E325041592E5359532E4444463031A51ABF0C1761154F07A0000000031010500A56495341435245444954\");\n```\n\n## Exmaple for build PSE record\n\n```javascript\n// EMV 4.3 Book 1\n// Table 46: Payment System Directory Record Format\n// Tag '70'  | Data Length (L) | Tag '61' | Length | Directory entry 1 (ADF)\n// EMV 4.3 Book 1\n// Table 47: ADF Directory Entry Format\n// '4F'   5–16 ADF Name M\n// '50'   1–16 Application Label M\n// '9F12' 1–16 Application Preferred Name O\n// '87'   1    Application Priority Indicator O\n// '73'   var. Directory Discretionary Template O\n// CAPDU: 00B2010C00\n// RAPDU: 702861264F07A0000000041010870101500A4D4153544552434152449F120B43495449204D4153544552\n// 70   28(40) [READ RECORD Response Message Template]\n//    61   26(38) [Directory Entry]\n//        4F   07( 7) [ADF Name]: A0000000041010\n//        87   01( 1) [Application Priority Indicator]: 01\n//        50   0A(10) [Application Label]: MASTERCARD\n//        9F12 0B(11) [Application Preferred Name]: CITI MASTER\nconst TLV = require(\"node-tlv\");\nconst assert = require(\"assert\");\n\n// step 1 build leaf\nconst adf_name = new TLV(\"4F\", \"A0000000041010\"); // aid for mastercard\nconst app_priority = new TLV(\"87\", \"01\");\nconst app_label = new TLV(\"50\", \"4D415354455243415244\"); // MASTERCARD\nconst app_pref_name = new TLV(\"9F12\", \"43495449204D4153544552\"); // CITI MASTER\n\n// step 2 build directory entry '61'\nconst dir_entry = new TLV(\"61\", adf_name + app_priority + app_label + app_pref_name);\n\n// step 3 build read record response message template\nconst record_template = new TLV(\"70\", dir_entry.getTLV());\nassert(record_template.toString() === \"702861264F07A0000000041010870101500A4D4153544552434152449F120B43495449204D4153544552\");\n```\n\n## Installation\n\nYou can install the latest tag via npm:\n\n    npm install node-tlv\n\n##Use\nnode-tlv-parser\n\n1. [Github](https://github.com/coolbong/node-tlv-parser/)\n2. [Heroku](https://node-tlv-parser.herokuapp.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoolbong%2Fnode-tlv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoolbong%2Fnode-tlv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoolbong%2Fnode-tlv/lists"}