1

申し訳ありませんが、私の英語は下手ですが、質問を作成してみます。

BouncyCastle プロジェクトには、プロトコル DVCS (RFC-3029) の実装が含まれています。DVCS リクエストに対するレスポンス(アンサー)は、以下のような構造になっています。

DVCSResponse ::= CHOICE {
    dvCertInfo      DVCSCertInfo ,
    dvErrorNote [0] DVCSErrorNotice 
}

DVCSCertInfo::= SEQUENCE {
    version             Integer DEFAULT 1 ,
    dvReqInfo           DVCSRequestInformation, 
    messageImprint      DigestInfo,
    serialNumber        Integer,
    responseTime        DVCSTime,
    dvStatus        [0] PKIStatusInfo OPTIONAL,
    policy          [1] PolicyInformation OPTIONAL,
    reqSignature        [2] SignerInfos OPTIONAL,
    certs           [3] SEQUENCE SIZE (1..MAX) OF TargetEtcChain OPTIONAL,
    extensions          Extensions OPTIONAL 
}

フィールド dvStatus に興味があります。BouncyCastle のコードは次のとおりです。

private static final int TAG_DV_STATUS = 0;
...
public DVCSCertInfo build()
{   
    ASN1EncodableVector v = new ASN1EncodableVector();
    ...     
    if (dvStatus != null)
    {
        // DERTaggedObject(bool explicitly, int tagNo, Org.BouncyCastle.Asn1.Asn1Encodable obj)
        v.add(new DERTaggedObject(false, TAG_DV_STATUS, dvStatus));  //Why FALSE?
    }
    ...     
    return DVCSCertInfo.getInstance(new DERSequence(v));
}

ASN1 のフィールド PkiStatusInfo は次のとおりです。

PkiStatusInfo ::= SEQUENCE {
    status        PKIStatus, 
    statusString  PkiFreeText     OPTIONAL,
    failInfo      PkiFailureInfo  OPTIONAL  
}

実際の dvcs 応答のダンプ:

 SEQUENCE :                 dvCertInfo  DVCSCertInfo 
    SEQUENCE :              dvReqInfo       DVCSRequestInformation
       ENUMERATED :             service         ServiceType
       INTEGER :                nonce           INTEGER 
       GENERALIZED TIME :       requestTime     DVCSTime 
    SEQUENCE :              messageImprint      DigestInfo
    INTEGER :               serialNumber        Integer
    GENERALIZED TIME :      responseTime        DVCSTime
    CONTEXT SPECIFIC (0) :  dvStatus        [0] PKIStatusInfo 
       INTEGER : 0              status  PKIStatus //Where SEQUENCE?

しかし、なぜSequenceなしでエンコードされているのか理解できません。

4

2 に答える 2

1

完全な ASN.1 モジュールを含む RFC 3029 付録 E を見ると、3 行目に「IMPLICIT TAGS」が含まれています。これは、タグ ([0] など) を持つコンポーネントの BER または DER エンコーディングでは、組み込みの UNIVERSAL タグを仕様のタグに置き換える必要があることを示しています。これは、dvStatus コンポーネントの UNIVERSAL 16 の代わりにコンテキスト固有の 0 が使用されることを意味します。

http://www.oss.com/asn1/resources/books-whitepapers-pubs/asn1-books.htmlから無料でダウンロードできる 2 つの優れた ASN.1 ブックがあり、EXPLICIT タグと IMPLICIT タグを明確に説明しています。また、 http: //asn1-playground.oss.comにある無料のオンライン ASN.1 コンパイラとエンコーダ/デコーダで例を試して、エンコーディングに対する IMPLICIT タグと EXPLICIT タグの効果を確認することもできます。

今日作成された新しい仕様のほとんどは、AUTOMATIC TAGS (暗黙のタグ付けを意味します) を使用しています。古い仕様の多くは IMPLICIT TAGS を使用していますが、少数またはより古い仕様では EXPLICIT TAGS を使用する傾向があります。

于 2013-08-21T22:55:35.990 に答える
0

「IMPLICIT TAGS」という言葉は、インポートされたタイプには使用できません! X.208: 「注 5 – モジュール定義の "TagDefault" の値は、モジュールで明示的に定義された型のみに影響します。インポートされた型の解釈には影響しません。」. PKIStatusInfo - PKIXCMP (RFC 2510) からインポートされたタイプ。

PKIXCMP {iso(1) identified-organization(3) dod(6) internet(1) security(5) mechanisms(5) pkix(7) id-mod(0) id-mod-cmp(9)}
DEFINITIONS EXPLICIT TAGS ::=
  BEGIN
...
PKIStatusInfo ::= SEQUENCE {
      status        PKIStatus,
      statusString  PKIFreeText     OPTIONAL,
      failInfo      PKIFailureInfo  OPTIONAL}
...
END

PKIStatusInfo は明示的に定義されています!

于 2013-09-18T08:20:08.230 に答える