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 Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.security.provider.crypto;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.MessageDigestSpi;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.DigestException;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.internal.nls.Messages;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.provider.crypto.SHA1_Data;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.provider.crypto.SHA1Impl;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This class extends the MessageDigestSpi class implementing all its abstract methods;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * it overrides the "Object clone()" and "int engineGetDigestLength()" methods. <BR>
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The class implements the Cloneable interface.
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class SHA1_MessageDigestImpl extends MessageDigestSpi
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    implements Cloneable, SHA1_Data {
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private  int buffer[];       // buffer has the following structure:
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                 // -  0-16 - frame for accumulating a message
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                 // - 17-79 - for SHA1Impl methods
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                 // - 80    - unused
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                 // - 81    - to store length of the message
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                 // - 82-86 - frame for current message digest
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private byte oneByte[];      // one byte buffer needed to use in engineUpdate(byte)
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                 // having buffer as private field is just optimization
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int messageLength;   // total length of bytes supplied by user
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  The constructor creates needed buffers and sets the engine at initial state
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public SHA1_MessageDigestImpl() {
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BYTES_OFFSET +6 is minimal length required by methods in SHA1Impl
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer  = new int[BYTES_OFFSET +6];
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        oneByte = new byte[1];
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        engineReset();
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The method performs final actions and invokes the "computeHash(int[])" method.
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * In case if there is no enough words in current frame
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * after processing its data, extra frame is prepared and
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the "computeHash(int[])" method is invoked second time. <BR>
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * After processing, the method resets engine's state
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       digest - byte array
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       offset - offset in digest
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void processDigest(byte[] digest, int offset) {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int i, j;         // implementation variables
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int lastWord;     //
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        long nBits = messageLength <<3 ;  // length has to be calculated before padding
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        engineUpdate( (byte) 0x80 );      // beginning byte in padding
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        i = 0;                     // i contains number of beginning word for following loop
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        lastWord = (buffer[BYTES_OFFSET] + 3)>>2 ;  // computing of # of full words by shifting
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                                    // # of bytes
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // possible cases:
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // - buffer[BYTES_OFFSET] == 0 - buffer frame is empty,
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //                         padding byte was 64th in previous frame
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //                         current frame should contain only message's length
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // - lastWord < 14 - two last, these are 14 & 15, words in 16 word frame are free;
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //                   no extra frame needed
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // - lastWord = 14 - only one last, namely 15-th, word in frame doesn't contain bytes;
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //                   extra frame is needed
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // - lastWord > 14 - last word in frame is not full;
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //                   extra frame is needed
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ( buffer[BYTES_OFFSET] != 0 ) {
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if ( lastWord < 15 ) {
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                i = lastWord;
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if ( lastWord == 15 ) {
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buffer[15] = 0;       // last word in frame is set to "0"
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                SHA1Impl.computeHash(buffer);
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                i = 0;
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Arrays.fill(buffer, i, 14, 0);
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer[14] = (int)( nBits >>>32 );
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer[15] = (int)( nBits & 0xFFFFFFFF );
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SHA1Impl.computeHash(buffer);
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // converting 5-word frame into 20 bytes
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        j = offset;
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for ( i = HASH_OFFSET; i < HASH_OFFSET +5; i++ ) {
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int k = buffer[i];
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            digest[j  ] = (byte) ( k >>>24 );   // getting first  byte from left
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            digest[j+1] = (byte) ( k >>>16 );   // getting second byte from left
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            digest[j+2] = (byte) ( k >>> 8 );   // getting third  byte from left
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            digest[j+3] = (byte) ( k       );   // getting fourth byte from left
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            j += 4;
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        engineReset();
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //  methods specified in java.security.MessageDigestSpi
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a "deep" copy of this SHA1MDImpl object. <BR>
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The method overrides "clone()" in class Object. <BR>
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       a clone of this object
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Object clone() throws CloneNotSupportedException {
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SHA1_MessageDigestImpl cloneObj = (SHA1_MessageDigestImpl) super.clone();
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cloneObj.buffer  = ( int[])buffer.clone();
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cloneObj.oneByte = (byte[])oneByte.clone();
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return cloneObj;
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Computes a message digest value. <BR>
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The method resets the engine. <BR>
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The method overrides "engineDigest()" in class MessageDigestSpi. <BR>
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       byte array containing message digest value
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected byte[] engineDigest() {
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] hash = new byte[DIGEST_LENGTH];
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        processDigest(hash, 0);
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return hash;
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Computes message digest value.
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Upon return, the value is stored in "buf" buffer beginning "offset" byte. <BR>
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The method resets the engine. <BR>
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The method overrides "engineDigest(byte[],int,int) in class MessageDigestSpi.
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       buf    byte array to store a message digest returned
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       offset a position in the array for first byte of the message digest
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       len    number of bytes within buffer allotted for the message digest;
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                as this implementation doesn't provide partial digests,
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                len should be >= 20, DigestException is thrown otherwise
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       the length of the message digest stored in the "buf" buffer;
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       in this implementation the length=20
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *               if null is passed to the "buf" argument <BR>
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *               if offset + len > buf.length  <BR>
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *               if offset > buf.length or len > buf.length
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws DigestException
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *               if len < 20
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws  ArrayIndexOutOfBoundsException
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *               if offset < 0
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected int engineDigest(byte[] buf, int offset, int len) throws DigestException {
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ( buf == null ) {
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("security.162"));  //$NON-NLS-1$
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ( offset > buf.length || len > buf.length || (len + offset) > buf.length ) {
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException(
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               Messages.getString("security.163")); //$NON-NLS-1$
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ( len < DIGEST_LENGTH ) {
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new DigestException(Messages.getString("security.164")); //$NON-NLS-1$
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ( offset < 0 ) {
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new ArrayIndexOutOfBoundsException(Messages.getString("security.165", offset)); //$NON-NLS-1$
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        processDigest(buf, offset);
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return DIGEST_LENGTH;
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a message digest length. <BR>
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The method overrides "engineGetDigestLength()" in class MessageDigestSpi. <BR>
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        total length of current message digest as an int value
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected int engineGetDigestLength() {
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return DIGEST_LENGTH;
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resets the engine. <BR>
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The method overrides "engineReset()" in class MessageDigestSpi. <BR>
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void engineReset() {
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        messageLength = 0;
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer[BYTES_OFFSET] = 0;
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer[HASH_OFFSET   ] = H0;
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer[HASH_OFFSET +1] = H1;
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer[HASH_OFFSET +2] = H2;
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer[HASH_OFFSET +3] = H3;
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer[HASH_OFFSET +4] = H4;
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Supplements a byte to current message. <BR>
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The method overrides "engineUpdate(byte)" in class MessageDigestSpi. <BR>
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       input byte to add to current message
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void engineUpdate(byte input) {
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        oneByte[0] = input;
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SHA1Impl.updateHash( buffer, oneByte, 0, 0 );
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        messageLength++;
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Updates current message. <BR>
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The method overrides "engineUpdate(byte[],int,int)" in class MessageDigestSpi. <BR>
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The method silently returns if "len" <= 0.
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       input  a byte array
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       offset a number of first byte in the "input" array to use for updating
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       len    a number of bytes to use
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if null is passed to the "buf" argument
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if offset > buf.length or len > buf.length or
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                (len + offset) > buf.length
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                offset < 0
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void engineUpdate(byte[] input, int offset, int len) {
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ( input == null ) {
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("security.166"));  //$NON-NLS-1$
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ( len <= 0 ) {
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ( offset < 0 ) {
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new ArrayIndexOutOfBoundsException(Messages.getString("security.165", offset)); //$NON-NLS-1$
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ( offset > input.length || len > input.length || (len + offset) > input.length ) {
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException(
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               Messages.getString("security.167")); //$NON-NLS-1$
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SHA1Impl.updateHash(buffer, input, offset, offset + len -1 );
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        messageLength += len;
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
326