申し訳ありませんが、私の英語は下手ですが、質問を作成してみます。
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なしでエンコードされているのか理解できません。