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 321057 : fd_chacha_rng_new( void * shmem, int mode ) { 15 321057 : if( FD_UNLIKELY( !shmem ) ) { 16 3 : FD_LOG_WARNING(( "NULL shmem" )); 17 3 : return NULL; 18 3 : } 19 321054 : 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 321051 : memset( shmem, 0, sizeof(fd_chacha_rng_t) ); 24 321051 : 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 321048 : ((fd_chacha_rng_t *)shmem)->mode = mode; 29 321048 : ((fd_chacha_rng_t *)shmem)->algo = FD_CHACHA_RNG_ALGO_CHACHA20; 30 321048 : return shmem; 31 321051 : } 32 : 33 : fd_chacha_rng_t * 34 321051 : fd_chacha_rng_join( void * shrng ) { 35 321051 : if( FD_UNLIKELY( !shrng ) ) { 36 3 : FD_LOG_WARNING(( "NULL shrng" )); 37 3 : return NULL; 38 3 : } 39 321048 : return (fd_chacha_rng_t *)shrng; 40 321051 : } 41 : 42 : void * 43 320751 : fd_chacha_rng_leave( fd_chacha_rng_t * rng ) { 44 320751 : if( FD_UNLIKELY( !rng ) ) { 45 3 : FD_LOG_WARNING(( "NULL rng" )); 46 3 : return NULL; 47 3 : } 48 320748 : return (void *)rng; 49 320751 : } 50 : 51 : void * 52 320751 : fd_chacha_rng_delete( void * shrng ) { 53 320751 : if( FD_UNLIKELY( !shrng ) ) { 54 3 : FD_LOG_WARNING(( "NULL shrng" )); 55 3 : return NULL; 56 3 : } 57 320748 : memset( shrng, 0, sizeof(fd_chacha_rng_t) ); 58 320748 : return shrng; 59 320751 : } 60 : 61 : fd_chacha_rng_t * 62 : fd_chacha_rng_init( fd_chacha_rng_t * rng, 63 : void const * key, 64 2594279 : int algo ) { 65 2594279 : memcpy( rng->key, key, FD_CHACHA_KEY_SZ ); 66 2594279 : rng->buf_off = 0UL; 67 2594279 : rng->buf_fill = 0UL; 68 : 69 : /* invalid algo defaults to chacha20 */ 70 2594279 : rng->algo = algo; 71 2594279 : if( algo==FD_CHACHA_RNG_ALGO_CHACHA8 ) { 72 780046 : fd_chacha8_rng_private_refill( rng ); 73 1814233 : } else { 74 1814233 : fd_chacha20_rng_private_refill( rng ); 75 1814233 : } 76 : 77 2594279 : return rng; 78 2594279 : } 79 : 80 : static void 81 : fd_chacha_rng_refill_seq( fd_chacha_rng_t * rng, 82 6600000 : void * (* block_fn)( void *, void const *, void const * ) ) { 83 6600000 : ulong fill_target = FD_CHACHA_RNG_BUFSZ - FD_CHACHA_BLOCK_SZ; 84 : 85 6600000 : ulong buf_avail; 86 13199994 : while( (buf_avail=(rng->buf_fill - rng->buf_off))<fill_target ) { 87 6599994 : ulong idx = rng->buf_fill >> 6; 88 6599994 : uint idx_nonce[4] __attribute__((aligned(16))) = 89 6599994 : { (uint)idx, 0U, 0U, 0U }; 90 6599994 : block_fn( rng->buf + (rng->buf_fill % FD_CHACHA_RNG_BUFSZ), 91 6599994 : rng->key, 92 6599994 : idx_nonce ); 93 6599994 : rng->buf_fill += (uint)FD_CHACHA_BLOCK_SZ; 94 6599994 : } 95 6600000 : } 96 : 97 : void 98 3300000 : fd_chacha8_rng_refill_seq( fd_chacha_rng_t * rng ) { 99 3300000 : fd_chacha_rng_refill_seq( rng, fd_chacha8_block ); 100 3300000 : } 101 : 102 : void 103 3300000 : fd_chacha20_rng_refill_seq( fd_chacha_rng_t * rng ) { 104 3300000 : fd_chacha_rng_refill_seq( rng, fd_chacha20_block ); 105 3300000 : }