CryptoAPI: Usando CryptVerifySignature para verificar uma assinatura do openssl com chave pública

Estou tentando portar oAquaticPrime estrutura para Mac para Windows.

No Mac, ele usa a biblioteca opensll e tento entender como portar isso para o Windows, onde tenho que usar o CryptoAPI, eu acho.

Eu preciso principalmente do código para validação da assinatura gerada com uma determinada chave pública.

Veja como a verificação é feita com o openssl:

entradas: dados da licença, chave pública e assinatura, ambos com 128 bytes de comprimento.Um resumo SHA1 é calculado a partir dos dados da licença.Um contexto RSA é configurado com os dados da chave públicaRSA_public_decrypt () é chamado, dada a chave RSA e a assinatura, que retorna um resumo SHA1 de 20 bytes de comprimento - este resumo é igual ao da etapa 2, a assinatura é válida.

Então, como faço isso com o CryptoAPI? Cheguei até aqui:

Comece com CryptAcquireContext (ctx, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)Use CryptImportKey com a ajuda deesta postagem, com pubexp = 3 e bitlen = 1024. Isso tudo funciona, ou seja, não recebo erros e examinei os dados binários para verificar se eles correspondem ao que o artigo do MSDN mostra.Crie um resumo SHA1 a partir dos dados da licença. Eu recuperei o valor de hash de 20 bytes resultante e vi que ele corresponde ao que recebo com o openssl no Mac.

Neste ponto, eu chamo:

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

Isso falha com o código de erro ERROR_INVALID_PARAMETER.

O estranho é que, quando eu acidentalmente armazenei uma chave pública duas vezes maior na estrutura PUBLICKEYBLOB, recebi um erro NTE_BAD_SIGNATURE. Isso pode sugerir que agora a chave pública que estou passando está correta.

Por que o erro ERROR_INVALID_PARAMETER agora, então? Eu verifiquei que o valor do hash está correto e a chave parece ser aceita também. E o parâmetro "sig" é apenas um ponteiro para os 128 bytes da assinatura e sigLen é 128.

Então, o que estou perdendo aqui?

questionAnswers(2)

yourAnswerToTheQuestion