001package org.apache.commons.ssl.org.bouncycastle.asn1.smime;
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.ASN1Object;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier;
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.DERSequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
011import org.apache.commons.ssl.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
012
013public class SMIMECapability
014    extends ASN1Object
015{
016    /**
017     * general preferences
018     */
019    public static final ASN1ObjectIdentifier preferSignedData = PKCSObjectIdentifiers.preferSignedData;
020    public static final ASN1ObjectIdentifier canNotDecryptAny = PKCSObjectIdentifiers.canNotDecryptAny;
021    public static final ASN1ObjectIdentifier sMIMECapabilitiesVersions = PKCSObjectIdentifiers.sMIMECapabilitiesVersions;
022
023    /**
024     * encryption algorithms preferences
025     */
026    public static final ASN1ObjectIdentifier dES_CBC = new ASN1ObjectIdentifier("1.3.14.3.2.7");
027    public static final ASN1ObjectIdentifier dES_EDE3_CBC = PKCSObjectIdentifiers.des_EDE3_CBC;
028    public static final ASN1ObjectIdentifier rC2_CBC = PKCSObjectIdentifiers.RC2_CBC;
029    public static final ASN1ObjectIdentifier aES128_CBC = NISTObjectIdentifiers.id_aes128_CBC;
030    public static final ASN1ObjectIdentifier aES192_CBC = NISTObjectIdentifiers.id_aes192_CBC;
031    public static final ASN1ObjectIdentifier aES256_CBC = NISTObjectIdentifiers.id_aes256_CBC;
032    
033    private ASN1ObjectIdentifier capabilityID;
034    private ASN1Encodable        parameters;
035
036    public SMIMECapability(
037        ASN1Sequence seq)
038    {
039        capabilityID = (ASN1ObjectIdentifier)seq.getObjectAt(0);
040
041        if (seq.size() > 1)
042        {
043            parameters = (ASN1Primitive)seq.getObjectAt(1);
044        }
045    }
046
047    public SMIMECapability(
048        ASN1ObjectIdentifier capabilityID,
049        ASN1Encodable        parameters)
050    {
051        this.capabilityID = capabilityID;
052        this.parameters = parameters;
053    }
054    
055    public static SMIMECapability getInstance(
056        Object obj)
057    {
058        if (obj == null || obj instanceof SMIMECapability)
059        {
060            return (SMIMECapability)obj;
061        }
062        
063        if (obj instanceof ASN1Sequence)
064        {
065            return new SMIMECapability((ASN1Sequence)obj);
066        }
067        
068        throw new IllegalArgumentException("Invalid SMIMECapability");
069    } 
070
071    public ASN1ObjectIdentifier getCapabilityID()
072    {
073        return capabilityID;
074    }
075
076    public ASN1Encodable getParameters()
077    {
078        return parameters;
079    }
080
081    /**
082     * Produce an object suitable for an ASN1OutputStream.
083     * <pre> 
084     * SMIMECapability ::= SEQUENCE {
085     *     capabilityID OBJECT IDENTIFIER,
086     *     parameters ANY DEFINED BY capabilityID OPTIONAL 
087     * }
088     * </pre>
089     */
090    public ASN1Primitive toASN1Primitive()
091    {
092        ASN1EncodableVector  v = new ASN1EncodableVector();
093
094        v.add(capabilityID);
095        
096        if (parameters != null)
097        {
098            v.add(parameters);
099        }
100        
101        return new DERSequence(v);
102    }
103}