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