001package org.apache.commons.ssl.org.bouncycastle.asn1.x509; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 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.DERBitString; 011import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 012 013public class AttributeCertificateInfo 014 extends ASN1Object 015{ 016 private ASN1Integer version; 017 private Holder holder; 018 private AttCertIssuer issuer; 019 private AlgorithmIdentifier signature; 020 private ASN1Integer serialNumber; 021 private AttCertValidityPeriod attrCertValidityPeriod; 022 private ASN1Sequence attributes; 023 private DERBitString issuerUniqueID; 024 private Extensions extensions; 025 026 public static AttributeCertificateInfo getInstance( 027 ASN1TaggedObject obj, 028 boolean explicit) 029 { 030 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 031 } 032 033 public static AttributeCertificateInfo getInstance( 034 Object obj) 035 { 036 if (obj instanceof AttributeCertificateInfo) 037 { 038 return (AttributeCertificateInfo)obj; 039 } 040 else if (obj != null) 041 { 042 return new AttributeCertificateInfo(ASN1Sequence.getInstance(obj)); 043 } 044 045 return null; 046 } 047 048 private AttributeCertificateInfo( 049 ASN1Sequence seq) 050 { 051 if (seq.size() < 6 || seq.size() > 9) 052 { 053 throw new IllegalArgumentException("Bad sequence size: " + seq.size()); 054 } 055 056 int start; 057 if (seq.getObjectAt(0) instanceof ASN1Integer) // in version 1 certs version is DEFAULT v1(0) 058 { 059 this.version = ASN1Integer.getInstance(seq.getObjectAt(0)); 060 start = 1; 061 } 062 else 063 { 064 this.version = new ASN1Integer(0); 065 start = 0; 066 } 067 068 this.holder = Holder.getInstance(seq.getObjectAt(start)); 069 this.issuer = AttCertIssuer.getInstance(seq.getObjectAt(start + 1)); 070 this.signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(start + 2)); 071 this.serialNumber = ASN1Integer.getInstance(seq.getObjectAt(start + 3)); 072 this.attrCertValidityPeriod = AttCertValidityPeriod.getInstance(seq.getObjectAt(start + 4)); 073 this.attributes = ASN1Sequence.getInstance(seq.getObjectAt(start + 5)); 074 075 for (int i = start + 6; i < seq.size(); i++) 076 { 077 ASN1Encodable obj = seq.getObjectAt(i); 078 079 if (obj instanceof DERBitString) 080 { 081 this.issuerUniqueID = DERBitString.getInstance(seq.getObjectAt(i)); 082 } 083 else if (obj instanceof ASN1Sequence || obj instanceof Extensions) 084 { 085 this.extensions = Extensions.getInstance(seq.getObjectAt(i)); 086 } 087 } 088 } 089 090 public ASN1Integer getVersion() 091 { 092 return version; 093 } 094 095 public Holder getHolder() 096 { 097 return holder; 098 } 099 100 public AttCertIssuer getIssuer() 101 { 102 return issuer; 103 } 104 105 public AlgorithmIdentifier getSignature() 106 { 107 return signature; 108 } 109 110 public ASN1Integer getSerialNumber() 111 { 112 return serialNumber; 113 } 114 115 public AttCertValidityPeriod getAttrCertValidityPeriod() 116 { 117 return attrCertValidityPeriod; 118 } 119 120 public ASN1Sequence getAttributes() 121 { 122 return attributes; 123 } 124 125 public DERBitString getIssuerUniqueID() 126 { 127 return issuerUniqueID; 128 } 129 130 public Extensions getExtensions() 131 { 132 return extensions; 133 } 134 135 /** 136 * Produce an object suitable for an ASN1OutputStream. 137 * <pre> 138 * AttributeCertificateInfo ::= SEQUENCE { 139 * version AttCertVersion -- version is v2, 140 * holder Holder, 141 * issuer AttCertIssuer, 142 * signature AlgorithmIdentifier, 143 * serialNumber CertificateSerialNumber, 144 * attrCertValidityPeriod AttCertValidityPeriod, 145 * attributes SEQUENCE OF Attribute, 146 * issuerUniqueID UniqueIdentifier OPTIONAL, 147 * extensions Extensions OPTIONAL 148 * } 149 * 150 * AttCertVersion ::= INTEGER { v2(1) } 151 * </pre> 152 */ 153 public ASN1Primitive toASN1Primitive() 154 { 155 ASN1EncodableVector v = new ASN1EncodableVector(); 156 157 if (version.getValue().intValue() != 0) 158 { 159 v.add(version); 160 } 161 v.add(holder); 162 v.add(issuer); 163 v.add(signature); 164 v.add(serialNumber); 165 v.add(attrCertValidityPeriod); 166 v.add(attributes); 167 168 if (issuerUniqueID != null) 169 { 170 v.add(issuerUniqueID); 171 } 172 173 if (extensions != null) 174 { 175 v.add(extensions); 176 } 177 178 return new DERSequence(v); 179 } 180}