1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright 2017-2021 NXP 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu * 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu #ifndef __HASH_H__ 9*91f16700Schasinglulu #define __HASH_H__ 10*91f16700Schasinglulu 11*91f16700Schasinglulu #include <stdbool.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu /* List of hash algorithms */ 14*91f16700Schasinglulu enum hash_algo { 15*91f16700Schasinglulu SHA1 = 0, 16*91f16700Schasinglulu SHA256 17*91f16700Schasinglulu }; 18*91f16700Schasinglulu 19*91f16700Schasinglulu /* number of bytes in the SHA256-256 digest */ 20*91f16700Schasinglulu #define SHA256_DIGEST_SIZE 32 21*91f16700Schasinglulu 22*91f16700Schasinglulu /* 23*91f16700Schasinglulu * number of words in the digest - Digest is kept internally 24*91f16700Schasinglulu * as 8 32-bit words 25*91f16700Schasinglulu */ 26*91f16700Schasinglulu #define _SHA256_DIGEST_LENGTH 8 27*91f16700Schasinglulu 28*91f16700Schasinglulu /* 29*91f16700Schasinglulu * block length - A block, treated as a sequence of 30*91f16700Schasinglulu * 32-bit words 31*91f16700Schasinglulu */ 32*91f16700Schasinglulu #define SHA256_BLOCK_LENGTH 16 33*91f16700Schasinglulu 34*91f16700Schasinglulu /* number of bytes in the block */ 35*91f16700Schasinglulu #define SHA256_DATA_SIZE 64 36*91f16700Schasinglulu 37*91f16700Schasinglulu #define MAX_SG 12 38*91f16700Schasinglulu 39*91f16700Schasinglulu struct sg_entry { 40*91f16700Schasinglulu #if defined(NXP_SEC_LE) 41*91f16700Schasinglulu uint32_t addr_lo; /* Memory Address - lo */ 42*91f16700Schasinglulu uint32_t addr_hi; /* Memory Address of start of buffer - hi */ 43*91f16700Schasinglulu #else 44*91f16700Schasinglulu uint32_t addr_hi; /* Memory Address of start of buffer - hi */ 45*91f16700Schasinglulu uint32_t addr_lo; /* Memory Address - lo */ 46*91f16700Schasinglulu #endif 47*91f16700Schasinglulu 48*91f16700Schasinglulu uint32_t len_flag; /* Length of the data in the frame */ 49*91f16700Schasinglulu #define SG_ENTRY_LENGTH_MASK 0x3FFFFFFF 50*91f16700Schasinglulu #define SG_ENTRY_EXTENSION_BIT 0x80000000 51*91f16700Schasinglulu #define SG_ENTRY_FINAL_BIT 0x40000000 52*91f16700Schasinglulu uint32_t bpid_offset; 53*91f16700Schasinglulu #define SG_ENTRY_BPID_MASK 0x00FF0000 54*91f16700Schasinglulu #define SG_ENTRY_BPID_SHIFT 16 55*91f16700Schasinglulu #define SG_ENTRY_OFFSET_MASK 0x00001FFF 56*91f16700Schasinglulu #define SG_ENTRY_OFFSET_SHIFT 0 57*91f16700Schasinglulu }; 58*91f16700Schasinglulu 59*91f16700Schasinglulu /* 60*91f16700Schasinglulu * SHA256-256 context 61*91f16700Schasinglulu * contain the following fields 62*91f16700Schasinglulu * State 63*91f16700Schasinglulu * count low 64*91f16700Schasinglulu * count high 65*91f16700Schasinglulu * block data buffer 66*91f16700Schasinglulu * index to the buffer 67*91f16700Schasinglulu */ 68*91f16700Schasinglulu struct hash_ctx { 69*91f16700Schasinglulu struct sg_entry sg_tbl[MAX_SG]; 70*91f16700Schasinglulu uint32_t hash_desc[64]; 71*91f16700Schasinglulu uint8_t hash[SHA256_DIGEST_SIZE]; 72*91f16700Schasinglulu uint32_t sg_num; 73*91f16700Schasinglulu uint32_t len; 74*91f16700Schasinglulu uint8_t *data; 75*91f16700Schasinglulu enum hash_algo algo; 76*91f16700Schasinglulu bool active; 77*91f16700Schasinglulu }; 78*91f16700Schasinglulu 79*91f16700Schasinglulu int hash_init(enum hash_algo algo, void **ctx); 80*91f16700Schasinglulu int hash_update(enum hash_algo algo, void *context, void *data_ptr, 81*91f16700Schasinglulu unsigned int data_len); 82*91f16700Schasinglulu int hash_final(enum hash_algo algo, void *context, void *hash_ptr, 83*91f16700Schasinglulu unsigned int hash_len); 84*91f16700Schasinglulu 85*91f16700Schasinglulu #endif 86