Carregando uma chave privada RSA da memória usando libxmlsec
Pergunta
Estou usando atualmente libxmlsec No meu software C ++ e tento carregar uma chave privada RSA da memória. Para fazer isso, pesquisei na API e encontrei esta função.
São necessários dados binários, tamanho, sequência de formato e vários parâmetros relacionados ao PEM-Callback.
Quando eu chamo a função, ela apenas prende, usa 100% do tempo da CPU e nunca retorna. Muito irritante, porque não tenho como descobrir o que está errado.
Aqui está o meu código:
d_xmlsec_dsig_context->signKey =
xmlSecCryptoAppKeyLoadMemory(
reinterpret_cast<const xmlSecByte*>(data),
static_cast<xmlSecSize>(datalen),
xmlSecKeyDataFormatBinary,
NULL,
NULL,
NULL
);
data
é um const char*
apontando para os bytes crus da minha chave RSA (usando i2d_RSAPrivateKey()
, a partir de OpenSSL) e datalen
o tamanho de data
.
Meu teste A chave privada não tem uma senha, então decidi não usar os retornos de chamada por enquanto.
Alguém já fez algo semelhante? Vocês vêem algo que eu poderia mudar/testar para avançar nesse problema?
Acabei de descobrir a biblioteca de ontem, então posso sentir falta de algo óbvio aqui; Eu simplesmente não consigo ver.
Muito obrigado pela sua ajuda.
Solução
Eu mudei o formato de data
para PEM, usando a função OpenSSL PEM_write_bio_RSAPrivateKey()
e mudou o terceiro argumento para a chamada para xmlSecCryptoAppKeyLoadMemory()
Por isso, corresponde ao novo formato.
O novo código é:
d_xmlsec_dsig_context->signKey =
xmlSecCryptoAppKeyLoadMemory(
reinterpret_cast<const xmlSecByte*>(data), // data is now in PEM format
static_cast<xmlSecSize>(datalen),
xmlSecKeyDataFormatPem, // Updated
NULL,
NULL,
NULL
);
E desde então, tudo funciona: a chamada não fica mais presa.