Я пытаюсь перенести инфраструктуру AquaticPrime для Mac на Windows.
На Mac он использует библиотеку opensll, и я пытаюсь понять, как перенести это на Windows, где я должен использовать CryptoAPI, я думаю.
Мне в основном нужен код для проверки сгенерированной подписи с заданным открытым ключом.
Вот как проверка выполняется с openssl:
- входные данные: данные лицензии, открытый ключ и подпись длиной 128 байт.
- Дайджест SHA1 рассчитывается на основе данных лицензии.
- Контекст RSA устанавливается с данными открытого ключа
- RSA_public_decrypt () вызывается, учитывая ключ RSA и подпись, которая возвращает 20-байтовый дайджест SHA1 - если этот дайджест равен дайджесту из шага 2, подпись действительна.
Итак, как мне это сделать с CryptoAPI? Я получил это далеко:
- Начать с CryptAcquireContext (ctx, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)
- Используйте CryptImportKey с помощью этой публикации, с pubexp = 3 и bitlen = 1024. Это все работает, то есть я не получаю ошибок, и я посмотрел двоичные данные, чтобы убедиться, что они соответствуют тому, что показано в статье MSDN.
- Создать дайджест 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.
Итак, что мне здесь не хватает?