Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(626)

Side by Side Diff: base/sha1.cc

Issue 2076593002: base: In SHA-1 implementation use base::ByteSwap for endian conversion (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/sha1.h" 5 #include "base/sha1.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <string.h> 9 #include <string.h>
10 10
11 #include "base/sys_byteorder.h"
11 12
12 namespace base { 13 namespace base {
13 14
14 // Implementation of SHA-1. Only handles data in byte-sized blocks, 15 // Implementation of SHA-1. Only handles data in byte-sized blocks,
15 // which simplifies the code a fair bit. 16 // which simplifies the code a fair bit.
16 17
17 // Identifier names follow notation in FIPS PUB 180-3, where you'll 18 // Identifier names follow notation in FIPS PUB 180-3, where you'll
18 // also find a description of the algorithm: 19 // also find a description of the algorithm:
19 // http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf 20 // http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf
20 21
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 return 0x5a827999; 86 return 0x5a827999;
86 } else if (t < 40) { 87 } else if (t < 40) {
87 return 0x6ed9eba1; 88 return 0x6ed9eba1;
88 } else if (t < 60) { 89 } else if (t < 60) {
89 return 0x8f1bbcdc; 90 return 0x8f1bbcdc;
90 } else { 91 } else {
91 return 0xca62c1d6; 92 return 0xca62c1d6;
92 } 93 }
93 } 94 }
94 95
95 static inline void swapends(uint32_t* t) {
96 *t = (*t >> 24) | ((*t >> 8) & 0xff00) | ((*t & 0xff00) << 8) | (*t << 24);
97 }
98
99 const int SecureHashAlgorithm::kDigestSizeBytes = 20; 96 const int SecureHashAlgorithm::kDigestSizeBytes = 20;
100 97
101 void SecureHashAlgorithm::Init() { 98 void SecureHashAlgorithm::Init() {
102 A = 0; 99 A = 0;
103 B = 0; 100 B = 0;
104 C = 0; 101 C = 0;
105 D = 0; 102 D = 0;
106 E = 0; 103 E = 0;
107 cursor = 0; 104 cursor = 0;
108 l = 0; 105 l = 0;
109 H[0] = 0x67452301; 106 H[0] = 0x67452301;
110 H[1] = 0xefcdab89; 107 H[1] = 0xefcdab89;
111 H[2] = 0x98badcfe; 108 H[2] = 0x98badcfe;
112 H[3] = 0x10325476; 109 H[3] = 0x10325476;
113 H[4] = 0xc3d2e1f0; 110 H[4] = 0xc3d2e1f0;
114 } 111 }
115 112
116 void SecureHashAlgorithm::Final() { 113 void SecureHashAlgorithm::Final() {
117 Pad(); 114 Pad();
118 Process(); 115 Process();
119 116
120 for (int t = 0; t < 5; ++t) 117 for (int t = 0; t < 5; ++t)
121 swapends(&H[t]); 118 H[t] = ByteSwap(H[t]);
122 } 119 }
123 120
124 void SecureHashAlgorithm::Update(const void* data, size_t nbytes) { 121 void SecureHashAlgorithm::Update(const void* data, size_t nbytes) {
125 const uint8_t* d = reinterpret_cast<const uint8_t*>(data); 122 const uint8_t* d = reinterpret_cast<const uint8_t*>(data);
126 while (nbytes--) { 123 while (nbytes--) {
127 M[cursor++] = *d++; 124 M[cursor++] = *d++;
128 if (cursor >= 64) 125 if (cursor >= 64)
129 Process(); 126 Process();
130 l += 8; 127 l += 8;
131 } 128 }
(...skipping 26 matching lines...) Expand all
158 void SecureHashAlgorithm::Process() { 155 void SecureHashAlgorithm::Process() {
159 uint32_t t; 156 uint32_t t;
160 157
161 // Each a...e corresponds to a section in the FIPS 180-3 algorithm. 158 // Each a...e corresponds to a section in the FIPS 180-3 algorithm.
162 159
163 // a. 160 // a.
164 // 161 //
165 // W and M are in a union, so no need to memcpy. 162 // W and M are in a union, so no need to memcpy.
166 // memcpy(W, M, sizeof(M)); 163 // memcpy(W, M, sizeof(M));
167 for (t = 0; t < 16; ++t) 164 for (t = 0; t < 16; ++t)
168 swapends(&W[t]); 165 W[t] = ByteSwap(W[t]);
169 166
170 // b. 167 // b.
171 for (t = 16; t < 80; ++t) 168 for (t = 16; t < 80; ++t)
172 W[t] = S(1, W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16]); 169 W[t] = S(1, W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16]);
173 170
174 // c. 171 // c.
175 A = H[0]; 172 A = H[0];
176 B = H[1]; 173 B = H[1];
177 C = H[2]; 174 C = H[2];
178 D = H[3]; 175 D = H[3];
(...skipping 29 matching lines...) Expand all
208 void SHA1HashBytes(const unsigned char* data, size_t len, 205 void SHA1HashBytes(const unsigned char* data, size_t len,
209 unsigned char* hash) { 206 unsigned char* hash) {
210 SecureHashAlgorithm sha; 207 SecureHashAlgorithm sha;
211 sha.Update(data, len); 208 sha.Update(data, len);
212 sha.Final(); 209 sha.Final();
213 210
214 memcpy(hash, sha.Digest(), SecureHashAlgorithm::kDigestSizeBytes); 211 memcpy(hash, sha.Digest(), SecureHashAlgorithm::kDigestSizeBytes);
215 } 212 }
216 213
217 } // namespace base 214 } // namespace base
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698