1*61c4878aSAndroid Build Coastguard Worker // Copyright 2021 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker #include <cstring>
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include "pw_crypto/sha256.h"
18*61c4878aSAndroid Build Coastguard Worker #include "pw_crypto/sha256_backend.h"
19*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker namespace pw::crypto::sha256 {
22*61c4878aSAndroid Build Coastguard Worker namespace {
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Worker #define AS_BYTES(str) as_bytes(span(str, sizeof(str) - 1))
25*61c4878aSAndroid Build Coastguard Worker
26*61c4878aSAndroid Build Coastguard Worker #define ASSERT_FAIL(expr) ASSERT_NE(OkStatus(), expr)
27*61c4878aSAndroid Build Coastguard Worker
TEST(Sha256,HandlesBackendInitFailures)28*61c4878aSAndroid Build Coastguard Worker TEST(Sha256, HandlesBackendInitFailures) {
29*61c4878aSAndroid Build Coastguard Worker std::byte digest[kDigestSizeBytes];
30*61c4878aSAndroid Build Coastguard Worker
31*61c4878aSAndroid Build Coastguard Worker backend::ClearError();
32*61c4878aSAndroid Build Coastguard Worker PW_TEST_ASSERT_OK(Sha256().Update(AS_BYTES("blahblah")).Final(digest));
33*61c4878aSAndroid Build Coastguard Worker
34*61c4878aSAndroid Build Coastguard Worker backend::InjectError(backend::ErrorKind::kInit);
35*61c4878aSAndroid Build Coastguard Worker ASSERT_FAIL(Sha256().Update(AS_BYTES("blahblah")).Final(digest));
36*61c4878aSAndroid Build Coastguard Worker }
37*61c4878aSAndroid Build Coastguard Worker
TEST(Sha256,HandlesBackendUpdateFailures)38*61c4878aSAndroid Build Coastguard Worker TEST(Sha256, HandlesBackendUpdateFailures) {
39*61c4878aSAndroid Build Coastguard Worker std::byte digest[kDigestSizeBytes];
40*61c4878aSAndroid Build Coastguard Worker
41*61c4878aSAndroid Build Coastguard Worker backend::ClearError();
42*61c4878aSAndroid Build Coastguard Worker PW_TEST_ASSERT_OK(Sha256().Update(AS_BYTES("blahblah")).Final(digest));
43*61c4878aSAndroid Build Coastguard Worker
44*61c4878aSAndroid Build Coastguard Worker backend::InjectError(backend::ErrorKind::kUpdate);
45*61c4878aSAndroid Build Coastguard Worker ASSERT_FAIL(Sha256().Update(AS_BYTES("blahblah")).Final(digest));
46*61c4878aSAndroid Build Coastguard Worker }
47*61c4878aSAndroid Build Coastguard Worker
TEST(Sha256,HandlesBackendFinalFailures)48*61c4878aSAndroid Build Coastguard Worker TEST(Sha256, HandlesBackendFinalFailures) {
49*61c4878aSAndroid Build Coastguard Worker std::byte digest[kDigestSizeBytes];
50*61c4878aSAndroid Build Coastguard Worker
51*61c4878aSAndroid Build Coastguard Worker backend::ClearError();
52*61c4878aSAndroid Build Coastguard Worker PW_TEST_ASSERT_OK(Sha256().Update(AS_BYTES("blahblah")).Final(digest));
53*61c4878aSAndroid Build Coastguard Worker
54*61c4878aSAndroid Build Coastguard Worker backend::InjectError(backend::ErrorKind::kFinal);
55*61c4878aSAndroid Build Coastguard Worker ASSERT_FAIL(Sha256().Update(AS_BYTES("blahblah")).Final(digest));
56*61c4878aSAndroid Build Coastguard Worker }
57*61c4878aSAndroid Build Coastguard Worker
58*61c4878aSAndroid Build Coastguard Worker } // namespace
59*61c4878aSAndroid Build Coastguard Worker } // namespace pw::crypto::sha256
60