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?

但我不明白为什么它是在没有序列的情况下编码的。

4

2 回答 2

1

如果您查看包含完整 ASN.1 模块的 RFC 3029 附录 E,则第三行包含“IMPLICIT TAGS”。这表明带有标签(例如 [0])的组件的 BER 或 DER 编码应该将内置的 UNIVERSAL 标签替换为规范中的标签。这意味着使用上下文特定的 0 代替 dvStatus 组件的 UNIVERSAL 16。

您可以从http://www.oss.com/asn1/resources/books-whitepapers-pubs/asn1-books.html免费下载两本优秀的 ASN.1 书籍,它们将清楚地解释显式与隐式标签。您还可以在http://asn1-playground.oss.com上的免费在线 ASN.1 编译器和编码器/解码器中尝试您的示例,以查看 IMPLICIT 与 EXPLICIT 标签对编码的影响。

今天创建的大多数新规范都使用自动标记(暗示隐式标记)。许多较旧的规范使用隐式标签,而更少或更古老的规范倾向于使用显式标签。

于 2013-08-21T22:55:35.990 回答
0

词“隐式标签”不适用于导入类型!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 回答