Rsa

ASN.1 編碼關閉 RSASSA-PSS 預設參數

  • June 4, 2021

我不完全確定這個問題屬於加密而不是stackoverflow,但是……

問題在於X509 證書中RSASSA-PSS預設算法標識符參數的編碼。

在測試案例中,我們使用 PSS 的預設參數生成證書,並嘗試將該證書導入 hsm。

hsm 的 pkcs#11 驅動程序周圍的 jca 包裝器庫拒絕證書並出現異常 ala

Wrong parameters for an RSAandMGF1 algorithm identifier

有問題的證書是使用 bouncy castle 生成的,可以使用 openssl 進行驗證。問題是證書中的算法標識符參數是一個空序列。

RFC3447 A.2.2.3聲明如下:

The parameters field associated with this OID in a value of type
AlgorithmIdentifier shall have a value of type RSASSA-PSS-params:

 RSASSA-PSS-params ::= SEQUENCE {
     hashAlgorithm      [0] HashAlgorithm    DEFAULT sha1,
     maskGenAlgorithm   [1] MaskGenAlgorithm DEFAULT mgf1SHA1,
     saltLength         [2] INTEGER          DEFAULT 20,
     trailerField       [3] TrailerField     DEFAULT trailerFieldBC
 }

幾段之後:

 If the default values of the hashAlgorithm, maskGenAlgorithm, and
 trailerField fields of RSASSA-PSS-params are used, then the
 algorithm identifier will have the following value:


    rSASSA-PSS-Default-Identifier  RSASSA-AlgorithmIdentifier ::= {
        algorithm   id-RSASSA-PSS,
        parameters  RSASSA-PSS-params : {
            hashAlgorithm       sha1,
            maskGenAlgorithm    mgf1SHA1,
            saltLength          20,
            trailerField        trailerFieldBC
        }
    }

    RSASSA-AlgorithmIdentifier ::=
        AlgorithmIdentifier { {PKCS1Algorithms} }

因此,充氣城堡似乎遵循 ASN.1 定義並為預設值返回一個空序列。但是,如果我閱讀了最後一部分,在我看來,他們仍然需要設置預設值,而且我們需要使用的庫似乎強制執行了這一點。

因此,在寫支持票之前,我只想問一下我是否確實錯過了 rfc 中的某些內容,或者證書確實無效。

充氣城堡是正確的。Bouncy Castle 包含一個 BER/DER 編碼器,它通過顯式編碼方式將 ASN.1 對象更改為編碼 - 據我所知,手動進行。由於此結構使用區分編碼規則 (DER) 表示,因此該結構為空。DER 使用最少的字節數對值進行編碼。

DEFAULT ASN.1 值——就像 XSD 模式中的 XML 預設值一樣——應該在解析結構時填寫。因此 HSM 應該在解析數據時自動替換這些值。如果它不包含功能齊全的 ASN.1 解析器,則可能需要對其進行顯式編碼(使其相對容易受到實現錯誤的影響)。

由於我目前在家,我將使用古老的“ASN.1、BER 和 DER 子集的外行指南”,而不是直接引用 ITU-T X.690 / ISO/IEC 8825-1 規範:

內容八位字節與 BER 編碼相同,除瞭如果具有 DEFAULT 限定符的組件的值為預設值,則該組件的編碼不包含在內容八位字節中。

請注意,該引號用於對 SEQUENCE 進行編碼。

引用自:https://crypto.stackexchange.com/questions/22370