1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.security.spec;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The parameter specification for the RSA-PSS Signature scheme.
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Defined in the <a
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * href="http://www.rsa.com/rsalabs/pubs/PKCS/html/pkcs-1.html">PKCS #1 v2.1</a>
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * standard.
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
27f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughespublic class PSSParameterSpec implements AlgorithmParameterSpec {
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The default parameter specification. It specifies the following parameters:
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <ul>
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>message digest: {@code "SHA-1"}</li>
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>mask generation function (<i>mgf</i>): {@code "MGF1"}</li>
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>parameters for the <i>mgf</i>: {@link MGF1ParameterSpec#SHA1}</li>
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>salt length: {@code 20}</li>
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>trailer field: {@code -1}</li>
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </ul>
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final PSSParameterSpec DEFAULT = new PSSParameterSpec(20);
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Message digest algorithm name
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String mdName;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Mask generation function algorithm name
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String mgfName;
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Mask generation function parameters
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final AlgorithmParameterSpec mgfSpec;
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Trailer field value
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final int trailerField;
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Salt length in bits
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final int saltLen;
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
53f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Creates a new {@code PSSParameterSpec} with the specified salt length
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and the default values.
55f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param saltLen
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the salt length (in bits).
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code saltLen} is negative.
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PSSParameterSpec(int saltLen) {
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (saltLen < 0) {
63897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes            throw new IllegalArgumentException("saltLen < 0");
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.saltLen = saltLen;
66f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        this.mdName = "SHA-1";
67f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        this.mgfName = "MGF1";
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.mgfSpec = MGF1ParameterSpec.SHA1;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.trailerField = 1;
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new {@code PSSParameterSpec} with the specified message digest
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * name, mask generation function name, mask generation function parameters,
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * salt length, and trailer field value.
76f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param mdName
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the message digest algorithm.
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param mgfName
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the mask generation function algorithm.
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param mgfSpec
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parameter for the mask generation function algorithm.
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param saltLen
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the salt length (in bits).
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param trailerField
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the trailer field value.
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code saltLen} or {@code trailerField} is negative.
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PSSParameterSpec(String mdName, String mgfName,
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            AlgorithmParameterSpec mgfSpec, int saltLen, int trailerField) {
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (mdName == null) {
94897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes            throw new NullPointerException("mdName == null");
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (mgfName == null) {
97897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes            throw new NullPointerException("mgfName == null");
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (saltLen < 0) {
100897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes            throw new IllegalArgumentException("saltLen < 0");
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (trailerField < 0) {
103897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes            throw new IllegalArgumentException("trailerField < 0");
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.mdName = mdName;
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.mgfName = mgfName;
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.mgfSpec = mgfSpec;
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.saltLen = saltLen;
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.trailerField = trailerField;
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the length of the salt (in bits).
114f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the length of the salt (in bits).
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getSaltLength() {
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return saltLen;
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of the message digest algorithm.
123f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of the message digest algorithm.
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getDigestAlgorithm() {
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return mdName;
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of the mask generation function algorithm.
132f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of the mask generation function algorithm.
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getMGFAlgorithm() {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return mgfName;
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the parameter for the mask generation function algorithm.
141f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the parameter for the mask generation function algorithm, or
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code null} if none specified.
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public AlgorithmParameterSpec getMGFParameters() {
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return mgfSpec;
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the trailer field value.
151f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the trailer field value.
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getTrailerField() {
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return trailerField;
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
158