1package org.bouncycastle.asn1.ocsp; 2 3import org.bouncycastle.asn1.ASN1EncodableVector; 4import org.bouncycastle.asn1.ASN1Sequence; 5import org.bouncycastle.asn1.ASN1TaggedObject; 6import org.bouncycastle.asn1.ASN1Encodable; 7import org.bouncycastle.asn1.DERInteger; 8import org.bouncycastle.asn1.DERObject; 9import org.bouncycastle.asn1.DERSequence; 10import org.bouncycastle.asn1.DERTaggedObject; 11import org.bouncycastle.asn1.x509.GeneralName; 12import org.bouncycastle.asn1.x509.X509Extensions; 13 14public class TBSRequest 15 extends ASN1Encodable 16{ 17 private static final DERInteger V1 = new DERInteger(0); 18 19 DERInteger version; 20 GeneralName requestorName; 21 ASN1Sequence requestList; 22 X509Extensions requestExtensions; 23 24 public TBSRequest( 25 GeneralName requestorName, 26 ASN1Sequence requestList, 27 X509Extensions requestExtensions) 28 { 29 this.version = V1; 30 this.requestorName = requestorName; 31 this.requestList = requestList; 32 this.requestExtensions = requestExtensions; 33 } 34 35 public TBSRequest( 36 ASN1Sequence seq) 37 { 38 int index = 0; 39 40 if (seq.getObjectAt(0) instanceof ASN1TaggedObject) 41 { 42 ASN1TaggedObject o = (ASN1TaggedObject)seq.getObjectAt(0); 43 44 if (o.getTagNo() == 0) 45 { 46 version = DERInteger.getInstance((ASN1TaggedObject)seq.getObjectAt(0), true); 47 index++; 48 } 49 else 50 { 51 version = V1; 52 } 53 } 54 else 55 { 56 version = V1; 57 } 58 59 if (seq.getObjectAt(index) instanceof ASN1TaggedObject) 60 { 61 requestorName = GeneralName.getInstance((ASN1TaggedObject)seq.getObjectAt(index++), true); 62 } 63 64 requestList = (ASN1Sequence)seq.getObjectAt(index++); 65 66 if (seq.size() == (index + 1)) 67 { 68 requestExtensions = X509Extensions.getInstance((ASN1TaggedObject)seq.getObjectAt(index), true); 69 } 70 } 71 72 public static TBSRequest getInstance( 73 ASN1TaggedObject obj, 74 boolean explicit) 75 { 76 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 77 } 78 79 public static TBSRequest getInstance( 80 Object obj) 81 { 82 if (obj == null || obj instanceof TBSRequest) 83 { 84 return (TBSRequest)obj; 85 } 86 else if (obj instanceof ASN1Sequence) 87 { 88 return new TBSRequest((ASN1Sequence)obj); 89 } 90 91 throw new IllegalArgumentException("unknown object in factory"); 92 } 93 94 public DERInteger getVersion() 95 { 96 return version; 97 } 98 99 public GeneralName getRequestorName() 100 { 101 return requestorName; 102 } 103 104 public ASN1Sequence getRequestList() 105 { 106 return requestList; 107 } 108 109 public X509Extensions getRequestExtensions() 110 { 111 return requestExtensions; 112 } 113 114 /** 115 * Produce an object suitable for an ASN1OutputStream. 116 * <pre> 117 * TBSRequest ::= SEQUENCE { 118 * version [0] EXPLICIT Version DEFAULT v1, 119 * requestorName [1] EXPLICIT GeneralName OPTIONAL, 120 * requestList SEQUENCE OF Request, 121 * requestExtensions [2] EXPLICIT Extensions OPTIONAL } 122 * </pre> 123 */ 124 public DERObject toASN1Object() 125 { 126 ASN1EncodableVector v = new ASN1EncodableVector(); 127 128 // 129 // if default don't include. 130 // 131 if (!version.equals(V1)) 132 { 133 v.add(new DERTaggedObject(true, 0, version)); 134 } 135 136 if (requestorName != null) 137 { 138 v.add(new DERTaggedObject(true, 1, requestorName)); 139 } 140 141 v.add(requestList); 142 143 if (requestExtensions != null) 144 { 145 v.add(new DERTaggedObject(true, 2, requestExtensions)); 146 } 147 148 return new DERSequence(v); 149 } 150} 151