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.ASN1GeneralizedTime;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERSet;
011
012/**
013 * Generator for Version 2 AttributeCertificateInfo
014 * <pre>
015 * AttributeCertificateInfo ::= SEQUENCE {
016 *       version              AttCertVersion -- version is v2,
017 *       holder               Holder,
018 *       issuer               AttCertIssuer,
019 *       signature            AlgorithmIdentifier,
020 *       serialNumber         CertificateSerialNumber,
021 *       attrCertValidityPeriod   AttCertValidityPeriod,
022 *       attributes           SEQUENCE OF Attribute,
023 *       issuerUniqueID       UniqueIdentifier OPTIONAL,
024 *       extensions           Extensions OPTIONAL
025 * }
026 * </pre>
027 *
028 */
029public class V2AttributeCertificateInfoGenerator
030{
031    private ASN1Integer version;
032    private Holder holder;
033    private AttCertIssuer issuer;
034    private AlgorithmIdentifier signature;
035    private ASN1Integer serialNumber;
036    private ASN1EncodableVector attributes;
037    private DERBitString issuerUniqueID;
038    private Extensions extensions;
039
040    // Note: validity period start/end dates stored directly
041    //private AttCertValidityPeriod attrCertValidityPeriod;
042    private ASN1GeneralizedTime startDate, endDate; 
043
044    public V2AttributeCertificateInfoGenerator()
045    {
046        this.version = new ASN1Integer(1);
047        attributes = new ASN1EncodableVector();
048    }
049    
050    public void setHolder(Holder holder)
051    {
052        this.holder = holder;
053    }
054    
055    public void addAttribute(String oid, ASN1Encodable value) 
056    {
057        attributes.add(new Attribute(new ASN1ObjectIdentifier(oid), new DERSet(value)));
058    }
059
060    /**
061     * @param attribute
062     */
063    public void addAttribute(Attribute attribute)
064    {
065        attributes.add(attribute);
066    }
067    
068    public void setSerialNumber(
069        ASN1Integer  serialNumber)
070    {
071        this.serialNumber = serialNumber;
072    }
073
074    public void setSignature(
075        AlgorithmIdentifier    signature)
076    {
077        this.signature = signature;
078    }
079
080    public void setIssuer(
081        AttCertIssuer    issuer)
082    {
083        this.issuer = issuer;
084    }
085
086    public void setStartDate(
087        ASN1GeneralizedTime startDate)
088    {
089        this.startDate = startDate;
090    }
091
092    public void setEndDate(
093        ASN1GeneralizedTime endDate)
094    {
095        this.endDate = endDate;
096    }
097
098    public void setIssuerUniqueID(
099        DERBitString    issuerUniqueID)
100    {
101        this.issuerUniqueID = issuerUniqueID;
102    }
103
104    /**
105     * @deprecated use method taking Extensions
106     * @param extensions
107     */
108    public void setExtensions(
109        X509Extensions    extensions)
110    {
111        this.extensions = Extensions.getInstance(extensions.toASN1Primitive());
112    }
113
114    public void setExtensions(
115        Extensions    extensions)
116    {
117        this.extensions = extensions;
118    }
119
120    public AttributeCertificateInfo generateAttributeCertificateInfo()
121    {
122        if ((serialNumber == null) || (signature == null)
123            || (issuer == null) || (startDate == null) || (endDate == null)
124            || (holder == null) || (attributes == null))
125        {
126            throw new IllegalStateException("not all mandatory fields set in V2 AttributeCertificateInfo generator");
127        }
128
129        ASN1EncodableVector  v = new ASN1EncodableVector();
130
131        v.add(version);
132        v.add(holder);
133        v.add(issuer);
134        v.add(signature);
135        v.add(serialNumber);
136    
137        //
138        // before and after dates => AttCertValidityPeriod
139        //
140        AttCertValidityPeriod validity = new AttCertValidityPeriod(startDate, endDate);
141        v.add(validity);
142        
143        // Attributes
144        v.add(new DERSequence(attributes));
145        
146        if (issuerUniqueID != null)
147        {
148            v.add(issuerUniqueID);
149        }
150    
151        if (extensions != null)
152        {
153            v.add(extensions);
154        }
155
156        return AttributeCertificateInfo.getInstance(new DERSequence(v));
157    }
158}