52#include "lib/assert.h"
57#define LOG_MODULE "cc2538-sha-256"
58#define LOG_LEVEL LOG_LEVEL_NONE
60static const uint8_t empty_digest[SHA_256_DIGEST_LENGTH] = {
61 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14,
62 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24,
63 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
64 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55
66static sha_256_checkpoint_t checkpoint;
67static bool was_crypto_enabled;
74 if(!was_crypto_enabled) {
86 if(!was_crypto_enabled) {
92do_hash(
const uint8_t *data,
size_t len,
93 void *digest, uint64_t final_bit_count)
104 if(checkpoint.bit_count) {
121 if(final_bit_count) {
149 LOG_ERR(
"error at line %d\n", __LINE__);
164update(
const uint8_t *data,
size_t len)
168 if(!checkpoint.buf_len && (len > SHA_256_BLOCK_SIZE)) {
170 n = (len - 1) & ~(SHA_256_BLOCK_SIZE - 1);
171 do_hash(data, n, checkpoint.state, 0);
173 n = SHA_256_BLOCK_SIZE;
174 memcpy(checkpoint.buf, data, n);
175 do_hash(checkpoint.buf, n, checkpoint.state, 0);
177 checkpoint.bit_count += n << 3;
181 n = MIN(len, SHA_256_BLOCK_SIZE - checkpoint.buf_len);
182 memcpy(checkpoint.buf + checkpoint.buf_len, data, n);
183 checkpoint.buf_len += n;
186 if((checkpoint.buf_len == SHA_256_BLOCK_SIZE) && len) {
187 do_hash(checkpoint.buf, SHA_256_BLOCK_SIZE, checkpoint.state, 0);
188 checkpoint.bit_count += SHA_256_BLOCK_SIZE << 3;
189 checkpoint.buf_len = 0;
196finalize(uint8_t digest[
static SHA_256_DIGEST_LENGTH])
198 uint64_t final_bit_count = checkpoint.bit_count + (checkpoint.buf_len << 3);
199 if(!final_bit_count) {
201 memcpy(digest, empty_digest,
sizeof(empty_digest));
203 do_hash(checkpoint.buf, checkpoint.buf_len, digest, final_bit_count);
206 checkpoint.buf_len = 0;
207 checkpoint.bit_count = 0;
211create_checkpoint(sha_256_checkpoint_t *cp)
214 memcpy(cp, &checkpoint,
sizeof(*cp));
218restore_checkpoint(
const sha_256_checkpoint_t *cp)
220 memcpy(&checkpoint, cp,
sizeof(checkpoint));
225hash(
const uint8_t *data,
size_t len,
226 uint8_t digest[
static SHA_256_DIGEST_LENGTH])
230 memcpy(digest, empty_digest,
sizeof(empty_digest));
233 do_hash(data, len, digest, len << 3);
236 sha_256_hash(data, len, digest);
Header file for the cc2538 AES driver.
Header file for the cc2538 SHA-256 driver.
#define AES_CTRL_INT_CLR
Interrupt clear.
#define AES_HASH_DIGEST_C
Hash digest.
#define AES_DMAC_CH1_CTRL
Channel 1 control.
#define AES_CTRL_INT_CFG
Interrupt configuration.
#define AES_CTRL_INT_CFG_LEVEL
Level interrupt type.
#define AES_DMAC_CH1_DMALENGTH
Channel 1 DMA length.
#define AES_HASH_IO_BUF_CTRL_PAD_DMA_MESSAGE
Hash engine message padding required.
#define AES_CTRL_ALG_SEL_HASH
Select hash engine as DMA destination.
#define AES_CTRL_INT_STAT_DMA_BUS_ERR
DMA bus error detected.
#define AES_HASH_DIGEST_D
Hash digest.
#define AES_HASH_DIGEST_E
Hash digest.
#define AES_CTRL_ALG_SEL_TAG
DMA operation includes TAG.
#define AES_HASH_LENGTH_IN_L
Hash length.
#define AES_HASH_DIGEST_A
Hash digest.
#define AES_DMAC_CH0_CTRL
Channel 0 control.
#define AES_DMAC_CH_CTRL_EN
Channel enable.
#define AES_HASH_MODE_IN_NEW_HASH
New hash session.
#define AES_HASH_DIGEST_H
Hash digest.
#define AES_HASH_LENGTH_IN_H
Hash length.
#define AES_DMAC_CH0_EXTADDR
Channel 0 external address.
#define AES_CTRL_INT_EN_RESULT_AV
Result available interrupt enabled.
#define AES_DMAC_CH1_EXTADDR
Channel 1 external address.
#define AES_HASH_DIGEST_G
Hash digest.
#define AES_HASH_MODE_IN_SHA256_MODE
Hash mode.
#define AES_HASH_DIGEST_F
Hash digest.
#define AES_CTRL_INT_CLR_RESULT_AV
Clear result available interrupt.
#define AES_HASH_IO_BUF_CTRL
Input/output buffer control and status.
#define AES_HASH_MODE_IN
Hash mode.
#define AES_CTRL_ALG_SEL
Algorithm select.
#define AES_CTRL_INT_STAT
Interrupt status.
#define AES_DMAC_CH0_DMALENGTH
Channel 0 DMA length.
#define AES_CTRL_INT_EN
Interrupt enable.
#define AES_HASH_DIGEST_B
Hash digest.
#define AES_CTRL_INT_STAT_RESULT_AV
Result available interrupt status.
void crypto_enable(void)
Enables the AES/SHA cryptoprocessor.
#define CRYPTO_IS_ENABLED()
Indicates whether the AES/SHA cryptoprocessor is enabled.
void crypto_disable(void)
Disables the AES/SHA cryptoprocessor.
bool udma_is_valid_source_address(uintptr_t source_address)
Checks if data can be DMAed from the given address.
Header file for the logging system.
Structure of SHA-256 drivers.
void(* create_checkpoint)(sha_256_checkpoint_t *checkpoint)
Saves the hash session, e.g., before pausing a protothread.
void(* finalize)(uint8_t digest[static 32])
Terminates the hash session and produces the digest.
void(* init)(void)
Starts a hash session.
void(* restore_checkpoint)(const sha_256_checkpoint_t *checkpoint)
Restores a hash session, e.g., after resuming a protothread.
void(* update)(const uint8_t *data, size_t len)
Processes a chunk of data.
void(* hash)(const uint8_t *data, size_t len, uint8_t digest[static 32])
Does init, update, and finalize at once.
Header file with register, macro and function declarations for the cc2538 micro-DMA controller module...