1 // Copyright 2019 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <stdint.h>
6
7 #include <string_view>
8
9 #include "base/hash/sha1.h"
10 #include "third_party/boringssl/src/include/openssl/crypto.h"
11 #include "third_party/boringssl/src/include/openssl/sha.h"
12
13 namespace base {
14 static_assert(kSHA1Length == SHA_DIGEST_LENGTH,
15 "SHA-1 digest length mismatch.");
16
SHA1HashSpan(span<const uint8_t> data)17 SHA1Digest SHA1HashSpan(span<const uint8_t> data) {
18 CRYPTO_library_init();
19 SHA1Digest digest;
20 SHA1(data.data(), data.size(), digest.data());
21 return digest;
22 }
23
SHA1HashString(std::string_view str)24 std::string SHA1HashString(std::string_view str) {
25 CRYPTO_library_init();
26 std::string digest(kSHA1Length, '\0');
27 SHA1(reinterpret_cast<const uint8_t*>(str.data()), str.size(),
28 reinterpret_cast<uint8_t*>(digest.data()));
29 return digest;
30 }
31
SHA1HashBytes(const unsigned char * data,size_t len,unsigned char * hash)32 void SHA1HashBytes(const unsigned char* data, size_t len, unsigned char* hash) {
33 CRYPTO_library_init();
34 SHA1(data, len, hash);
35 }
36
37 // These functions allow streaming SHA-1 operations.
SHA1Init(SHA1Context & context)38 void SHA1Init(SHA1Context& context) {
39 SHA1_Init(&context);
40 }
41
SHA1Update(const std::string_view data,SHA1Context & context)42 void SHA1Update(const std::string_view data, SHA1Context& context) {
43 SHA1_Update(&context, data.data(), data.size());
44 }
45
SHA1Final(SHA1Context & context,SHA1Digest & digest)46 void SHA1Final(SHA1Context& context, SHA1Digest& digest) {
47 SHA1Context ctx(context);
48 SHA1_Final(digest.data(), &ctx);
49 }
50
51 } // namespace base
52