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

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

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

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

Затем я разбиваю его дальше и получаю

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

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


person codenamezero    schedule 25.01.2017    source источник


Ответы (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
person codenamezero    schedule 26.01.2017
comment
Откуда стол? - person Ayxan Haqverdili; 02.08.2020
comment
@Ayxan Я забыл точное местоположение, но это был один из этих PDF-файлов стандарта ISO. Либо с www.itu.int, либо с www.etsi.org - person codenamezero; 04.08.2020
comment
Я нашел это. Это в книге EMV 3, стр. 156. - person Ayxan Haqverdili; 04.08.2020

Вопрос. Как мне остановиться?

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"
person iso8583.info support    schedule 26.01.2017
comment
Я знаю, что длина (L) — это размер того, сколько байтов нужно прочитать в TLV, но если вы посмотрите на мой BERTLV. Первый TLV фактически содержит 2 TLV внутри, а затем первый TLV также снова содержит 2 TLV. Когда вы знаете, когда он вложен, а когда нет, это больше моего вопроса. Я знаю множество синтаксических анализаторов в Интернете, но это не то, что я пытаюсь понять, когда имею в виду стоп, хе-хе... - person codenamezero; 26.01.2017
comment
Кстати, спасибо за сайт https://iso8583.info, там есть кое-какая информация, но где еще я могу найти все поддерживаемые теги, например, 0x7F66 отображается как Unknown Tag - person codenamezero; 26.01.2017
comment
Рад, что вы нашли BER-TLV (ASN.1 BER) и определение построенного тега. Значение тега 0x7F66 не описывается в примере, поскольку оно не является частью спецификации Contact EMV, используемой для этой разбивки данных. Это всего лишь пример разбора вложенных тегов. Простой поиск по тегу 7F66 может указать на описания в ISO 24727-2 и более подробные спецификации ISO 7816-15. - person iso8583.info support; 27.01.2017
comment
Почему бы первому тегу не быть 0x01 вместо 0x61? Согласно ISO/IEC 7816-4, раздел 5.2.2.1, только 5 младших битов кодируют номер тега (если не все эти 5 бит установлены в 1). - person Adam Johns; 12.10.2018
comment
Адам, идентификаторы тегов зарезервированы по разным спецификациям. В примере Тег шаблона 0x61 используется ISO 7816. Теги от 0x01 до 0x31 зарезервированы для ASN.1 BER-TLV (ISO 8825-1) Общие типы. Вот список тегов (iso8583.info/lib/ISO/8825/1 /BER/TLV) - person iso8583.info support; 15.10.2018