Latest idea to force usage of custom engine

Frederick Gotham cauldwell.thomas at gmail.com
Thu Nov 7 08:44:18 UTC 2019


 
> I'm going to keep at this until every process (including ssh-keygen) is 
> using my custom engine for random numbers.


Now every process that links with 'libcrypto.so' is segfaulting in 
libpthread-2.28.so. Here's the error:

    openssl[1744]: segfault at 18 ip 00007f1798d44930 sp 00007ffcf46bb1b8 
error 4 in libpthread-2.28.so[7f1798d38000+1a000]

Here's the totality of the changes I've made. . . I added the following to 
"rand_lib.c":


/* =================== The fields in RAND_METHOD ====================== 
    int (*seed) (const void *buf, int num);
    int (*bytes) (unsigned char *buf, int num);
    void (*cleanup) (void);
    int (*add) (const void *buf, int num, double randomness);
    int (*pseudorand) (unsigned char *buf, int num);
    int (*status) (void);
   ==================================================================== */

#include <assert.h>

static int Supplemented_seed(const void *buf, int num) { (void)buf; (void)
num; return 1; }

static void Supplemented_cleanup(void) { /* Do Nothing */ return; }

static int Supplemented_add(const void *buf, int num, double randomness) 
{ (void)buf; (void)num; (void)randomness; return 1; }

static int Supplemented_status(void) { /* Do Nothing */ return 1; }

static CRYPTO_ONCE crypto_once_tpm2_init = CRYPTO_ONCE_STATIC_INIT;

DEFINE_RUN_ONCE_STATIC(Do_Whatever_Needs_Done_For_TPM2)
{
	/* Initialize the dynamic engine loader */
	ENGINE_load_dynamic();

	ENGINE *tpm2_engine;
 
	/* If the first fails, try the second one */
	(tpm2_engine = ENGINE_by_id("tpm2tss")) || (tpm2_engine = 
ENGINE_by_id("libtpm2tss"));
	
	if ( NULL == tpm2_engine )
	{
		assert( 0 == "Do_Whatever_Needs_Done_For_TPM2: NULL == tpm2
_engine" );
		abort();
	}

	int const init_res = ENGINE_init(tpm2_engine);
	
	if ( 0 == init_res )
	{
		assert( 0 == "Do_Whatever_Needs_Done_For_TPM2: 0 == 
init_res" );
		abort();
	}
		
	RAND_METHOD const *const p_rm = ENGINE_get_RAND(tpm2_engine);

	if ( NULL == p_rm )
	{
		assert( 0 == "Do_Whatever_Needs_Done_For_TPM2: NULL == 
p_rm" );
		abort();
	}
	
	static RAND_METHOD funcptrs = {
		Supplemented_seed,          /* seed() */
		0,							/* bytes() */
		Supplemented_cleanup,       /* cleanup() */
		Supplemented_add,           /* add() */
		0,			                /* pseudorand() */
		Supplemented_status                 /* status() */
	};
	
	CRYPTO_THREAD_write_lock(rand_meth_lock);
		funcptrs.bytes = p_rm->bytes;
		funcptrs.pseudorand = p_rm->pseudorand;	
		funct_ref = tpm2_engine;
		default_RAND_meth = &funcptrs;
		rand_meth = funcptrs;  /* Even set the Drbg func pointers */
	CRYPTO_THREAD_unlock(rand_meth_lock);
	
	return 0;
}

const RAND_METHOD *RAND_get_rand_method(void)
{
    RUN_ONCE(&crypto_once_tpm2_init,  Do_Whatever_Needs_Done_For_TPM2);




More information about the openssl-users mailing list