emv
Version:
EMV / Chip and PIN library
157 lines (145 loc) • 4.39 kB
JavaScript
;
var _tlv = _interopRequireDefault(require("tlv"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var emvTags = {
'4F': 'APP_IDENTIFIER',
'50': 'APP_LABEL',
'57': 'TRACK_2',
'5A': 'PAN',
'5F20': 'CARDHOLDER_NAME',
'5F24': 'APP_EXPIRY',
'5F25': 'APP_EFFECTIVE',
'5F28': 'ISSUER_COUNTRY_CODE',
'5F2A': 'TRANSACTION_CURRENCY_CODE',
'5F2D': 'LANGUAGE_PREFERENCE',
'5F30': 'SERVICE_CODE',
'5F34': 'PAN_SEQUENCE_NUMBER',
'5F36': 'TRANSACTION_CURRENCY_EXPONENT',
'5F50': 'ISSUER_URL',
'61': 'APPLICATION_TEMPLATE',
'6F': 'FILE_CONTROL_log',
'70': 'EMV_APP_ELEMENTARY_FILE',
'71': 'ISSUER_SCRIPT_TEMPLATE_1',
'72': 'ISSUER_SCRIPT_TEMPLATE_2',
'77': 'RESPONSE_TEMPLATE_2',
'80': 'RESPONSE_TEMPLATE_1',
'81': 'AUTH_AMOUNT_BIN',
'82': 'APP_INTERCHANGE_PROFILE',
'83': 'COMMAND_TEMPLATE',
'84': 'DEDICATED_FILE_NAME',
'86': 'ISSUER_SCRIPT_CMD',
'87': 'APP_PRIORITY',
'88': 'SFI',
'89': 'AUTH_IDENTIFICATION_RESPONSE',
'8A': 'AUTH_RESPONSE_CODE',
'8C': 'CDOL_1',
'8D': 'CDOL_2',
'8E': 'CVM_LIST',
'8F': 'CA_PK_INDEX',
'90': 'ISSUER_PK_CERTIFICATE',
'91': 'ISSUER_AUTH_DATA',
'92': 'ISSUER_PK_REMAINDER',
'93': 'SIGNED_STATIC_APPLICATION_DATA',
'94': 'APP_FILE_LOCATOR',
'95': 'TERMINAL_VERIFICATION_RESULTS',
'98': 'TC_HASH_VALUE',
'99': 'TRANSACTION_PIN_DATA',
'9A': 'TRANSACTION_DATE',
'9B': 'TRANSACTION_STATUS_logRMATION',
'9C': 'TRANSACTION_TYPE',
'9D': 'DIRECTORY_DEFINITION_FILE',
'9F01': 'ACQUIRER_ID',
'9F02': 'AUTH_AMOUNT_NUM',
'9F03': 'OTHER_AMOUNT_NUM',
'9F04': 'OTHER_AMOUNT_BIN',
'9F05': 'APP_DISCRETIONARY_DATA',
'9F06': 'AID_TERMINAL',
'9F07': 'APP_USAGE_CONTROL',
'9F08': 'APP_VERSION_NUMBER',
'9F09': 'APP_VERSION_NUMBER_TERMINAL',
'9F0D': 'IAC_DEFAULT',
'9F0E': 'IAC_DENIAL',
'9F0F': 'IAC_ONLINE',
'9F10': 'ISSUER_APPLICATION_DATA',
'9F11': 'ISSUER_CODE_TABLE_IDX',
'9F12': 'APP_PREFERRED_NAME',
'9F13': 'LAST_ONLINE_ATC',
'9F14': 'LOWER_OFFLINE_LIMIT',
'9F15': 'MERCHANT_CATEGORY_CODE',
'9F16': 'MERCHANT_ID',
'9F17': 'PIN_TRY_COUNT',
'9F18': 'ISSUER_SCRIPT_ID',
'9F1A': 'TERMINAL_COUNTRY_CODE',
'9F1B': 'TERMINAL_FLOOR_LIMIT',
'9F1C': 'TERMINAL_ID',
'9F1D': 'TRM_DATA',
'9F1E': 'IFD_SERIAL_NUM',
'9F1F': 'TRACK_1_DD',
'9F21': 'TRANSACTION_TIME',
'9F22': 'CA_PK_INDEX_TERM',
'9F23': 'UPPER_OFFLINE_LIMIT',
'9F26': 'APPLICATION_CRYPTOGRAM',
'9F27': 'CRYPTOGRAM_logRMATION_DATA',
'9F2D': 'ICC_PIN_ENCIPHERMENT_PK_CERT',
'9F32': 'ISSUER_PK_EXPONENT',
'9F33': 'TERMINAL_CAPABILITIES',
'9F34': 'CVM_RESULTS',
'9F35': 'APP_TERMINAL_TYPE',
'9F36': 'APP_TRANSACTION_COUNTER',
'9F37': 'APP_UNPREDICATABLE_NUMBER',
'9F38': 'ICC_PDOL',
'9F39': 'POS_ENTRY_MODE',
'9F3A': 'AMOUNT_REF_CURRENCY',
'9F3B': 'APP_REF_CURRENCY',
'9F3C': 'TRANSACTION_REF_CURRENCY_CODE',
'9F3D': 'TRANSACTION_REF_CURRENCY_EXPONENT',
'9F40': 'ADDITIONAL_TERMINAL_CAPABILITIES',
'9F41': 'TRANSACTION_SEQUENCE_COUNTER',
'9F42': 'APP_CURRENCY_CODE',
'9F43': 'APP_REF_CURRENCY_EXPONENT',
'9F44': 'APP_CURRENCY_EXPONENT',
'9F45': 'DATA_AUTH_CODE',
'9F46': 'ICC_PK_CERTIFICATE',
'9F47': 'ICC_PK_EXPONENT',
'9F48': 'ICC_PK_REMAINDER',
'9F49': 'DDOL',
'9F4A': 'STATIC_DATA_AUTHENTICATION_TAG_LIST',
'9F4C': 'ICC_DYNAMIC_NUMBER',
'A5': 'FCI_TEMPLATE',
'BF0C': 'FCI_ISSUER_DD'
};
function toString(data) {
var value = data.value;
var decoded = '\n';
if (Buffer.isBuffer(value)) {
decoded = value.toString() + ' ' + value.toString('hex');
}
var str = '' + data.tag.toString(16) + ' (' + emvTags[data.tag.toString(16).toUpperCase()] + ') ' + decoded;
if (data.value && Array.isArray(data.value)) {
data.value.forEach(function (child) {
str += '\t' + toString(child);
});
}
str += '\n';
return str;
}
function find(data, tag) {
if (data.tag === tag) {
return data.value;
} else if (data.value && Array.isArray(data.value)) {
for (var i = 0; i < data.value.length; i++) {
var result = find(data.value[i], tag);
if (result) return result;
}
}
}
function format(response) {
return toString(_tlv["default"].parse(response.buffer));
}
function findTag(response, tag) {
return find(_tlv["default"].parse(response.buffer), tag);
}
module.exports = {
format: format,
findTag: findTag
};