1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 /* Simple class for computing SHA1. */
8 
9 #ifndef mozilla_SHA1_h
10 #define mozilla_SHA1_h
11 
12 #include "mozilla/Types.h"
13 
14 #include <stddef.h>
15 #include <stdint.h>
16 
17 namespace mozilla {
18 
19 /**
20  * This class computes the SHA1 hash of a byte sequence, or of the concatenation
21  * of multiple sequences.  For example, computing the SHA1 of two sequences of
22  * bytes could be done as follows:
23  *
24  *   void SHA1(const uint8_t* buf1, uint32_t size1,
25  *             const uint8_t* buf2, uint32_t size2,
26  *             SHA1Sum::Hash& hash)
27  *   {
28  *     SHA1Sum s;
29  *     s.update(buf1, size1);
30  *     s.update(buf2, size2);
31  *     s.finish(hash);
32  *   }
33  *
34  * The finish method may only be called once and cannot be followed by calls
35  * to update.
36  */
37 class SHA1Sum {
38   union {
39     uint32_t mW[16]; /* input buffer */
40     uint8_t mB[64];
41   } mU;
42   uint64_t mSize;  /* count of hashed bytes. */
43   unsigned mH[22]; /* 5 state variables, 16 tmp values, 1 extra */
44   bool mDone;
45 
46  public:
47   MFBT_API SHA1Sum();
48 
49   static const size_t kHashSize = 20;
50   typedef uint8_t Hash[kHashSize];
51 
52   /* Add len bytes of dataIn to the data sequence being hashed. */
53   MFBT_API void update(const void* aData, uint32_t aLength);
54 
55   /* Compute the final hash of all data into hashOut. */
56   MFBT_API void finish(SHA1Sum::Hash& aHashOut);
57 };
58 
59 } /* namespace mozilla */
60 
61 #endif /* mozilla_SHA1_h */
62