LCOV - code coverage report
Current view: top level - ballet/chacha - fd_chacha_rng.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 71 71 100.0 %
Date: 2025-09-20 04:42:25 Functions: 10 10 100.0 %

          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 : }

Generated by: LCOV version 1.14