LCOV - code coverage report
Current view: top level - waltz/tls - test_tls_helper.h (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 66 68 97.1 %
Date: 2025-10-16 04:31:23 Functions: 23 198 11.6 %

          Line data    Source code
       1             : #ifndef HEADER_fd_src_waltz_tls_test_tls_helper_h
       2             : #define HEADER_fd_src_waltz_tls_test_tls_helper_h
       3             : 
       4             : #include "fd_tls.h"
       5             : #include "fd_tls_proto.h"
       6             : #include "../../ballet/sha512/fd_sha512.h"
       7             : #include "../../ballet/ed25519/fd_ed25519.h"
       8             : 
       9             : /* Common routines for fd_tls unit tests */
      10             : 
      11             : /* fd_tls_test_rand creates an fd_tls provider from an fd_rng_t.
      12             :    This is a deliberately insecure, deterministic RNG inteded for tests. */
      13             : 
      14             : static void *
      15             : fd_tls_test_rand_read( void * ctx,
      16             :                        void * buf,
      17          21 :                        ulong  bufsz ) {
      18             : 
      19          21 :   if( FD_UNLIKELY( !ctx ) ) return NULL;
      20             : 
      21          21 :   fd_rng_t * rng  = (fd_rng_t *)ctx;
      22          21 :   uchar *    buf_ = (uchar *)buf;
      23         693 :   for( ulong i=0UL; i<bufsz; i++ )
      24         672 :     buf_[i] = (uchar)fd_rng_uchar( rng );
      25          21 :   return buf_;
      26          21 : }
      27             : 
      28             : static FD_FN_UNUSED fd_tls_rand_t
      29          30 : fd_tls_test_rand( fd_rng_t * rng ) {
      30          30 :   return (fd_tls_rand_t) {
      31          30 :     .ctx     = rng,
      32          30 :     .rand_fn = fd_tls_test_rand_read
      33          30 :   };
      34          30 : }
      35             : 
      36             : struct fd_tls_test_sign_ctx {
      37             :   fd_sha512_t sha512[ 1 ];
      38             : 
      39             :   uchar public_key[ 32UL ];
      40             :   uchar private_key[ 32UL ];
      41             : };
      42             : typedef struct fd_tls_test_sign_ctx fd_tls_test_sign_ctx_t;
      43             : 
      44             : static void
      45             : fd_tls_test_sign_sign( void *        _ctx,
      46             :                        uchar *       signature,
      47        6075 :                        uchar const * payload ) {
      48        6075 :   fd_tls_test_sign_ctx_t * ctx = (fd_tls_test_sign_ctx_t *)_ctx;
      49        6075 :   fd_ed25519_sign( signature, payload, 130UL, ctx->public_key, ctx->private_key, ctx->sha512 );
      50        6075 : }
      51             : 
      52             : static FD_FN_UNUSED void
      53             : fd_tls_test_sign_ctx( fd_tls_test_sign_ctx_t * ctx,
      54        2166 :                       fd_rng_t *               rng ) {
      55        2166 :   FD_TEST( fd_sha512_join( fd_sha512_new( ctx->sha512 ) ) );
      56       71478 :   for( ulong b=0; b<32UL; b++ ) ctx->private_key[b] = fd_rng_uchar( rng );
      57        2166 :   fd_ed25519_public_from_private( ctx->public_key, ctx->private_key, ctx->sha512 );
      58        2166 : }
      59             : 
      60             : 
      61             : static FD_FN_UNUSED fd_tls_sign_t
      62          33 : fd_tls_test_sign( void * ctx ) {
      63          33 :   return (fd_tls_sign_t) {
      64          33 :     .ctx     = ctx,
      65          33 :     .sign_fn = fd_tls_test_sign_sign
      66          33 :   };
      67          33 : }
      68             : 
      69             : /* Test record transport */
      70             : 
      71             : #define TEST_RECORD_BUFSZ (4096UL)
      72             : struct test_record {
      73             :   uint  level;
      74             :   uchar buf[ TEST_RECORD_BUFSZ ];
      75             :   ulong cur;
      76             : };
      77             : 
      78             : typedef struct test_record test_record_t;
      79             : 
      80         135 : #define TEST_RECORD_BUF_CNT (8UL)
      81             : struct test_record_buf {
      82             :   test_record_t records[ TEST_RECORD_BUF_CNT ];
      83             :   ulong         recv;
      84             :   ulong         send;
      85             : };
      86             : 
      87             : typedef struct test_record_buf test_record_buf_t;
      88             : 
      89             : static FD_FN_UNUSED void
      90          24 : test_record_reset( test_record_buf_t * buf ) {
      91          24 :   buf->recv = buf->send = 0UL;
      92          24 : }
      93             : 
      94             : static FD_FN_UNUSED void
      95             : test_record_send( test_record_buf_t * buf,
      96             :                   uint                level,
      97             :                   uchar const *       record,
      98         135 :                   ulong               record_sz ) {
      99         135 :   test_record_t * r = &buf->records[ (buf->send++ % TEST_RECORD_BUF_CNT) ];
     100         135 :   r->level = level;
     101         135 :   r->cur   = record_sz;
     102         135 :   FD_TEST( record_sz<=TEST_RECORD_BUFSZ );
     103         135 :   fd_memcpy( r->buf, record, record_sz );
     104         135 : }
     105             : 
     106             : static FD_FN_UNUSED test_record_t *
     107         165 : test_record_recv( test_record_buf_t * buf ) {
     108         165 :   if( buf->recv==buf->send ) return NULL;
     109         120 :   return &buf->records[ buf->recv++ ];
     110         165 : }
     111             : 
     112             : static FD_FN_UNUSED void
     113             : test_record_log( uchar const * record,
     114             :                  ulong         record_sz,
     115         135 :                  int           from_server ) {
     116             : 
     117         135 :   FD_TEST( record_sz>=4UL );
     118             : 
     119         135 :   char buf[ 512UL ];
     120         135 :   char * str = fd_cstr_init( buf );
     121             : 
     122         135 :   char const * prefix = from_server ? "server" : "client";
     123         135 :          str = fd_cstr_append_cstr( str, prefix );
     124         135 :          str = fd_cstr_append_cstr( str, ": " );
     125             : 
     126         135 :   char const * type = NULL;
     127         135 :   switch( *(uchar const *)record ) {
     128          21 :   case FD_TLS_MSG_CLIENT_HELLO:       type = "ClientHello";         break;
     129          18 :   case FD_TLS_MSG_SERVER_HELLO:       type = "ServerHello";         break;
     130          15 :   case FD_TLS_MSG_ENCRYPTED_EXT:      type = "EncryptedExtensions"; break;
     131          18 :   case FD_TLS_MSG_CERT:               type = "Certificate";         break;
     132          18 :   case FD_TLS_MSG_CERT_VERIFY:        type = "CertificateVerify";   break;
     133           3 :   case FD_TLS_MSG_CERT_REQ:           type = "CertificateRequest";  break;
     134          30 :   case FD_TLS_MSG_FINISHED:           type = "Finished";            break;
     135          12 :   case FD_TLS_MSG_NEW_SESSION_TICKET: type = "NewSessionTicket";    break;
     136           0 :   default:
     137           0 :     FD_LOG_ERR(( "unknown TLS message type %u", *(uchar const *)record ));
     138         135 :   }
     139         135 :   str = fd_cstr_append_cstr( str, type );
     140         135 :   fd_cstr_fini( str );
     141             : 
     142         135 :   FD_LOG_HEXDUMP_INFO(( buf, record, record_sz ));
     143         135 : }
     144             : 
     145             : #endif /* HEADER_fd_src_waltz_tls_test_tls_helper_h */

Generated by: LCOV version 1.14