LCOV - code coverage report
Current view: top level - disco/keyguard - fd_keyguard_client.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 42 42 100.0 %
Date: 2025-09-19 04:41:14 Functions: 2 2 100.0 %

          Line data    Source code
       1             : #include "fd_keyguard_client.h"
       2             : 
       3             : #include "../../tango/mcache/fd_mcache.h"
       4             : #include "../../tango/dcache/fd_dcache.h"
       5             : 
       6             : void *
       7             : fd_keyguard_client_new( void *           shmem,
       8             :                         fd_frag_meta_t * request_mcache,
       9             :                         uchar *          request_dcache,
      10             :                         fd_frag_meta_t * response_mcache,
      11             :                         uchar *          response_dcache,
      12          30 :                         ulong            request_mtu ) {
      13          30 :   fd_keyguard_client_t * client = (fd_keyguard_client_t*)shmem;
      14             : 
      15          30 :   client->request        = request_mcache;
      16          30 :   client->request_depth  = fd_mcache_depth( request_mcache );
      17          30 :   client->request_seq    = 0UL;
      18          30 :   client->request_mem    = fd_wksp_containing( request_dcache );
      19          30 :   client->request_chunk0 = fd_dcache_compact_chunk0( client->request_mem, request_dcache );
      20          30 :   client->request_wmark  = fd_dcache_compact_wmark( client->request_mem, request_dcache, request_mtu );
      21          30 :   client->request_chunk  = client->request_chunk0;
      22          30 :   client->request_mtu    = request_mtu;
      23             : 
      24          30 :   client->response        = response_mcache;
      25          30 :   client->response_depth  = fd_mcache_depth( response_mcache );
      26          30 :   client->response_seq    = 0UL;
      27          30 :   client->response_mem    = fd_wksp_containing( response_dcache );
      28          30 :   client->response_chunk0 = fd_dcache_compact_chunk0( client->response_mem, response_dcache );
      29          30 :   client->response_wmark  = fd_dcache_compact_wmark( client->response_mem, response_dcache, 64UL );
      30             : 
      31          30 :   return shmem;
      32          30 : }
      33             : 
      34             : void
      35             : fd_keyguard_client_sign( fd_keyguard_client_t * client,
      36             :                          uchar *                signature,
      37             :                          uchar const *          sign_data,
      38             :                          ulong                  sign_data_len,
      39           9 :                          int                    sign_type ) {
      40           9 :   FD_TEST( sign_data_len<=client->request_mtu );
      41             : 
      42           9 :   uchar * dst = fd_chunk_to_laddr( client->request_mem, client->request_chunk );
      43           9 :   fd_memcpy( dst, sign_data, sign_data_len );
      44             : 
      45           9 :   ulong sig = (ulong)(uint)sign_type;
      46           9 :   fd_mcache_publish( client->request, client->request_depth, client->request_seq, sig, client->request_chunk, sign_data_len, 0UL, 0UL, 0UL );
      47           9 :   client->request_seq   = fd_seq_inc( client->request_seq, 1UL );
      48           9 :   client->request_chunk = fd_dcache_compact_next( client->request_chunk, sign_data_len, client->request_chunk0, client->request_wmark );
      49             : 
      50           9 :   fd_frag_meta_t meta;
      51           9 :   fd_frag_meta_t const * mline;
      52           9 :   ulong seq_found;
      53           9 :   long seq_diff;
      54           9 :   ulong poll_max = ULONG_MAX;
      55           9 :   FD_MCACHE_WAIT( &meta, mline, seq_found, seq_diff, poll_max, client->response, client->response_depth, client->response_seq );
      56           9 :   if( FD_UNLIKELY( !poll_max ) ) FD_LOG_ERR(( "sign request timed out while polling" ));
      57           9 :   if( FD_UNLIKELY( seq_diff ) ) FD_LOG_ERR(( "sign request was overrun while polling" ));
      58             : 
      59             :   /* Chunk is in shared memory and might be be written to by an
      60             :      attacking tile after we validate it, so load once. */
      61           9 :   ulong chunk = FD_VOLATILE_CONST( mline->chunk );
      62           9 :   FD_TEST( chunk>=client->response_chunk0 && chunk<=client->response_wmark );
      63             : 
      64           9 :   uchar * src = fd_chunk_to_laddr( client->response_mem, chunk );
      65           9 :   fd_memcpy( signature, src, 64UL );
      66             : 
      67           9 :   seq_found = fd_frag_meta_seq_query( mline );
      68           9 :   if( FD_UNLIKELY( fd_seq_ne( seq_found, client->response_seq ) ) ) FD_LOG_ERR(( "sign request was overrun while reading" ));
      69           9 :   client->response_seq = fd_seq_inc( client->response_seq, 1UL );
      70           9 : }

Generated by: LCOV version 1.14