153dc9fa0SGreg Tucker /********************************************************************** 253dc9fa0SGreg Tucker Copyright(c) 2011-2017 Intel Corporation All rights reserved. 353dc9fa0SGreg Tucker 453dc9fa0SGreg Tucker Redistribution and use in source and binary forms, with or without 553dc9fa0SGreg Tucker modification, are permitted provided that the following conditions 653dc9fa0SGreg Tucker are met: 753dc9fa0SGreg Tucker * Redistributions of source code must retain the above copyright 853dc9fa0SGreg Tucker notice, this list of conditions and the following disclaimer. 953dc9fa0SGreg Tucker * Redistributions in binary form must reproduce the above copyright 1053dc9fa0SGreg Tucker notice, this list of conditions and the following disclaimer in 1153dc9fa0SGreg Tucker the documentation and/or other materials provided with the 1253dc9fa0SGreg Tucker distribution. 1353dc9fa0SGreg Tucker * Neither the name of Intel Corporation nor the names of its 1453dc9fa0SGreg Tucker contributors may be used to endorse or promote products derived 1553dc9fa0SGreg Tucker from this software without specific prior written permission. 1653dc9fa0SGreg Tucker 1753dc9fa0SGreg Tucker THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1853dc9fa0SGreg Tucker "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1953dc9fa0SGreg Tucker LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2053dc9fa0SGreg Tucker A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2153dc9fa0SGreg Tucker OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2253dc9fa0SGreg Tucker SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2353dc9fa0SGreg Tucker LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2453dc9fa0SGreg Tucker DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2553dc9fa0SGreg Tucker THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2653dc9fa0SGreg Tucker (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2753dc9fa0SGreg Tucker OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2853dc9fa0SGreg Tucker **********************************************************************/ 2953dc9fa0SGreg Tucker 3053dc9fa0SGreg Tucker /** 3153dc9fa0SGreg Tucker * @file rolling_hashx.h 3253dc9fa0SGreg Tucker * @brief Fingerprint functions based on rolling hash 3353dc9fa0SGreg Tucker * 3453dc9fa0SGreg Tucker * rolling_hash2 - checks hash in a sliding window based on random 64-bit hash. 3553dc9fa0SGreg Tucker */ 3653dc9fa0SGreg Tucker 3753dc9fa0SGreg Tucker #ifndef _ROLLING_HASHX_H_ 3853dc9fa0SGreg Tucker #define _ROLLING_HASHX_H_ 3953dc9fa0SGreg Tucker 4053dc9fa0SGreg Tucker #ifdef __cplusplus 4153dc9fa0SGreg Tucker extern "C" { 4253dc9fa0SGreg Tucker #endif 4353dc9fa0SGreg Tucker 4453dc9fa0SGreg Tucker #include <stdint.h> 45283b3129SMarcel Cornu #include "types.h" 4653dc9fa0SGreg Tucker 470200e16bSMarcel Cornu /* 480200e16bSMarcel Cornu * Define enums from API v2.24, so applications that were using this version 490200e16bSMarcel Cornu * will still be compiled successfully. 500200e16bSMarcel Cornu * This list does not need to be extended for new definitions. 510200e16bSMarcel Cornu */ 520200e16bSMarcel Cornu #ifndef NO_COMPAT_ISAL_CRYPTO_API_2_24 530200e16bSMarcel Cornu /***** Previous hash constants and typedefs *****/ 540200e16bSMarcel Cornu #define FINGERPRINT_RET_HIT ISAL_FINGERPRINT_RET_HIT 550200e16bSMarcel Cornu #define FINGERPRINT_RET_MAX ISAL_FINGERPRINT_RET_MAX 560200e16bSMarcel Cornu #define FINGERPRINT_RET_OTHER ISAL_FINGERPRINT_RET_OTHER 570200e16bSMarcel Cornu 580200e16bSMarcel Cornu #define FINGERPRINT_MAX_WINDOW ISAL_FINGERPRINT_MAX_WINDOW 59*1e0b122eSMarcel Cornu 60*1e0b122eSMarcel Cornu #define rh_state2 isal_rh_state2 610200e16bSMarcel Cornu #endif /* !NO_COMPAT_ISAL_CRYPTO_API_2_24 */ 620200e16bSMarcel Cornu 6353dc9fa0SGreg Tucker /** 6453dc9fa0SGreg Tucker *@brief rolling hash return values 6553dc9fa0SGreg Tucker */ 6653dc9fa0SGreg Tucker enum { 670200e16bSMarcel Cornu ISAL_FINGERPRINT_RET_HIT = 0, //!< Fingerprint trigger hit 680200e16bSMarcel Cornu ISAL_FINGERPRINT_RET_MAX, //!< Fingerprint max length reached before hit 690200e16bSMarcel Cornu ISAL_FINGERPRINT_RET_OTHER //!< Fingerprint function error returned 7053dc9fa0SGreg Tucker }; 7153dc9fa0SGreg Tucker 720200e16bSMarcel Cornu #define ISAL_FINGERPRINT_MAX_WINDOW 48 7353dc9fa0SGreg Tucker 7453dc9fa0SGreg Tucker /** 7553dc9fa0SGreg Tucker * @brief Context for rolling_hash2 functions 7653dc9fa0SGreg Tucker */ 77*1e0b122eSMarcel Cornu struct isal_rh_state2 { 780200e16bSMarcel Cornu uint8_t history[ISAL_FINGERPRINT_MAX_WINDOW]; 7953dc9fa0SGreg Tucker uint64_t table1[256]; 8053dc9fa0SGreg Tucker uint64_t table2[256]; 8153dc9fa0SGreg Tucker uint64_t hash; 8253dc9fa0SGreg Tucker uint32_t w; 8353dc9fa0SGreg Tucker }; 8453dc9fa0SGreg Tucker 8553dc9fa0SGreg Tucker /** 8653dc9fa0SGreg Tucker * @brief Initialize state object for rolling hash2 8753dc9fa0SGreg Tucker * 8853dc9fa0SGreg Tucker * @param state Structure holding state info on current rolling hash 8953dc9fa0SGreg Tucker * @param w Window width (1 <= w <= 32) 9053dc9fa0SGreg Tucker * @returns 0 - success, -1 - failure 91283b3129SMarcel Cornu * @deprecated Please use isal_rolling_hash2_init() instead. 9253dc9fa0SGreg Tucker */ 93283b3129SMarcel Cornu ISAL_DEPRECATED("Please use isal_rolling_hash2_init() instead") 941de5344dSMarcel Cornu int 95*1e0b122eSMarcel Cornu rolling_hash2_init(struct isal_rh_state2 *state, uint32_t w); 9653dc9fa0SGreg Tucker 9753dc9fa0SGreg Tucker /** 9853dc9fa0SGreg Tucker * @brief Reset the hash state history 9953dc9fa0SGreg Tucker * 10053dc9fa0SGreg Tucker * @param state Structure holding state info on current rolling hash 10153dc9fa0SGreg Tucker * @param init_bytes Optional window size buffer to pre-init hash 10253dc9fa0SGreg Tucker * @returns none 103283b3129SMarcel Cornu * @deprecated Please use isal_rolling_hash2_reset() instead. 10453dc9fa0SGreg Tucker */ 105283b3129SMarcel Cornu ISAL_DEPRECATED("Please use isal_rolling_hash2_reset() instead") 1061de5344dSMarcel Cornu void 107*1e0b122eSMarcel Cornu rolling_hash2_reset(struct isal_rh_state2 *state, uint8_t *init_bytes); 10853dc9fa0SGreg Tucker 10953dc9fa0SGreg Tucker /** 11053dc9fa0SGreg Tucker * @brief Run rolling hash function until trigger met or max length reached 11153dc9fa0SGreg Tucker * 11253dc9fa0SGreg Tucker * Checks for trigger based on a random hash in a sliding window. 11353dc9fa0SGreg Tucker * @param state Structure holding state info on current rolling hash 11453dc9fa0SGreg Tucker * @param buffer Pointer to input buffer to run windowed hash on 11553dc9fa0SGreg Tucker * @param max_len Max length to run over input 11653dc9fa0SGreg Tucker * @param mask Mask bits ORed with hash before test with trigger 11753dc9fa0SGreg Tucker * @param trigger Match value to compare with windowed hash at each input byte 11853dc9fa0SGreg Tucker * @param offset Offset from buffer to match, set if match found 1190200e16bSMarcel Cornu * @returns ISAL_FINGERPRINT_RET_HIT - match found, ISAL_FINGERPRINT_RET_MAX - exceeded max length 120283b3129SMarcel Cornu * @deprecated Please use isal_rolling_hash2_run() instead. 12153dc9fa0SGreg Tucker */ 122283b3129SMarcel Cornu ISAL_DEPRECATED("Please use isal_rolling_hash2_run() instead") 1231de5344dSMarcel Cornu int 124*1e0b122eSMarcel Cornu rolling_hash2_run(struct isal_rh_state2 *state, uint8_t *buffer, uint32_t max_len, uint32_t mask, 1251de5344dSMarcel Cornu uint32_t trigger, uint32_t *offset); 12653dc9fa0SGreg Tucker 12753dc9fa0SGreg Tucker /** 12853dc9fa0SGreg Tucker * @brief Generate an appropriate mask to target mean hit rate 12953dc9fa0SGreg Tucker * 13053dc9fa0SGreg Tucker * @param mean Target chunk size in bytes 13153dc9fa0SGreg Tucker * @param shift Bits to rotate result to get independent masks 13253dc9fa0SGreg Tucker * @returns 32-bit mask value 133283b3129SMarcel Cornu * @deprecated Please use isal_rolling_hashx_mask_gen() instead. 13453dc9fa0SGreg Tucker */ 135283b3129SMarcel Cornu ISAL_DEPRECATED("Please use isal_rolling_hashx_mask_gen() instead") 1361de5344dSMarcel Cornu uint32_t 1371de5344dSMarcel Cornu rolling_hashx_mask_gen(long mean, int shift); 13853dc9fa0SGreg Tucker 13996581315SMarcel Cornu /** 14096581315SMarcel Cornu * @brief Initialize state object for rolling hash2 14196581315SMarcel Cornu * 14296581315SMarcel Cornu * @param[in] state Structure holding state info on current rolling hash 14396581315SMarcel Cornu * @param[in] w Window width (1 <= w <= 32) 14496581315SMarcel Cornu * @return Operation status 14596581315SMarcel Cornu * @retval 0 on success 14696581315SMarcel Cornu * @retval Non-zero \a ISAL_CRYPTO_ERR on failure 14796581315SMarcel Cornu */ 14896581315SMarcel Cornu int 149*1e0b122eSMarcel Cornu isal_rolling_hash2_init(struct isal_rh_state2 *state, const uint32_t w); 15096581315SMarcel Cornu 15196581315SMarcel Cornu /** 15296581315SMarcel Cornu * @brief Reset the hash state history 15396581315SMarcel Cornu * 15496581315SMarcel Cornu * @param[in] state Structure holding state info on current rolling hash 15596581315SMarcel Cornu * @param[in] init_bytes Optional window size buffer to pre-init hash 15696581315SMarcel Cornu * @return Operation status 15796581315SMarcel Cornu * @retval 0 on success 15896581315SMarcel Cornu * @retval Non-zero \a ISAL_CRYPTO_ERR on failure 15996581315SMarcel Cornu */ 16096581315SMarcel Cornu int 161*1e0b122eSMarcel Cornu isal_rolling_hash2_reset(struct isal_rh_state2 *state, const uint8_t *init_bytes); 16296581315SMarcel Cornu 16396581315SMarcel Cornu /** 16496581315SMarcel Cornu * @brief Run rolling hash function until trigger met or max length reached 16596581315SMarcel Cornu * 16696581315SMarcel Cornu * Checks for trigger based on a random hash in a sliding window. 16796581315SMarcel Cornu * @param[in] state Structure holding state info on current rolling hash 16896581315SMarcel Cornu * @param[in] buffer Pointer to input buffer to run windowed hash on 16996581315SMarcel Cornu * @param[in] max_len Max length to run over input 17096581315SMarcel Cornu * @param[in] mask Mask bits ORed with hash before test with trigger 17196581315SMarcel Cornu * @param[in] trigger Match value to compare with windowed hash at each input byte 17296581315SMarcel Cornu * @param[out] offset Offset from buffer to match, set if match found 17396581315SMarcel Cornu * @param[out] match Pointer to fingerprint result status to set 1740200e16bSMarcel Cornu * ISAL_FINGERPRINT_RET_HIT - match found 1750200e16bSMarcel Cornu * ISAL_FINGERPRINT_RET_MAX - exceeded max length 1760200e16bSMarcel Cornu * ISAL_FINGERPRINT_RET_OTHER - error 17796581315SMarcel Cornu * @return Operation status 17896581315SMarcel Cornu * @retval 0 on success 17996581315SMarcel Cornu * @retval Non-zero \a ISAL_CRYPTO_ERR on failure 18096581315SMarcel Cornu */ 18196581315SMarcel Cornu int 182*1e0b122eSMarcel Cornu isal_rolling_hash2_run(struct isal_rh_state2 *state, const uint8_t *buffer, const uint32_t max_len, 18396581315SMarcel Cornu const uint32_t mask, const uint32_t trigger, uint32_t *offset, int *match); 18496581315SMarcel Cornu 18596581315SMarcel Cornu /** 18696581315SMarcel Cornu * @brief Generate an appropriate mask to target mean hit rate 18796581315SMarcel Cornu * 18896581315SMarcel Cornu * @param[in] mean Target chunk size in bytes 18996581315SMarcel Cornu * @param[in] shift Bits to rotate result to get independent masks 19096581315SMarcel Cornu * @param[out] mask Generated 32-bit mask value 19196581315SMarcel Cornu * @return Operation status 19296581315SMarcel Cornu * @retval 0 on success 19396581315SMarcel Cornu * @retval Non-zero \a ISAL_CRYPTO_ERR on failure 19496581315SMarcel Cornu */ 19596581315SMarcel Cornu int 19696581315SMarcel Cornu isal_rolling_hashx_mask_gen(const uint32_t mean, const uint32_t shift, uint32_t *mask); 19796581315SMarcel Cornu 19853dc9fa0SGreg Tucker #ifdef __cplusplus 19953dc9fa0SGreg Tucker } 20053dc9fa0SGreg Tucker #endif 20153dc9fa0SGreg Tucker 20253dc9fa0SGreg Tucker #endif // _ROLLING_HASHX_H_ 203