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?