LCOV - code coverage report
Current view: top level - ballet/blake3 - fd_blake3.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 12 85 14.1 %
Date: 2024-11-13 11:58:15 Functions: 3 11 27.3 %

          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           0 : fd_blake3_align( void ) {
       8           0 :   return FD_BLAKE3_ALIGN;
       9           0 : }
      10             : 
      11             : ulong
      12           0 : fd_blake3_footprint( void ) {
      13           0 :   return FD_BLAKE3_FOOTPRINT;
      14           0 : }
      15             : 
      16             : void *
      17           0 : fd_blake3_new( void * shmem ) {
      18           0 :   fd_blake3_t * sha = (fd_blake3_t *)shmem;
      19             : 
      20           0 :   if( FD_UNLIKELY( !shmem ) ) {
      21           0 :     FD_LOG_WARNING(( "NULL shmem" ));
      22           0 :     return NULL;
      23           0 :   }
      24             : 
      25           0 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shmem, fd_blake3_align() ) ) ) {
      26           0 :     FD_LOG_WARNING(( "misaligned shmem" ));
      27           0 :     return NULL;
      28           0 :   }
      29             : 
      30           0 :   ulong footprint = fd_blake3_footprint();
      31             : 
      32           0 :   fd_memset( sha, 0, footprint );
      33             : 
      34           0 :   FD_COMPILER_MFENCE();
      35           0 :   FD_VOLATILE( sha->magic ) = FD_BLAKE3_MAGIC;
      36           0 :   FD_COMPILER_MFENCE();
      37             : 
      38           0 :   return (void *)sha;
      39           0 : }
      40             : 
      41             : fd_blake3_t *
      42           0 : fd_blake3_join( void * shsha ) {
      43             : 
      44           0 :   if( FD_UNLIKELY( !shsha ) ) {
      45           0 :     FD_LOG_WARNING(( "NULL shsha" ));
      46           0 :     return NULL;
      47           0 :   }
      48             : 
      49           0 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shsha, fd_blake3_align() ) ) ) {
      50           0 :     FD_LOG_WARNING(( "misaligned shsha" ));
      51           0 :     return NULL;
      52           0 :   }
      53             : 
      54           0 :   fd_blake3_t * sha = (fd_blake3_t *)shsha;
      55             : 
      56           0 :   if( FD_UNLIKELY( sha->magic!=FD_BLAKE3_MAGIC ) ) {
      57           0 :     FD_LOG_WARNING(( "bad magic" ));
      58           0 :     return NULL;
      59           0 :   }
      60             : 
      61           0 :   return sha;
      62           0 : }
      63             : 
      64             : void *
      65           0 : fd_blake3_leave( fd_blake3_t * sha ) {
      66             : 
      67           0 :   if( FD_UNLIKELY( !sha ) ) {
      68           0 :     FD_LOG_WARNING(( "NULL sha" ));
      69           0 :     return NULL;
      70           0 :   }
      71             : 
      72           0 :   return (void *)sha;
      73           0 : }
      74             : 
      75             : void *
      76           0 : fd_blake3_delete( void * shsha ) {
      77             : 
      78           0 :   if( FD_UNLIKELY( !shsha ) ) {
      79           0 :     FD_LOG_WARNING(( "NULL shsha" ));
      80           0 :     return NULL;
      81           0 :   }
      82             : 
      83           0 :   if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shsha, fd_blake3_align() ) ) ) {
      84           0 :     FD_LOG_WARNING(( "misaligned shsha" ));
      85           0 :     return NULL;
      86           0 :   }
      87             : 
      88           0 :   fd_blake3_t * sha = (fd_blake3_t *)shsha;
      89             : 
      90           0 :   if( FD_UNLIKELY( sha->magic!=FD_BLAKE3_MAGIC ) ) {
      91           0 :     FD_LOG_WARNING(( "bad magic" ));
      92           0 :     return NULL;
      93           0 :   }
      94             : 
      95           0 :   FD_COMPILER_MFENCE();
      96           0 :   FD_VOLATILE( sha->magic ) = 0UL;
      97           0 :   FD_COMPILER_MFENCE();
      98             : 
      99           0 :   return (void *)sha;
     100           0 : }
     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          33 : fd_blake3_init( fd_blake3_t * sha ) {
     121          33 :   blake3_hasher_init( &sha->hasher );
     122          33 :   return sha;
     123          33 : }
     124             : 
     125             : fd_blake3_t *
     126             : fd_blake3_append( fd_blake3_t * sha,
     127             :                   void const *  data,
     128          18 :                   ulong         sz ) {
     129          18 :   blake3_hasher_update( &sha->hasher, data, sz);
     130          18 :   return sha;
     131          18 : }
     132             : 
     133             : void *
     134             : fd_blake3_fini( fd_blake3_t * sha,
     135          15 :                 void *        hash ) {
     136          15 :   blake3_hasher_finalize( &sha->hasher, (uchar *) hash, 32 );
     137          15 :   return hash;
     138          15 : }
     139             : 
     140             : void *
     141             : fd_blake3_fini_512( fd_blake3_t * sha,
     142           0 :                     void *        hash ) {
     143           0 :   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 :   blake3_hasher_finalize( &sha->hasher, (uchar *) hash, hash_len );
     152           0 :   return hash;
     153           0 : }

Generated by: LCOV version 1.14