History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/security/provider/SHA.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/security/provider/SHA.java+187−0
@@ -0,0 +1,187 @@
1/*
2 * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package sun.security.provider;
27
28import static sun.security.provider.ByteArrayAccess.*;
29
30/**
31 * This class implements the Secure Hash Algorithm (SHA) developed by
32 * the National Institute of Standards and Technology along with the
33 * National Security Agency. This is the updated version of SHA
34 * fip-180 as superseded by fip-180-1.
35 *
36 * <p>It implement JavaSecurity MessageDigest, and can be used by in
37 * the Java Security framework, as a pluggable implementation, as a
38 * filter for the digest stream classes.
39 *
40 * @author Roger Riggs
41 * @author Benjamin Renaud
42 * @author Andreas Sterbenz
43 */
44public final class SHA extends DigestBase {
45
46 // Buffer of int's and count of characters accumulated
47 // 64 bytes are included in each hash block so the low order
48 // bits of count are used to know how to pack the bytes into ints
49 // and to know when to compute the block and start the next one.
50 private final int[] W;
51
52 // state of this
53 private final int[] state;
54
55 /**
56 * Creates a new SHA object.
57 */
58 public SHA() {
59 super("SHA-1", 20, 64);
60 state = new int[5];
61 W = new int[80];
62 implReset();
63 }
64
65 /**
66 * Creates a SHA object.with state (for cloning) */
67 private SHA(SHA base) {
68 super(base);
69 this.state = base.state.clone();
70 this.W = new int[80];
71 }
72
73 /*
74 * Clones this object.
75 */
76 public Object clone() {
77 return new SHA(this);
78 }
79
80 /**
81 * Resets the buffers and hash value to start a new hash.
82 */
83 void implReset() {
84 state[0] = 0x67452301;
85 state[1] = 0xefcdab89;
86 state[2] = 0x98badcfe;
87 state[3] = 0x10325476;
88 state[4] = 0xc3d2e1f0;
89 }
90
91 /**
92 * Computes the final hash and copies the 20 bytes to the output array.
93 */
94 void implDigest(byte[] out, int ofs) {
95 long bitsProcessed = bytesProcessed << 3;
96
97 int index = (int)bytesProcessed & 0x3f;
98 int padLen = (index < 56) ? (56 - index) : (120 - index);
99 engineUpdate(padding, 0, padLen);
100
101 i2bBig4((int)(bitsProcessed >>> 32), buffer, 56);
102 i2bBig4((int)bitsProcessed, buffer, 60);
103 implCompress(buffer, 0);
104
105 i2bBig(state, 0, out, ofs, 20);
106 }
107
108 // Constants for each round
109 private final static int round1_kt = 0x5a827999;
110 private final static int round2_kt = 0x6ed9eba1;
111 private final static int round3_kt = 0x8f1bbcdc;
112 private final static int round4_kt = 0xca62c1d6;
113
114 /**
115 * Compute a the hash for the current block.
116 *
117 * This is in the same vein as Peter Gutmann's algorithm listed in
118 * the back of Applied Cryptography, Compact implementation of
119 * "old" NIST Secure Hash Algorithm.
120 */
121 void implCompress(byte[] buf, int ofs) {
122 b2iBig64(buf, ofs, W);
123
124 // The first 16 ints have the byte stream, compute the rest of
125 // the buffer
126 for (int t = 16; t <= 79; t++) {
127 int temp = W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16];
128 W[t] = (temp << 1) | (temp >>> 31);
129 }
130
131 int a = state[0];
132 int b = state[1];
133 int c = state[2];
134 int d = state[3];
135 int e = state[4];
136
137 // Round 1
138 for (int i = 0; i < 20; i++) {
139 int temp = ((a<<5) | (a>>>(32-5))) +
140 ((b&c)|((~b)&d))+ e + W[i] + round1_kt;
141 e = d;
142 d = c;
143 c = ((b<<30) | (b>>>(32-30)));
144 b = a;
145 a = temp;
146 }
147
148 // Round 2
149 for (int i = 20; i < 40; i++) {
150 int temp = ((a<<5) | (a>>>(32-5))) +
151 (b ^ c ^ d) + e + W[i] + round2_kt;
152 e = d;
153 d = c;
154 c = ((b<<30) | (b>>>(32-30)));
155 b = a;
156 a = temp;
157 }
158
159 // Round 3
160 for (int i = 40; i < 60; i++) {
161 int temp = ((a<<5) | (a>>>(32-5))) +
162 ((b&c)|(b&d)|(c&d)) + e + W[i] + round3_kt;
163 e = d;
164 d = c;
165 c = ((b<<30) | (b>>>(32-30)));
166 b = a;
167 a = temp;
168 }
169
170 // Round 4
171 for (int i = 60; i < 80; i++) {
172 int temp = ((a<<5) | (a>>>(32-5))) +
173 (b ^ c ^ d) + e + W[i] + round4_kt;
174 e = d;
175 d = c;
176 c = ((b<<30) | (b>>>(32-30)));
177 b = a;
178 a = temp;
179 }
180 state[0] += a;
181 state[1] += b;
182 state[2] += c;
183 state[3] += d;
184 state[4] += e;
185 }
186
187}