16df3ef80SGreg Tucker /********************************************************************** 29475391eSMarcel Cornu Copyright(c) 2011-2024 Intel Corporation All rights reserved. 36df3ef80SGreg Tucker 46df3ef80SGreg Tucker Redistribution and use in source and binary forms, with or without 56df3ef80SGreg Tucker modification, are permitted provided that the following conditions 66df3ef80SGreg Tucker are met: 76df3ef80SGreg Tucker * Redistributions of source code must retain the above copyright 86df3ef80SGreg Tucker notice, this list of conditions and the following disclaimer. 96df3ef80SGreg Tucker * Redistributions in binary form must reproduce the above copyright 106df3ef80SGreg Tucker notice, this list of conditions and the following disclaimer in 116df3ef80SGreg Tucker the documentation and/or other materials provided with the 126df3ef80SGreg Tucker distribution. 136df3ef80SGreg Tucker * Neither the name of Intel Corporation nor the names of its 146df3ef80SGreg Tucker contributors may be used to endorse or promote products derived 156df3ef80SGreg Tucker from this software without specific prior written permission. 166df3ef80SGreg Tucker 176df3ef80SGreg Tucker THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 186df3ef80SGreg Tucker "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 196df3ef80SGreg Tucker LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 206df3ef80SGreg Tucker A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 216df3ef80SGreg Tucker OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 226df3ef80SGreg Tucker SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 236df3ef80SGreg Tucker LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 246df3ef80SGreg Tucker DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 256df3ef80SGreg Tucker THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 266df3ef80SGreg Tucker (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 276df3ef80SGreg Tucker OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 286df3ef80SGreg Tucker **********************************************************************/ 296df3ef80SGreg Tucker 306df3ef80SGreg Tucker #ifndef _MD5_MB_H_ 316df3ef80SGreg Tucker #define _MD5_MB_H_ 326df3ef80SGreg Tucker 336df3ef80SGreg Tucker /** 346df3ef80SGreg Tucker * @file md5_mb.h 356df3ef80SGreg Tucker * @brief Multi-buffer CTX API MD5 function prototypes and structures 36070644e4SPablo de Lara * @warning: MD5 is considered unsafe, so it is recommended to use SHA256 instead. 376df3ef80SGreg Tucker * 386df3ef80SGreg Tucker * Interface for multi-buffer MD5 functions 396df3ef80SGreg Tucker * 406df3ef80SGreg Tucker * <b> Multi-buffer MD5 Entire or First-Update..Update-Last </b> 416df3ef80SGreg Tucker * 426df3ef80SGreg Tucker * The interface to this multi-buffer hashing code is carried out through the 43cca1040dSPablo de Lara * context-level (CTX) init, submit and flush functions and the ISAL_MD5_HASH_CTX_MGR and 44cca1040dSPablo de Lara * ISAL_MD5_HASH_CTX objects. Numerous ISAL_MD5_HASH_CTX objects may be instantiated by the 45cca1040dSPablo de Lara * application for use with a single ISAL_MD5_HASH_CTX_MGR. 466df3ef80SGreg Tucker * 476df3ef80SGreg Tucker * The CTX interface functions carry out the initialization and padding of the jobs 486df3ef80SGreg Tucker * entered by the user and add them to the multi-buffer manager. The lower level "scheduler" 496df3ef80SGreg Tucker * layer then processes the jobs in an out-of-order manner. The scheduler layer functions 506df3ef80SGreg Tucker * are internal and are not intended to be invoked directly. Jobs can be submitted 518cb7fe78SPablo de Lara * to a CTX as a complete buffer to be hashed, using the ISAL_HASH_ENTIRE flag, or as partial 528cb7fe78SPablo de Lara * jobs which can be started using the ISAL_HASH_FIRST flag, and later resumed or finished 538cb7fe78SPablo de Lara * using the ISAL_HASH_UPDATE and ISAL_HASH_LAST flags respectively. 546df3ef80SGreg Tucker * 556df3ef80SGreg Tucker * <b>Note:</b> The submit function does not require data buffers to be block sized. 566df3ef80SGreg Tucker * 576df3ef80SGreg Tucker * The MD5 CTX interface functions are available for 4 architectures: SSE, AVX, AVX2 and 586df3ef80SGreg Tucker * AVX512. In addition, a multibinary interface is provided, which selects the appropriate 596df3ef80SGreg Tucker * architecture-specific function at runtime. 606df3ef80SGreg Tucker * 61cca1040dSPablo de Lara * <b>Usage:</b> The application creates a ISAL_MD5_HASH_CTX_MGR object and initializes it 626df3ef80SGreg Tucker * with a call to md5_ctx_mgr_init*() function, where henceforth "*" stands for the 636df3ef80SGreg Tucker * relevant suffix for each architecture; _sse, _avx, _avx2, _avx512 (or no suffix for the 64cca1040dSPablo de Lara * multibinary version). The ISAL_MD5_HASH_CTX_MGR object will be used to schedule processor 65cca1040dSPablo de Lara * resources, with up to 8 ISAL_MD5_HASH_CTX objects (or 16 in AVX2 case, 32 in AVX512 case) 666df3ef80SGreg Tucker * being processed at a time. 676df3ef80SGreg Tucker * 68cca1040dSPablo de Lara * Each ISAL_MD5_HASH_CTX must be initialized before first use by the isal_hash_ctx_init macro 696df3ef80SGreg Tucker * defined in multi_buffer.h. After initialization, the application may begin computing 70cca1040dSPablo de Lara * a hash by giving the ISAL_MD5_HASH_CTX to a ISAL_MD5_HASH_CTX_MGR using the submit functions 71cca1040dSPablo de Lara * md5_ctx_mgr_submit*() with the ISAL_HASH_FIRST flag set. When the ISAL_MD5_HASH_CTX is 726df3ef80SGreg Tucker * returned to the application (via this or a later call to md5_ctx_mgr_submit*() or 736df3ef80SGreg Tucker * md5_ctx_mgr_flush*()), the application can then re-submit it with another call to 748cb7fe78SPablo de Lara * md5_ctx_mgr_submit*(), but without the ISAL_HASH_FIRST flag set. 756df3ef80SGreg Tucker * 766df3ef80SGreg Tucker * Ideally, on the last buffer for that hash, md5_ctx_mgr_submit_sse is called with 778cb7fe78SPablo de Lara * ISAL_HASH_LAST, although it is also possible to submit the hash with ISAL_HASH_LAST and a zero 78cca1040dSPablo de Lara * length if necessary. When a ISAL_MD5_HASH_CTX is returned after having been submitted with 79cca1040dSPablo de Lara * ISAL_HASH_LAST, it will contain a valid hash. The ISAL_MD5_HASH_CTX can be reused immediately 808cb7fe78SPablo de Lara * by submitting with ISAL_HASH_FIRST. 816df3ef80SGreg Tucker * 826df3ef80SGreg Tucker * For example, you would submit hashes with the following flags for the following numbers 836df3ef80SGreg Tucker * of buffers: 846df3ef80SGreg Tucker * <ul> 858cb7fe78SPablo de Lara * <li> one buffer: ISAL_HASH_FIRST | ISAL_HASH_LAST (or, equivalently, ISAL_HASH_ENTIRE) 868cb7fe78SPablo de Lara * <li> two buffers: ISAL_HASH_FIRST, ISAL_HASH_LAST 878cb7fe78SPablo de Lara * <li> three buffers: ISAL_HASH_FIRST, ISAL_HASH_UPDATE, ISAL_HASH_LAST 886df3ef80SGreg Tucker * etc. 896df3ef80SGreg Tucker * </ul> 906df3ef80SGreg Tucker * 916df3ef80SGreg Tucker * The order in which MD5_CTX objects are returned is in general different from the order 926df3ef80SGreg Tucker * in which they are submitted. 936df3ef80SGreg Tucker * 946df3ef80SGreg Tucker * A few possible error conditions exist: 956df3ef80SGreg Tucker * <ul> 966df3ef80SGreg Tucker * <li> Submitting flags other than the allowed entire/first/update/last values 97cca1040dSPablo de Lara * <li> Submitting a context that is currently being managed by a ISAL_MD5_HASH_CTX_MGR. 988cb7fe78SPablo de Lara * <li> Submitting a context after ISAL_HASH_LAST is used but before ISAL_HASH_FIRST is set. 996df3ef80SGreg Tucker * </ul> 1006df3ef80SGreg Tucker * 101cca1040dSPablo de Lara * These error conditions are reported by returning the ISAL_MD5_HASH_CTX immediately after 1026df3ef80SGreg Tucker * a submit with its error member set to a non-zero error code (defined in 103cca1040dSPablo de Lara * multi_buffer.h). No changes are made to the ISAL_MD5_HASH_CTX_MGR in the case of an 1046df3ef80SGreg Tucker * error; no processing is done for other hashes. 1056df3ef80SGreg Tucker * 1066df3ef80SGreg Tucker */ 1076df3ef80SGreg Tucker 1086df3ef80SGreg Tucker #include <stdint.h> 109fabd0c36SMarcel Cornu #include <string.h> 1106df3ef80SGreg Tucker #include "multi_buffer.h" 1116df3ef80SGreg Tucker #include "types.h" 1126df3ef80SGreg Tucker 1136df3ef80SGreg Tucker #ifdef __cplusplus 1146df3ef80SGreg Tucker extern "C" { 1156df3ef80SGreg Tucker #endif 1166df3ef80SGreg Tucker 117b1952c63SMarcel Cornu /* 118b1952c63SMarcel Cornu * Define enums from API v2.24, so applications that were using this version 119b1952c63SMarcel Cornu * will still be compiled successfully. 120b1952c63SMarcel Cornu * This list does not need to be extended for new definitions. 121b1952c63SMarcel Cornu */ 122b1952c63SMarcel Cornu #ifndef NO_COMPAT_ISAL_CRYPTO_API_2_24 123b1952c63SMarcel Cornu /***** Previous hash constants and typedefs *****/ 124b1952c63SMarcel Cornu #define MD5_DIGEST_NWORDS ISAL_MD5_DIGEST_NWORDS 125b1952c63SMarcel Cornu #define MD5_MAX_LANES ISAL_MD5_MAX_LANES 126b1952c63SMarcel Cornu #define MD5_MIN_LANES ISAL_MD5_MIN_LANES 127b1952c63SMarcel Cornu #define MD5_BLOCK_SIZE ISAL_MD5_BLOCK_SIZE 128b1952c63SMarcel Cornu #define MD5_PADLENGTHFIELD_SIZE ISAL_MD5_PADLENGTHFIELD_SIZE 129b1952c63SMarcel Cornu 130b1952c63SMarcel Cornu #define MD5_HASH_CTX ISAL_MD5_HASH_CTX 131b1952c63SMarcel Cornu #define md5_digest_array isal_md5_digest_array 132b1952c63SMarcel Cornu 133b1952c63SMarcel Cornu #define MD5_HASH_CTX_MGR ISAL_MD5_HASH_CTX_MGR 134b1952c63SMarcel Cornu #define MD5_JOB ISAL_MD5_JOB 135b1952c63SMarcel Cornu #define MD5_WORD_T ISAL_MD5_WORD_T 136b1952c63SMarcel Cornu #define MD5_MB_ARGS_X32 ISAL_MD5_MB_ARGS_X32 137b1952c63SMarcel Cornu #define MD5_LANE_DATA ISAL_MD5_LANE_DATA 138b1952c63SMarcel Cornu #define MD5_MB_JOB_MGR ISAL_MD5_MB_JOB_MGR 139b1952c63SMarcel Cornu #endif /* !NO_COMPAT_ISAL_CRYPTO_API_2_24 */ 140b1952c63SMarcel Cornu 1416df3ef80SGreg Tucker // Hash Constants and Typedefs 142cca1040dSPablo de Lara #define ISAL_MD5_DIGEST_NWORDS 4 143cca1040dSPablo de Lara #define ISAL_MD5_MAX_LANES 32 144cca1040dSPablo de Lara #define ISAL_MD5_MIN_LANES 8 145cca1040dSPablo de Lara #define ISAL_MD5_BLOCK_SIZE 64 146cca1040dSPablo de Lara #define ISAL_MD5_PADLENGTHFIELD_SIZE 8 1476df3ef80SGreg Tucker 148b1952c63SMarcel Cornu typedef uint32_t isal_md5_digest_array[ISAL_MD5_DIGEST_NWORDS][ISAL_MD5_MAX_LANES]; 149cca1040dSPablo de Lara typedef uint32_t ISAL_MD5_WORD_T; 1506df3ef80SGreg Tucker 1516df3ef80SGreg Tucker /** @brief Scheduler layer - Holds info describing a single MD5 job for the multi-buffer manager */ 1526df3ef80SGreg Tucker 1536df3ef80SGreg Tucker typedef struct { 1546df3ef80SGreg Tucker uint8_t *buffer; //!< pointer to data buffer for this job 1556df3ef80SGreg Tucker uint32_t len; //!< length of buffer for this job in blocks. 156cca1040dSPablo de Lara DECLARE_ALIGNED(uint32_t result_digest[ISAL_MD5_DIGEST_NWORDS], 64); 157*2d00dcb6SPablo de Lara //!< Digest output (in array of little-endian double words, different than SHA's). 1588cb7fe78SPablo de Lara ISAL_JOB_STS status; //!< output job status 1596df3ef80SGreg Tucker void *user_data; //!< pointer for user's job-related data 160cca1040dSPablo de Lara } ISAL_MD5_JOB; 1616df3ef80SGreg Tucker 1626df3ef80SGreg Tucker /** @brief Scheduler layer - Holds arguments for submitted MD5 job */ 1636df3ef80SGreg Tucker 1646df3ef80SGreg Tucker typedef struct { 165b1952c63SMarcel Cornu isal_md5_digest_array digest; 166cca1040dSPablo de Lara uint8_t *data_ptr[ISAL_MD5_MAX_LANES]; 167b1952c63SMarcel Cornu } ISAL_MD5_MB_ARGS_X32; 1686df3ef80SGreg Tucker 1696df3ef80SGreg Tucker /** @brief Scheduler layer - Lane data */ 1706df3ef80SGreg Tucker 1716df3ef80SGreg Tucker typedef struct { 172cca1040dSPablo de Lara ISAL_MD5_JOB *job_in_lane; 173cca1040dSPablo de Lara } ISAL_MD5_LANE_DATA; 1746df3ef80SGreg Tucker 1756df3ef80SGreg Tucker /** @brief Scheduler layer - Holds state for multi-buffer MD5 jobs */ 1766df3ef80SGreg Tucker 1776df3ef80SGreg Tucker typedef struct { 178b1952c63SMarcel Cornu ISAL_MD5_MB_ARGS_X32 args; 179cca1040dSPablo de Lara uint32_t lens[ISAL_MD5_MAX_LANES]; 1806df3ef80SGreg Tucker uint64_t unused_lanes[4]; //!< each byte or nibble is index (0...31 or 15) of unused lanes. 181cca1040dSPablo de Lara ISAL_MD5_LANE_DATA ldata[ISAL_MD5_MAX_LANES]; 1826df3ef80SGreg Tucker uint32_t num_lanes_inuse; 183cca1040dSPablo de Lara } ISAL_MD5_MB_JOB_MGR; 1846df3ef80SGreg Tucker 1856df3ef80SGreg Tucker /** @brief Context layer - Holds state for multi-buffer MD5 jobs */ 1866df3ef80SGreg Tucker 1876df3ef80SGreg Tucker typedef struct { 188cca1040dSPablo de Lara ISAL_MD5_MB_JOB_MGR mgr; 189cca1040dSPablo de Lara } ISAL_MD5_HASH_CTX_MGR; 1906df3ef80SGreg Tucker 1911de5344dSMarcel Cornu /** @brief Context layer - Holds info describing a single MD5 job for the multi-buffer CTX manager 1921de5344dSMarcel Cornu */ 1936df3ef80SGreg Tucker 1946df3ef80SGreg Tucker typedef struct { 195cca1040dSPablo de Lara ISAL_MD5_JOB job; // Must be at struct offset 0. 1968cb7fe78SPablo de Lara ISAL_HASH_CTX_STS status; //!< Context status flag 1978cb7fe78SPablo de Lara ISAL_HASH_CTX_ERROR error; //!< Context error flag 1985892c34bSChunyang Hui uint64_t total_length; //!< Running counter of length processed for this CTX's job 1996df3ef80SGreg Tucker const void *incoming_buffer; //!< pointer to data input buffer for this CTX's job 2006df3ef80SGreg Tucker uint32_t incoming_buffer_length; //!< length of buffer for this job in bytes. 201cca1040dSPablo de Lara uint8_t partial_block_buffer[ISAL_MD5_BLOCK_SIZE * 2]; //!< CTX partial blocks 2026df3ef80SGreg Tucker uint32_t partial_block_buffer_length; 2036df3ef80SGreg Tucker void *user_data; //!< pointer for user to keep any job-related data 204cca1040dSPablo de Lara } ISAL_MD5_HASH_CTX; 2056df3ef80SGreg Tucker 2066df3ef80SGreg Tucker /******************** multibinary function prototypes **********************/ 2076df3ef80SGreg Tucker 2086df3ef80SGreg Tucker /** 2096df3ef80SGreg Tucker * @brief Initialize the MD5 multi-buffer manager structure. 2106df3ef80SGreg Tucker * @requires SSE4.1 or AVX or AVX2 or AVX512 2110b8ee81fSPablo de Lara * @deprecated Please use isal_md5_ctx_mgr_init() instead. 2126df3ef80SGreg Tucker * 2136df3ef80SGreg Tucker * @param mgr Structure holding context level state info 2146df3ef80SGreg Tucker * @returns void 2156df3ef80SGreg Tucker */ 2160b8ee81fSPablo de Lara ISAL_DEPRECATED("Please use isal_md5_ctx_mgr_init() instead") 2171de5344dSMarcel Cornu void 218cca1040dSPablo de Lara md5_ctx_mgr_init(ISAL_MD5_HASH_CTX_MGR *mgr); 2196df3ef80SGreg Tucker 2206df3ef80SGreg Tucker /** 2216df3ef80SGreg Tucker * @brief Submit a new MD5 job to the multi-buffer manager. 2226df3ef80SGreg Tucker * @requires SSE4.1 or AVX or AVX2 or AVX512 2230b8ee81fSPablo de Lara * @deprecated Please use isal_md5_ctx_mgr_submit() instead. 2246df3ef80SGreg Tucker * 2256df3ef80SGreg Tucker * @param mgr Structure holding context level state info 2266df3ef80SGreg Tucker * @param ctx Structure holding ctx job info 2276df3ef80SGreg Tucker * @param buffer Pointer to buffer to be processed 2286df3ef80SGreg Tucker * @param len Length of buffer (in bytes) to be processed 2296df3ef80SGreg Tucker * @param flags Input flag specifying job type (first, update, last or entire) 2306df3ef80SGreg Tucker * @returns NULL if no jobs complete or pointer to jobs structure. 2316df3ef80SGreg Tucker */ 2320b8ee81fSPablo de Lara ISAL_DEPRECATED("Please use isal_md5_ctx_mgr_submit() instead") 233cca1040dSPablo de Lara ISAL_MD5_HASH_CTX * 234cca1040dSPablo de Lara md5_ctx_mgr_submit(ISAL_MD5_HASH_CTX_MGR *mgr, ISAL_MD5_HASH_CTX *ctx, const void *buffer, 235cca1040dSPablo de Lara uint32_t len, ISAL_HASH_CTX_FLAG flags); 2366df3ef80SGreg Tucker 2376df3ef80SGreg Tucker /** 2386df3ef80SGreg Tucker * @brief Finish all submitted MD5 jobs and return when complete. 2396df3ef80SGreg Tucker * @requires SSE4.1 or AVX or AVX2 or AVX512 2400b8ee81fSPablo de Lara * @deprecated Please use isal_md5_ctx_mgr_submit() instead. 2416df3ef80SGreg Tucker * 2426df3ef80SGreg Tucker * @param mgr Structure holding context level state info 2436df3ef80SGreg Tucker * @returns NULL if no jobs to complete or pointer to jobs structure. 2446df3ef80SGreg Tucker */ 2450b8ee81fSPablo de Lara ISAL_DEPRECATED("Please use isal_md5_ctx_mgr_submit() instead") 246cca1040dSPablo de Lara ISAL_MD5_HASH_CTX * 247cca1040dSPablo de Lara md5_ctx_mgr_flush(ISAL_MD5_HASH_CTX_MGR *mgr); 2486df3ef80SGreg Tucker 2499475391eSMarcel Cornu /** 2509475391eSMarcel Cornu * @brief Initialize the MD5 multi-buffer manager structure. 2519475391eSMarcel Cornu * @requires SSE4.1 for x86 or ASIMD for ARM 2529475391eSMarcel Cornu * 2539475391eSMarcel Cornu * @param[in] mgr Structure holding context level state info 2549475391eSMarcel Cornu * @return Operation status 2559475391eSMarcel Cornu * @retval 0 on success 2569475391eSMarcel Cornu * @retval Non-zero \a ISAL_CRYPTO_ERR on failure 2579475391eSMarcel Cornu */ 2581de5344dSMarcel Cornu int 259cca1040dSPablo de Lara isal_md5_ctx_mgr_init(ISAL_MD5_HASH_CTX_MGR *mgr); 2609475391eSMarcel Cornu 2619475391eSMarcel Cornu /** 2629475391eSMarcel Cornu * @brief Submit a new MD5 job to the multi-buffer manager. 2639475391eSMarcel Cornu * @requires SSE4.1 for x86 or ASIMD for ARM 2649475391eSMarcel Cornu * 2659475391eSMarcel Cornu * @param[in] mgr Structure holding context level state info 2669475391eSMarcel Cornu * @param[in] ctx_in Pointer to structure holding input job ctx info 2679475391eSMarcel Cornu * @param[out] ctx_out Pointer address to output job ctx info. 2689475391eSMarcel Cornu * Modified to point to completed job structure or 2699475391eSMarcel Cornu * NULL if no jobs completed. 2709475391eSMarcel Cornu * @param[in] buffer Pointer to buffer to be processed 2719475391eSMarcel Cornu * @param[in] len Length of buffer (in bytes) to be processed 2729475391eSMarcel Cornu * @param[in] flags Input flag specifying job type (first, update, last or entire) 2739475391eSMarcel Cornu * @return Operation status 2749475391eSMarcel Cornu * @retval 0 on success 2759475391eSMarcel Cornu * @retval Non-zero \a ISAL_CRYPTO_ERR on failure 2769475391eSMarcel Cornu */ 2771de5344dSMarcel Cornu int 278cca1040dSPablo de Lara isal_md5_ctx_mgr_submit(ISAL_MD5_HASH_CTX_MGR *mgr, ISAL_MD5_HASH_CTX *ctx_in, 279cca1040dSPablo de Lara ISAL_MD5_HASH_CTX **ctx_out, const void *buffer, const uint32_t len, 280cca1040dSPablo de Lara const ISAL_HASH_CTX_FLAG flags); 2819475391eSMarcel Cornu 2829475391eSMarcel Cornu /** 2839475391eSMarcel Cornu * @brief Finish all submitted MD5 jobs and return when complete. 2849475391eSMarcel Cornu * @requires SSE4.1 for x86 or ASIMD for ARM 2859475391eSMarcel Cornu * 2869475391eSMarcel Cornu * @param[in] mgr Structure holding context level state info 2879475391eSMarcel Cornu * @param[out] ctx_out Pointer address to output job ctx info. 2889475391eSMarcel Cornu * Modified to point to completed job structure or NULL 2899475391eSMarcel Cornu * if no jobs complete. 2909475391eSMarcel Cornu * @return Operation status 2919475391eSMarcel Cornu * @retval 0 on success 2929475391eSMarcel Cornu * @retval Non-zero \a ISAL_CRYPTO_ERR on failure 2939475391eSMarcel Cornu */ 2941de5344dSMarcel Cornu int 295cca1040dSPablo de Lara isal_md5_ctx_mgr_flush(ISAL_MD5_HASH_CTX_MGR *mgr, ISAL_MD5_HASH_CTX **ctx_out); 2966df3ef80SGreg Tucker #ifdef __cplusplus 2976df3ef80SGreg Tucker } 2986df3ef80SGreg Tucker #endif 2996df3ef80SGreg Tucker 3006df3ef80SGreg Tucker #endif // _MD5_MB_H_ 301