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}