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