DSA証明書を使用してデータに署名しようとしています。私は証明書をメモリに保存しています(これはopenssl gendsaコマンドで生成されたものです)。Openssl DSA sign
私の機能はこのように見え、問題はres = EVP_SignFinal
です。関数は0を返し、signature_lenを0に設定します。
bool my_dsa_sign(const Certificate& certificate, const char* messageData, size_t messageLength, Signature &outSignature) {
bool resultOk = false;
BIO* bio = BIO_new_mem_buf((void*) certificate.getPEMData(), certificate.getSize());
if(NULL != bio) {
EVP_PKEY *pkey = NULL;
if(NULL != (pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))) {
unsigned int signature_len;
EVP_MD_CTX ctx;
int res = EVP_SignInit(&ctx, EVP_sha512());
if(1 == res) {
res = EVP_SignUpdate(&ctx, messageData, messageLength);
if(1 == res) {
unsigned char* s = (unsigned char*)malloc(EVP_PKEY_size(pkey));
// problem here
res = EVP_SignFinal(&ctx, s, &signature_len, pkey);
if(1 == res) {
resultOk = true;
signature.setData(s, signature_len);
}
}
}
EVP_PKEY_free(pkey);
EVP_MD_CTX_cleanup(&ctx);
}
BIO_free(bio);
}
return resultOk;
}
何か問題が起こっている可能性はありますか? 私は、デバッガでチェックして、証明書の値は、フォームで、正しいされています。また、長さが正確である
-----BEGIN DSA PRIVATE KEY-----
MIID....
.......
-----END DSA PRIVATE KEY-----
、ファイルのそれと一致しました。
*証明書*は公開鍵を含むデータ(多かれ少なかれ一般的なもの)であり、一部はデータと署名(通常は他の誰かが記述する)を含み、秘密鍵はこれとは別です(証明書には含まれていません)。 –
あなたは正しいです、私はそのクラスをリファクタリングする必要があります – Ha11owed