OpenSSL

密碼學和 SSL/TLS 工具包

EVP_SIGNATURE-ED448

名稱

EVP_SIGNATURE-ED25519、EVP_SIGNATURE-ED448、Ed25519、Ed448 - EVP_PKEY Ed25519 和 Ed448 支援

說明

Ed25519Ed448 EVP_PKEY 實作支援使用 RFC 8032 中所述的 EdDSA 簽章配置產生金鑰、一次性摘要簽章和摘要驗證。它有與 RFC 8410 相容的私密和公開金鑰格式。

EdDSA 實例

RFC 8032 說明了五個 EdDSA 實例:Ed25519、Ed25519ctx、Ed25519ph、Ed448、Ed448ph。

實例 Ed25519、Ed25519ctx、Ed448 稱為 PureEdDSA 配置。對於這三個實例,簽章和驗證程序需要存取完整的訊息(不是訊息的摘要)。

實例 Ed25519ph、Ed448ph 稱為 HashEdDSA 配置。對於這兩個實例,簽章和驗證程序不需要存取完整的訊息;它們會在訊息的雜湊上運作。對於 Ed25519ph,雜湊函數是 SHA512。對於 Ed448ph,雜湊函數是 SHAKE256,輸出長度為 512 位元。

實例 Ed25519ctx、Ed25519ph、Ed448、Ed448ph 接受一個選用的 context-string 作為簽章和驗證作業的輸入(對於 Ed25519ctx,context-string 必須是非空的)。對於 Ed25519 實例,不允許使用非空的 context-string。

ED25519 和 ED448 簽章參數

在簽章或驗證期間可以設定兩個參數:EdDSA 實例名稱context-string 值。它們可以透過將 OSSL_PARAM 陣列傳遞給 EVP_DigestSignInit_ex() 來設定。

  • "實例" (OSSL_SIGNATURE_PARAM_INSTANCE) <utf8 字串>

    五個字串之一:"Ed25519"、"Ed25519ctx"、"Ed25519ph"、"Ed448"、"Ed448ph"。

    "Ed25519"、"Ed25519ctx"、"Ed25519ph" 僅對 Ed25519 EVP_PKEY 有效。

    "Ed448"、"Ed448ph" 僅對 Ed448 EVP_PKEY 有效。

  • "context-string" (OSSL_SIGNATURE_PARAM_CONTEXT_STRING) <八位元組字串>

    長度最多為 255 的八位元組字串。

這兩個參數都是選用的。

如果未指定實例名稱,則使用預設的 "Ed25519" 或 "Ed448"。

如果未指定 context-string,則使用空的 context-string。

請注意,在簽章或驗證時 不得 指定訊息摘要名稱。

有關 X25519X448 金鑰的資訊,請參閱 EVP_PKEY-X25519(7)

可以使用 EVP_PKEY_CTX_get_params() 擷取下列簽章參數。

  • 「演算法識別碼」(OSSL_SIGNATURE_PARAM_ALGORITHM_ID) <八位元組字串>

  • "實例" (OSSL_SIGNATURE_PARAM_INSTANCE) <utf8 字串>

  • "context-string" (OSSL_SIGNATURE_PARAM_CONTEXT_STRING) <八位元組字串>

參數說明請參閱 provider-signature(7)

注意事項

PureEdDSA 實例不支援其他簽章演算法的串流機制,例如 EVP_DigestUpdate()。必須使用一次性 EVP_DigestSign() 和 EVP_DigestVerify() 函數傳遞要簽署或驗證的訊息。

HashEdDSA 實例尚未支援串流機制 (因此一次性函數也必須與 HashEdDSA 搭配使用)。

呼叫 EVP_DigestSignInit() 或 EVP_DigestVerifyInit() 時,摘要 類型 參數 必須 設定為 NULL。

想要使用 Ed25519 或 Ed448 簽署憑證 (或其他結構,例如 CRL 或憑證要求) 的應用程式,可以使用 X509_sign() 或 X509_sign_ctx() 以一般方式進行。

可以使用 EVP_PKEY_new_raw_private_key(3) 直接設定 Ed25519 或 Ed448 私密金鑰,或使用 PEM_read_bio_PrivateKey(3) (或類似函數) 從 PKCS#8 私密金鑰檔案載入。也可以產生全新的金鑰 (請參閱以下範例)。設定私密金鑰時,也會設定相關的公開金鑰。

可以使用 EVP_PKEY_new_raw_public_key(3) 直接設定 Ed25519 或 Ed448 公開金鑰,或使用 PEM_read_bio_PUBKEY(3) (或類似函數) 從 PEM 檔案中的 SubjectPublicKeyInfo 結構載入。

自 1.1.1 版起,可以使用 openssl-speed(1) 應用程式測試 Ed25519 和 Ed448。有效的演算法名稱為 ed25519ed448eddsa。如果指定 eddsa,則會對 Ed25519 和 Ed448 進行基準測試。

範例

使用 ED25519 EVP_PKEY 結構簽署訊息

void do_sign(EVP_PKEY *ed_key, unsigned char *msg, size_t msg_len)
{
    size_t sig_len;
    unsigned char *sig = NULL;
    EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();

    const OSSL_PARAM params[] = {
        OSSL_PARAM_utf8_string ("instance", "Ed25519ctx", 10),
        OSSL_PARAM_octet_string("context-string", (unsigned char *)"A protocol defined context string", 33),
        OSSL_PARAM_END
    };

    /* The input "params" is not needed if default options are acceptable.
       Use NULL in place of "params" in that case. */
    EVP_DigestSignInit_ex(md_ctx, NULL, NULL, NULL, NULL, ed_key, params);
    /* Calculate the required size for the signature by passing a NULL buffer. */
    EVP_DigestSign(md_ctx, NULL, &sig_len, msg, msg_len);
    sig = OPENSSL_zalloc(sig_len);

    EVP_DigestSign(md_ctx, sig, &sig_len, msg, msg_len);
    ...
    OPENSSL_free(sig);
    EVP_MD_CTX_free(md_ctx);
}

另請參閱

EVP_PKEY-X25519(7) provider-signature(7)EVP_DigestSignInit(3)EVP_DigestVerifyInit(3)

Copyright 2017-2023 The OpenSSL Project Authors。保留所有權利。

根據 Apache 授權條款 2.0 (「授權條款」) 授權。您不得在未遵守授權條款的情況下使用此檔案。您可以在原始程式碼散發的 LICENSE 檔案中取得一份副本,或前往 https://www.openssl.org/source/license.html 取得副本。