Line data Source code
1 : #include "fd_chacha_rng.h" 2 : 3 : FD_FN_CONST ulong 4 3 : fd_chacha_rng_align( void ) { 5 3 : return alignof(fd_chacha_rng_t); 6 3 : } 7 : 8 : FD_FN_CONST ulong 9 3 : fd_chacha_rng_footprint( void ) { 10 3 : return sizeof(fd_chacha_rng_t); 11 3 : } 12 : 13 : void * 14 320223 : fd_chacha_rng_new( void * shmem, int mode ) { 15 320223 : if( FD_UNLIKELY( !shmem ) ) { 16 3 : FD_LOG_WARNING(( "NULL shmem" )); 17 3 : return NULL; 18 3 : } 19 320220 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shmem, alignof(fd_chacha_rng_t) ) ) ) { 20 3 : FD_LOG_WARNING(( "misaligned shmem" )); 21 3 : return NULL; 22 3 : } 23 320217 : memset( shmem, 0, sizeof(fd_chacha_rng_t) ); 24 320217 : if( FD_UNLIKELY( (mode!=FD_CHACHA_RNG_MODE_MOD) & (mode!=FD_CHACHA_RNG_MODE_SHIFT) ) ) { 25 3 : FD_LOG_WARNING(( "invalid mode" )); 26 3 : return NULL; 27 3 : } 28 320214 : ((fd_chacha_rng_t *)shmem)->mode = mode; 29 : 30 320214 : return shmem; 31 320217 : } 32 : 33 : fd_chacha_rng_t * 34 320217 : fd_chacha_rng_join( void * shrng ) { 35 320217 : if( FD_UNLIKELY( !shrng ) ) { 36 3 : FD_LOG_WARNING(( "NULL shrng" )); 37 3 : return NULL; 38 3 : } 39 320214 : return (fd_chacha_rng_t *)shrng; 40 320217 : } 41 : 42 : void * 43 320097 : fd_chacha_rng_leave( fd_chacha_rng_t * rng ) { 44 320097 : if( FD_UNLIKELY( !rng ) ) { 45 3 : FD_LOG_WARNING(( "NULL rng" )); 46 3 : return NULL; 47 3 : } 48 320094 : return (void *)rng; 49 320097 : } 50 : 51 : void * 52 320097 : fd_chacha_rng_delete( void * shrng ) { 53 320097 : if( FD_UNLIKELY( !shrng ) ) { 54 3 : FD_LOG_WARNING(( "NULL shrng" )); 55 3 : return NULL; 56 3 : } 57 320094 : memset( shrng, 0, sizeof(fd_chacha_rng_t) ); 58 320094 : return shrng; 59 320097 : } 60 : 61 : fd_chacha_rng_t * 62 : fd_chacha20_rng_init( fd_chacha_rng_t * rng, 63 4513892 : void const * key ) { 64 4513892 : memcpy( rng->key, key, FD_CHACHA20_KEY_SZ ); 65 4513892 : rng->buf_off = 0UL; 66 4513892 : rng->buf_fill = 0UL; 67 4513892 : fd_chacha20_rng_private_refill( rng ); 68 4513892 : return rng; 69 4513892 : } 70 : 71 : static void 72 : fd_chacha_rng_refill_seq( fd_chacha_rng_t * rng, 73 6600000 : void * (* block_fn)( void *, void const *, void const * ) ) { 74 6600000 : ulong fill_target = FD_CHACHA_RNG_BUFSZ - FD_CHACHA_BLOCK_SZ; 75 : 76 6600000 : ulong buf_avail; 77 13199994 : while( (buf_avail=(rng->buf_fill - rng->buf_off))<fill_target ) { 78 6599994 : ulong idx = rng->buf_fill >> 6; 79 6599994 : uint idx_nonce[4] __attribute__((aligned(16))) = 80 6599994 : { (uint)idx, 0U, 0U, 0U }; 81 6599994 : block_fn( rng->buf + (rng->buf_fill % FD_CHACHA_RNG_BUFSZ), 82 6599994 : rng->key, 83 6599994 : idx_nonce ); 84 6599994 : rng->buf_fill += (uint)FD_CHACHA_BLOCK_SZ; 85 6599994 : } 86 6600000 : } 87 : 88 : void 89 3300000 : fd_chacha8_rng_refill_seq( fd_chacha_rng_t * rng ) { 90 3300000 : fd_chacha_rng_refill_seq( rng, fd_chacha8_block ); 91 3300000 : } 92 : 93 : void 94 3300000 : fd_chacha20_rng_refill_seq( fd_chacha_rng_t * rng ) { 95 3300000 : fd_chacha_rng_refill_seq( rng, fd_chacha20_block ); 96 3300000 : }