001package org.apache.commons.ssl.org.bouncycastle.asn1.pkcs;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERNull;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DEROctetString;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
011import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
012import org.apache.commons.ssl.org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
013import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
014
015public class RSAESOAEPparams
016    extends ASN1Object
017{
018    private AlgorithmIdentifier hashAlgorithm;
019    private AlgorithmIdentifier maskGenAlgorithm;
020    private AlgorithmIdentifier pSourceAlgorithm;
021    
022    public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE);
023    public final static AlgorithmIdentifier DEFAULT_MASK_GEN_FUNCTION = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_mgf1, DEFAULT_HASH_ALGORITHM);
024    public final static AlgorithmIdentifier DEFAULT_P_SOURCE_ALGORITHM = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_pSpecified, new DEROctetString(new byte[0]));
025    
026    public static RSAESOAEPparams getInstance(
027        Object  obj)
028    {
029        if (obj instanceof RSAESOAEPparams)
030        {
031            return (RSAESOAEPparams)obj;
032        }
033        else if (obj != null)
034        {
035            return new RSAESOAEPparams(ASN1Sequence.getInstance(obj));
036        }
037
038        return null;
039    }
040    
041    /**
042     * The default version
043     */
044    public RSAESOAEPparams()
045    {
046        hashAlgorithm = DEFAULT_HASH_ALGORITHM;
047        maskGenAlgorithm = DEFAULT_MASK_GEN_FUNCTION;
048        pSourceAlgorithm = DEFAULT_P_SOURCE_ALGORITHM;
049    }
050    
051    public RSAESOAEPparams(
052        AlgorithmIdentifier hashAlgorithm,
053        AlgorithmIdentifier maskGenAlgorithm,
054        AlgorithmIdentifier pSourceAlgorithm)
055    {
056        this.hashAlgorithm = hashAlgorithm;
057        this.maskGenAlgorithm = maskGenAlgorithm;
058        this.pSourceAlgorithm = pSourceAlgorithm;
059    }
060
061    /**
062     * @deprecated use getInstance()
063     * @param seq
064     */
065    public RSAESOAEPparams(
066        ASN1Sequence seq)
067    {
068        hashAlgorithm = DEFAULT_HASH_ALGORITHM;
069        maskGenAlgorithm = DEFAULT_MASK_GEN_FUNCTION;
070        pSourceAlgorithm = DEFAULT_P_SOURCE_ALGORITHM;
071        
072        for (int i = 0; i != seq.size(); i++)
073        {
074            ASN1TaggedObject    o = (ASN1TaggedObject)seq.getObjectAt(i);
075            
076            switch (o.getTagNo())
077            {
078            case 0:
079                hashAlgorithm = AlgorithmIdentifier.getInstance(o, true);
080                break;
081            case 1:
082                maskGenAlgorithm = AlgorithmIdentifier.getInstance(o, true);
083                break;
084            case 2:
085                pSourceAlgorithm = AlgorithmIdentifier.getInstance(o, true);
086                break;
087            default:
088                throw new IllegalArgumentException("unknown tag");
089            }
090        }
091    }
092    
093    public AlgorithmIdentifier getHashAlgorithm()
094    {
095        return hashAlgorithm;
096    }
097    
098    public AlgorithmIdentifier getMaskGenAlgorithm()
099    {
100        return maskGenAlgorithm;
101    }
102    
103    public AlgorithmIdentifier getPSourceAlgorithm()
104    {
105        return pSourceAlgorithm;
106    }
107    
108    /**
109     * <pre>
110     *  RSAES-OAEP-params ::= SEQUENCE {
111     *     hashAlgorithm      [0] OAEP-PSSDigestAlgorithms     DEFAULT sha1,
112     *     maskGenAlgorithm   [1] PKCS1MGFAlgorithms  DEFAULT mgf1SHA1,
113     *     pSourceAlgorithm   [2] PKCS1PSourceAlgorithms  DEFAULT pSpecifiedEmpty
114     *   }
115     *  
116     *   OAEP-PSSDigestAlgorithms    ALGORITHM-IDENTIFIER ::= {
117     *     { OID id-sha1 PARAMETERS NULL   }|
118     *     { OID id-sha256 PARAMETERS NULL }|
119     *     { OID id-sha384 PARAMETERS NULL }|
120     *     { OID id-sha512 PARAMETERS NULL },
121     *     ...  -- Allows for future expansion --
122     *   }
123     *   PKCS1MGFAlgorithms    ALGORITHM-IDENTIFIER ::= {
124     *     { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms },
125     *    ...  -- Allows for future expansion --
126     *   }
127     *   PKCS1PSourceAlgorithms    ALGORITHM-IDENTIFIER ::= {
128     *     { OID id-pSpecified PARAMETERS OCTET STRING },
129     *     ...  -- Allows for future expansion --
130     *  }
131     * </pre>
132     * @return the asn1 primitive representing the parameters.
133     */
134    public ASN1Primitive toASN1Primitive()
135    {
136        ASN1EncodableVector v = new ASN1EncodableVector();
137        
138        if (!hashAlgorithm.equals(DEFAULT_HASH_ALGORITHM))
139        {
140            v.add(new DERTaggedObject(true, 0, hashAlgorithm));
141        }
142        
143        if (!maskGenAlgorithm.equals(DEFAULT_MASK_GEN_FUNCTION))
144        {
145            v.add(new DERTaggedObject(true, 1, maskGenAlgorithm));
146        }
147        
148        if (!pSourceAlgorithm.equals(DEFAULT_P_SOURCE_ALGORITHM))
149        {
150            v.add(new DERTaggedObject(true, 2, pSourceAlgorithm));
151        }
152        
153        return new DERSequence(v);
154    }
155}