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 207365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilsonimport java.nio.ByteBuffer; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidAlgorithmParameterException; 227365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilsonimport java.security.InvalidKeyException; 237365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilsonimport java.security.Key; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.AlgorithmParameterSpec; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The <i>Service-Provider Interface</i> (<b>SPI</b>) definition for the {@code 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Mac} class. 29f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Mac 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class MacSpi { 33ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new {@code MacSpi} instance. 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public MacSpi() { 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the length of this MAC (in bytes). 42ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the length of this MAC (in bytes). 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract int engineGetMacLength(); 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Initializes this {@code MacSpi} instance with the specified key and 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm parameters. 50ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key to initialize this algorithm. 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param params 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the parameters for this algorithm. 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified key cannot be used to initialize this 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm, or it is {@code null}. 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidAlgorithmParameterException 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified parameters cannot be used to initialize this 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm. 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void engineInit(Key key, AlgorithmParameterSpec params) 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InvalidKeyException, InvalidAlgorithmParameterException; 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Updates this {@code MacSpi} instance with the specified byte. 67ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param input 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the byte. 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void engineUpdate(byte input); 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Updates this {@code MacSpi} instance with the data from the specified 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffer {@code input} from the specified {@code offset} and length {@code 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * len}. 77ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param input 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer. 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the offset in the buffer. 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param len 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the length of the data in the buffer. 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void engineUpdate(byte[] input, int offset, int len); 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Updates this {@code MacSpi} instance with the data from the specified 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffer, starting at {@link ByteBuffer#position()}, including the next 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link ByteBuffer#remaining()} bytes. 91ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param input 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer. 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void engineUpdate(ByteBuffer input) { 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!input.hasRemaining()) { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] bInput; 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (input.hasArray()) { 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bInput = input.array(); 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int offset = input.arrayOffset(); 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int position = input.position(); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int limit = input.limit(); 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project engineUpdate(bInput, offset + position, limit - position); 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project input.position(limit); 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bInput = new byte[input.limit() - input.position()]; 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project input.get(bInput); 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project engineUpdate(bInput, 0, bInput.length); 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Computes the digest of this MAC based on the data previously specified in 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link #engineUpdate} calls. 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This {@code MacSpi} instance is reverted to its initial state and 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * can be used to start the next MAC computation with the same parameters or 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * initialized with different parameters. 121ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the generated digest. 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract byte[] engineDoFinal(); 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Resets this {@code MacSpi} instance to its initial state. 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This {@code MacSpi} instance is reverted to its initial state and can be 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used to start the next MAC computation with the same parameters or 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * initialized with different parameters. 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void engineReset(); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Clones this {@code MacSpi} instance. 137ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the cloned instance. 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws CloneNotSupportedException 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if cloning is not supported. 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object clone() throws CloneNotSupportedException { 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return super.clone(); 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1467365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilson} 147