19#include "pw_bytes/span.h"
20#include "pw_crypto/sha256_backend.h"
21#include "pw_log/log.h"
22#include "pw_status/status.h"
23#include "pw_status/try.h"
24#include "pw_stream/stream.h"
26namespace pw::crypto::sha256 {
29inline constexpr uint32_t kDigestSizeBytes = 32;
32enum class Sha256State {
47Status DoInit(NativeSha256Context& ctx);
48Status DoUpdate(NativeSha256Context& ctx, ConstByteSpan data);
49Status DoFinal(NativeSha256Context& ctx, ByteSpan out_digest);
66 if (!backend::DoInit(native_ctx_).ok()) {
67 PW_LOG_DEBUG(
"backend::DoInit() failed");
68 state_ = Sha256State::kError;
72 state_ = Sha256State::kReady;
78 if (state_ != Sha256State::kReady) {
79 PW_LOG_DEBUG(
"The backend is not ready/initialized");
83 if (!backend::DoUpdate(native_ctx_, data).ok()) {
84 PW_LOG_DEBUG(
"backend::DoUpdate() failed");
85 state_ = Sha256State::kError;
101 if (out_digest.size() < kDigestSizeBytes) {
102 PW_LOG_DEBUG(
"Digest output buffer is too small");
103 state_ = Sha256State::kError;
104 return Status::InvalidArgument();
107 if (state_ != Sha256State::kReady) {
108 PW_LOG_DEBUG(
"The backend is not ready/initialized");
109 return Status::FailedPrecondition();
112 auto status = backend::DoFinal(native_ctx_, out_digest);
114 PW_LOG_DEBUG(
"backend::DoFinal() failed");
115 state_ = Sha256State::kError;
119 state_ = Sha256State::kFinalized;
127 backend::NativeSha256Context native_ctx_;
162inline Status Hash(ConstByteSpan message, ByteSpan out_digest) {
163 return Sha256().
Update(message).Final(out_digest);
167 if (out_digest.size() < kDigestSizeBytes) {
168 return Status::InvalidArgument();
173 Result<ByteSpan> res = reader.
Read(out_digest);
174 if (res.status().IsOutOfRange()) {
178 PW_TRY(res.status());
179 sha256.Update(res.value());
182 return sha256.Final(out_digest);
constexpr void Update(Status other)
Definition: status.h:213
Status Final(ByteSpan out_digest)
Definition: sha256.h:100
Sha256 & Update(ConstByteSpan data)
Definition: sha256.h:77
Result< ByteSpan > Read(ByteSpan dest)
Definition: stream.h:120
constexpr Status OkStatus()
Definition: status.h:234