Line data Source code
1 : #ifndef HEADER_fd_src_ballet_siphash13_fd_siphash13_h 2 : #define HEADER_fd_src_ballet_siphash13_fd_siphash13_h 3 : 4 : /* fd_siphash13 provides APIs for SipHash1-3. 5 : (1 compression round, 3 finalization rounds) 6 : 7 : This code is a modified version of https://github.com/antirez/siphash 8 : For further license info see NOTICE in the root of this repo. 9 : 10 : Copyright (c) 2012-2016 Jean-Philippe Aumasson 11 : <jeanphilippe.aumasson@gmail.com> 12 : Copyright (c) 2012-2014 Daniel J. Bernstein <djb@cr.yp.to> 13 : Copyright (c) 2017 Salvatore Sanfilippo <antirez@gmail.com> 14 : Modified 2023 by Firedancer Contributors */ 15 : 16 : #include "../fd_ballet_base.h" 17 : 18 : #define FD_SIPHASH13_ALIGN (128UL) 19 : #define FD_SIPHASH13_FOOTPRINT (128UL) 20 : 21 : struct __attribute__((aligned(FD_SIPHASH13_ALIGN))) fd_siphash13_private { 22 : ulong v[ 4 ]; 23 : ulong n; 24 : uchar buf[ 8 ]; 25 : }; 26 : 27 : typedef struct fd_siphash13_private fd_siphash13_t; 28 : 29 : /* FD_SIPHASH_ROUND is the SipHash1-3 round function */ 30 : 31 : #define FD_SIPHASH_ROUND(v) \ 32 483122232 : do { \ 33 483122232 : (v)[0] += (v)[1]; \ 34 483122232 : (v)[1] = fd_ulong_rotate_left((v)[1], 13); \ 35 483122232 : (v)[1] ^= (v)[0]; \ 36 483122232 : (v)[0] = fd_ulong_rotate_left((v)[0], 32); \ 37 483122232 : (v)[2] += (v)[3]; \ 38 483122232 : (v)[3] = fd_ulong_rotate_left((v)[3], 16); \ 39 483122232 : (v)[3] ^= (v)[2]; \ 40 483122232 : (v)[0] += (v)[3]; \ 41 483122232 : (v)[3] = fd_ulong_rotate_left((v)[3], 21); \ 42 483122232 : (v)[3] ^= (v)[0]; \ 43 483122232 : (v)[2] += (v)[1]; \ 44 483122232 : (v)[1] = fd_ulong_rotate_left((v)[1], 17); \ 45 483122232 : (v)[1] ^= (v)[2]; \ 46 483122232 : (v)[2] = fd_ulong_rotate_left((v)[2], 32); \ 47 483122232 : } while (0) 48 : 49 : FD_PROTOTYPES_BEGIN 50 : 51 : /* fd_siphash13_init starts a new SipHash1-3 calculation */ 52 : 53 : fd_siphash13_t * 54 : fd_siphash13_init( fd_siphash13_t * sip, 55 : ulong k0, 56 : ulong k1 ); 57 : 58 : fd_siphash13_t * 59 : fd_siphash13_append( fd_siphash13_t * sip, 60 : uchar const * data, 61 : ulong sz ); 62 : 63 : /* fd_siphash13_append_fast is an aligned-only version of 64 : fd_siphash13_append. sip->n and sz must be multiplies of 8 bytes. */ 65 : 66 : fd_siphash13_t * 67 : fd_siphash13_append_fast( fd_siphash13_t * sip, 68 : uchar const * data, 69 : ulong sz ); 70 : 71 : /* fd_siphash13_fini finishes a SipHash1-3 calculation. Returns the 72 : hash value. */ 73 : 74 : ulong 75 : fd_siphash13_fini( fd_siphash13_t * sip ); 76 : 77 : /* fd_siphash13_hash is a streamlined implementation of: 78 : 79 : fd_siphash13_t sip[1]; 80 : return fd_siphash13_fini( fd_siphash13_append( fd_siphash13_init( sip ), data, sz ) ); 81 : 82 : This can be faster for small message sizes. */ 83 : 84 : FD_FN_PURE ulong 85 : fd_siphash13_hash( void const * data, 86 : ulong sz, 87 : ulong k0, 88 : ulong k1 ); 89 : 90 : FD_PROTOTYPES_END 91 : 92 : #endif /* HEADER_fd_src_ballet_siphash13_fd_siphash13_h */