1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "crypto/secure_hash.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/pickle.h"
12*6777b538SAndroid Build Coastguard Worker #include "crypto/openssl_util.h"
13*6777b538SAndroid Build Coastguard Worker #include "third_party/boringssl/src/include/openssl/mem.h"
14*6777b538SAndroid Build Coastguard Worker #include "third_party/boringssl/src/include/openssl/sha.h"
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker namespace crypto {
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker namespace {
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard Worker class SecureHashSHA256 : public SecureHash {
21*6777b538SAndroid Build Coastguard Worker public:
SecureHashSHA256()22*6777b538SAndroid Build Coastguard Worker SecureHashSHA256() {
23*6777b538SAndroid Build Coastguard Worker // Ensure that CPU features detection is performed before using
24*6777b538SAndroid Build Coastguard Worker // BoringSSL. This will enable hw accelerated implementations.
25*6777b538SAndroid Build Coastguard Worker EnsureOpenSSLInit();
26*6777b538SAndroid Build Coastguard Worker SHA256_Init(&ctx_);
27*6777b538SAndroid Build Coastguard Worker }
28*6777b538SAndroid Build Coastguard Worker
SecureHashSHA256(const SecureHashSHA256 & other)29*6777b538SAndroid Build Coastguard Worker SecureHashSHA256(const SecureHashSHA256& other) {
30*6777b538SAndroid Build Coastguard Worker memcpy(&ctx_, &other.ctx_, sizeof(ctx_));
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker
~SecureHashSHA256()33*6777b538SAndroid Build Coastguard Worker ~SecureHashSHA256() override {
34*6777b538SAndroid Build Coastguard Worker OPENSSL_cleanse(&ctx_, sizeof(ctx_));
35*6777b538SAndroid Build Coastguard Worker }
36*6777b538SAndroid Build Coastguard Worker
Update(const void * input,size_t len)37*6777b538SAndroid Build Coastguard Worker void Update(const void* input, size_t len) override {
38*6777b538SAndroid Build Coastguard Worker SHA256_Update(&ctx_, static_cast<const unsigned char*>(input), len);
39*6777b538SAndroid Build Coastguard Worker }
40*6777b538SAndroid Build Coastguard Worker
Finish(void * output,size_t len)41*6777b538SAndroid Build Coastguard Worker void Finish(void* output, size_t len) override {
42*6777b538SAndroid Build Coastguard Worker ScopedOpenSSLSafeSizeBuffer<SHA256_DIGEST_LENGTH> result(
43*6777b538SAndroid Build Coastguard Worker static_cast<unsigned char*>(output), len);
44*6777b538SAndroid Build Coastguard Worker SHA256_Final(result.safe_buffer(), &ctx_);
45*6777b538SAndroid Build Coastguard Worker }
46*6777b538SAndroid Build Coastguard Worker
Clone() const47*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SecureHash> Clone() const override {
48*6777b538SAndroid Build Coastguard Worker return std::make_unique<SecureHashSHA256>(*this);
49*6777b538SAndroid Build Coastguard Worker }
50*6777b538SAndroid Build Coastguard Worker
GetHashLength() const51*6777b538SAndroid Build Coastguard Worker size_t GetHashLength() const override { return SHA256_DIGEST_LENGTH; }
52*6777b538SAndroid Build Coastguard Worker
53*6777b538SAndroid Build Coastguard Worker private:
54*6777b538SAndroid Build Coastguard Worker SHA256_CTX ctx_;
55*6777b538SAndroid Build Coastguard Worker };
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Worker class SecureHashSHA512 : public SecureHash {
58*6777b538SAndroid Build Coastguard Worker public:
SecureHashSHA512()59*6777b538SAndroid Build Coastguard Worker SecureHashSHA512() {
60*6777b538SAndroid Build Coastguard Worker // Ensure that CPU features detection is performed before using
61*6777b538SAndroid Build Coastguard Worker // BoringSSL. This will enable hw accelerated implementations.
62*6777b538SAndroid Build Coastguard Worker EnsureOpenSSLInit();
63*6777b538SAndroid Build Coastguard Worker SHA512_Init(&ctx_);
64*6777b538SAndroid Build Coastguard Worker }
65*6777b538SAndroid Build Coastguard Worker
SecureHashSHA512(const SecureHashSHA512 & other)66*6777b538SAndroid Build Coastguard Worker SecureHashSHA512(const SecureHashSHA512& other) {
67*6777b538SAndroid Build Coastguard Worker memcpy(&ctx_, &other.ctx_, sizeof(ctx_));
68*6777b538SAndroid Build Coastguard Worker }
69*6777b538SAndroid Build Coastguard Worker
~SecureHashSHA512()70*6777b538SAndroid Build Coastguard Worker ~SecureHashSHA512() override { OPENSSL_cleanse(&ctx_, sizeof(ctx_)); }
71*6777b538SAndroid Build Coastguard Worker
Update(const void * input,size_t len)72*6777b538SAndroid Build Coastguard Worker void Update(const void* input, size_t len) override {
73*6777b538SAndroid Build Coastguard Worker SHA512_Update(&ctx_, static_cast<const unsigned char*>(input), len);
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker
Finish(void * output,size_t len)76*6777b538SAndroid Build Coastguard Worker void Finish(void* output, size_t len) override {
77*6777b538SAndroid Build Coastguard Worker ScopedOpenSSLSafeSizeBuffer<SHA512_DIGEST_LENGTH> result(
78*6777b538SAndroid Build Coastguard Worker static_cast<unsigned char*>(output), len);
79*6777b538SAndroid Build Coastguard Worker SHA512_Final(result.safe_buffer(), &ctx_);
80*6777b538SAndroid Build Coastguard Worker }
81*6777b538SAndroid Build Coastguard Worker
Clone() const82*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SecureHash> Clone() const override {
83*6777b538SAndroid Build Coastguard Worker return std::make_unique<SecureHashSHA512>(*this);
84*6777b538SAndroid Build Coastguard Worker }
85*6777b538SAndroid Build Coastguard Worker
GetHashLength() const86*6777b538SAndroid Build Coastguard Worker size_t GetHashLength() const override { return SHA512_DIGEST_LENGTH; }
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker private:
89*6777b538SAndroid Build Coastguard Worker SHA512_CTX ctx_;
90*6777b538SAndroid Build Coastguard Worker };
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker } // namespace
93*6777b538SAndroid Build Coastguard Worker
Create(Algorithm algorithm)94*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SecureHash> SecureHash::Create(Algorithm algorithm) {
95*6777b538SAndroid Build Coastguard Worker switch (algorithm) {
96*6777b538SAndroid Build Coastguard Worker case SHA256:
97*6777b538SAndroid Build Coastguard Worker return std::make_unique<SecureHashSHA256>();
98*6777b538SAndroid Build Coastguard Worker case SHA512:
99*6777b538SAndroid Build Coastguard Worker return std::make_unique<SecureHashSHA512>();
100*6777b538SAndroid Build Coastguard Worker default:
101*6777b538SAndroid Build Coastguard Worker NOTIMPLEMENTED();
102*6777b538SAndroid Build Coastguard Worker return nullptr;
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker }
105*6777b538SAndroid Build Coastguard Worker
106*6777b538SAndroid Build Coastguard Worker } // namespace crypto
107