package org.bouncycastle.asn1.cmc; import org.bouncycastle.asn1.ASN1EncodableVector; import org.bouncycastle.asn1.ASN1Object; import org.bouncycastle.asn1.ASN1Primitive; import org.bouncycastle.asn1.ASN1Sequence; import org.bouncycastle.asn1.DERSequence; import org.bouncycastle.asn1.DERUTF8String; /** * <pre> * -- Replaces CMC Status Info * -- * * id-cmc-statusInfoV2 OBJECT IDENTIFIER ::= {id-cmc 25} * * CMCStatusInfoV2 ::= SEQUENCE { * cMCStatus CMCStatus, * bodyList SEQUENCE SIZE (1..MAX) OF BodyPartReference, * statusString UTF8String OPTIONAL, * otherStatusInfo OtherStatusInfo OPTIONAL * } * * OtherStatusInfo ::= CHOICE { * failInfo CMCFailInfo, * pendInfo PendInfo, * extendedFailInfo ExtendedFailInfo * } * * PendInfo ::= SEQUENCE { * pendToken OCTET STRING, * pendTime GeneralizedTime * } * * ExtendedFailInfo ::= SEQUENCE { * failInfoOID OBJECT IDENTIFIER, * failInfoValue ANY DEFINED BY failInfoOID * } * </pre> */ public class CMCStatusInfoV2 extends ASN1Object { private final CMCStatus cMCStatus; private final ASN1Sequence bodyList; private final DERUTF8String statusString; private final OtherStatusInfo otherStatusInfo; CMCStatusInfoV2(CMCStatus cMCStatus, ASN1Sequence bodyList, DERUTF8String statusString, OtherStatusInfo otherStatusInfo) { this.cMCStatus = cMCStatus; this.bodyList = bodyList; this.statusString = statusString; this.otherStatusInfo = otherStatusInfo; } private CMCStatusInfoV2(ASN1Sequence seq) { if (seq.size() < 2 || seq.size() > 4) { throw new IllegalArgumentException("incorrect sequence size"); } this.cMCStatus = CMCStatus.getInstance(seq.getObjectAt(0)); this.bodyList = ASN1Sequence.getInstance(seq.getObjectAt(1)); if (seq.size() > 2) { if (seq.size() == 4) { this.statusString = DERUTF8String.getInstance(seq.getObjectAt(2)); this.otherStatusInfo = OtherStatusInfo.getInstance(seq.getObjectAt(3)); } else if (seq.getObjectAt(2) instanceof DERUTF8String) { this.statusString = DERUTF8String.getInstance(seq.getObjectAt(2)); this.otherStatusInfo = null; } else { this.statusString = null; this.otherStatusInfo = OtherStatusInfo.getInstance(seq.getObjectAt(2)); } } else { this.statusString = null; this.otherStatusInfo = null; } } public CMCStatus getcMCStatus() { return cMCStatus; } public BodyPartID[] getBodyList() { return Utils.toBodyPartIDArray(bodyList); } public DERUTF8String getStatusString() { return statusString; } public OtherStatusInfo getOtherStatusInfo() { return otherStatusInfo; } public boolean hasOtherInfo() { return otherStatusInfo != null; } public static CMCStatusInfoV2 getInstance(Object o) { if (o instanceof CMCStatusInfoV2) { return (CMCStatusInfoV2)o; } if (o != null) { return new CMCStatusInfoV2(ASN1Sequence.getInstance(o)); } return null; } public ASN1Primitive toASN1Primitive() { ASN1EncodableVector v = new ASN1EncodableVector(); v.add(cMCStatus); v.add(bodyList); if (statusString != null) { v.add(statusString); } if (otherStatusInfo != null) { v.add(otherStatusInfo); } return new DERSequence(v); } }