web-dev-qa-db-ja.com

X.509証明書のid-ce-keyUsage拡張の解析

X.509証明書をデコードしようとしていますが、拡張機能のデコードについて質問があります。特に、id-ce-keyUsage(OID 2.5.29.15)に対応するオクテット文字列は次のとおりです。

03020106

03はタグです。ビット文字列。 02は丈です。値は0106です。これは http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf がビット文字列のエンコードについて述べているものです。

"The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, the number of
unused bits in the final subsequent octet. The number shall be in the range zero to seven."

これは、この特定のビット文字列のASN.1定義です( http://tools.ietf.org/html/rfc5280#appendix-A.1 から):

-- key usage extension OID and syntax

id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }

KeyUsage ::= BIT STRING {
     digitalSignature        (0),
     nonRepudiation          (1),  -- recent editions of X.509 have
                                -- renamed this bit to contentCommitment
     keyEncipherment         (2),
     dataEncipherment        (3),
     keyAgreement            (4),
     keyCertSign             (5),
     cRLSign                 (6),
     encipherOnly            (7),
     decipherOnly            (8) }

私の質問は...最終的なビット文字列に未使用のバイトが1つあるのはなぜですか? ASN.1の定義では8ビットすべての値が定義されているため、未使用のビットはないと予想されます。

3
compcert

ASN.1には、BIT STRINGで指定されるtwo異なるタイプがあります。

これがある場合:

Foo ::= BIT STRING

次に、Fooは総長ビットの文字列の型であり、任意の長さと各ビットの任意の値を持ちます。

一方、これで:

Bar ::= BIT STRING {
    x  (0),
    y  (1),
    z  (2)
}

次に、Barフラグのセットのタイプであり、DERエンコーディングルールでは、これらは一般的なBIT STRINGであるかのようにエンコードする必要があると記述されていますが、最後で停止しますゼロ以外のビット。したがって、フラグBarxを設定してyではなく、タイプzの値をエンコードする場合、エンコードは正確に長さのBIT STRINGtwoビット。3ビット以上ではありません。それがDERの義務です。一般的なBER規則では、値がゼロのビットを追加することができます。デコードすると、エンコードされたコード長を超えるフラグはクリアされたと見なされます。

したがって、BIT STRINGの場合:03 02 01 06は次のようにデコードします。

  • 03:a BIT STRING
  • 02:値は次の2バイトで構成されます。
  • 01:最初の値のバイト。 BIT STRINGの場合は、最後の値バイトの1ビットだけを無視することを意味します。
  • 06:ビットそのもの。

バイナリでは、0600000110ですが、最初の値のバイトは最後のビットを無視することを示しているため、バイトは実際には正確に7ビットの文字列0000011をエンコードします。

その文字列の最後のビットは1なので、これはDERルールと互換性があります。 interpretingビットストリングが個々のフラグの数だけある場合、フラグが5と6の2つの「1」状態が設定されます(それぞれ、CA証明書の一般的なkeyCertSignとcRLSignです)。他のフラグは、それらの数値インデックスが実際のエンコードされたビット文字列よりも大きい場合でも、クリアされます。

BERを使用すると、KeyUsage値を次のようにエンコードできます。

03 04 05 06 00 00

つまり、19ビットの文字列(ビットを含む3つの値バイトですが、最後の5バイトは無視されます)。これは、keyCertSignフラグとcRLSignフラグが設定されていることを示しているため、セマンティクスは同じになります。ただし、証明書の内容はDERに従う必要があります。DERは、エンコードを最小限の長さにします(末尾のゼロは削除されます)。

DERエンコーディングのこの特殊性は、以降のバージョンとの互換性を目的としています。一連のフラグのDERエンコーディングは、どのフラグに設定されているのではなく、実際に設定されているフラグに依存しますcouldが設定されているため、後のX .509バージョンは、以前のバージョンを使用する無効な(つまり、非DER)証明書を作成することなく、新しい可能なキー使用法を追加できます。

実際、ASN.1構文が2つの異なる目的で "BIT STRING"を使用していなかった場合、これははるかに明確でした。後者の使用法(フラグのセット)では、明示的な個別のキーワードを使用する必要があります。 「FLAGS」。

4
Thomas Pornin