1050a99a6SPankaj Gupta /* 2050a99a6SPankaj Gupta * Copyright 2017-2021 NXP 3050a99a6SPankaj Gupta * 4050a99a6SPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause 5050a99a6SPankaj Gupta * 6050a99a6SPankaj Gupta */ 7050a99a6SPankaj Gupta 8050a99a6SPankaj Gupta #ifndef __HASH_H__ 9050a99a6SPankaj Gupta #define __HASH_H__ 10050a99a6SPankaj Gupta 11050a99a6SPankaj Gupta #include <stdbool.h> 12*e9529e46SRaghu Krishnamurthy #include <common/sha_common_macros.h> 13050a99a6SPankaj Gupta 14050a99a6SPankaj Gupta /* List of hash algorithms */ 15050a99a6SPankaj Gupta enum hash_algo { 16050a99a6SPankaj Gupta SHA1 = 0, 17050a99a6SPankaj Gupta SHA256 18050a99a6SPankaj Gupta }; 19050a99a6SPankaj Gupta 20050a99a6SPankaj Gupta /* 21050a99a6SPankaj Gupta * number of words in the digest - Digest is kept internally 22050a99a6SPankaj Gupta * as 8 32-bit words 23050a99a6SPankaj Gupta */ 24050a99a6SPankaj Gupta #define _SHA256_DIGEST_LENGTH 8 25050a99a6SPankaj Gupta 26050a99a6SPankaj Gupta /* 27050a99a6SPankaj Gupta * block length - A block, treated as a sequence of 28050a99a6SPankaj Gupta * 32-bit words 29050a99a6SPankaj Gupta */ 30050a99a6SPankaj Gupta #define SHA256_BLOCK_LENGTH 16 31050a99a6SPankaj Gupta 32050a99a6SPankaj Gupta /* number of bytes in the block */ 33050a99a6SPankaj Gupta #define SHA256_DATA_SIZE 64 34050a99a6SPankaj Gupta 35050a99a6SPankaj Gupta #define MAX_SG 12 36050a99a6SPankaj Gupta 37050a99a6SPankaj Gupta struct sg_entry { 38050a99a6SPankaj Gupta #if defined(NXP_SEC_LE) 39050a99a6SPankaj Gupta uint32_t addr_lo; /* Memory Address - lo */ 40050a99a6SPankaj Gupta uint32_t addr_hi; /* Memory Address of start of buffer - hi */ 41050a99a6SPankaj Gupta #else 42050a99a6SPankaj Gupta uint32_t addr_hi; /* Memory Address of start of buffer - hi */ 43050a99a6SPankaj Gupta uint32_t addr_lo; /* Memory Address - lo */ 44050a99a6SPankaj Gupta #endif 45050a99a6SPankaj Gupta 46050a99a6SPankaj Gupta uint32_t len_flag; /* Length of the data in the frame */ 47050a99a6SPankaj Gupta #define SG_ENTRY_LENGTH_MASK 0x3FFFFFFF 48050a99a6SPankaj Gupta #define SG_ENTRY_EXTENSION_BIT 0x80000000 49050a99a6SPankaj Gupta #define SG_ENTRY_FINAL_BIT 0x40000000 50050a99a6SPankaj Gupta uint32_t bpid_offset; 51050a99a6SPankaj Gupta #define SG_ENTRY_BPID_MASK 0x00FF0000 52050a99a6SPankaj Gupta #define SG_ENTRY_BPID_SHIFT 16 53050a99a6SPankaj Gupta #define SG_ENTRY_OFFSET_MASK 0x00001FFF 54050a99a6SPankaj Gupta #define SG_ENTRY_OFFSET_SHIFT 0 55050a99a6SPankaj Gupta }; 56050a99a6SPankaj Gupta 57050a99a6SPankaj Gupta /* 58050a99a6SPankaj Gupta * SHA256-256 context 59050a99a6SPankaj Gupta * contain the following fields 60050a99a6SPankaj Gupta * State 61050a99a6SPankaj Gupta * count low 62050a99a6SPankaj Gupta * count high 63050a99a6SPankaj Gupta * block data buffer 64050a99a6SPankaj Gupta * index to the buffer 65050a99a6SPankaj Gupta */ 66050a99a6SPankaj Gupta struct hash_ctx { 67050a99a6SPankaj Gupta struct sg_entry sg_tbl[MAX_SG]; 68050a99a6SPankaj Gupta uint32_t hash_desc[64]; 69050a99a6SPankaj Gupta uint8_t hash[SHA256_DIGEST_SIZE]; 70050a99a6SPankaj Gupta uint32_t sg_num; 71050a99a6SPankaj Gupta uint32_t len; 72050a99a6SPankaj Gupta uint8_t *data; 73050a99a6SPankaj Gupta enum hash_algo algo; 74050a99a6SPankaj Gupta bool active; 75050a99a6SPankaj Gupta }; 76050a99a6SPankaj Gupta 77050a99a6SPankaj Gupta int hash_init(enum hash_algo algo, void **ctx); 78050a99a6SPankaj Gupta int hash_update(enum hash_algo algo, void *context, void *data_ptr, 79050a99a6SPankaj Gupta unsigned int data_len); 80050a99a6SPankaj Gupta int hash_final(enum hash_algo algo, void *context, void *hash_ptr, 81050a99a6SPankaj Gupta unsigned int hash_len); 82050a99a6SPankaj Gupta 83050a99a6SPankaj Gupta #endif 84