Подпись Yubikey PCKS11 не может быть проверена с openssl - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь интегрировать подпись Yubikey в рабочий процесс подписи / проверки, который в настоящее время работает.

Генерация подписи с использованием yubico-piv-tool - это нормально и генерирует проверяемую подпись. Использование API PKCS11 для взаимодействия с Yubikey и генерации подписи создает непроверяемую подпись. Рассматривая подписи, PKCS11 создает подпись не в формате asn1.

Почему и как можно создать подпись в формате asn1, используя выходные данные PKCS11?

команды yubico-piv-tool ниже:

$ yubico-piv-tool -a verify-pin --sign -s 9c -H SHA384 -A ECCP384 -i package.json -o 
signature.sign
Enter PIN:
Successfully verified PIN.
Signature successful!
$ openssl dgst -sha384 -verify pubkey.pem -signature signature.sign package.json
Verified OK

Команда использования PKCS11 :

$ node yubi-sign.js -p $PIN -f package.json > signature.node
$ openssl dgst -sha384 -verify testdata/pubkey.pem -signature signature.node package.json
Error Verifying Data
4461661632:error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag:crypto/asn1/tasn_dec.c:1130:
4461661632:error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error:crypto/asn1/tasn_dec.c:290:Type=ECDSA_SIG

Nodejs приведенный ниже код для создания подписи:

[...]

const graphene = require('graphene-pk11');
const Module = graphene.Module;
const lib = '/usr/local/lib/libykcs11.dylib';
const mod = Module.load(lib, 'Yubikey');
mod.initialize();

const slot = mod.getSlots(0);
if (slot.flags & graphene.SlotFlag.TOKEN_PRESENT) {
  const session = slot.open();
  session.login(PIN);
  const privateKeys = session.find({ class: graphene.ObjectClass.PRIVATE_KEY });
  const privateKey = privateKeys.items(0);
  const algorithm = 'ECDSA_SHA384';
  const sign = session.createSign(algorithm, privateKey);
  sign.update(FILE);
  const signature = sign.final();
  const bufferStream = new stream.PassThrough();
  bufferStream.end(signature);
  bufferStream.pipe(process.stdout);
}

подпись yubico-piv-tool hexdump:

$ cat signature.sign| hexdump
0000000 30 64 02 30 40 7c f0 19 e8 99 39 ba 68 b3 3a e4
0000010 8c f8 32 ee cd 3c fc 1f da 37 af 33 77 7f f5 01
0000020 37 25 6e 3b 7a c0 13 16 b7 da c8 e8 30 a7 6a 64
0000030 63 7b 00 62 02 30 13 34 9b d3 14 99 65 0a f5 05
0000040 d9 fc 42 3c d3 7f 11 a1 64 8a a6 a7 29 db 4e a3
0000050 94 71 59 05 19 71 05 6f 00 76 a4 b2 90 3b b2 11
0000060 9c 05 9c 13 b3 26
0000066

pkcs11 подпись hexdump:

$ cat signature.node| hexdump
0000000 18 1d ad 4c ca 47 63 2b 4d 57 01 e0 ca d7 88 89
0000010 ed 02 b5 e5 e6 53 0e 00 80 84 53 6e 9f 9f 69 28
0000020 93 7e ec d1 e6 b1 46 3e 24 be 24 7b cb ef 4b d0
0000030 10 03 13 bf a7 6f d6 6a ae 38 13 4d 6c ce b6 18
0000040 59 b5 8c 47 93 bd 1c 94 ea 0f c7 db 49 c6 29 07
0000050 2d 5e f7 31 4d 56 e2 0c 61 59 89 7f 5a 30 a3 89
0000060
...