2

DSA 証明書を使用してデータに署名しようとしています。証明書をメモリに保存しています (openssl gendsa コマンドで生成されたものです)。

私の関数は次のようになります。私の問題は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-----

また、長さも正しく、ファイルの長さと一致します。

4

1 に答える 1

1

OpenSSL についてよく知らないので、コードで DSA を使用している場所はどこにもありません。

int res = EVP_SignInit(&ctx, EVP_sha512());

マニュアルページにEVP_SignInitは次のように書かれています:

EVP_SignInit()署名コンテキストctxを初期化して、ダイジェストタイプのデフォルトの実装を使用します。

マニュアルページにEVP_sha512は次のように書かれています:

[...]、 、 [...]は、それぞれ [...]、 SHA512 、 [...] ダイジェスト アルゴリズムの構造を EVP_sha512()返します。関連する署名アルゴリズムは、いずれの場合も RSA です。EVP_MD

私によるハイライト。したがって、DSA キーを使用して RSA 署名を実行しようとしているように見えますが、これは機能しません (またはナンセンスを吐き出します)。

ドキュメントを参照した後、SHA512 を DSA と一緒に使用する方法を見つけることができませんでしたが、ドキュメントには次のように記載されています。

ダイジェストと署名アルゴリズムの間のリンクは、OpenSSL 1.0 以降で修正されたためEVP_sha1()、RSA および DSA で使用できるようになりました。これ以上使用する必要はありませんEVP_dss1()

于 2011-12-04T20:41:37.180 に答える