blob: 7b99b10a73366777038ee55e4cc889533649a966 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#ifndef OPENTITAN_SW_DEVICE_LIB_CRYPTO_DRIVERS_HMAC_H_
#define OPENTITAN_SW_DEVICE_LIB_CRYPTO_DRIVERS_HMAC_H_
#include <stddef.h>
#include <stdint.h>
#include "sw/device/lib/base/macros.h"
#ifdef __cplusplus
extern "C" {
#endif
enum {
/* Number of bits in an HMAC or SHA-256 digest. */
kHmacDigestNumBits = 256,
/* Number of bytes in an HMAC or SHA-256 digest. */
kHmacDigestNumBytes = kHmacDigestNumBits / 8,
/* Number of words in an HMAC or SHA-256 digest. */
kHmacDigestNumWords = kHmacDigestNumBytes / sizeof(uint32_t),
};
/**
* Error types for the HMAC driver.
*/
typedef enum hmac_error {
kHmacOk = 0,
/* Invalid argument.*/
kHmacErrorBadArg = 1,
/* HMAC device is still processing. */
kHmacErrorBusy = 2,
/* Attempt to push when FIFO is full. */
kHmacErrorFifoFull = 3,
} hmac_error_t;
/**
* A typed representation of the HMAC digest.
*/
typedef struct hmac_digest {
uint32_t digest[kHmacDigestNumWords];
} hmac_digest_t;
/**
* Initializes the HMAC in SHA256 mode.
*
* This function resets the HMAC module to clear the digest register.
* It then configures the HMAC block in SHA256 mode with little endian
* data input and digest output.
*/
void hmac_sha256_init(void);
/**
* Sends `len` bytes from `data` to the SHA2-256 function.
*
* This function does not check for the size of the available HMAC
* FIFO. Since the this function is meant to run in blocking mode,
* polling for FIFO status is equivalent to stalling on FIFO write.
*
* @param data Buffer to copy data from.
* @param len size of the `data` buffer in bytes.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
hmac_error_t hmac_sha256_update(const void *data, size_t len);
/**
* Finalizes SHA256 operation and writes `digest` buffer.
*
* Blocks while the device is processing.
*
* @param[out] digest Buffer to copy digest to.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
hmac_error_t hmac_sha256_final(hmac_digest_t *digest);
#ifdef __cplusplus
}
#endif
#endif // OPENTITAN_SW_DEVICE_LIB_CRYPTO_DRIVERS_HMAC_H_