1*8975f5c5SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 4*8975f5c5SAndroid Build Coastguard Worker 5*8975f5c5SAndroid Build Coastguard Worker #ifndef ANGLEBASE_SHA1_H_ 6*8975f5c5SAndroid Build Coastguard Worker #define ANGLEBASE_SHA1_H_ 7*8975f5c5SAndroid Build Coastguard Worker 8*8975f5c5SAndroid Build Coastguard Worker #include <stddef.h> 9*8975f5c5SAndroid Build Coastguard Worker #include <stdint.h> 10*8975f5c5SAndroid Build Coastguard Worker 11*8975f5c5SAndroid Build Coastguard Worker #include <array> 12*8975f5c5SAndroid Build Coastguard Worker #include <string> 13*8975f5c5SAndroid Build Coastguard Worker 14*8975f5c5SAndroid Build Coastguard Worker #include "anglebase/base_export.h" 15*8975f5c5SAndroid Build Coastguard Worker 16*8975f5c5SAndroid Build Coastguard Worker namespace angle 17*8975f5c5SAndroid Build Coastguard Worker { 18*8975f5c5SAndroid Build Coastguard Worker 19*8975f5c5SAndroid Build Coastguard Worker namespace base 20*8975f5c5SAndroid Build Coastguard Worker { 21*8975f5c5SAndroid Build Coastguard Worker 22*8975f5c5SAndroid Build Coastguard Worker // These functions perform SHA-1 operations. 23*8975f5c5SAndroid Build Coastguard Worker 24*8975f5c5SAndroid Build Coastguard Worker static const size_t kSHA1Length = 20; // Length in bytes of a SHA-1 hash. 25*8975f5c5SAndroid Build Coastguard Worker 26*8975f5c5SAndroid Build Coastguard Worker // Computes the SHA-1 hash of the input string |str| and returns the full 27*8975f5c5SAndroid Build Coastguard Worker // hash. 28*8975f5c5SAndroid Build Coastguard Worker ANGLEBASE_EXPORT std::string SHA1HashString(const std::string &str); 29*8975f5c5SAndroid Build Coastguard Worker 30*8975f5c5SAndroid Build Coastguard Worker // Computes the SHA-1 hash of the |len| bytes in |data| and puts the hash 31*8975f5c5SAndroid Build Coastguard Worker // in |hash|. |hash| must be kSHA1Length bytes long. 32*8975f5c5SAndroid Build Coastguard Worker ANGLEBASE_EXPORT void SHA1HashBytes(const unsigned char *data, size_t len, unsigned char *hash); 33*8975f5c5SAndroid Build Coastguard Worker 34*8975f5c5SAndroid Build Coastguard Worker // Implementation of SHA-1. Only handles data in byte-sized blocks, 35*8975f5c5SAndroid Build Coastguard Worker // which simplifies the code a fair bit. 36*8975f5c5SAndroid Build Coastguard Worker 37*8975f5c5SAndroid Build Coastguard Worker // Identifier names follow notation in FIPS PUB 180-3, where you'll 38*8975f5c5SAndroid Build Coastguard Worker // also find a description of the algorithm: 39*8975f5c5SAndroid Build Coastguard Worker // http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf 40*8975f5c5SAndroid Build Coastguard Worker 41*8975f5c5SAndroid Build Coastguard Worker // Usage example: 42*8975f5c5SAndroid Build Coastguard Worker // 43*8975f5c5SAndroid Build Coastguard Worker // SecureHashAlgorithm sha; 44*8975f5c5SAndroid Build Coastguard Worker // while(there is data to hash) 45*8975f5c5SAndroid Build Coastguard Worker // sha.Update(moredata, size of data); 46*8975f5c5SAndroid Build Coastguard Worker // sha.Final(); 47*8975f5c5SAndroid Build Coastguard Worker // memcpy(somewhere, sha.Digest(), 20); 48*8975f5c5SAndroid Build Coastguard Worker // 49*8975f5c5SAndroid Build Coastguard Worker // to reuse the instance of sha, call sha.Init(); 50*8975f5c5SAndroid Build Coastguard Worker 51*8975f5c5SAndroid Build Coastguard Worker // TODO(jhawkins): Replace this implementation with a per-platform 52*8975f5c5SAndroid Build Coastguard Worker // implementation using each platform's crypto library. See 53*8975f5c5SAndroid Build Coastguard Worker // http://crbug.com/47218 54*8975f5c5SAndroid Build Coastguard Worker 55*8975f5c5SAndroid Build Coastguard Worker class SecureHashAlgorithm 56*8975f5c5SAndroid Build Coastguard Worker { 57*8975f5c5SAndroid Build Coastguard Worker public: SecureHashAlgorithm()58*8975f5c5SAndroid Build Coastguard Worker SecureHashAlgorithm() { Init(); } 59*8975f5c5SAndroid Build Coastguard Worker 60*8975f5c5SAndroid Build Coastguard Worker static const int kDigestSizeBytes; 61*8975f5c5SAndroid Build Coastguard Worker 62*8975f5c5SAndroid Build Coastguard Worker void Init(); 63*8975f5c5SAndroid Build Coastguard Worker void Update(const void *data, size_t nbytes); 64*8975f5c5SAndroid Build Coastguard Worker void Final(); 65*8975f5c5SAndroid Build Coastguard Worker 66*8975f5c5SAndroid Build Coastguard Worker // 20 bytes of message digest. Digest()67*8975f5c5SAndroid Build Coastguard Worker const unsigned char *Digest() const { return reinterpret_cast<const unsigned char *>(H); } 68*8975f5c5SAndroid Build Coastguard Worker 69*8975f5c5SAndroid Build Coastguard Worker std::array<uint8_t, kSHA1Length> DigestAsArray() const; 70*8975f5c5SAndroid Build Coastguard Worker 71*8975f5c5SAndroid Build Coastguard Worker private: 72*8975f5c5SAndroid Build Coastguard Worker void Pad(); 73*8975f5c5SAndroid Build Coastguard Worker void Process(); 74*8975f5c5SAndroid Build Coastguard Worker 75*8975f5c5SAndroid Build Coastguard Worker uint32_t A, B, C, D, E; 76*8975f5c5SAndroid Build Coastguard Worker 77*8975f5c5SAndroid Build Coastguard Worker uint32_t H[5]; 78*8975f5c5SAndroid Build Coastguard Worker 79*8975f5c5SAndroid Build Coastguard Worker union 80*8975f5c5SAndroid Build Coastguard Worker { 81*8975f5c5SAndroid Build Coastguard Worker uint32_t W[80]; 82*8975f5c5SAndroid Build Coastguard Worker uint8_t M[64]; 83*8975f5c5SAndroid Build Coastguard Worker }; 84*8975f5c5SAndroid Build Coastguard Worker 85*8975f5c5SAndroid Build Coastguard Worker uint32_t cursor; 86*8975f5c5SAndroid Build Coastguard Worker uint64_t l; 87*8975f5c5SAndroid Build Coastguard Worker }; 88*8975f5c5SAndroid Build Coastguard Worker 89*8975f5c5SAndroid Build Coastguard Worker } // namespace base 90*8975f5c5SAndroid Build Coastguard Worker 91*8975f5c5SAndroid Build Coastguard Worker } // namespace angle 92*8975f5c5SAndroid Build Coastguard Worker 93*8975f5c5SAndroid Build Coastguard Worker #endif // ANGLEBASE_SHA1_H_ 94