xref: /aosp_15_r20/external/angle/src/common/base/anglebase/sha1.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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