LCOV - code coverage report
Current view: top level - ballet/chacha - fd_chacha_rng.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 33 77 42.9 %
Date: 2026-03-19 18:19:27 Functions: 5 10 50.0 %

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

Generated by: LCOV version 1.14