| // Copyright lowRISC contributors. | |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| // SPDX-License-Identifier: Apache-2.0 | |
| #include "sw/device/lib/crypto/impl/status.h" | |
| #include "sw/device/lib/base/hardened_status.h" | |
| #include "sw/device/lib/base/status.h" | |
| #include "sw/device/lib/crypto/include/datatypes.h" | |
| crypto_status_t crypto_status_interpret(status_t status) { | |
| // First, check for a hardened-ok status. | |
| uint32_t res = launder32(kCryptoStatusOK ^ kHardenedBoolTrue); | |
| hardened_bool_t is_ok = hardened_status_ok(status); | |
| if (launder32(is_ok) == kHardenedBoolTrue) { | |
| HARDENED_CHECK_EQ(is_ok, kHardenedBoolTrue); | |
| return res ^ is_ok; | |
| } | |
| HARDENED_CHECK_NE(is_ok, kHardenedBoolTrue); | |
| switch (status_err(status)) { | |
| case kOk: | |
| // This status indicates OK but the hardened value doesn't match; return | |
| // an error. | |
| return kCryptoStatusInternalError; | |
| case kInvalidArgument: | |
| return kCryptoStatusBadArgs; | |
| case kUnavailable: | |
| return kCryptoStatusAsyncIncomplete; | |
| case kCancelled: | |
| return kCryptoStatusInternalError; | |
| case kDeadlineExceeded: | |
| return kCryptoStatusInternalError; | |
| case kNotFound: | |
| return kCryptoStatusInternalError; | |
| case kAlreadyExists: | |
| return kCryptoStatusInternalError; | |
| case kPermissionDenied: | |
| return kCryptoStatusInternalError; | |
| case kResourceExhausted: | |
| return kCryptoStatusInternalError; | |
| case kAborted: | |
| return kCryptoStatusInternalError; | |
| case kOutOfRange: | |
| return kCryptoStatusInternalError; | |
| case kUnimplemented: | |
| return kCryptoStatusInternalError; | |
| case kUnauthenticated: | |
| return kCryptoStatusInternalError; | |
| case kUnknown: | |
| return kCryptoStatusFatalError; | |
| case kFailedPrecondition: | |
| return kCryptoStatusFatalError; | |
| case kInternal: | |
| return kCryptoStatusFatalError; | |
| case kDataLoss: | |
| return kCryptoStatusFatalError; | |
| default: | |
| // Conservatively return a fatal error in case we encounter something | |
| // unexpected. | |
| return kCryptoStatusFatalError; | |
| } | |
| HARDENED_UNREACHABLE(); | |
| return kCryptoStatusFatalError; | |
| } |