1package org.bouncycastle.asn1.ocsp; 2 3import org.bouncycastle.asn1.ASN1EncodableVector; 4import org.bouncycastle.asn1.ASN1GeneralizedTime; 5import org.bouncycastle.asn1.ASN1Object; 6import org.bouncycastle.asn1.ASN1Primitive; 7import org.bouncycastle.asn1.ASN1Sequence; 8import org.bouncycastle.asn1.ASN1TaggedObject; 9import org.bouncycastle.asn1.DERSequence; 10import org.bouncycastle.asn1.DERTaggedObject; 11import org.bouncycastle.asn1.x509.Extensions; 12import org.bouncycastle.asn1.x509.X509Extensions; 13 14public class SingleResponse 15 extends ASN1Object 16{ 17 private CertID certID; 18 private CertStatus certStatus; 19 private ASN1GeneralizedTime thisUpdate; 20 private ASN1GeneralizedTime nextUpdate; 21 private Extensions singleExtensions; 22 23 /** 24 * @deprecated use method taking ASN1GeneralizedTime and Extensions 25 * @param certID 26 * @param certStatus 27 * @param thisUpdate 28 * @param nextUpdate 29 * @param singleExtensions 30 */ 31 public SingleResponse( 32 CertID certID, 33 CertStatus certStatus, 34 ASN1GeneralizedTime thisUpdate, 35 ASN1GeneralizedTime nextUpdate, 36 X509Extensions singleExtensions) 37 { 38 this(certID, certStatus, thisUpdate, nextUpdate, Extensions.getInstance(singleExtensions)); 39 } 40 41 public SingleResponse( 42 CertID certID, 43 CertStatus certStatus, 44 ASN1GeneralizedTime thisUpdate, 45 ASN1GeneralizedTime nextUpdate, 46 Extensions singleExtensions) 47 { 48 this.certID = certID; 49 this.certStatus = certStatus; 50 this.thisUpdate = thisUpdate; 51 this.nextUpdate = nextUpdate; 52 this.singleExtensions = singleExtensions; 53 } 54 55 private SingleResponse( 56 ASN1Sequence seq) 57 { 58 this.certID = CertID.getInstance(seq.getObjectAt(0)); 59 this.certStatus = CertStatus.getInstance(seq.getObjectAt(1)); 60 this.thisUpdate = ASN1GeneralizedTime.getInstance(seq.getObjectAt(2)); 61 62 if (seq.size() > 4) 63 { 64 this.nextUpdate = ASN1GeneralizedTime.getInstance( 65 (ASN1TaggedObject)seq.getObjectAt(3), true); 66 this.singleExtensions = Extensions.getInstance( 67 (ASN1TaggedObject)seq.getObjectAt(4), true); 68 } 69 else if (seq.size() > 3) 70 { 71 ASN1TaggedObject o = (ASN1TaggedObject)seq.getObjectAt(3); 72 73 if (o.getTagNo() == 0) 74 { 75 this.nextUpdate = ASN1GeneralizedTime.getInstance(o, true); 76 } 77 else 78 { 79 this.singleExtensions = Extensions.getInstance(o, true); 80 } 81 } 82 } 83 84 public static SingleResponse getInstance( 85 ASN1TaggedObject obj, 86 boolean explicit) 87 { 88 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 89 } 90 91 public static SingleResponse getInstance( 92 Object obj) 93 { 94 if (obj instanceof SingleResponse) 95 { 96 return (SingleResponse)obj; 97 } 98 else if (obj != null) 99 { 100 return new SingleResponse(ASN1Sequence.getInstance(obj)); 101 } 102 103 return null; 104 } 105 106 public CertID getCertID() 107 { 108 return certID; 109 } 110 111 public CertStatus getCertStatus() 112 { 113 return certStatus; 114 } 115 116 public ASN1GeneralizedTime getThisUpdate() 117 { 118 return thisUpdate; 119 } 120 121 public ASN1GeneralizedTime getNextUpdate() 122 { 123 return nextUpdate; 124 } 125 126 public Extensions getSingleExtensions() 127 { 128 return singleExtensions; 129 } 130 131 /** 132 * Produce an object suitable for an ASN1OutputStream. 133 * <pre> 134 * SingleResponse ::= SEQUENCE { 135 * certID CertID, 136 * certStatus CertStatus, 137 * thisUpdate GeneralizedTime, 138 * nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL, 139 * singleExtensions [1] EXPLICIT Extensions OPTIONAL } 140 * </pre> 141 */ 142 public ASN1Primitive toASN1Primitive() 143 { 144 ASN1EncodableVector v = new ASN1EncodableVector(); 145 146 v.add(certID); 147 v.add(certStatus); 148 v.add(thisUpdate); 149 150 if (nextUpdate != null) 151 { 152 v.add(new DERTaggedObject(true, 0, nextUpdate)); 153 } 154 155 if (singleExtensions != null) 156 { 157 v.add(new DERTaggedObject(true, 1, singleExtensions)); 158 } 159 160 return new DERSequence(v); 161 } 162} 163