001package org.apache.commons.ssl.org.bouncycastle.asn1.ocsp; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1GeneralizedTime; 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject; 010import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 011import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject; 012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.Extensions; 013import org.apache.commons.ssl.org.bouncycastle.asn1.x509.X509Extensions; 014 015public class ResponseData 016 extends ASN1Object 017{ 018 private static final ASN1Integer V1 = new ASN1Integer(0); 019 020 private boolean versionPresent; 021 022 private ASN1Integer version; 023 private ResponderID responderID; 024 private ASN1GeneralizedTime producedAt; 025 private ASN1Sequence responses; 026 private Extensions responseExtensions; 027 028 public ResponseData( 029 ASN1Integer version, 030 ResponderID responderID, 031 ASN1GeneralizedTime producedAt, 032 ASN1Sequence responses, 033 Extensions responseExtensions) 034 { 035 this.version = version; 036 this.responderID = responderID; 037 this.producedAt = producedAt; 038 this.responses = responses; 039 this.responseExtensions = responseExtensions; 040 } 041 042 /** 043 * @deprecated use method taking Extensions 044 * @param responderID 045 * @param producedAt 046 * @param responses 047 * @param responseExtensions 048 */ 049 public ResponseData( 050 ResponderID responderID, 051 ASN1GeneralizedTime producedAt, 052 ASN1Sequence responses, 053 X509Extensions responseExtensions) 054 { 055 this(V1, responderID, ASN1GeneralizedTime.getInstance(producedAt), responses, Extensions.getInstance(responseExtensions)); 056 } 057 058 public ResponseData( 059 ResponderID responderID, 060 ASN1GeneralizedTime producedAt, 061 ASN1Sequence responses, 062 Extensions responseExtensions) 063 { 064 this(V1, responderID, producedAt, responses, responseExtensions); 065 } 066 067 private ResponseData( 068 ASN1Sequence seq) 069 { 070 int index = 0; 071 072 if (seq.getObjectAt(0) instanceof ASN1TaggedObject) 073 { 074 ASN1TaggedObject o = (ASN1TaggedObject)seq.getObjectAt(0); 075 076 if (o.getTagNo() == 0) 077 { 078 this.versionPresent = true; 079 this.version = ASN1Integer.getInstance( 080 (ASN1TaggedObject)seq.getObjectAt(0), true); 081 index++; 082 } 083 else 084 { 085 this.version = V1; 086 } 087 } 088 else 089 { 090 this.version = V1; 091 } 092 093 this.responderID = ResponderID.getInstance(seq.getObjectAt(index++)); 094 this.producedAt = ASN1GeneralizedTime.getInstance(seq.getObjectAt(index++)); 095 this.responses = (ASN1Sequence)seq.getObjectAt(index++); 096 097 if (seq.size() > index) 098 { 099 this.responseExtensions = Extensions.getInstance( 100 (ASN1TaggedObject)seq.getObjectAt(index), true); 101 } 102 } 103 104 public static ResponseData getInstance( 105 ASN1TaggedObject obj, 106 boolean explicit) 107 { 108 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 109 } 110 111 public static ResponseData getInstance( 112 Object obj) 113 { 114 if (obj instanceof ResponseData) 115 { 116 return (ResponseData)obj; 117 } 118 else if (obj != null) 119 { 120 return new ResponseData(ASN1Sequence.getInstance(obj)); 121 } 122 123 return null; 124 } 125 126 public ASN1Integer getVersion() 127 { 128 return version; 129 } 130 131 public ResponderID getResponderID() 132 { 133 return responderID; 134 } 135 136 public ASN1GeneralizedTime getProducedAt() 137 { 138 return producedAt; 139 } 140 141 public ASN1Sequence getResponses() 142 { 143 return responses; 144 } 145 146 public Extensions getResponseExtensions() 147 { 148 return responseExtensions; 149 } 150 151 /** 152 * Produce an object suitable for an ASN1OutputStream. 153 * <pre> 154 * ResponseData ::= SEQUENCE { 155 * version [0] EXPLICIT Version DEFAULT v1, 156 * responderID ResponderID, 157 * producedAt GeneralizedTime, 158 * responses SEQUENCE OF SingleResponse, 159 * responseExtensions [1] EXPLICIT Extensions OPTIONAL } 160 * </pre> 161 */ 162 public ASN1Primitive toASN1Primitive() 163 { 164 ASN1EncodableVector v = new ASN1EncodableVector(); 165 166 if (versionPresent || !version.equals(V1)) 167 { 168 v.add(new DERTaggedObject(true, 0, version)); 169 } 170 171 v.add(responderID); 172 v.add(producedAt); 173 v.add(responses); 174 if (responseExtensions != null) 175 { 176 v.add(new DERTaggedObject(true, 1, responseExtensions)); 177 } 178 179 return new DERSequence(v); 180 } 181}