необходим пример вычисления безопасного канала 2 глобальной платформы

Я пишу программное обеспечение для персонализации платежного чипа, реализующего протокол Global Platform Secure Channel 2. У меня есть инструмент от поставщика чипа, который может войти в систему на карте, но я не могу дублировать эти вычисления, чтобы придумать свой собственный логин. Инструмент поставщика имеет только один заводской ключ или, возможно, набор ключей из трех одинаковых частей. Это все, что знает инструмент поставщика, и он может войти в карту:

cm> auth
=> 80 50 00 00 08 A0 13 2D 8B C1 E6 6E 9A 00          .P.....-...n..          host challenge:     A0132D8B C1E66E9A
(122317 usec)                       vv indicates SCP02
<= 00 00 00 00 00 00 00 00 00 00 FF 02 00 13 BA 2A    ...............*        seq num: 0013    card challenge:     BA2A16C9DC0E
   16 C9 DC 0E 30 11 F0 19 01 0D BF 2B 90 00          ....0......+..          card cryptogram:    3011F019 010DBF2B
 Status: No Error                                                               
 => 84 82 00 00 10 29 FD 73 3D 5A 91 6C 6F EA A6 56    .....).s=Z.lo..V        host cryptogram: 29FD733D5A916C6FEAA656B82A6B8928
   B8 2A 6B 89 28                                     .*k.(
(75647 usec)
<= 90 00                                              ..
Status: No Error

Судя по общедоступной Спецификации Global Platform Card, мое программное обеспечение должно использовать константу 182 ( или, может быть, 181, я пробовал и то, и другое), и счетчик последовательности (здесь "0013"), дополненный нулями до 16 байтов, чтобы создать сеансовый ключ. Затем ему необходимо объединить вызов хоста, порядковый номер, вызов карты и заполнение «8000 ...», чтобы получить открытый текст для подписи. Подпишите это сеансовым ключом, и результат должен совпадать с криптограммой карты. Как только я смогу продублировать вычисления инструмента поставщика, я смогу использовать тот же код на своей личной машине. Очень просто.

Работая в .Net 4.5 TripleDESCryptoServiceProvider и MACTripleDES, я получаю значения, которые не совпадают. Я не хочу интегрировать Bouncy Castle только для того, чтобы посмотреть, улучшит ли это ситуацию. Вычисление моего ключа проверяется на интернет-калькуляторах, но, конечно же, я не вижу сеансового ключа карты. Онлайн-калькуляторы подписи не согласуются с моим кодом, но они также не согласуются с примерными данными. Все, что я знаю, это то, что подпись получается неправильной или, по крайней мере, отличной от рабочего инструмента.

Итак, я думаю, вопрос в том, есть ли где-нибудь примеры этого вычисления? Конечно, сначала я спросил поставщика чипов.


person Larry Martin    schedule 21.02.2020    source источник


Ответы (1)


Примером в Python является проект Asterix: https://github.com/suma12/asterix.

Небольшого сокращения SCP02.py в этом проекте было достаточно, чтобы запустить и продублировать мои образцы данных.

person Larry Martin    schedule 21.02.2020