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