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