1d57a697cSPablo de Lara /********************************************************************** 2d57a697cSPablo de Lara Copyright(c) 2024 Intel Corporation All rights reserved. 3d57a697cSPablo de Lara 4d57a697cSPablo de Lara Redistribution and use in source and binary forms, with or without 5d57a697cSPablo de Lara modification, are permitted provided that the following conditions 6d57a697cSPablo de Lara are met: 7d57a697cSPablo de Lara * Redistributions of source code must retain the above copyright 8d57a697cSPablo de Lara notice, this list of conditions and the following disclaimer. 9d57a697cSPablo de Lara * Redistributions in binary form must reproduce the above copyright 10d57a697cSPablo de Lara notice, this list of conditions and the following disclaimer in 11d57a697cSPablo de Lara the documentation and/or other materials provided with the 12d57a697cSPablo de Lara distribution. 13d57a697cSPablo de Lara * Neither the name of Intel Corporation nor the names of its 14d57a697cSPablo de Lara contributors may be used to endorse or promote products derived 15d57a697cSPablo de Lara from this software without specific prior written permission. 16d57a697cSPablo de Lara 17d57a697cSPablo de Lara THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18d57a697cSPablo de Lara "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19d57a697cSPablo de Lara LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20d57a697cSPablo de Lara A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21d57a697cSPablo de Lara OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22d57a697cSPablo de Lara SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23d57a697cSPablo de Lara LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24d57a697cSPablo de Lara DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25d57a697cSPablo de Lara THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26d57a697cSPablo de Lara (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27d57a697cSPablo de Lara OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28d57a697cSPablo de Lara **********************************************************************/ 29d57a697cSPablo de Lara 30d57a697cSPablo de Lara #ifndef _SHA512_MB_INTERNAL_H_ 31d57a697cSPablo de Lara #define _SHA512_MB_INTERNAL_H_ 32d57a697cSPablo de Lara 33d57a697cSPablo de Lara /** 34d57a697cSPablo de Lara * @file sha512_mb_internal.h 35d57a697cSPablo de Lara * @brief Multi-buffer CTX API function prototypes and structures 36d57a697cSPablo de Lara * 37d57a697cSPablo de Lara */ 38d57a697cSPablo de Lara 39d57a697cSPablo de Lara #include <stdint.h> 40d57a697cSPablo de Lara #include <string.h> 41d57a697cSPablo de Lara 42d57a697cSPablo de Lara #include "sha512_mb.h" 43d57a697cSPablo de Lara #include "multi_buffer.h" 44d57a697cSPablo de Lara #include "types.h" 45d57a697cSPablo de Lara 46d57a697cSPablo de Lara #ifdef __cplusplus 47d57a697cSPablo de Lara extern "C" { 48d57a697cSPablo de Lara #endif 49d57a697cSPablo de Lara 50592e639eSPablo de Lara #define ISAL_SHA512_X4_LANES 4 51592e639eSPablo de Lara #define ISAL_SHA512_LOG2_BLOCK_SIZE 7 52592e639eSPablo de Lara #define ISAL_SHA512_INITIAL_DIGEST \ 534e73c0e8SPablo de Lara 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, \ 544e73c0e8SPablo de Lara 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179 554e73c0e8SPablo de Lara 56*371c22beSPablo de Lara /** 57*371c22beSPablo de Lara * @brief Initialize the SHA512 multi-buffer manager structure. 58*371c22beSPablo de Lara * @requires SSE4.1 or AVX or AVX2 or AVX512 59*371c22beSPablo de Lara * 60*371c22beSPablo de Lara * @param mgr Structure holding context level state info 61*371c22beSPablo de Lara * @returns void 62*371c22beSPablo de Lara */ 63*371c22beSPablo de Lara void 64*371c22beSPablo de Lara _sha512_ctx_mgr_init(ISAL_SHA512_HASH_CTX_MGR *mgr); 65*371c22beSPablo de Lara 66*371c22beSPablo de Lara /** 67*371c22beSPablo de Lara * @brief Submit a new SHA512 job to the multi-buffer manager. 68*371c22beSPablo de Lara * @requires SSE4.1 or AVX or AVX2 or AVX512 69*371c22beSPablo de Lara * 70*371c22beSPablo de Lara * @param mgr Structure holding context level state info 71*371c22beSPablo de Lara * @param ctx Structure holding ctx job info 72*371c22beSPablo de Lara * @param buffer Pointer to buffer to be processed 73*371c22beSPablo de Lara * @param len Length of buffer (in bytes) to be processed 74*371c22beSPablo de Lara * @param flags Input flag specifying job type (first, update, last or entire) 75*371c22beSPablo de Lara * @returns NULL if no jobs complete or pointer to jobs structure. 76*371c22beSPablo de Lara */ 77*371c22beSPablo de Lara ISAL_SHA512_HASH_CTX * 78*371c22beSPablo de Lara _sha512_ctx_mgr_submit(ISAL_SHA512_HASH_CTX_MGR *mgr, ISAL_SHA512_HASH_CTX *ctx, const void *buffer, 79*371c22beSPablo de Lara uint32_t len, ISAL_HASH_CTX_FLAG flags); 80*371c22beSPablo de Lara 81*371c22beSPablo de Lara /** 82*371c22beSPablo de Lara * @brief Finish all submitted SHA512 jobs and return when complete. 83*371c22beSPablo de Lara * @requires SSE4.1 or AVX or AVX2 or AVX512 84*371c22beSPablo de Lara * 85*371c22beSPablo de Lara * @param mgr Structure holding context level state info 86*371c22beSPablo de Lara * @returns NULL if no jobs to complete or pointer to jobs structure. 87*371c22beSPablo de Lara */ 88*371c22beSPablo de Lara ISAL_SHA512_HASH_CTX * 89*371c22beSPablo de Lara _sha512_ctx_mgr_flush(ISAL_SHA512_HASH_CTX_MGR *mgr); 90*371c22beSPablo de Lara 91d57a697cSPablo de Lara /******************************************************************* 9298bffc31SPablo de Lara * Context level API function prototypes 9398bffc31SPablo de Lara ******************************************************************/ 9498bffc31SPablo de Lara 9598bffc31SPablo de Lara /** 9698bffc31SPablo de Lara * @brief Initialize the context level SHA512 multi-buffer manager structure. 9798bffc31SPablo de Lara * @requires SSE4.1 9898bffc31SPablo de Lara * 9998bffc31SPablo de Lara * @param mgr Structure holding context level state info 10098bffc31SPablo de Lara * @returns void 10198bffc31SPablo de Lara */ 10298bffc31SPablo de Lara void 103592e639eSPablo de Lara _sha512_ctx_mgr_init_sse(ISAL_SHA512_HASH_CTX_MGR *mgr); 10498bffc31SPablo de Lara 10598bffc31SPablo de Lara /** 10698bffc31SPablo de Lara * @brief Submit a new SHA512 job to the context level multi-buffer manager. 10798bffc31SPablo de Lara * @requires SSE4.1 10898bffc31SPablo de Lara * 10998bffc31SPablo de Lara * @param mgr Structure holding context level state info 11098bffc31SPablo de Lara * @param ctx Structure holding ctx job info 11198bffc31SPablo de Lara * @param buffer Pointer to buffer to be processed 11298bffc31SPablo de Lara * @param len Length of buffer (in bytes) to be processed 11398bffc31SPablo de Lara * @param flags Input flag specifying job type (first, update, last or entire) 11498bffc31SPablo de Lara * @returns NULL if no jobs complete or pointer to jobs structure. 11598bffc31SPablo de Lara */ 116592e639eSPablo de Lara ISAL_SHA512_HASH_CTX * 117592e639eSPablo de Lara _sha512_ctx_mgr_submit_sse(ISAL_SHA512_HASH_CTX_MGR *mgr, ISAL_SHA512_HASH_CTX *ctx, 118592e639eSPablo de Lara const void *buffer, uint32_t len, ISAL_HASH_CTX_FLAG flags); 11998bffc31SPablo de Lara 12098bffc31SPablo de Lara /** 12198bffc31SPablo de Lara * @brief Finish all submitted SHA512 jobs and return when complete. 12298bffc31SPablo de Lara * @requires SSE4.1 12398bffc31SPablo de Lara * 12498bffc31SPablo de Lara * @param mgr Structure holding context level state info 12598bffc31SPablo de Lara * @returns NULL if no jobs to complete or pointer to jobs structure. 12698bffc31SPablo de Lara */ 127592e639eSPablo de Lara ISAL_SHA512_HASH_CTX * 128592e639eSPablo de Lara _sha512_ctx_mgr_flush_sse(ISAL_SHA512_HASH_CTX_MGR *mgr); 12998bffc31SPablo de Lara 13098bffc31SPablo de Lara /** 13198bffc31SPablo de Lara * @brief Initialize the SHA512 multi-buffer manager structure. 13298bffc31SPablo de Lara * @requires AVX 13398bffc31SPablo de Lara * 13498bffc31SPablo de Lara * @param mgr Structure holding context level state info 13598bffc31SPablo de Lara * @returns void 13698bffc31SPablo de Lara */ 13798bffc31SPablo de Lara void 138592e639eSPablo de Lara _sha512_ctx_mgr_init_avx(ISAL_SHA512_HASH_CTX_MGR *mgr); 13998bffc31SPablo de Lara 14098bffc31SPablo de Lara /** 14198bffc31SPablo de Lara * @brief Submit a new SHA512 job to the multi-buffer manager. 14298bffc31SPablo de Lara * @requires AVX 14398bffc31SPablo de Lara * 14498bffc31SPablo de Lara * @param mgr Structure holding context level state info 14598bffc31SPablo de Lara * @param ctx Structure holding ctx job info 14698bffc31SPablo de Lara * @param buffer Pointer to buffer to be processed 14798bffc31SPablo de Lara * @param len Length of buffer (in bytes) to be processed 14898bffc31SPablo de Lara * @param flags Input flag specifying job type (first, update, last or entire) 14998bffc31SPablo de Lara * @returns NULL if no jobs complete or pointer to jobs structure. 15098bffc31SPablo de Lara */ 151592e639eSPablo de Lara ISAL_SHA512_HASH_CTX * 152592e639eSPablo de Lara _sha512_ctx_mgr_submit_avx(ISAL_SHA512_HASH_CTX_MGR *mgr, ISAL_SHA512_HASH_CTX *ctx, 153592e639eSPablo de Lara const void *buffer, uint32_t len, ISAL_HASH_CTX_FLAG flags); 15498bffc31SPablo de Lara 15598bffc31SPablo de Lara /** 15698bffc31SPablo de Lara * @brief Finish all submitted SHA512 jobs and return when complete. 15798bffc31SPablo de Lara * @requires AVX 15898bffc31SPablo de Lara * 15998bffc31SPablo de Lara * @param mgr Structure holding context level state info 16098bffc31SPablo de Lara * @returns NULL if no jobs to complete or pointer to jobs structure. 16198bffc31SPablo de Lara */ 162592e639eSPablo de Lara ISAL_SHA512_HASH_CTX * 163592e639eSPablo de Lara _sha512_ctx_mgr_flush_avx(ISAL_SHA512_HASH_CTX_MGR *mgr); 16498bffc31SPablo de Lara 16598bffc31SPablo de Lara /** 16698bffc31SPablo de Lara * @brief Initialize the SHA512 multi-buffer manager structure. 16798bffc31SPablo de Lara * @requires AVX2 16898bffc31SPablo de Lara * 16998bffc31SPablo de Lara * @param mgr Structure holding context level state info 17098bffc31SPablo de Lara * @returns void 17198bffc31SPablo de Lara */ 17298bffc31SPablo de Lara void 173592e639eSPablo de Lara _sha512_ctx_mgr_init_avx2(ISAL_SHA512_HASH_CTX_MGR *mgr); 17498bffc31SPablo de Lara 17598bffc31SPablo de Lara /** 17698bffc31SPablo de Lara * @brief Submit a new SHA512 job to the multi-buffer manager. 17798bffc31SPablo de Lara * @requires AVX2 17898bffc31SPablo de Lara * 17998bffc31SPablo de Lara * @param mgr Structure holding context level state info 18098bffc31SPablo de Lara * @param ctx Structure holding ctx job info 18198bffc31SPablo de Lara * @param buffer Pointer to buffer to be processed 18298bffc31SPablo de Lara * @param len Length of buffer (in bytes) to be processed 18398bffc31SPablo de Lara * @param flags Input flag specifying job type (first, update, last or entire) 18498bffc31SPablo de Lara * @returns NULL if no jobs complete or pointer to jobs structure. 18598bffc31SPablo de Lara */ 186592e639eSPablo de Lara ISAL_SHA512_HASH_CTX * 187592e639eSPablo de Lara _sha512_ctx_mgr_submit_avx2(ISAL_SHA512_HASH_CTX_MGR *mgr, ISAL_SHA512_HASH_CTX *ctx, 188592e639eSPablo de Lara const void *buffer, uint32_t len, ISAL_HASH_CTX_FLAG flags); 18998bffc31SPablo de Lara 19098bffc31SPablo de Lara /** 19198bffc31SPablo de Lara * @brief Finish all submitted SHA512 jobs and return when complete. 19298bffc31SPablo de Lara * @requires AVX2 19398bffc31SPablo de Lara * 19498bffc31SPablo de Lara * @param mgr Structure holding context level state info 19598bffc31SPablo de Lara * @returns NULL if no jobs to complete or pointer to jobs structure. 19698bffc31SPablo de Lara */ 197592e639eSPablo de Lara ISAL_SHA512_HASH_CTX * 198592e639eSPablo de Lara _sha512_ctx_mgr_flush_avx2(ISAL_SHA512_HASH_CTX_MGR *mgr); 19998bffc31SPablo de Lara 20098bffc31SPablo de Lara /** 20198bffc31SPablo de Lara * @brief Initialize the SHA512 multi-buffer manager structure. 20298bffc31SPablo de Lara * @requires AVX512 20398bffc31SPablo de Lara * 20498bffc31SPablo de Lara * @param mgr Structure holding context level state info 20598bffc31SPablo de Lara * @returns void 20698bffc31SPablo de Lara */ 20798bffc31SPablo de Lara void 208592e639eSPablo de Lara _sha512_ctx_mgr_init_avx512(ISAL_SHA512_HASH_CTX_MGR *mgr); 20998bffc31SPablo de Lara 21098bffc31SPablo de Lara /** 21198bffc31SPablo de Lara * @brief Submit a new SHA512 job to the multi-buffer manager. 21298bffc31SPablo de Lara * @requires AVX512 21398bffc31SPablo de Lara * 21498bffc31SPablo de Lara * @param mgr Structure holding context level state info 21598bffc31SPablo de Lara * @param ctx Structure holding ctx job info 21698bffc31SPablo de Lara * @param buffer Pointer to buffer to be processed 21798bffc31SPablo de Lara * @param len Length of buffer (in bytes) to be processed 21898bffc31SPablo de Lara * @param flags Input flag specifying job type (first, update, last or entire) 21998bffc31SPablo de Lara * @returns NULL if no jobs complete or pointer to jobs structure. 22098bffc31SPablo de Lara */ 221592e639eSPablo de Lara ISAL_SHA512_HASH_CTX * 222592e639eSPablo de Lara _sha512_ctx_mgr_submit_avx512(ISAL_SHA512_HASH_CTX_MGR *mgr, ISAL_SHA512_HASH_CTX *ctx, 223592e639eSPablo de Lara const void *buffer, uint32_t len, ISAL_HASH_CTX_FLAG flags); 22498bffc31SPablo de Lara 22598bffc31SPablo de Lara /** 22698bffc31SPablo de Lara * @brief Finish all submitted SHA512 jobs and return when complete. 22798bffc31SPablo de Lara * @requires AVX512 22898bffc31SPablo de Lara * 22998bffc31SPablo de Lara * @param mgr Structure holding context level state info 23098bffc31SPablo de Lara * @returns NULL if no jobs to complete or pointer to jobs structure. 23198bffc31SPablo de Lara */ 232592e639eSPablo de Lara ISAL_SHA512_HASH_CTX * 233592e639eSPablo de Lara _sha512_ctx_mgr_flush_avx512(ISAL_SHA512_HASH_CTX_MGR *mgr); 23498bffc31SPablo de Lara 23598bffc31SPablo de Lara /** 23698bffc31SPablo de Lara * @brief Initialize the SHA512 multi-buffer manager structure. 23798bffc31SPablo de Lara * @requires SSE4 23898bffc31SPablo de Lara * 23998bffc31SPablo de Lara * @param mgr Structure holding context level state info 24098bffc31SPablo de Lara * @returns void 24198bffc31SPablo de Lara */ 24298bffc31SPablo de Lara void 243592e639eSPablo de Lara _sha512_ctx_mgr_init_sb_sse4(ISAL_SHA512_HASH_CTX_MGR *mgr); 24498bffc31SPablo de Lara 24598bffc31SPablo de Lara /** 24698bffc31SPablo de Lara * @brief Submit a new SHA512 job to the multi-buffer manager. 24798bffc31SPablo de Lara * @requires SSE4 24898bffc31SPablo de Lara * 24998bffc31SPablo de Lara * @param mgr Structure holding context level state info 25098bffc31SPablo de Lara * @param ctx Structure holding ctx job info 25198bffc31SPablo de Lara * @param buffer Pointer to buffer to be processed 25298bffc31SPablo de Lara * @param len Length of buffer (in bytes) to be processed 25398bffc31SPablo de Lara * @param flags Input flag specifying job type (first, update, last or entire) 25498bffc31SPablo de Lara * @returns NULL if no jobs complete or pointer to jobs structure. 25598bffc31SPablo de Lara */ 256592e639eSPablo de Lara ISAL_SHA512_HASH_CTX * 257592e639eSPablo de Lara _sha512_ctx_mgr_submit_sb_sse4(ISAL_SHA512_HASH_CTX_MGR *mgr, ISAL_SHA512_HASH_CTX *ctx, 258592e639eSPablo de Lara const void *buffer, uint32_t len, ISAL_HASH_CTX_FLAG flags); 25998bffc31SPablo de Lara 26098bffc31SPablo de Lara /** 26198bffc31SPablo de Lara * @brief Finish all submitted SHA512 jobs and return when complete. 26298bffc31SPablo de Lara * @requires SSE4 26398bffc31SPablo de Lara * 26498bffc31SPablo de Lara * @param mgr Structure holding context level state info 26598bffc31SPablo de Lara * @returns NULL if no jobs to complete or pointer to jobs structure. 26698bffc31SPablo de Lara */ 267592e639eSPablo de Lara ISAL_SHA512_HASH_CTX * 268592e639eSPablo de Lara _sha512_ctx_mgr_flush_sb_sse4(ISAL_SHA512_HASH_CTX_MGR *mgr); 26998bffc31SPablo de Lara 27098bffc31SPablo de Lara /******************************************************************* 271d57a697cSPablo de Lara * Scheduler (internal) level out-of-order function prototypes 272d57a697cSPablo de Lara ******************************************************************/ 273d57a697cSPablo de Lara 274d57a697cSPablo de Lara void 275592e639eSPablo de Lara _sha512_mb_mgr_init_sse(ISAL_SHA512_MB_JOB_MGR *state); 276592e639eSPablo de Lara ISAL_SHA512_JOB * 277592e639eSPablo de Lara _sha512_mb_mgr_submit_sse(ISAL_SHA512_MB_JOB_MGR *state, ISAL_SHA512_JOB *job); 278592e639eSPablo de Lara ISAL_SHA512_JOB * 279592e639eSPablo de Lara _sha512_mb_mgr_flush_sse(ISAL_SHA512_MB_JOB_MGR *state); 280d57a697cSPablo de Lara 281d57a697cSPablo de Lara #define _sha512_mb_mgr_init_avx _sha512_mb_mgr_init_sse 282592e639eSPablo de Lara ISAL_SHA512_JOB * 283592e639eSPablo de Lara _sha512_mb_mgr_submit_avx(ISAL_SHA512_MB_JOB_MGR *state, ISAL_SHA512_JOB *job); 284592e639eSPablo de Lara ISAL_SHA512_JOB * 285592e639eSPablo de Lara _sha512_mb_mgr_flush_avx(ISAL_SHA512_MB_JOB_MGR *state); 286d57a697cSPablo de Lara 287d57a697cSPablo de Lara void 288592e639eSPablo de Lara _sha512_mb_mgr_init_avx2(ISAL_SHA512_MB_JOB_MGR *state); 289592e639eSPablo de Lara ISAL_SHA512_JOB * 290592e639eSPablo de Lara _sha512_mb_mgr_submit_avx2(ISAL_SHA512_MB_JOB_MGR *state, ISAL_SHA512_JOB *job); 291592e639eSPablo de Lara ISAL_SHA512_JOB * 292592e639eSPablo de Lara _sha512_mb_mgr_flush_avx2(ISAL_SHA512_MB_JOB_MGR *state); 293d57a697cSPablo de Lara 294d57a697cSPablo de Lara void 295592e639eSPablo de Lara _sha512_mb_mgr_init_avx512(ISAL_SHA512_MB_JOB_MGR *state); 296592e639eSPablo de Lara ISAL_SHA512_JOB * 297592e639eSPablo de Lara _sha512_mb_mgr_submit_avx512(ISAL_SHA512_MB_JOB_MGR *state, ISAL_SHA512_JOB *job); 298592e639eSPablo de Lara ISAL_SHA512_JOB * 299592e639eSPablo de Lara _sha512_mb_mgr_flush_avx512(ISAL_SHA512_MB_JOB_MGR *state); 300d57a697cSPablo de Lara 301d57a697cSPablo de Lara // Single buffer SHA512 APIs, optimized for SLM. 302d57a697cSPablo de Lara void 303d57a697cSPablo de Lara _sha512_sse4(const void *M, void *D, uint64_t L); 304d57a697cSPablo de Lara // Note that these APIs comply with multi-buffer APIs' high level usage 305d57a697cSPablo de Lara void 306592e639eSPablo de Lara _sha512_sb_mgr_init_sse4(ISAL_SHA512_MB_JOB_MGR *state); 307592e639eSPablo de Lara ISAL_SHA512_JOB * 308592e639eSPablo de Lara _sha512_sb_mgr_submit_sse4(ISAL_SHA512_MB_JOB_MGR *state, ISAL_SHA512_JOB *job); 309592e639eSPablo de Lara ISAL_SHA512_JOB * 310592e639eSPablo de Lara _sha512_sb_mgr_flush_sse4(ISAL_SHA512_MB_JOB_MGR *state); 311d57a697cSPablo de Lara #ifdef __cplusplus 312d57a697cSPablo de Lara } 313d57a697cSPablo de Lara #endif 314d57a697cSPablo de Lara 315d57a697cSPablo de Lara #endif // _SHA512_MB_INTERNAL_H_ 316