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