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