CryptoAPI: использование CryptVerifySignature для проверки подписи от openssl с открытым ключом - PullRequest
8 голосов
/ 07 февраля 2011

Я пытаюсь перенести инфраструктуру AquaticPrime для Mac на Windows.

На Mac он использует библиотеку opensll, и я пытаюсь понять, как перенести это на Windows, где я должен использовать CryptoAPI, я думаю.

Мне в основном нужен код для проверки сгенерированной подписи с заданным открытым ключом.

Вот как проверка выполняется с openssl:

  1. входные данные: данные лицензии, открытый ключ и подпись длиной 128 байт.
  2. Дайджест SHA1 рассчитывается на основе данных лицензии.
  3. Контекст RSA устанавливается с данными открытого ключа
  4. RSA_public_decrypt () вызывается, учитывая ключ RSA и подпись, которая возвращает 20-байтовый дайджест SHA1 - если этот дайджест равен дайджесту из шага 2, подпись действительна.

Итак, как мне это сделать с CryptoAPI? Я получил это далеко:

  1. Начать с CryptAcquireContext (ctx, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)
  2. Используйте CryptImportKey с помощью этой публикации, с pubexp = 3 и bitlen = 1024. Это все работает, то есть я не получаю ошибок, и я посмотрел двоичные данные, чтобы убедиться, что они соответствуют тому, что показано в статье MSDN.
  3. Создать дайджест SHA1 из данных лицензии. Я получил результирующее 20-байтовое хеш-значение и вижу, что оно совпадает с тем, что я получаю с openssl на Mac.

В этот момент я звоню:

CryptVerifySignature (hashHdl, sig, sigLen, keyHdl, 0, 0)

Сбой с кодом ошибки ERROR_INVALID_PARAMETER.

Странно то, что когда я впервые случайно сохранил в два раза больший открытый ключ в структуре PUBLICKEYBLOB, я вместо этого получил ошибку NTE_BAD_SIGNATURE. Это может указывать на то, что теперь открытый ключ, который я передаю, верен.

Почему сейчас возникает ошибка ERROR_INVALID_PARAMETER? Я проверил, что значение хеш-функции является правильным, и ключ, кажется, также принят. А параметр "sig" - это просто указатель на 128 байтов подписи, а sigLen - 128.

Итак, что мне здесь не хватает?

Ответы [ 2 ]

9 голосов
/ 08 февраля 2011

ОК, я решил проблему после большого количества проб и ошибок.

И данные сигнатуры, и данные открытого ключа, когда они находятся в форме чисто байтовой строки, должны быть обращены, т.е.последняя позиция и так далее.Тогда вышесказанное работает.

0 голосов
/ 08 февраля 2011

Статическая компиляция и связывание OpenSSL libCrypto.Это можно сделать, я видел это у бывшего работодателя.

...