⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 e_atalla.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 2 页
字号:
 * better solution will be needed. */static const char *ATALLA_LIBNAME = NULL;static const char *get_ATALLA_LIBNAME(void)	{		if(ATALLA_LIBNAME)			return ATALLA_LIBNAME;		return "atasi";	}static void free_ATALLA_LIBNAME(void)	{		if(ATALLA_LIBNAME)			OPENSSL_free((void*)ATALLA_LIBNAME);		ATALLA_LIBNAME = NULL;	}static long set_ATALLA_LIBNAME(const char *name)	{	free_ATALLA_LIBNAME();	return (((ATALLA_LIBNAME = BUF_strdup(name)) != NULL) ? 1 : 0);	}static const char *ATALLA_F1 = "ASI_GetHardwareConfig";static const char *ATALLA_F2 = "ASI_RSAPrivateKeyOpFn";static const char *ATALLA_F3 = "ASI_GetPerformanceStatistics";/* Destructor (complements the "ENGINE_atalla()" constructor) */static int atalla_destroy(ENGINE *e)	{	free_ATALLA_LIBNAME();	/* Unload the atalla error strings so any error state including our	 * functs or reasons won't lead to a segfault (they simply get displayed	 * without corresponding string data because none will be found). */	ERR_unload_ATALLA_strings();	return 1;	}/* (de)initialisation functions. */static int atalla_init(ENGINE *e)	{	tfnASI_GetHardwareConfig *p1;	tfnASI_RSAPrivateKeyOpFn *p2;	tfnASI_GetPerformanceStatistics *p3;	/* Not sure of the origin of this magic value, but Ben's code had it	 * and it seemed to have been working for a few people. :-) */	unsigned int config_buf[1024];	if(atalla_dso != NULL)		{		ATALLAerr(ATALLA_F_ATALLA_INIT,ATALLA_R_ALREADY_LOADED);		goto err;		}	/* Attempt to load libatasi.so/atasi.dll/whatever. Needs to be	 * changed unfortunately because the Atalla drivers don't have	 * standard library names that can be platform-translated well. */	/* TODO: Work out how to actually map to the names the Atalla	 * drivers really use - for now a symbollic link needs to be	 * created on the host system from libatasi.so to atasi.so on	 * unix variants. */	atalla_dso = DSO_load(NULL, get_ATALLA_LIBNAME(), NULL, 0);	if(atalla_dso == NULL)		{		ATALLAerr(ATALLA_F_ATALLA_INIT,ATALLA_R_NOT_LOADED);		goto err;		}	if(!(p1 = (tfnASI_GetHardwareConfig *)DSO_bind_func(				atalla_dso, ATALLA_F1)) ||			!(p2 = (tfnASI_RSAPrivateKeyOpFn *)DSO_bind_func(				atalla_dso, ATALLA_F2)) ||			!(p3 = (tfnASI_GetPerformanceStatistics *)DSO_bind_func(				atalla_dso, ATALLA_F3)))		{		ATALLAerr(ATALLA_F_ATALLA_INIT,ATALLA_R_NOT_LOADED);		goto err;		}	/* Copy the pointers */	p_Atalla_GetHardwareConfig = p1;	p_Atalla_RSAPrivateKeyOpFn = p2;	p_Atalla_GetPerformanceStatistics = p3;	/* Perform a basic test to see if there's actually any unit	 * running. */	if(p1(0L, config_buf) != 0)		{		ATALLAerr(ATALLA_F_ATALLA_INIT,ATALLA_R_UNIT_FAILURE);		goto err;		}	/* Everything's fine. */	return 1;err:	if(atalla_dso)		DSO_free(atalla_dso);	atalla_dso = NULL;	p_Atalla_GetHardwareConfig = NULL;	p_Atalla_RSAPrivateKeyOpFn = NULL;	p_Atalla_GetPerformanceStatistics = NULL;	return 0;	}static int atalla_finish(ENGINE *e)	{	free_ATALLA_LIBNAME();	if(atalla_dso == NULL)		{		ATALLAerr(ATALLA_F_ATALLA_FINISH,ATALLA_R_NOT_LOADED);		return 0;		}	if(!DSO_free(atalla_dso))		{		ATALLAerr(ATALLA_F_ATALLA_FINISH,ATALLA_R_UNIT_FAILURE);		return 0;		}	atalla_dso = NULL;	p_Atalla_GetHardwareConfig = NULL;	p_Atalla_RSAPrivateKeyOpFn = NULL;	p_Atalla_GetPerformanceStatistics = NULL;	return 1;	}static int atalla_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void))	{	int initialised = ((atalla_dso == NULL) ? 0 : 1);	switch(cmd)		{	case ATALLA_CMD_SO_PATH:		if(p == NULL)			{			ATALLAerr(ATALLA_F_ATALLA_CTRL,ERR_R_PASSED_NULL_PARAMETER);			return 0;			}		if(initialised)			{			ATALLAerr(ATALLA_F_ATALLA_CTRL,ATALLA_R_ALREADY_LOADED);			return 0;			}		return set_ATALLA_LIBNAME((const char *)p);	default:		break;		}	ATALLAerr(ATALLA_F_ATALLA_CTRL,ATALLA_R_CTRL_COMMAND_NOT_IMPLEMENTED);	return 0;	}static int atalla_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,			const BIGNUM *m, BN_CTX *ctx)	{	/* I need somewhere to store temporary serialised values for	 * use with the Atalla API calls. A neat cheat - I'll use	 * BIGNUMs from the BN_CTX but access their arrays directly as	 * byte arrays <grin>. This way I don't have to clean anything	 * up. */	BIGNUM *modulus;	BIGNUM *exponent;	BIGNUM *argument;	BIGNUM *result;	RSAPrivateKey keydata;	int to_return, numbytes;	modulus = exponent = argument = result = NULL;	to_return = 0; /* expect failure */	if(!atalla_dso)		{		ATALLAerr(ATALLA_F_ATALLA_MOD_EXP,ATALLA_R_NOT_LOADED);		goto err;		}	/* Prepare the params */	BN_CTX_start(ctx);	modulus = BN_CTX_get(ctx);	exponent = BN_CTX_get(ctx);	argument = BN_CTX_get(ctx);	result = BN_CTX_get(ctx);	if (!result)		{		ATALLAerr(ATALLA_F_ATALLA_MOD_EXP,ATALLA_R_BN_CTX_FULL);		goto err;		}	if(!bn_wexpand(modulus, m->top) || !bn_wexpand(exponent, m->top) ||	   !bn_wexpand(argument, m->top) || !bn_wexpand(result, m->top))		{		ATALLAerr(ATALLA_F_ATALLA_MOD_EXP,ATALLA_R_BN_EXPAND_FAIL);		goto err;		}	/* Prepare the key-data */	memset(&keydata, 0,sizeof keydata);	numbytes = BN_num_bytes(m);	memset(exponent->d, 0, numbytes);	memset(modulus->d, 0, numbytes);	BN_bn2bin(p, (unsigned char *)exponent->d + numbytes - BN_num_bytes(p));	BN_bn2bin(m, (unsigned char *)modulus->d + numbytes - BN_num_bytes(m));	keydata.privateExponent.data = (unsigned char *)exponent->d;	keydata.privateExponent.len = numbytes;	keydata.modulus.data = (unsigned char *)modulus->d;	keydata.modulus.len = numbytes;	/* Prepare the argument */	memset(argument->d, 0, numbytes);	memset(result->d, 0, numbytes);	BN_bn2bin(a, (unsigned char *)argument->d + numbytes - BN_num_bytes(a));	/* Perform the operation */	if(p_Atalla_RSAPrivateKeyOpFn(&keydata, (unsigned char *)result->d,			(unsigned char *)argument->d,			keydata.modulus.len) != 0)		{		ATALLAerr(ATALLA_F_ATALLA_MOD_EXP,ATALLA_R_REQUEST_FAILED);		goto err;		}	/* Convert the response */	BN_bin2bn((unsigned char *)result->d, numbytes, r);	to_return = 1;err:	BN_CTX_end(ctx);	return to_return;	}#ifndef OPENSSL_NO_RSAstatic int atalla_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx)	{	int to_return = 0;	if(!atalla_dso)		{		ATALLAerr(ATALLA_F_ATALLA_RSA_MOD_EXP,ATALLA_R_NOT_LOADED);		goto err;		}	if(!rsa->d || !rsa->n)		{		ATALLAerr(ATALLA_F_ATALLA_RSA_MOD_EXP,ATALLA_R_MISSING_KEY_COMPONENTS);		goto err;		}	to_return = atalla_mod_exp(r0, I, rsa->d, rsa->n, ctx);err:	return to_return;	}#endif#ifndef OPENSSL_NO_DSA/* This code was liberated and adapted from the commented-out code in * dsa_ossl.c. Because of the unoptimised form of the Atalla acceleration * (it doesn't have a CRT form for RSA), this function means that an * Atalla system running with a DSA server certificate can handshake * around 5 or 6 times faster/more than an equivalent system running with * RSA. Just check out the "signs" statistics from the RSA and DSA parts * of "openssl speed -engine atalla dsa1024 rsa1024". */static int atalla_dsa_mod_exp(DSA *dsa, BIGNUM *rr, BIGNUM *a1,		BIGNUM *p1, BIGNUM *a2, BIGNUM *p2, BIGNUM *m,		BN_CTX *ctx, BN_MONT_CTX *in_mont)	{	BIGNUM t;	int to_return = 0; 	BN_init(&t);	/* let rr = a1 ^ p1 mod m */	if (!atalla_mod_exp(rr,a1,p1,m,ctx)) goto end;	/* let t = a2 ^ p2 mod m */	if (!atalla_mod_exp(&t,a2,p2,m,ctx)) goto end;	/* let rr = rr * t mod m */	if (!BN_mod_mul(rr,rr,&t,m,ctx)) goto end;	to_return = 1;end:	BN_free(&t);	return to_return;	}static int atalla_mod_exp_dsa(DSA *dsa, BIGNUM *r, BIGNUM *a,		const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx,		BN_MONT_CTX *m_ctx)	{	return atalla_mod_exp(r, a, p, m, ctx);	}#endif#ifndef OPENSSL_NO_RSA/* This function is aliased to mod_exp (with the mont stuff dropped). */static int atalla_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,		const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx)	{	return atalla_mod_exp(r, a, p, m, ctx);	}#endif#ifndef OPENSSL_NO_DH/* This function is aliased to mod_exp (with the dh and mont dropped). */static int atalla_mod_exp_dh(const DH *dh, BIGNUM *r,		const BIGNUM *a, const BIGNUM *p,		const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx)	{	return atalla_mod_exp(r, a, p, m, ctx);	}#endif/* This stuff is needed if this ENGINE is being compiled into a self-contained * shared-library. */#ifndef OPENSSL_NO_DYNAMIC_ENGINEstatic int bind_fn(ENGINE *e, const char *id)	{	if(id && (strcmp(id, engine_atalla_id) != 0))		return 0;	if(!bind_helper(e))		return 0;	return 1;	}IMPLEMENT_DYNAMIC_CHECK_FN()IMPLEMENT_DYNAMIC_BIND_FN(bind_fn)#endif /* OPENSSL_NO_DYNAMIC_ENGINE */#endif /* !OPENSSL_NO_HW_ATALLA */#endif /* !OPENSSL_NO_HW */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -