diff --git a/exp/emv/data.go b/exp/emv/data.go index 8269b6e..f10cf30 100644 --- a/exp/emv/data.go +++ b/exp/emv/data.go @@ -131,3 +131,134 @@ type Data struct { UnpredictableNumber *field.String `index:"9F37"` UpperConsecutiveOfflineLimit *field.String `index:"9F23"` } + +// genearte struct with native go types +type NativeData struct { + AcquirerIdentifier string `index:"9F01"` + AdditionalTerminalCapabilities string `index:"9F40"` + AmountAuthorisedBinary string `index:"81"` + AmountAuthorisedNumeric int64 `index:"9F02"` + AmountOtherBinary string `index:"9F04"` + AmountOtherNumeric int64 `index:"9F03"` + AmountReferenceCurrency string `index:"9F3A"` + ApplicationCryptogram string `index:"9F26"` + ApplicationCurrencyCode string `index:"9F42"` + ApplicationCurrencyExponent string `index:"9F44"` + ApplicationDiscretionaryData string `index:"9F05"` + ApplicationEffectiveDate string `index:"5F25"` + ApplicationExpirationDate string `index:"5F24"` + ApplicationFileLocatorAFL string `index:"94"` + ApplicationIdentifierAIDcard string `index:"4F"` + ApplicationIdentifierAIDterminal string `index:"9F06"` + ApplicationInterchangeProfile string `index:"82"` + ApplicationLabel string `index:"50"` + ApplicationPreferredName string `index:"9F12"` + ApplicationPrimaryAccountNumberPAN string `index:"5A"` + ApplicationPrimaryAccountNumberPANSequenceNumber string `index:"5F34"` + ApplicationPriorityIndicator string `index:"87"` + ApplicationReferenceCurrency string `index:"9F3B"` + ApplicationReferenceCurrencyExponent string `index:"9F43"` + ApplicationSelectionRegisteredProprietaryData string `index:"9F0A"` + ApplicationTemplate string `index:"61"` + ApplicationTransactionCounter int64 `index:"9F36"` + ApplicationUsageControl string `index:"9F07"` + ApplicationVersionNumber string `index:"9F08"` + ApplicationVersionNumberTerminal string `index:"9F09"` + AuthorisationCode string `index:"89"` + AuthorisationResponseCode string `index:"8A"` + BankIdentifierCodeBIC string `index:"5F54"` + CardBITGroupTemplate string `index:"9F31"` + CardRiskManagementDataObjectList1CDOL1 string `index:"8C"` + CardRiskManagementDataObjectList2CDOL2 string `index:"8D"` + CardholderName string `index:"5F20"` + CardholderNameExtended string `index:"9F0B"` + CardholderVerificationMethodCVMList string `index:"8E"` + CardholderVerificationMethodCVMResults string `index:"9F34"` + CertificationAuthorityPublicKeyIndex string `index:"8F"` + CertificationAuthorityPublicKeyIndexTerminal string `index:"9F22"` + CommandTemplate string `index:"83"` + CryptogramInformationData string `index:"9F27"` + DataAuthenticationCode string `index:"9F45"` + DedicatedFileDFName string `index:"84"` + DirectoryDefinitionFileDDFName string `index:"9D"` + DirectoryDiscretionaryTemplate string `index:"73"` + DynamicDataAuthenticationDataObjectListDDOL string `index:"9F49"` + EMVProprietaryTemplate string `index:"70"` + FacialTryCounter string `index:"DF50"` + FileControlInformationFCIIssuerDiscretionaryData string `index:"BF0C"` + FileControlInformationFCIProprietaryTemplate string `index:"A5"` + FileControlInformationFCITemplate string `index:"6F"` + FingerTryCounter string `index:"DF51"` + ICCDynamicNumber string `index:"9F4C"` + IntegratedCircuitCardICCPINEnciphermentPublicKeyCertificate string `index:"9F2D"` + IntegratedCircuitCardICCPINEnciphermentPublicKeyExponent string `index:"9F2E"` + IntegratedCircuitCardICCPINEnciphermentPublicKeyRemainder string `index:"9F2F"` + IntegratedCircuitCardICCPublicKeyCertificate string `index:"9F46"` + IntegratedCircuitCardICCPublicKeyExponent string `index:"9F47"` + IntegratedCircuitCardICCPublicKeyRemainder string `index:"9F48"` + InterfaceDeviceIFDSerialNumber string `index:"9F1E"` + InternationalBankAccountNumberIBAN string `index:"5F53"` + IssuerActionCodeDefault string `index:"9F0D"` + IssuerActionCodeDenial string `index:"9F0E"` + IssuerActionCodeOnline string `index:"9F0F"` + IssuerApplicationData string `index:"9F10"` + IssuerAuthenticationData string `index:"91"` + IssuerCodeTableIndex string `index:"9F11"` + IssuerCountryCode string `index:"5F28"` + IssuerCountryCodealpha2format string `index:"5F55"` + IssuerCountryCodealpha3format string `index:"5F56"` + IssuerIdentificationNumberIIN string `index:"42"` + IssuerIdentificationNumberExtended string `index:"9F0C"` + IssuerPublicKeyCertificate string `index:"90"` + IssuerPublicKeyExponent string `index:"9F32"` + IssuerPublicKeyRemainder string `index:"92"` + IssuerScriptCommand string `index:"86"` + IssuerScriptIdentifier string `index:"9F18"` + IssuerScriptTemplate1 string `index:"71"` + IssuerScriptTemplate2 string `index:"72"` + IssuerURL string `index:"5F50"` + LanguagePreference string `index:"5F2D"` + LastOnlineApplicationTransactionCounterATCRegister string `index:"9F13"` + LogEntry string `index:"9F4D"` + LogFormat string `index:"9F4F"` + LowerConsecutiveOfflineLimit string `index:"9F14"` + MerchantCategoryCode string `index:"9F15"` + MerchantIdentifier string `index:"9F16"` + MerchantNameandLocation string `index:"9F4E"` + PaymentAccountReferencePAR string `index:"9F24"` + PersonalIdentificationNumberPINTryCounter string `index:"9F17"` + PointofServicePOSEntryMode string `index:"9F39"` + ProcessingOptionsDataObjectListPDOL string `index:"9F38"` + ResponseMessageTemplateFormat1 string `index:"80"` + ResponseMessageTemplateFormat2 string `index:"77"` + ServiceCode string `index:"5F30"` + ShortFileIdentifierSFI string `index:"88"` + SignedDynamicApplicationData string `index:"9F4B"` + SignedStaticApplicationData string `index:"93"` + StaticDataAuthenticationTagList string `index:"9F4A"` + TerminalCapabilities string `index:"9F33"` + TerminalCountryCode string `index:"9F1A"` + TerminalFloorLimit string `index:"9F1B"` + TerminalIdentification string `index:"9F1C"` + TerminalRiskManagementData string `index:"9F1D"` + TerminalType string `index:"9F35"` + TerminalVerificationResults string `index:"95"` + TokenRequestorID string `index:"9F19"` + Track1DiscretionaryData string `index:"9F1F"` + Track2DiscretionaryData string `index:"9F20"` + Track2EquivalentData string `index:"57"` + TransactionCertificateTCHashValue string `index:"98"` + TransactionCertificateDataObjectListTDOL string `index:"97"` + TransactionCurrencyCode string `index:"5F2A"` + TransactionCurrencyExponent string `index:"5F36"` + TransactionDate string `index:"9A"` + TransactionPersonalIdentificationNumberPINData string `index:"99"` + TransactionReferenceCurrencyCode string `index:"9F3C"` + TransactionReferenceCurrencyExponent string `index:"9F3D"` + TransactionSequenceCounter string `index:"9F41"` + TransactionStatusInformation string `index:"9B"` + TransactionTime string `index:"9F21"` + TransactionType string `index:"9C"` + UnpredictableNumber string `index:"9F37"` + UpperConsecutiveOfflineLimit string `index:"9F23"` +} diff --git a/exp/emv/emv_test.go b/exp/emv/emv_test.go index 706e318..87c1427 100644 --- a/exp/emv/emv_test.go +++ b/exp/emv/emv_test.go @@ -2,35 +2,39 @@ package emv import ( "encoding/hex" - "fmt" + "os" "testing" - "github.com/moov-io/iso8583/field" + "github.com/moov-io/iso8583" "github.com/stretchr/testify/require" ) func TestEmv(t *testing.T) { - exampleICCData := `9F0206000000006300820258009F360200029F2608B9B2B58202D37033840FA000000152301010000100000000009F100801050000000000009F3303E0F0C09F1A020840950500000000009A031711209C01005F2A0208409F370459F58EB1` - rawData, err := hex.DecodeString(exampleICCData) + iccData := `4f07a00000000410105f2a0208405f2d047275656e82021980950500000000009a032410029c01009f02060000000001009f03060000000000009f0607a00000000410109f090200029f1a0208409f1e0834543734353038359f21030909329f33030000e89f34030000009f3501229f360200539f370409bc21069f3901919f4104000000069f530100df81290830f0f00030f0ff00dfee2601d1dfef4c06002700000000dfef4d28fd4b4f392e1278361252d85649e405b430b9cb5e57d5211ba81d00242dbbd987ffe099fbf92b422eff810581ac500a4d6173746572436172648407a00000000410109f6d02000156a1292a353438392a2a2a2a2a2a2a2a313433375e202f5e323330333230312a2a2a2a2a2a2a2a2a2a2a2a2a56c1307004c1af307c59842b4edd3e745d27e783f4fefefb36698568ee921be4b2d6ae066b1a8cac8aba5c29453da922bc7ed89f6ba1135489cccccccc1437d2303201cccccccccccccc9f6bc118c5e921e707dabbfc762d47986509668fd22f9b3dbd10cbd6ff81063cdf812ac11870b80a15602160f54503ce3f5d9116997adb85fcfcd5388edf812bc110e912f0f4c0d82d1075ccc984f9864127df8115060000000000ffffee012cdf300100df31c110ab6c422bbfb95378504cbc6683306641df32c11081592240b4e352d17af39b923ad115caffee120acdcdcd0701453de0000d` + rawData, err := hex.DecodeString(iccData) require.NoError(t, err) - // we have to add LLL length before rawData to unpack it - lenPrefix := fmt.Sprintf("%03d", len(rawData)) - rawData = append([]byte(lenPrefix), rawData...) - - emvField := field.NewComposite(Spec) - _, err = emvField.Unpack(rawData) - - require.NoError(t, err) - - data := &Data{} - - err = emvField.Unmarshal(data) - require.NoError(t, err) - - require.Equal(t, int64(6300), data.AmountAuthorisedNumeric.Value()) - require.Equal(t, "5800", data.ApplicationInterchangeProfile.Value()) - require.Equal(t, int64(2), data.ApplicationTransactionCounter.Value()) - require.Equal(t, "B9B2B58202D37033", data.ApplicationCryptogram.Value()) - + msg := iso8583.NewMessage(MessageSpec) + msg.MTI("0100") + msg.BinaryField(55, rawData) + + // this will print the all EMV tags in readable format + // like this (note, that first F is not part of the tag, it's just a Filed prefix): + // F55 ICC Data SUBFIELDS: + // ------------------------------------------- + // F4F Application Identifier (AID) – card............: A0000000041010 + // F5F2A Transaction Currency Code.....................: 0840 + // F5F2D Language Preference...........................: 7275656E + // F82 Application Interchange Profile................: 1980 + // F95 Terminal Verification Results..................: 0000000000 + // F9A Transaction Date...............................: 241002 + // F9C Transaction Type...............................: 00 + // F9F02 Amount, Authorised (Numeric)..................: 100 + + iso8583.Describe(msg, os.Stdout) + + // now we can extract values we can use + iccField := msg.GetField(55) + data := &NativeData{} + iccField.Unmarshal(data) } diff --git a/exp/emv/spec.go b/exp/emv/spec.go index 6f5d416..92b9cd3 100644 --- a/exp/emv/spec.go +++ b/exp/emv/spec.go @@ -1,655 +1,681 @@ package emv import ( + "github.com/moov-io/iso8583" "github.com/moov-io/iso8583/encoding" "github.com/moov-io/iso8583/field" "github.com/moov-io/iso8583/prefix" "github.com/moov-io/iso8583/sort" ) -var Spec = &field.Spec{ - Length: 999, - Description: "ICC Data", - Pref: prefix.ASCII.LLL, - Tag: &field.TagSpec{ - Sort: sort.StringsByHex, - Enc: encoding.BerTLVTag, - }, - Subfields: map[string]field.Field{ - "9F01": field.NewString(&field.Spec{ - Description: "Acquirer Identifier", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F40": field.NewString(&field.Spec{ - Description: "Additional Terminal Capabilities", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "81": field.NewString(&field.Spec{ - Description: "Amount, Authorised (Binary)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F02": field.NewNumeric(&field.Spec{ - Description: "Amount, Authorised (Numeric)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F04": field.NewString(&field.Spec{ - Description: "Amount, Other (Binary)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F03": field.NewNumeric(&field.Spec{ - Description: "Amount, Other (Numeric)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F3A": field.NewString(&field.Spec{ - Description: "Amount, Reference Currency", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F26": field.NewString(&field.Spec{ - Description: "Application Cryptogram", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F42": field.NewString(&field.Spec{ - Description: "Application Currency Code", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F44": field.NewString(&field.Spec{ - Description: "Application Currency Exponent", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F05": field.NewString(&field.Spec{ - Description: "Application Discretionary Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F25": field.NewString(&field.Spec{ - Description: "Application Effective Date", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F24": field.NewString(&field.Spec{ - Description: "Application Expiration Date", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "94": field.NewString(&field.Spec{ - Description: "Application File Locator (AFL)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "4F": field.NewString(&field.Spec{ - Description: "Application Identifier (AID) – card", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F06": field.NewString(&field.Spec{ - Description: "Application Identifier (AID) – terminal", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "82": field.NewString(&field.Spec{ - Description: "Application Interchange Profile", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "50": field.NewString(&field.Spec{ - Description: "Application Label", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F12": field.NewString(&field.Spec{ - Description: "Application Preferred Name", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5A": field.NewString(&field.Spec{ - Description: "Application Primary Account Number (PAN)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F34": field.NewString(&field.Spec{ - Description: "Application Primary Account Number (PAN) Sequence Number", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "87": field.NewString(&field.Spec{ - Description: "Application Priority Indicator", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F3B": field.NewString(&field.Spec{ - Description: "Application Reference Currency", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F43": field.NewString(&field.Spec{ - Description: "Application Reference Currency Exponent", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F0A": field.NewString(&field.Spec{ - Description: "Application Selection Registered Proprietary Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "61": field.NewString(&field.Spec{ - Description: "Application Template", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F36": field.NewNumeric(&field.Spec{ - Description: "Application Transaction Counter", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F07": field.NewString(&field.Spec{ - Description: "Application Usage Control", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F08": field.NewString(&field.Spec{ - Description: "Application Version Number ICC", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F09": field.NewString(&field.Spec{ - Description: "Application Version Number Terminal", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "89": field.NewString(&field.Spec{ - Description: "Authorisation Code", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "8A": field.NewString(&field.Spec{ - Description: "Authorisation Response Code", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F54": field.NewString(&field.Spec{ - Description: "Bank Identifier Code (BIC)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F31": field.NewString(&field.Spec{ - Description: "Card BIT Group Template", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "8C": field.NewString(&field.Spec{ - Description: "Card Risk Management Data Object List 1 (CDOL1)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "8D": field.NewString(&field.Spec{ - Description: "Card Risk Management Data Object List 2 (CDOL2)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F20": field.NewString(&field.Spec{ - Description: "Cardholder Name", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F0B": field.NewString(&field.Spec{ - Description: "Cardholder Name Extended", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "8E": field.NewString(&field.Spec{ - Description: "Cardholder Verification Method (CVM) List", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F34": field.NewString(&field.Spec{ - Description: "Cardholder Verification Method (CVM) Results", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "8F": field.NewString(&field.Spec{ - Description: "Certification Authority Public Key Index ICC", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F22": field.NewString(&field.Spec{ - Description: "Certification Authority Public Key Index Terminal", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "83": field.NewString(&field.Spec{ - Description: "Command Template", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F27": field.NewString(&field.Spec{ - Description: "Cryptogram Information Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F45": field.NewString(&field.Spec{ - Description: "Data Authentication Code", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "84": field.NewString(&field.Spec{ - Description: "Dedicated File (DF) Name", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9D": field.NewString(&field.Spec{ - Description: "Directory Definition File (DDF) Name", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "73": field.NewString(&field.Spec{ - Description: "Directory Discretionary Template", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F49": field.NewString(&field.Spec{ - Description: "Dynamic Data Authentication Data Object List (DDOL)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "70": field.NewString(&field.Spec{ - Description: "EMV Proprietary Template", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "DF50": field.NewString(&field.Spec{ - Description: "Facial Try Counter", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "BF0C": field.NewString(&field.Spec{ - Description: "File Control Information (FCI) Issuer Discretionary Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "A5": field.NewString(&field.Spec{ - Description: "File Control Information (FCI) Proprietary Template", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "6F": field.NewString(&field.Spec{ - Description: "File Control Information (FCI) Template", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "DF51": field.NewString(&field.Spec{ - Description: "Finger Try Counter", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F4C": field.NewString(&field.Spec{ - Description: "ICC Dynamic Number", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F2D": field.NewString(&field.Spec{ - Description: "Integrated Circuit Card (ICC) PIN Encipherment Public Key Certificate", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F2E": field.NewString(&field.Spec{ - Description: "Integrated Circuit Card (ICC) PIN Encipherment Public Key Exponent", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F2F": field.NewString(&field.Spec{ - Description: "Integrated Circuit Card (ICC) PIN Encipherment Public Key Remainder", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F46": field.NewString(&field.Spec{ - Description: "Integrated Circuit Card (ICC) Public Key Certificate", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F47": field.NewString(&field.Spec{ - Description: "Integrated Circuit Card (ICC) Public Key Exponent", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F48": field.NewString(&field.Spec{ - Description: "Integrated Circuit Card (ICC) Public Key Remainder", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F1E": field.NewString(&field.Spec{ - Description: "Interface Device (IFD) Serial Number", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F53": field.NewString(&field.Spec{ - Description: "International Bank Account Number (IBAN)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F0D": field.NewString(&field.Spec{ - Description: "Issuer Action Code – Default", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F0E": field.NewString(&field.Spec{ - Description: "Issuer Action Code – Denial", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F0F": field.NewString(&field.Spec{ - Description: "Issuer Action Code – Online", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F10": field.NewString(&field.Spec{ - Description: "Issuer Application Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "91": field.NewString(&field.Spec{ - Description: "Issuer Authentication Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F11": field.NewString(&field.Spec{ - Description: "Issuer Code Table Index", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F28": field.NewString(&field.Spec{ - Description: "Issuer Country Code", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F55": field.NewString(&field.Spec{ - Description: "Issuer Country Code (alpha2 format)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F56": field.NewString(&field.Spec{ - Description: "Issuer Country Code (alpha3 format)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "42": field.NewString(&field.Spec{ - Description: "Issuer Identification Number (IIN)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F0C": field.NewString(&field.Spec{ - Description: "Issuer Identification Number Extended", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "90": field.NewString(&field.Spec{ - Description: "Issuer Public Key Certificate", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F32": field.NewString(&field.Spec{ - Description: "Issuer Public Key Exponent", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "92": field.NewString(&field.Spec{ - Description: "Issuer Public Key Remainder", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "86": field.NewString(&field.Spec{ - Description: "Issuer Script Command", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F18": field.NewString(&field.Spec{ - Description: "Issuer Script Identifier", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "71": field.NewString(&field.Spec{ - Description: "Issuer Script Template 1", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "72": field.NewString(&field.Spec{ - Description: "Issuer Script Template 2", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F50": field.NewString(&field.Spec{ - Description: "Issuer URL", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F2D": field.NewString(&field.Spec{ - Description: "Language Preference", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F13": field.NewString(&field.Spec{ - Description: "Last Online Application Transaction Counter (ATC) Register", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F4D": field.NewString(&field.Spec{ - Description: "Log Entry", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F4F": field.NewString(&field.Spec{ - Description: "Log Format", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F14": field.NewString(&field.Spec{ - Description: "Lower Consecutive Offline Limit", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F15": field.NewString(&field.Spec{ - Description: "Merchant Category Code", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F16": field.NewString(&field.Spec{ - Description: "Merchant Identifier", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F4E": field.NewString(&field.Spec{ - Description: "Merchant Name and Location", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F24": field.NewString(&field.Spec{ - Description: "Payment Account Reference (PAR)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F17": field.NewString(&field.Spec{ - Description: "Personal Identification Number (PIN) Try Counter", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F39": field.NewString(&field.Spec{ - Description: "Point-of-Service (POS) Entry Mode", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F38": field.NewString(&field.Spec{ - Description: "Processing Options Data Object List (PDOL)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "80": field.NewString(&field.Spec{ - Description: "Response Message Template Format 1", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "77": field.NewString(&field.Spec{ - Description: "Response Message Template Format 2", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F30": field.NewString(&field.Spec{ - Description: "Service Code", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "88": field.NewString(&field.Spec{ - Description: "Short File Identifier (SFI)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F4B": field.NewString(&field.Spec{ - Description: "Signed Dynamic Application Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "93": field.NewString(&field.Spec{ - Description: "Signed Static Application Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F4A": field.NewString(&field.Spec{ - Description: "Static Data Authentication Tag List", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F33": field.NewString(&field.Spec{ - Description: "Terminal Capabilities", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F1A": field.NewString(&field.Spec{ - Description: "Terminal Country Code", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F1B": field.NewString(&field.Spec{ - Description: "Terminal Floor Limit", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F1C": field.NewString(&field.Spec{ - Description: "Terminal Identification", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F1D": field.NewString(&field.Spec{ - Description: "Terminal Risk Management Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F35": field.NewString(&field.Spec{ - Description: "Terminal Type", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "95": field.NewString(&field.Spec{ - Description: "Terminal Verification Results", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F19": field.NewString(&field.Spec{ - Description: "Token Requestor ID", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F1F": field.NewString(&field.Spec{ - Description: "Track 1 Discretionary Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F20": field.NewString(&field.Spec{ - Description: "Track 2 Discretionary Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "57": field.NewString(&field.Spec{ - Description: "Track 2 Equivalent Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "98": field.NewString(&field.Spec{ - Description: "Transaction Certificate (TC) Hash Value", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "97": field.NewString(&field.Spec{ - Description: "Transaction Certificate Data Object List (TDOL)", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F2A": field.NewString(&field.Spec{ - Description: "Transaction Currency Code", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "5F36": field.NewString(&field.Spec{ - Description: "Transaction Currency Exponent", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9A": field.NewString(&field.Spec{ - Description: "Transaction Date", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "99": field.NewString(&field.Spec{ - Description: "Transaction Personal Identification Number (PIN) Data", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F3C": field.NewString(&field.Spec{ - Description: "Transaction Reference Currency Code", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F3D": field.NewString(&field.Spec{ - Description: "Transaction Reference Currency Exponent", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F41": field.NewString(&field.Spec{ - Description: "Transaction Sequence Counter", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9B": field.NewString(&field.Spec{ - Description: "Transaction Status Information", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F21": field.NewString(&field.Spec{ - Description: "Transaction Time", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9C": field.NewString(&field.Spec{ - Description: "Transaction Type", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F37": field.NewString(&field.Spec{ - Description: "Unpredictable Number", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - "9F23": field.NewString(&field.Spec{ - Description: "Upper Consecutive Offline Limit", - Enc: encoding.ASCIIHexToBytes, - Pref: prefix.BerTLV, - }), - }, -} +var ( + MessageSpec = &iso8583.MessageSpec{ + Fields: map[int]field.Field{ + 0: field.NewString(&field.Spec{ + Length: 4, + Description: "Message Type Indicator", + Enc: encoding.ASCII, + Pref: prefix.ASCII.Fixed, + }), + 1: field.NewBitmap(&field.Spec{ + Description: "Bitmap", + Enc: encoding.BytesToASCIIHex, + Pref: prefix.Hex.Fixed, + }), + 55: field.NewComposite(Spec), + }, + } + + Spec = &field.Spec{ + Length: 999, + Description: "ICC Data", + Pref: prefix.ASCII.LLL, + Tag: &field.TagSpec{ + Sort: sort.StringsByHex, + Enc: encoding.BerTLVTag, + SkipUnknownTLVTags: true, + }, + Subfields: map[string]field.Field{ + "9F01": field.NewString(&field.Spec{ + Description: "Acquirer Identifier", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F40": field.NewString(&field.Spec{ + Description: "Additional Terminal Capabilities", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "81": field.NewString(&field.Spec{ + Description: "Amount, Authorised (Binary)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F02": field.NewNumeric(&field.Spec{ + Description: "Amount, Authorised (Numeric)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F04": field.NewString(&field.Spec{ + Description: "Amount, Other (Binary)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F03": field.NewNumeric(&field.Spec{ + Description: "Amount, Other (Numeric)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F3A": field.NewString(&field.Spec{ + Description: "Amount, Reference Currency", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F26": field.NewString(&field.Spec{ + Description: "Application Cryptogram", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F42": field.NewString(&field.Spec{ + Description: "Application Currency Code", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F44": field.NewString(&field.Spec{ + Description: "Application Currency Exponent", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F05": field.NewString(&field.Spec{ + Description: "Application Discretionary Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F25": field.NewString(&field.Spec{ + Description: "Application Effective Date", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F24": field.NewString(&field.Spec{ + Description: "Application Expiration Date", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "94": field.NewString(&field.Spec{ + Description: "Application File Locator (AFL)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "4F": field.NewString(&field.Spec{ + Description: "Application Identifier (AID) – card", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F06": field.NewString(&field.Spec{ + Description: "Application Identifier (AID) – terminal", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "82": field.NewString(&field.Spec{ + Description: "Application Interchange Profile", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "50": field.NewString(&field.Spec{ + Description: "Application Label", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F12": field.NewString(&field.Spec{ + Description: "Application Preferred Name", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5A": field.NewString(&field.Spec{ + Description: "Application Primary Account Number (PAN)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F34": field.NewString(&field.Spec{ + Description: "Application Primary Account Number (PAN) Sequence Number", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "87": field.NewString(&field.Spec{ + Description: "Application Priority Indicator", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F3B": field.NewString(&field.Spec{ + Description: "Application Reference Currency", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F43": field.NewString(&field.Spec{ + Description: "Application Reference Currency Exponent", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F0A": field.NewString(&field.Spec{ + Description: "Application Selection Registered Proprietary Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "61": field.NewString(&field.Spec{ + Description: "Application Template", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F36": field.NewNumeric(&field.Spec{ + Description: "Application Transaction Counter", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F07": field.NewString(&field.Spec{ + Description: "Application Usage Control", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F08": field.NewString(&field.Spec{ + Description: "Application Version Number ICC", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F09": field.NewString(&field.Spec{ + Description: "Application Version Number Terminal", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "89": field.NewString(&field.Spec{ + Description: "Authorisation Code", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "8A": field.NewString(&field.Spec{ + Description: "Authorisation Response Code", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F54": field.NewString(&field.Spec{ + Description: "Bank Identifier Code (BIC)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F31": field.NewString(&field.Spec{ + Description: "Card BIT Group Template", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "8C": field.NewString(&field.Spec{ + Description: "Card Risk Management Data Object List 1 (CDOL1)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "8D": field.NewString(&field.Spec{ + Description: "Card Risk Management Data Object List 2 (CDOL2)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F20": field.NewString(&field.Spec{ + Description: "Cardholder Name", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F0B": field.NewString(&field.Spec{ + Description: "Cardholder Name Extended", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "8E": field.NewString(&field.Spec{ + Description: "Cardholder Verification Method (CVM) List", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F34": field.NewString(&field.Spec{ + Description: "Cardholder Verification Method (CVM) Results", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "8F": field.NewString(&field.Spec{ + Description: "Certification Authority Public Key Index ICC", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F22": field.NewString(&field.Spec{ + Description: "Certification Authority Public Key Index Terminal", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "83": field.NewString(&field.Spec{ + Description: "Command Template", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F27": field.NewString(&field.Spec{ + Description: "Cryptogram Information Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F45": field.NewString(&field.Spec{ + Description: "Data Authentication Code", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "84": field.NewString(&field.Spec{ + Description: "Dedicated File (DF) Name", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9D": field.NewString(&field.Spec{ + Description: "Directory Definition File (DDF) Name", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "73": field.NewString(&field.Spec{ + Description: "Directory Discretionary Template", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F49": field.NewString(&field.Spec{ + Description: "Dynamic Data Authentication Data Object List (DDOL)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "70": field.NewString(&field.Spec{ + Description: "EMV Proprietary Template", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "DF50": field.NewString(&field.Spec{ + Description: "Facial Try Counter", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "BF0C": field.NewString(&field.Spec{ + Description: "File Control Information (FCI) Issuer Discretionary Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "A5": field.NewString(&field.Spec{ + Description: "File Control Information (FCI) Proprietary Template", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "6F": field.NewString(&field.Spec{ + Description: "File Control Information (FCI) Template", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "DF51": field.NewString(&field.Spec{ + Description: "Finger Try Counter", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F4C": field.NewString(&field.Spec{ + Description: "ICC Dynamic Number", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F2D": field.NewString(&field.Spec{ + Description: "Integrated Circuit Card (ICC) PIN Encipherment Public Key Certificate", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F2E": field.NewString(&field.Spec{ + Description: "Integrated Circuit Card (ICC) PIN Encipherment Public Key Exponent", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F2F": field.NewString(&field.Spec{ + Description: "Integrated Circuit Card (ICC) PIN Encipherment Public Key Remainder", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F46": field.NewString(&field.Spec{ + Description: "Integrated Circuit Card (ICC) Public Key Certificate", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F47": field.NewString(&field.Spec{ + Description: "Integrated Circuit Card (ICC) Public Key Exponent", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F48": field.NewString(&field.Spec{ + Description: "Integrated Circuit Card (ICC) Public Key Remainder", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F1E": field.NewString(&field.Spec{ + Description: "Interface Device (IFD) Serial Number", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F53": field.NewString(&field.Spec{ + Description: "International Bank Account Number (IBAN)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F0D": field.NewString(&field.Spec{ + Description: "Issuer Action Code – Default", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F0E": field.NewString(&field.Spec{ + Description: "Issuer Action Code – Denial", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F0F": field.NewString(&field.Spec{ + Description: "Issuer Action Code – Online", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F10": field.NewString(&field.Spec{ + Description: "Issuer Application Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "91": field.NewString(&field.Spec{ + Description: "Issuer Authentication Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F11": field.NewString(&field.Spec{ + Description: "Issuer Code Table Index", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F28": field.NewString(&field.Spec{ + Description: "Issuer Country Code", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F55": field.NewString(&field.Spec{ + Description: "Issuer Country Code (alpha2 format)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F56": field.NewString(&field.Spec{ + Description: "Issuer Country Code (alpha3 format)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "42": field.NewString(&field.Spec{ + Description: "Issuer Identification Number (IIN)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F0C": field.NewString(&field.Spec{ + Description: "Issuer Identification Number Extended", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "90": field.NewString(&field.Spec{ + Description: "Issuer Public Key Certificate", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F32": field.NewString(&field.Spec{ + Description: "Issuer Public Key Exponent", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "92": field.NewString(&field.Spec{ + Description: "Issuer Public Key Remainder", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "86": field.NewString(&field.Spec{ + Description: "Issuer Script Command", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F18": field.NewString(&field.Spec{ + Description: "Issuer Script Identifier", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "71": field.NewString(&field.Spec{ + Description: "Issuer Script Template 1", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "72": field.NewString(&field.Spec{ + Description: "Issuer Script Template 2", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F50": field.NewString(&field.Spec{ + Description: "Issuer URL", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F2D": field.NewString(&field.Spec{ + Description: "Language Preference", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F13": field.NewString(&field.Spec{ + Description: "Last Online Application Transaction Counter (ATC) Register", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F4D": field.NewString(&field.Spec{ + Description: "Log Entry", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F4F": field.NewString(&field.Spec{ + Description: "Log Format", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F14": field.NewString(&field.Spec{ + Description: "Lower Consecutive Offline Limit", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F15": field.NewString(&field.Spec{ + Description: "Merchant Category Code", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F16": field.NewString(&field.Spec{ + Description: "Merchant Identifier", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F4E": field.NewString(&field.Spec{ + Description: "Merchant Name and Location", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F24": field.NewString(&field.Spec{ + Description: "Payment Account Reference (PAR)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F17": field.NewString(&field.Spec{ + Description: "Personal Identification Number (PIN) Try Counter", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F39": field.NewString(&field.Spec{ + Description: "Point-of-Service (POS) Entry Mode", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F38": field.NewString(&field.Spec{ + Description: "Processing Options Data Object List (PDOL)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "80": field.NewString(&field.Spec{ + Description: "Response Message Template Format 1", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "77": field.NewString(&field.Spec{ + Description: "Response Message Template Format 2", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F30": field.NewString(&field.Spec{ + Description: "Service Code", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "88": field.NewString(&field.Spec{ + Description: "Short File Identifier (SFI)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F4B": field.NewString(&field.Spec{ + Description: "Signed Dynamic Application Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "93": field.NewString(&field.Spec{ + Description: "Signed Static Application Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F4A": field.NewString(&field.Spec{ + Description: "Static Data Authentication Tag List", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F33": field.NewString(&field.Spec{ + Description: "Terminal Capabilities", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F1A": field.NewString(&field.Spec{ + Description: "Terminal Country Code", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F1B": field.NewString(&field.Spec{ + Description: "Terminal Floor Limit", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F1C": field.NewString(&field.Spec{ + Description: "Terminal Identification", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F1D": field.NewString(&field.Spec{ + Description: "Terminal Risk Management Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F35": field.NewString(&field.Spec{ + Description: "Terminal Type", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "95": field.NewString(&field.Spec{ + Description: "Terminal Verification Results", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F19": field.NewString(&field.Spec{ + Description: "Token Requestor ID", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F1F": field.NewString(&field.Spec{ + Description: "Track 1 Discretionary Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F20": field.NewString(&field.Spec{ + Description: "Track 2 Discretionary Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "57": field.NewString(&field.Spec{ + Description: "Track 2 Equivalent Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "98": field.NewString(&field.Spec{ + Description: "Transaction Certificate (TC) Hash Value", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "97": field.NewString(&field.Spec{ + Description: "Transaction Certificate Data Object List (TDOL)", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F2A": field.NewString(&field.Spec{ + Description: "Transaction Currency Code", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "5F36": field.NewString(&field.Spec{ + Description: "Transaction Currency Exponent", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9A": field.NewString(&field.Spec{ + Description: "Transaction Date", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "99": field.NewString(&field.Spec{ + Description: "Transaction Personal Identification Number (PIN) Data", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F3C": field.NewString(&field.Spec{ + Description: "Transaction Reference Currency Code", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F3D": field.NewString(&field.Spec{ + Description: "Transaction Reference Currency Exponent", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F41": field.NewString(&field.Spec{ + Description: "Transaction Sequence Counter", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9B": field.NewString(&field.Spec{ + Description: "Transaction Status Information", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F21": field.NewString(&field.Spec{ + Description: "Transaction Time", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9C": field.NewString(&field.Spec{ + Description: "Transaction Type", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F37": field.NewString(&field.Spec{ + Description: "Unpredictable Number", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F23": field.NewString(&field.Spec{ + Description: "Upper Consecutive Offline Limit", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + "9F5B": field.NewString(&field.Spec{ + Description: "Issuer Script Results", + Enc: encoding.ASCIIHexToBytes, + Pref: prefix.BerTLV, + }), + }, + } +)