...
Библиотека 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 если подпись корректная