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 javax.crypto;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidAlgorithmParameterException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidKeyException;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Key;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.SecureRandom;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.AlgorithmParameterSpec;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The <i>Service Provider Interface</i> (<b>SPI</b>) definition for the
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeyAgreement} class.
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class KeyAgreementSpi {
32ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new {@code KeyAgreementSpi} instance.
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public KeyAgreementSpi() {
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Does the next (or the last) phase of the key agreement, using the
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified key.
42ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key received from the other party for this phase.
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param lastPhase
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            set to {@code true} if this is the last phase of this key
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            agreement.
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the intermediate key from this phase or null if there is no
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         intermediate key for this phase.
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidKeyException
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified key cannot be used in this key agreement or
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             this phase,
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this instance has not been initialized.
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract Key engineDoPhase(Key key, boolean lastPhase)
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidKeyException, IllegalStateException;
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Generates the shared secret.
61ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the generated shared secret.
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this key agreement is not complete.
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract byte[] engineGenerateSecret()
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IllegalStateException;
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Generates the shared secret and stores it into the buffer {@code
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * sharedSecred} at {@code offset}.
72ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sharedSecret
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer to store the shared secret.
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the offset in the buffer.
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes stored in the buffer.
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this key agreement is not complete.
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ShortBufferException
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified buffer is too small for the shared secret.
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract int engineGenerateSecret(byte[] sharedSecret, int offset)
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IllegalStateException, ShortBufferException;
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Generates the shared secret.
88ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param algorithm
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the algorithm to for the {@code SecretKey}
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the shared secret as a {@code SecretKey} of the specified
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         algorithm.
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this key agreement is not complete.
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified algorithm for the secret key does not
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             exists.
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidKeyException
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a {@code SecretKey} with the specified algorithm cannot be
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             created using the generated shared secret.
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract SecretKey engineGenerateSecret(String algorithm)
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IllegalStateException, NoSuchAlgorithmException,
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InvalidKeyException;
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Initializes this {@code KeyAgreementSpi} with the specified key and the
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified randomness source.
109ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to initialize this key agreement.
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param random
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source for any randomness needed.
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidKeyException
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified key cannot be used to initialize this key
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             agreement.
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void engineInit(Key key, SecureRandom random)
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidKeyException;
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Initializes this {@code KeyAgreementSpi} with the specified key,
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * algorithm parameters and randomness source.
124ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to initialize this key agreement.
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param params
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parameters for this key agreement algorithm.
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param random
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source for any randomness needed.
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidKeyException
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified key cannot be used to initialize this key
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             agreement.
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidAlgorithmParameterException
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified parameters are invalid for this key
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             agreement algorithm.
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void engineInit(Key key, AlgorithmParameterSpec params,
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            SecureRandom random) throws InvalidKeyException,
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InvalidAlgorithmParameterException;
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}