1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage javax.crypto;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Key;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.InvalidKeyException;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.InvalidAlgorithmParameterException;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.AlgorithmParameterSpec;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.ByteBuffer;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The <i>Service-Provider Interface</i> (<b>SPI</b>) definition for the {@code
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Mac} class.
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Mac
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class MacSpi {
338207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a new {@code MacSpi} instance.
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public MacSpi() {
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the length of this MAC (in bytes).
428207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the length of this MAC (in bytes).
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected abstract int engineGetMacLength();
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Initializes this {@code MacSpi} instance with the specified key and
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * algorithm parameters.
508207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the key to initialize this algorithm.
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param params
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the parameters for this algorithm.
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws InvalidKeyException
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the specified key cannot be used to initialize this
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             algorithm, or it is {@code null}.
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws InvalidAlgorithmParameterException
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the specified parameters cannot be used to initialize this
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             algorithm.
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected abstract void engineInit(Key key, AlgorithmParameterSpec params)
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws InvalidKeyException, InvalidAlgorithmParameterException;
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Updates this {@code MacSpi} instance with the specified byte.
678207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param input
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the byte.
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected abstract void engineUpdate(byte input);
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Updates this {@code MacSpi} instance with the data from the specified
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer {@code input} from the specified {@code offset} and length {@code
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * len}.
778207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param input
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the buffer.
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param offset
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the offset in the buffer.
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param len
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the length of the data in the buffer.
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected abstract void engineUpdate(byte[] input, int offset, int len);
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Updates this {@code MacSpi} instance with the data from the specified
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer, starting at {@link ByteBuffer#position()}, including the next
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@link ByteBuffer#remaining()} bytes.
918207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param input
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the buffer.
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void engineUpdate(ByteBuffer input) {
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!input.hasRemaining()) {
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] bInput;
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (input.hasArray()) {
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bInput = input.array();
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int offset = input.arrayOffset();
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int position = input.position();
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int limit = input.limit();
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            engineUpdate(bInput, offset + position, limit - position);
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            input.position(limit);
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bInput = new byte[input.limit() - input.position()];
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            input.get(bInput);
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            engineUpdate(bInput, 0, bInput.length);
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Computes the digest of this MAC based on the data previously specified in
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@link #engineUpdate} calls.
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This {@code MacSpi} instance is reverted to its initial state and
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * can be used to start the next MAC computation with the same parameters or
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * initialized with different parameters.
1218207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the generated digest.
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected abstract byte[] engineDoFinal();
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resets this {@code MacSpi} instance to its initial state.
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This {@code MacSpi} instance is reverted to its initial state and can be
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * used to start the next MAC computation with the same parameters or
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * initialized with different parameters.
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected abstract void engineReset();
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Clones this {@code MacSpi} instance.
1378207f1e8dbc63916f238f81dc46567c55090e95bJesse Wilson     *
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the cloned instance.
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws CloneNotSupportedException
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if cloning is not supported.
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Object clone() throws CloneNotSupportedException {
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return super.clone();
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}