1package org.bouncycastle.asn1.pkcs;
2
3import java.math.BigInteger;
4
5import org.bouncycastle.asn1.ASN1EncodableVector;
6import org.bouncycastle.asn1.ASN1Integer;
7import org.bouncycastle.asn1.ASN1Object;
8import org.bouncycastle.asn1.ASN1Primitive;
9import org.bouncycastle.asn1.ASN1Sequence;
10import org.bouncycastle.asn1.ASN1TaggedObject;
11import org.bouncycastle.asn1.DERNull;
12import org.bouncycastle.asn1.DERSequence;
13import org.bouncycastle.asn1.DERTaggedObject;
14import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
15import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
16
17public class RSASSAPSSparams
18    extends ASN1Object
19{
20    private AlgorithmIdentifier hashAlgorithm;
21    private AlgorithmIdentifier maskGenAlgorithm;
22    private ASN1Integer          saltLength;
23    private ASN1Integer          trailerField;
24
25    // BEGIN android-changed
26    public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE);
27    // END android-changed
28    public final static AlgorithmIdentifier DEFAULT_MASK_GEN_FUNCTION = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_mgf1, DEFAULT_HASH_ALGORITHM);
29    public final static ASN1Integer          DEFAULT_SALT_LENGTH = new ASN1Integer(20);
30    public final static ASN1Integer          DEFAULT_TRAILER_FIELD = new ASN1Integer(1);
31
32    public static RSASSAPSSparams getInstance(
33        Object  obj)
34    {
35        if (obj instanceof RSASSAPSSparams)
36        {
37            return (RSASSAPSSparams)obj;
38        }
39        else if (obj != null)
40        {
41            return new RSASSAPSSparams(ASN1Sequence.getInstance(obj));
42        }
43
44        return null;
45    }
46
47    /**
48     * The default version
49     */
50    public RSASSAPSSparams()
51    {
52        hashAlgorithm = DEFAULT_HASH_ALGORITHM;
53        maskGenAlgorithm = DEFAULT_MASK_GEN_FUNCTION;
54        saltLength = DEFAULT_SALT_LENGTH;
55        trailerField = DEFAULT_TRAILER_FIELD;
56    }
57
58    public RSASSAPSSparams(
59        AlgorithmIdentifier hashAlgorithm,
60        AlgorithmIdentifier maskGenAlgorithm,
61        ASN1Integer          saltLength,
62        ASN1Integer          trailerField)
63    {
64        this.hashAlgorithm = hashAlgorithm;
65        this.maskGenAlgorithm = maskGenAlgorithm;
66        this.saltLength = saltLength;
67        this.trailerField = trailerField;
68    }
69
70    private RSASSAPSSparams(
71        ASN1Sequence seq)
72    {
73        hashAlgorithm = DEFAULT_HASH_ALGORITHM;
74        maskGenAlgorithm = DEFAULT_MASK_GEN_FUNCTION;
75        saltLength = DEFAULT_SALT_LENGTH;
76        trailerField = DEFAULT_TRAILER_FIELD;
77
78        for (int i = 0; i != seq.size(); i++)
79        {
80            ASN1TaggedObject    o = (ASN1TaggedObject)seq.getObjectAt(i);
81
82            switch (o.getTagNo())
83            {
84            case 0:
85                hashAlgorithm = AlgorithmIdentifier.getInstance(o, true);
86                break;
87            case 1:
88                maskGenAlgorithm = AlgorithmIdentifier.getInstance(o, true);
89                break;
90            case 2:
91                saltLength = ASN1Integer.getInstance(o, true);
92                break;
93            case 3:
94                trailerField = ASN1Integer.getInstance(o, true);
95                break;
96            default:
97                throw new IllegalArgumentException("unknown tag");
98            }
99        }
100    }
101
102    public AlgorithmIdentifier getHashAlgorithm()
103    {
104        return hashAlgorithm;
105    }
106
107    public AlgorithmIdentifier getMaskGenAlgorithm()
108    {
109        return maskGenAlgorithm;
110    }
111
112    public BigInteger getSaltLength()
113    {
114        return saltLength.getValue();
115    }
116
117    public BigInteger getTrailerField()
118    {
119        return trailerField.getValue();
120    }
121
122    /**
123     * <pre>
124     * RSASSA-PSS-params ::= SEQUENCE {
125     *   hashAlgorithm      [0] OAEP-PSSDigestAlgorithms  DEFAULT sha1,
126     *    maskGenAlgorithm   [1] PKCS1MGFAlgorithms  DEFAULT mgf1SHA1,
127     *    saltLength         [2] INTEGER  DEFAULT 20,
128     *    trailerField       [3] TrailerField  DEFAULT trailerFieldBC
129     *  }
130     *
131     * OAEP-PSSDigestAlgorithms    ALGORITHM-IDENTIFIER ::= {
132     *    { OID id-sha1 PARAMETERS NULL   }|
133     *    { OID id-sha256 PARAMETERS NULL }|
134     *    { OID id-sha384 PARAMETERS NULL }|
135     *    { OID id-sha512 PARAMETERS NULL },
136     *    ...  -- Allows for future expansion --
137     * }
138     *
139     * PKCS1MGFAlgorithms    ALGORITHM-IDENTIFIER ::= {
140     *   { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms },
141     *    ...  -- Allows for future expansion --
142     * }
143     *
144     * TrailerField ::= INTEGER { trailerFieldBC(1) }
145     * </pre>
146     * @return the asn1 primitive representing the parameters.
147     */
148    public ASN1Primitive toASN1Primitive()
149    {
150        ASN1EncodableVector v = new ASN1EncodableVector();
151
152        if (!hashAlgorithm.equals(DEFAULT_HASH_ALGORITHM))
153        {
154            v.add(new DERTaggedObject(true, 0, hashAlgorithm));
155        }
156
157        if (!maskGenAlgorithm.equals(DEFAULT_MASK_GEN_FUNCTION))
158        {
159            v.add(new DERTaggedObject(true, 1, maskGenAlgorithm));
160        }
161
162        if (!saltLength.equals(DEFAULT_SALT_LENGTH))
163        {
164            v.add(new DERTaggedObject(true, 2, saltLength));
165        }
166
167        if (!trailerField.equals(DEFAULT_TRAILER_FIELD))
168        {
169            v.add(new DERTaggedObject(true, 3, trailerField));
170        }
171
172        return new DERSequence(v);
173    }
174}
175