package org.keysupport.bc.scvp; import java.io.IOException; import org.bouncycastle.asn1.ASN1GeneralizedTime; import org.bouncycastle.asn1.ASN1Integer; import org.bouncycastle.asn1.ASN1Sequence; import org.bouncycastle.asn1.ASN1SequenceParser; import org.keysupport.bc.scvp.asn1.ResponseStatus; /** * Parser for SCVPResponse * <p> * * This parser is intended to parse a typical signed SCVP response, * where the request was an unsigned DPV request with minimal contents. * <pre> * ContentInfo ::= SEQUENCE { * contentType ContentType, * content [0] EXPLICIT ANY DEFINED BY contentType } * * ContentType ::= OBJECT IDENTIFIER * * SignedData ::= SEQUENCE { * version CMSVersion, * digestAlgorithms DigestAlgorithmIdentifiers, * encapContentInfo EncapsulatedContentInfo, * certificates [0] IMPLICIT CertificateSet OPTIONAL, * crls [1] IMPLICIT RevocationInfoChoices OPTIONAL, * signerInfos SignerInfos } * * EncapsulatedContentInfo ::= SEQUENCE { * eContentType ContentType, * eContent [0] EXPLICIT OCTET STRING OPTIONAL } * * ContentType ::= OBJECT IDENTIFIER * * CVResponse ::= SEQUENCE { * cvResponseVersion INTEGER, * serverConfigurationID INTEGER, * producedAt GeneralizedTime, * responseStatus ResponseStatus, * respValidationPolicy [0] RespValidationPolicy OPTIONAL, * requestRef [1] RequestReference OPTIONAL, * requestorRef [2] GeneralNames OPTIONAL, * requestorName [3] GeneralNames OPTIONAL, * replyObjects [4] ReplyObjects OPTIONAL, * respNonce [5] OCTET STRING OPTIONAL, * serverContextInfo [6] OCTET STRING OPTIONAL, * cvResponseExtensions [7] Extensions OPTIONAL, * requestorText [8] UTF8String (SIZE (1..256)) OPTIONAL } * * RespValidationPolicy ::= ValidationPolicy * * ValidationPolicy ::= SEQUENCE { * validationPolRef ValidationPolRef, * validationAlg [0] ValidationAlg OPTIONAL, * userPolicySet [1] SEQUENCE SIZE (1..MAX) OF OBJECT * IDENTIFIER OPTIONAL, * inhibitPolicyMapping [2] BOOLEAN OPTIONAL, * requireExplicitPolicy [3] BOOLEAN OPTIONAL, * inhibitAnyPolicy [4] BOOLEAN OPTIONAL, * trustAnchors [5] TrustAnchors OPTIONAL, * keyUsages [6] SEQUENCE OF KeyUsage OPTIONAL, * extendedKeyUsages [7] SEQUENCE OF KeyPurposeId OPTIONAL, * specifiedKeyUsages [8] SEQUENCE OF KeyPurposeId OPTIONAL } * * </pre> */ public class CVResponseParser { // private ASN1Integer cvResponseVersion = null; // private ASN1Integer serverConfigurationID = null; // private ASN1GeneralizedTime producedAt = null; // private ResponseStatus responseStatus = null; // private ValidationPolicy respValidationPolicy = null; // private RequestReference requestRef = null; // private GeneralNames requestorRef = null; // private GeneralNames requestorName = null; // private ReplyObjects replyObjects = null; // private ASN1OctetString respNonce = null; // private ASN1OctetString serverContextInfo = null; // private Extensions cvResponseExtensions = null; //private DERUTF8String requestorText = null; private ASN1SequenceParser _seq; private ASN1Integer _cvResponseVersion; private ASN1Integer _serverConfigurationID; private ASN1GeneralizedTime _producedAt; private ResponseStatus _responseStatus; private Object _nextObject; public static CVResponseParser getInstance(Object o) throws IOException { if (o instanceof ASN1Sequence) { return new CVResponseParser(((ASN1Sequence) o).parser()); } if (o instanceof ASN1SequenceParser) { return new CVResponseParser((ASN1SequenceParser) o); } throw new IOException("unknown object encountered: " + o.getClass().getName()); } private CVResponseParser(ASN1SequenceParser seq) throws IOException { this._seq = seq; this._cvResponseVersion = (ASN1Integer) seq.readObject(); this._serverConfigurationID = (ASN1Integer) seq.readObject(); this._producedAt = (ASN1GeneralizedTime) seq.readObject(); this._responseStatus = ResponseStatus.getInstance((ASN1SequenceParser)seq.readObject()); _nextObject = _seq.readObject(); if (_nextObject instanceof ASN1SequenceParser) { System.out.println("Sequence Parser!"); } else { System.out.println(_nextObject.toString()); } } public ASN1Integer getResponseVersion() { return _cvResponseVersion; } public ASN1Integer getServerConfigurationID() { return _serverConfigurationID; } public ASN1GeneralizedTime getProducedAt() { return _producedAt; } public ResponseStatus getResponseStatus() { return _responseStatus; } }