LCOV - code coverage report
Current view: top level - ballet/chacha - fd_chacha_rng.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 77 77 100.0 %
Date: 2026-01-23 05:02:40 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      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 : }

Generated by: LCOV version 1.14