Когда вы читаете BERTLV, когда вы останавливаетесь?

У меня есть следующий BERTLV:61394F0BA00000030800001001234579074F05A000012345500E49442D4F6E65205049562042494F5F50107777772E6F626572746875722E636F6D7F66080202800002028000

Я пытаюсь разобрать это рекурсивным способом, поэтому я отношусь к первой части как к TLV.

Тег: 0x61Лен: 0x39, Значение: 4F0BA00000030800001001234579074F05A000012345500E49442D4F6E65205049562042494F5F50107777772E6F626572746875722E636F6D

Тогда я ломаю это дальше, и получаю

Тег: 0x4FЛен: 0x0B, Значение:A000000308000010012345

Теперь, как мне остановиться? На данный момент я знаю, что это значение является последним этапом этого TLV и не является другим вложенным TLV.

2 ответа

Решение

Хорошо, после долгих копаний, я узнал, что простое TAG на самом деле больше, чем просто число, TAG сам на самом деле закодировал кучу информации там. Я приказываю выяснить, TLV содержит вложенные TLV чтобы мой код знал, когда продолжить обработку, а когда остановить, мне пришлось декодировать TAG,

Итак TAG содержит 8 битов, и каждый из них имеет особое значение:

TLV TAG и их биты, означающие

Бит, который мне был нужен, был B5 для того, чтобы определить, является ли текущий TLV является Constructed или нет... когда есть Constructed это означает, что ток TLV состоит из нескольких TLVпоэтому для своего кода я использую эту информацию для рекурсивного поиска вложенных TLV,

Когда TLV не Constructed это мой случай остановки, чтобы всплыть.

Вот мой рекурсивный вывод функции путем анализа данных и проверки бита B5 в TAG:

11:20:38.428 Parsing: 61394F0BA00000030800001000010079074F05A000000308500E49442D4F6E65205049562042494F5F50107777772E6F626572746875722E636F6D7F66080202800002028000
11:20:38.436 Constructed Data Object
11:20:38.437 Parsing: 4F0BA00000030800001000010079074F05A000000308500E49442D4F6E65205049562042494F5F50107777772E6F626572746875722E636F6D
11:20:38.437 Primitive Data Object
11:20:38.437 tag: 79, len: 11, value: A000000308000010000100
11:20:38.437 Constructed Data Object
11:20:38.437 Parsing: 4F05A000000308
11:20:38.437 Primitive Data Object
11:20:38.437 tag: 79, len: 5, value: A000000308
11:20:38.437 Primitive Data Object
11:20:38.437 tag: 80, len: 14, value: 49442D4F6E65205049562042494F
11:20:38.437 MultiByte tag
11:20:38.437 Primitive Data Object
11:20:38.437 tag: 24400, len: 16, value: 7777772E6F626572746875722E636F6D
11:20:38.438 MultiByte tag
11:20:38.438 Constructed Data Object
11:20:38.438 Parsing: 0202800002028000
11:20:38.438 Primitive Data Object
11:20:38.438 tag: 2, len: 2, value: 8000
11:20:38.438 Primitive Data Object
11:20:38.438 tag: 2, len: 2, value: 8000

Q: Теперь, как мне остановиться?

A: Длина TAG (0x0B) представлена ​​в HEX и показывает количество байтов в значении. Каждый байт представлен в вашем примере как 2 (два) шестнадцатеричных символа. Таким образом, 0x0B, который является 11 в десятичном виде, покажет вам 11*2 = 22 символа в значении для использования.

Вот пример разбора вашего буфера BER-TLV, проанализированного с помощью инструмента https://iso8583.info/lib/EMV/TLVs:

---
# Cheef's parser.
# Copyright (C) 2008-2017 Alexander Shevelev. https://iso8583.info/
# lib   : "/lib/EMV/" - Integrated Circuit Card Specifications for Payment Systems
# tool  : "TLVs"
# stat  : 40 nodes, 4 lookup tables, 25.00% passed (1/4)

TLVs:#"61394F0BA00000030800001001234579074F05A000012345500E49442D4F..8000" # EMV, Tag + Length + Value (TLV) series
- x61:#"61394F0BA00000030800001001234579074F05A000012345500E49442D4F..6F6D" # ISO 7816, Template, Application
  - tag: "61"
  - len: "39" #  // 57
  - val:#"4F0BA00000030800001001234579074F05A000012345500E49442D4F6E65..6F6D" # Template, Application.
    - x4F:#"4F0BA000000308000010012345" # ISO 7816, Application Identifier (AID), Card
      - tag: "4F"
      - len: "0B" #  // 11
      - val:#"A000000308000010012345" # AID, Card.
        - RID: "A000000308" # Registered Application Provider Identifier (RID) // National Institute of Standards and Technology
        - PIX: "000010012345" # Proprietary Application Identifier Extension (PIX)
    - x79:#"79074F05A000012345" # ISO 7816, Coexistent Tag Allocation Authority
      - tag: "79"
      - len: "07" #  // 7
      - val:#"4F05A000012345"
        - x4F:#"4F05A000012345" # ISO 7816, Application Identifier (AID), Card
          - tag: "4F"
          - len: "05" #  // 5
          - val:#"A000012345" # AID, Card.
            - RID: "A000012345" # Registered Application Provider Identifier (RID)
    - x50:#"500E49442D4F6E65205049562042494F" # ISO 7816, Application Label
      - tag: "50"
      - len: "0E" #  // 14
      - val: "49442D4F6E65205049562042494F" # Application Label. // ID-One PIV BIO
    - x5F50:#"5F50107777772E6F626572746875722E636F6D" # ISO 7816, Uniform resource locator (URL)
      - tag: "5F50"
      - len: "10" #  // 16
      - val: "7777772E6F626572746875722E636F6D" # URL. // www.oberthur.com
- x7F66:#"7F66080202800002028000"
  - tag: "7F66"
  - len: "08" #  // 8
  - val:#"0202800002028000"
    - x02:#"02028000"
      - tag: "02"
      - len: "02" #  // 2
      - val: "8000"
    - x02:#"02028000"
      - tag: "02"
      - len: "02" #  // 2
      - val: "8000"
Другие вопросы по тегам