LCOV - code coverage report
Current view: top level - ballet/blake3 - fd_blake3.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 71 85 83.5 %
Date: 2025-08-05 05:04:49 Functions: 9 11 81.8 %

          Line data    Source code
       1             : #include "fd_blake3.h"
       2             : #include "blake3_impl.h"
       3             : #include "blake3_dispatch.c"
       4             : #include "blake3.c"
       5             : 
       6             : ulong
       7          21 : fd_blake3_align( void ) {
       8          21 :   return FD_BLAKE3_ALIGN;
       9          21 : }
      10             : 
      11             : ulong
      12           6 : fd_blake3_footprint( void ) {
      13           6 :   return FD_BLAKE3_FOOTPRINT;
      14           6 : }
      15             : 
      16             : void *
      17           9 : fd_blake3_new( void * shmem ) {
      18           9 :   fd_blake3_t * sha = (fd_blake3_t *)shmem;
      19             : 
      20           9 :   if( FD_UNLIKELY( !shmem ) ) {
      21           3 :     FD_LOG_WARNING(( "NULL shmem" ));
      22           3 :     return NULL;
      23           3 :   }
      24             : 
      25           6 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shmem, fd_blake3_align() ) ) ) {
      26           3 :     FD_LOG_WARNING(( "misaligned shmem" ));
      27           3 :     return NULL;
      28           3 :   }
      29             : 
      30           3 :   ulong footprint = fd_blake3_footprint();
      31             : 
      32           3 :   fd_memset( sha, 0, footprint );
      33             : 
      34           3 :   FD_COMPILER_MFENCE();
      35           3 :   FD_VOLATILE( sha->magic ) = FD_BLAKE3_MAGIC;
      36           3 :   FD_COMPILER_MFENCE();
      37             : 
      38           3 :   return (void *)sha;
      39           6 : }
      40             : 
      41             : fd_blake3_t *
      42           9 : fd_blake3_join( void * shsha ) {
      43             : 
      44           9 :   if( FD_UNLIKELY( !shsha ) ) {
      45           3 :     FD_LOG_WARNING(( "NULL shsha" ));
      46           3 :     return NULL;
      47           3 :   }
      48             : 
      49           6 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shsha, fd_blake3_align() ) ) ) {
      50           3 :     FD_LOG_WARNING(( "misaligned shsha" ));
      51           3 :     return NULL;
      52           3 :   }
      53             : 
      54           3 :   fd_blake3_t * sha = (fd_blake3_t *)shsha;
      55             : 
      56           3 :   if( FD_UNLIKELY( sha->magic!=FD_BLAKE3_MAGIC ) ) {
      57           0 :     FD_LOG_WARNING(( "bad magic" ));
      58           0 :     return NULL;
      59           0 :   }
      60             : 
      61           3 :   return sha;
      62           3 : }
      63             : 
      64             : void *
      65           6 : fd_blake3_leave( fd_blake3_t * sha ) {
      66             : 
      67           6 :   if( FD_UNLIKELY( !sha ) ) {
      68           3 :     FD_LOG_WARNING(( "NULL sha" ));
      69           3 :     return NULL;
      70           3 :   }
      71             : 
      72           3 :   return (void *)sha;
      73           6 : }
      74             : 
      75             : void *
      76           9 : fd_blake3_delete( void * shsha ) {
      77             : 
      78           9 :   if( FD_UNLIKELY( !shsha ) ) {
      79           3 :     FD_LOG_WARNING(( "NULL shsha" ));
      80           3 :     return NULL;
      81           3 :   }
      82             : 
      83           6 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shsha, fd_blake3_align() ) ) ) {
      84           3 :     FD_LOG_WARNING(( "misaligned shsha" ));
      85           3 :     return NULL;
      86           3 :   }
      87             : 
      88           3 :   fd_blake3_t * sha = (fd_blake3_t *)shsha;
      89             : 
      90           3 :   if( FD_UNLIKELY( sha->magic!=FD_BLAKE3_MAGIC ) ) {
      91           0 :     FD_LOG_WARNING(( "bad magic" ));
      92           0 :     return NULL;
      93           0 :   }
      94             : 
      95           3 :   FD_COMPILER_MFENCE();
      96           3 :   FD_VOLATILE( sha->magic ) = 0UL;
      97           3 :   FD_COMPILER_MFENCE();
      98             : 
      99           3 :   return (void *)sha;
     100           3 : }
     101             : 
     102             : /* The implementation below is a wrapper around the BLAKE3 reference
     103             :    implementation (CC0-1.0 and Apache-2.0 licensed).  See in particular:
     104             : 
     105             :    https://github.com/BLAKE3-team/BLAKE3/tree/master/c
     106             : 
     107             :    We bring in the portable implementation of BLAKE3 and the AVX2
     108             :    implementation.  There is room for improvement in these implementations In
     109             :    particular:
     110             : 
     111             :     - Using fd_memset, fd_memcpy where reference implementation uses memset, memcpy
     112             :     - Reduction in the number of memset(s) and memcpy(s)
     113             :     - Better AVX2 routines
     114             : 
     115             :    It is also straightforward to replace or improve these implementations with
     116             :    HPC implementations that target specific machine capabilities without
     117             :    requiring any changes to caller code. */
     118             : 
     119             : fd_blake3_t *
     120    25417488 : fd_blake3_init( fd_blake3_t * sha ) {
     121    25417488 :   fd_blake3_hasher_init( &sha->hasher );
     122    25417488 :   return sha;
     123    25417488 : }
     124             : 
     125             : fd_blake3_t *
     126             : fd_blake3_append( fd_blake3_t * sha,
     127             :                   void const *  data,
     128    25417674 :                   ulong         sz ) {
     129    25417674 :   fd_blake3_hasher_update( &sha->hasher, data, sz);
     130    25417674 :   return sha;
     131    25417674 : }
     132             : 
     133             : void *
     134             : fd_blake3_fini( fd_blake3_t * sha,
     135    25417488 :                 void *        hash ) {
     136    25417488 :   fd_blake3_hasher_finalize( &sha->hasher, (uchar *) hash, 32 );
     137    25417488 :   return hash;
     138    25417488 : }
     139             : 
     140             : void *
     141             : fd_blake3_fini_512( fd_blake3_t * sha,
     142           0 :                     void *        hash ) {
     143           0 :   fd_blake3_hasher_finalize( &sha->hasher, (uchar *) hash, 64 );
     144           0 :   return hash;
     145           0 : }
     146             : 
     147             : void *
     148             : fd_blake3_fini_varlen( fd_blake3_t * sha,
     149             :                        void *        hash,
     150           0 :                        ulong         hash_len ) {
     151           0 :   fd_blake3_hasher_finalize( &sha->hasher, (uchar *) hash, hash_len );
     152           0 :   return hash;
     153           0 : }

Generated by: LCOV version 1.14