1 package org.bouncycastle.asn1.x509; 2 3 import org.bouncycastle.asn1.ASN1Encodable; 4 import org.bouncycastle.asn1.ASN1EncodableVector; 5 import org.bouncycastle.asn1.ASN1Sequence; 6 import org.bouncycastle.asn1.ASN1TaggedObject; 7 import org.bouncycastle.asn1.DERBitString; 8 import org.bouncycastle.asn1.DERInteger; 9 import org.bouncycastle.asn1.DERObject; 10 import org.bouncycastle.asn1.DERSequence; 11 12 public class AttributeCertificateInfo 13 extends ASN1Encodable 14 { 15 private DERInteger version; 16 private Holder holder; 17 private AttCertIssuer issuer; 18 private AlgorithmIdentifier signature; 19 private DERInteger serialNumber; 20 private AttCertValidityPeriod attrCertValidityPeriod; 21 private ASN1Sequence attributes; 22 private DERBitString issuerUniqueID; 23 private X509Extensions extensions; 24 25 public static AttributeCertificateInfo getInstance( 26 ASN1TaggedObject obj, 27 boolean explicit) 28 { 29 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 30 } 31 32 public static AttributeCertificateInfo getInstance( 33 Object obj) 34 { 35 if (obj instanceof AttributeCertificateInfo) 36 { 37 return (AttributeCertificateInfo)obj; 38 } 39 else if (obj instanceof ASN1Sequence) 40 { 41 return new AttributeCertificateInfo((ASN1Sequence)obj); 42 } 43 44 throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); 45 } 46 47 public AttributeCertificateInfo( 48 ASN1Sequence seq) 49 { 50 if (seq.size() < 7 || seq.size() > 9) 51 { 52 throw new IllegalArgumentException("Bad sequence size: " + seq.size()); 53 } 54 55 this.version = DERInteger.getInstance(seq.getObjectAt(0)); 56 this.holder = Holder.getInstance(seq.getObjectAt(1)); 57 this.issuer = AttCertIssuer.getInstance(seq.getObjectAt(2)); 58 this.signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(3)); 59 this.serialNumber = DERInteger.getInstance(seq.getObjectAt(4)); 60 this.attrCertValidityPeriod = AttCertValidityPeriod.getInstance(seq.getObjectAt(5)); 61 this.attributes = ASN1Sequence.getInstance(seq.getObjectAt(6)); 62 63 for (int i = 7; i < seq.size(); i++) 64 { 65 ASN1Encodable obj = (ASN1Encodable)seq.getObjectAt(i); 66 67 if (obj instanceof DERBitString) 68 { 69 this.issuerUniqueID = DERBitString.getInstance(seq.getObjectAt(i)); 70 } 71 else if (obj instanceof ASN1Sequence || obj instanceof X509Extensions) 72 { 73 this.extensions = X509Extensions.getInstance(seq.getObjectAt(i)); 74 } 75 } 76 } 77 78 public DERInteger getVersion() 79 { 80 return version; 81 } 82 83 public Holder getHolder() 84 { 85 return holder; 86 } 87 88 public AttCertIssuer getIssuer() 89 { 90 return issuer; 91 } 92 93 public AlgorithmIdentifier getSignature() 94 { 95 return signature; 96 } 97 98 public DERInteger getSerialNumber() 99 { 100 return serialNumber; 101 } 102 103 public AttCertValidityPeriod getAttrCertValidityPeriod() 104 { 105 return attrCertValidityPeriod; 106 } 107 108 public ASN1Sequence getAttributes() 109 { 110 return attributes; 111 } 112 113 public DERBitString getIssuerUniqueID() 114 { 115 return issuerUniqueID; 116 } 117 118 public X509Extensions getExtensions() 119 { 120 return extensions; 121 } 122 123 /** 124 * Produce an object suitable for an ASN1OutputStream. 125 * <pre> 126 * AttributeCertificateInfo ::= SEQUENCE { 127 * version AttCertVersion -- version is v2, 128 * holder Holder, 129 * issuer AttCertIssuer, 130 * signature AlgorithmIdentifier, 131 * serialNumber CertificateSerialNumber, 132 * attrCertValidityPeriod AttCertValidityPeriod, 133 * attributes SEQUENCE OF Attribute, 134 * issuerUniqueID UniqueIdentifier OPTIONAL, 135 * extensions Extensions OPTIONAL 136 * } 137 * 138 * AttCertVersion ::= INTEGER { v2(1) } 139 * </pre> 140 */ 141 public DERObject toASN1Object() 142 { 143 ASN1EncodableVector v = new ASN1EncodableVector(); 144 145 v.add(version); 146 v.add(holder); 147 v.add(issuer); 148 v.add(signature); 149 v.add(serialNumber); 150 v.add(attrCertValidityPeriod); 151 v.add(attributes); 152 153 if (issuerUniqueID != null) 154 { 155 v.add(issuerUniqueID); 156 } 157 158 if (extensions != null) 159 { 160 v.add(extensions); 161 } 162 163 return new DERSequence(v); 164 } 165 } 166