CryptoAPI: Использование CryptVerifySignature для проверки подписи из openssl с открытым ключом

Я пытаюсь портировать AquaticPrime framework от Mac до Windows.

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

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

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

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

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

8
задан Thomas Tempelmann 26 December 2013 в 21:18
поделиться