Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Библиотека PKCS#11 возвращает открытый ключ ECDSA в через поле CKA_EC_POINT в формате OCTET_STRING

Пример CKA_EC_POINT

04 41 04 8B 92 09 CC C0 A1 B4 19 BA 80 2E 44 5D A2 16 E6 92 AA 9C BB B9 CC B0 CE 5C 76 71 C6 DF E4 CA 83 46 BB 92 2B C8 6F FC 15 20 D8 11 5F 32 4F 7F CA BB DE 9F E3 62 5E 8E 2C D2 2D C2 51 EC 3B 8C 67

разбор по частям

04 41 04 (открытый ключ - 64 байта)

04 - тег

41 - размер

04 - тег

далее - открытый ключ

Что нужно сделать

  • добавить параметры эллиптической кривой
  • добавить OID открытого ключа
  • изменить первый тег 04 на 03
  • добавить 00 байт перед вторым тегом 04
  • увеличить размер ключа на единицу (до 42)

Что должно получиться

30 56 30 10 06 07 2A 86 48 CE 3D 02 01 06 05 2B 81 04 00 0A 03 42 00 04 (открытый ключ - 64 байта)

30 - тег

56 - размер

30 - тег

10 - размер

06 - тег

07 - размер

2A 86 48 CE 3D 02 01 - id-ecPublicKey

06 - тег

05 - размер

2B 81 04 00 0A - secp256k1

03 - тег

42 - размер

00 04 - магия

Пример правильной структуры

30 56 30 10 06 07 2A 86 48 CE 3D 02 01 06 05 2B 81 04 00 0A 03 42 00 04 8B 92 09 CC C0 A1 B4 19 BA 80 2E 44 5D A2 16 E6 92 AA 9C BB B9 CC B0 CE 5C 76 71 C6 DF E4 CA 83 46 BB 92 2B C8 6F FC 15 20 D8 11 5F 32 4F 7F CA BB DE 9F E3 62 5E 8E 2C D2 2D C2 51 EC 3B 8C 67

Формат файла

Для утилиты openssl нужен открытый ключ в формате PEM

Чтобы перевести в PEM формат нужно выполнить команду

openssl ec -pubin -inform DER -in pubkey.der -outform PEM -out pubkey.pem

Проверка открытого ключа

openssl ec -check -pubin -in pubkey.pem

Команда напишет EC Key valid. если открытый ключ корректный

...

Библиотека PKCS#11 возвращает подпись через буфер в функции С_Sign в виде R|S

Пример R|S подписи

EC 8D 6D 05 96 B9 8A AE 04 F6 AE 83 D8 04 99 FA D4 A3 EA 37 86 95 A9 DC 0D 3F 09 7F 76 5A F8 40 AA 09 E6 8D D6 56 82 02 4B CF 15 78 21 A6 23 75 81 6C 93 51 90 ED 58 91 33 6E E2 91 4D 57 B5 50

Первые 32 байта - R, остальные 32 байта - S

...

  • добавить тег 30
  • добавить размер 44, 45 или 46
  • к каждой из половинок добавить тег 02
  • к каждой из половинок добавить длину (размер) 20 или 21
  • в зависимости от первого байта R и S, если первый байт больше 7F то нужно добавить лишний 00 байт в начало строки и увеличить длину на 1

Что должно получиться

30 46 02 21 00 (R - 32 байта) 02 21 00 (S - 32 байта)

30 - тег

46 - размер

02 - тег

21 - размер

00 - нулевой байт (добавлен так как первый байт R - ЕС, а ЕС > 7F)

02 - тег

21 - размер

00 - нулевой байт (добавлен так как первый байт S - AA, а AA > 7F)

Пример правильной структуры

30 46 02 21 00 EC 8D 6D 05 96 B9 8A AE 04 F6 AE 83 D8 04 99 FA D4 A3 EA 37 86 95 A9 DC 0D 3F 09 7F 76 5A F8 40 02 21 00 AA 09 E6 8D D6 56 82 02 4B CF 15 78 21 A6 23 75 81 6C 93 51 90 ED 58 91 33 6E E2 91 4D 57 B5 50

Формат файла

Никак преобразовывать подпись далее не нужно, можно оставить в этом же виде

...

Проверка подписи утилитой openssl

openssl dgst -sha256 -verify pubkey.pem -signature sign.der data.bin

Команда напишет Verified OK если подпись корректная