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.NoSuchProviderException; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Provider; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.SecureRandom; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Security; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.AlgorithmParameterSpec; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.fortress.Engine; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class provides the functionality for a key exchange protocol. This 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * enables two or more parties to agree on a secret key for symmetric 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * cryptography. 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class KeyAgreement { 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Used to access common engine functionality 390a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom private static final Engine ENGINE = new Engine("KeyAgreement"); 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store SecureRandom 420a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom private static final SecureRandom RANDOM = new SecureRandom(); 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store used provider 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Provider provider; 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store used spi implementation 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final KeyAgreementSpi spiImpl; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store used algorithm name 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String algorithm; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new {@code KeyAgreement} instance. 55ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param keyAgreeSpi 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the <b>SPI</b> delegate. 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param provider 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the provider providing this KeyAgreement. 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param algorithm 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the key agreement algorithm. 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected KeyAgreement(KeyAgreementSpi keyAgreeSpi, Provider provider, 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String algorithm) { 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.provider = provider; 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.algorithm = algorithm; 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.spiImpl = keyAgreeSpi; 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the name of the key agreement algorithm. 72ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the name of the key agreement algorithm. 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final String getAlgorithm() { 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return algorithm; 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the provider for this {@code KeyAgreement} instance. 81ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the provider for this {@code KeyAgreement} instance. 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Provider getProvider() { 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return provider; 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new {@code KeyAgreement} for the specified algorithm. 90ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param algorithm 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the key agreement algorithm to create. 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a key agreement for the specified algorithm. 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if no installed provider can provide the requested algorithm. 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified algorithm is {@code null}. 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final KeyAgreement getInstance(String algorithm) 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws NoSuchAlgorithmException { 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (algorithm == null) { 10286acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("algorithm == null"); 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1046cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom Engine.SpiAndProvider sap = ENGINE.getInstance(algorithm, null); 1056cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom return new KeyAgreement((KeyAgreementSpi) sap.spi, sap.provider, algorithm); 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new {@code KeyAgreement} for the specified algorithm from the 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified provider. 111ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param algorithm 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the key agreement algorithm to create. 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param provider 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the provider that provides the requested 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm. 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a key agreement for the specified algorithm from the specified 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * provider. 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified provider cannot provide the requested 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm. 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchProviderException 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified provider does not exist. 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified provider name is {@code null} or empty. 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final KeyAgreement getInstance(String algorithm, 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String provider) throws NoSuchAlgorithmException, 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project NoSuchProviderException { 13080a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes if (provider == null || provider.isEmpty()) { 13180a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes throw new IllegalArgumentException("Provider is null or empty"); 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Provider impProvider = Security.getProvider(provider); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (impProvider == null) { 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NoSuchProviderException(provider); 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getInstance(algorithm, impProvider); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Create a new {@code KeyAgreement} for the specified algorithm from the 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified provider. 143ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param algorithm 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the key agreement algorithm to create. 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param provider 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the provider that provides the requested algorithm. 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a key agreement for the specified algorithm from the specified 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * provider. 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified provider cannot provide the requested 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm. 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified provider is {@code null}. 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified algorithm name is {@code null}. 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final KeyAgreement getInstance(String algorithm, 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Provider provider) throws NoSuchAlgorithmException { 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (provider == null) { 16180a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes throw new IllegalArgumentException("provider == null"); 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (algorithm == null) { 16486acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("algorithm == null"); 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1666cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom Object spi = ENGINE.getInstance(algorithm, provider, null); 1676cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom return new KeyAgreement((KeyAgreementSpi) spi, provider, algorithm); 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Initializes this {@code KeyAgreement} with the specified key. 172ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key to initialize this key agreement. 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified key cannot be used to initialize this key 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * agreement. 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void init(Key key) throws InvalidKeyException { 1800a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom spiImpl.engineInit(key, RANDOM);//new SecureRandom()); 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Initializes this {@code KeyAgreement} with the specified key and the 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified randomness source. 186ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key to initialize this key agreement. 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param random 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the source for any randomness needed. 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified key cannot be used to initialize this key 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * agreement. 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void init(Key key, SecureRandom random) 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InvalidKeyException { 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project spiImpl.engineInit(key, random); 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Initializes this {@code KeyAgreement} with the specified key and the 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm parameters. 203ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key to initialize this key agreement. 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param params 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the parameters for this key agreement algorithm. 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified key cannot be used to initialize this key 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * agreement. 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidAlgorithmParameterException 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified parameters are invalid for this key 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * agreement algorithm. 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void init(Key key, AlgorithmParameterSpec params) 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InvalidKeyException, InvalidAlgorithmParameterException { 2170a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom spiImpl.engineInit(key, params, RANDOM);//new SecureRandom()); 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Initializes this {@code KeyAgreement} with the specified key, algorithm 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parameters and randomness source. 223ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key to initialize this key agreement. 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param params 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the parameters for this key agreement algorithm. 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param random 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the source for any randomness needed. 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified key cannot be used to initialize this key 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * agreement. 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidAlgorithmParameterException 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified parameters are invalid for this key 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * agreement algorithm. 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void init(Key key, AlgorithmParameterSpec params, 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecureRandom random) throws InvalidKeyException, 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InvalidAlgorithmParameterException { 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project spiImpl.engineInit(key, params, random); 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Does the next (or the last) phase of the key agreement, using the 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified key. 246ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key received from the other party for this phase. 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param lastPhase 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * set to {@code true} if this is the last phase of this key 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * agreement. 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the intermediate key from this phase or {@code null} if there is 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * no intermediate key for this phase. 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified key cannot be used in this key agreement or 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this phase, 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this instance has not been initialized. 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Key doPhase(Key key, boolean lastPhase) 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InvalidKeyException, IllegalStateException { 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return spiImpl.engineDoPhase(key, lastPhase); 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Generates the shared secret. 267ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the generated shared secret. 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this key agreement is not complete. 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final byte[] generateSecret() throws IllegalStateException { 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return spiImpl.engineGenerateSecret(); 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Generates the shared secret and stores it into the buffer {@code 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sharedSecred} at {@code offset}. 279ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param sharedSecret 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer to store the shared secret. 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the offset in the buffer. 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes stored in the buffer. 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this key agreement is not complete. 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ShortBufferException 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified buffer is too small for the shared secret. 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int generateSecret(byte[] sharedSecret, int offset) 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IllegalStateException, ShortBufferException { 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return spiImpl.engineGenerateSecret(sharedSecret, offset); 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Generates the shared secret. 297ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param algorithm 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the algorithm to for the {@code SecretKey} 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the shared secret as a {@code SecretKey} of the specified 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm. 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this key agreement is not complete. 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified algorithm for the secret key does not 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exists. 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a {@code SecretKey} with the specified algorithm cannot be 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * created using the generated shared secret. 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final SecretKey generateSecret(String algorithm) 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IllegalStateException, NoSuchAlgorithmException, 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InvalidKeyException { 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return spiImpl.engineGenerateSecret(algorithm); 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 31780a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes} 318