Компилировать и связывать OpenSSL libCrypto статически. Это можно сделать, я видел это у бывшего работодателя.
аюсь портировать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.
Итак, что мне здесь не хватает?