xref: /isa-l_crypto/include/rolling_hashx.h (revision 1e0b122e090c8ad3a8d8c56e182f754ea26fe70d)
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