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

📄 e_sureware.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 3 页
字号:
#ifndef OPENSSL_NO_DSA	case 2:/*DSA*/		/* set private/public external reference */		dsatmp = DSA_new_method(e);		DSA_set_ex_data(dsatmp,dsaHndidx,hptr);		/*dsatmp->flags |= DSA_FLAG_EXT_PKEY;*/		/* set public key*/		dsatmp->pub_key = BN_new();		dsatmp->p = BN_new();		dsatmp->q = BN_new();		dsatmp->g = BN_new();		bn_expand2(dsatmp->pub_key, el/sizeof(BN_ULONG));		bn_expand2(dsatmp->p, el/sizeof(BN_ULONG));		bn_expand2(dsatmp->q, 20/sizeof(BN_ULONG));		bn_expand2(dsatmp->g, el/sizeof(BN_ULONG));		if (!dsatmp->pub_key || dsatmp->pub_key->dmax!=(int)(el/sizeof(BN_ULONG))|| 			!dsatmp->p || dsatmp->p->dmax!=(int)(el/sizeof(BN_ULONG)) ||			!dsatmp->q || dsatmp->q->dmax!=20/sizeof(BN_ULONG) ||			!dsatmp->g || dsatmp->g->dmax!=(int)(el/sizeof(BN_ULONG)))			goto err;		ret=p_surewarehk_Load_Dsa_Pubkey(msg,key_id,el,						 (unsigned long *)dsatmp->pub_key->d, 						 (unsigned long *)dsatmp->p->d,						 (unsigned long *)dsatmp->q->d,						 (unsigned long *)dsatmp->g->d);		surewarehk_error_handling(msg,SUREWARE_F_SUREWARE_LOAD_PUBLIC,ret);		if (ret!=1)		{			SUREWAREerr(SUREWARE_F_SUREWARE_LOAD_PUBLIC,ENGINE_R_FAILED_LOADING_PUBLIC_KEY);			goto err;		}		/* set parameters */		/* normalise pubkey and parameters in case of */		dsatmp->pub_key->top=el/sizeof(BN_ULONG);		bn_fix_top(dsatmp->pub_key);		dsatmp->p->top=el/sizeof(BN_ULONG);		bn_fix_top(dsatmp->p);		dsatmp->q->top=20/sizeof(BN_ULONG);		bn_fix_top(dsatmp->q);		dsatmp->g->top=el/sizeof(BN_ULONG);		bn_fix_top(dsatmp->g);		/* create an EVP object: engine + rsa key */		res = EVP_PKEY_new();		EVP_PKEY_assign_DSA(res, dsatmp);		break;#endif	default:		SUREWAREerr(SUREWARE_F_SUREWARE_LOAD_PUBLIC,ENGINE_R_FAILED_LOADING_PRIVATE_KEY);		goto err;	}	return res; err:	if (res)		EVP_PKEY_free(res);#ifndef OPENSSL_NO_RSA	if (rsatmp)		RSA_free(rsatmp);#endif#ifndef OPENSSL_NO_DSA	if (dsatmp)		DSA_free(dsatmp);#endif	return NULL;}static EVP_PKEY *surewarehk_load_privkey(ENGINE *e, const char *key_id,					 UI_METHOD *ui_method, void *callback_data){	EVP_PKEY *res = NULL;	int ret=0;	unsigned long el=0;	char *hptr=NULL;	char keytype=0;	char msg[64]="ENGINE_load_privkey";	if(!p_surewarehk_Load_Privkey)	{		SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PRIVKEY,ENGINE_R_NOT_INITIALISED);	}	else	{		ret=p_surewarehk_Load_Privkey(msg,key_id,&hptr,&el,&keytype);		if (ret!=1)		{			SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PRIVKEY,ENGINE_R_FAILED_LOADING_PRIVATE_KEY);			ERR_add_error_data(1,msg);				}		else			res=sureware_load_public(e,key_id,hptr,el,keytype);	}	return res;}static EVP_PKEY *surewarehk_load_pubkey(ENGINE *e, const char *key_id,					 UI_METHOD *ui_method, void *callback_data){	EVP_PKEY *res = NULL;	int ret=0;	unsigned long el=0;	char *hptr=NULL;	char keytype=0;	char msg[64]="ENGINE_load_pubkey";	if(!p_surewarehk_Info_Pubkey)	{		SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PUBKEY,ENGINE_R_NOT_INITIALISED);	}	else	{		/* call once to identify if DSA or RSA */		ret=p_surewarehk_Info_Pubkey(msg,key_id,&el,&keytype);		if (ret!=1)		{			SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PUBKEY,ENGINE_R_FAILED_LOADING_PUBLIC_KEY);			ERR_add_error_data(1,msg);		}		else			res=sureware_load_public(e,key_id,hptr,el,keytype);	}	return res;}/* This cleans up an RSA/DSA KM key(do not destroy the key into the hardware), called when ex_data is freed */static void surewarehk_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad,	int idx,long argl, void *argp){	if(!p_surewarehk_Free)	{		SUREWAREerr(SUREWARE_F_SUREWAREHK_EX_FREE,ENGINE_R_NOT_INITIALISED);	}	else		p_surewarehk_Free((char *)item,0);}#if 0/* not currently used (bug?) *//* This cleans up an DH KM key (destroys the key into hardware), called when ex_data is freed */static void surewarehk_dh_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad,	int idx,long argl, void *argp){	if(!p_surewarehk_Free)	{		SUREWAREerr(SUREWARE_F_SUREWAREHK_DH_EX_FREE,ENGINE_R_NOT_INITIALISED);	}	else		p_surewarehk_Free((char *)item,1);}#endif/** return number of decrypted bytes*/#ifndef OPENSSL_NO_RSAstatic int surewarehk_rsa_priv_dec(int flen,const unsigned char *from,unsigned char *to,			RSA *rsa,int padding){	int ret=0,tlen;	char *buf=NULL,*hptr=NULL;	char msg[64]="ENGINE_rsa_priv_dec";	if (!p_surewarehk_Rsa_Priv_Dec)	{		SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,ENGINE_R_NOT_INITIALISED);	}	/* extract ref to private key */	else if (!(hptr=RSA_get_ex_data(rsa, rsaHndidx)))	{		SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,SUREWARE_R_MISSING_KEY_COMPONENTS);		goto err;	}	/* analyse what padding we can do into the hardware */	if (padding==RSA_PKCS1_PADDING)	{		/* do it one shot */		ret=p_surewarehk_Rsa_Priv_Dec(msg,flen,(unsigned char *)from,&tlen,to,hptr,SUREWARE_PKCS1_PAD);		surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,ret);		if (ret!=1)			goto err;		ret=tlen;	}	else /* do with no padding into hardware */	{		ret=p_surewarehk_Rsa_Priv_Dec(msg,flen,(unsigned char *)from,&tlen,to,hptr,SUREWARE_NO_PAD);		surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,ret);		if (ret!=1)			goto err;		/* intermediate buffer for padding */		if ((buf=OPENSSL_malloc(tlen)) == NULL)		{			SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,ERR_R_MALLOC_FAILURE);			goto err;		}		memcpy(buf,to,tlen);/* transfert to into buf */		switch (padding) /* check padding in software */		{#ifndef OPENSSL_NO_SHA		case RSA_PKCS1_OAEP_PADDING:			ret=RSA_padding_check_PKCS1_OAEP(to,tlen,(unsigned char *)buf,tlen,tlen,NULL,0);			break;#endif 		case RSA_SSLV23_PADDING:			ret=RSA_padding_check_SSLv23(to,tlen,(unsigned char *)buf,flen,tlen);			break;		case RSA_NO_PADDING:			ret=RSA_padding_check_none(to,tlen,(unsigned char *)buf,flen,tlen);			break;		default:			SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,SUREWARE_R_UNKNOWN_PADDING_TYPE);			goto err;		}		if (ret < 0)			SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,SUREWARE_R_PADDING_CHECK_FAILED);	}err:	if (buf)	{		OPENSSL_cleanse(buf,tlen);		OPENSSL_free(buf);	}	return ret;}/** Does what OpenSSL rsa_priv_enc does.*/static int surewarehk_rsa_sign(int flen,const unsigned char *from,unsigned char *to,			    RSA *rsa,int padding){	int ret=0,tlen;	char *hptr=NULL;	char msg[64]="ENGINE_rsa_sign";	if (!p_surewarehk_Rsa_Sign)	{		SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_SIGN,ENGINE_R_NOT_INITIALISED);	}	/* extract ref to private key */	else if (!(hptr=RSA_get_ex_data(rsa, rsaHndidx)))	{		SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_SIGN,SUREWARE_R_MISSING_KEY_COMPONENTS);	}	else	{		switch (padding)		{		case RSA_PKCS1_PADDING: /* do it in one shot */			ret=p_surewarehk_Rsa_Sign(msg,flen,(unsigned char *)from,&tlen,to,hptr,SUREWARE_PKCS1_PAD);			surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_RSA_SIGN,ret);			break;		case RSA_NO_PADDING:		default:			SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_SIGN,SUREWARE_R_UNKNOWN_PADDING_TYPE);		}	}	return ret==1 ? tlen : ret;}#endif#ifndef OPENSSL_NO_DSA/* DSA sign and verify */static	DSA_SIG * surewarehk_dsa_do_sign(const unsigned char *from, int flen, DSA *dsa){	int ret=0;	char *hptr=NULL;	DSA_SIG *psign=NULL;	char msg[64]="ENGINE_dsa_do_sign";	if (!p_surewarehk_Dsa_Sign)	{		SUREWAREerr(SUREWARE_F_SUREWAREHK_DSA_DO_SIGN,ENGINE_R_NOT_INITIALISED);	}	/* extract ref to private key */	else if (!(hptr=DSA_get_ex_data(dsa, dsaHndidx)))	{		SUREWAREerr(SUREWARE_F_SUREWAREHK_DSA_DO_SIGN,SUREWARE_R_MISSING_KEY_COMPONENTS);	}	else	{		if((psign = DSA_SIG_new()) == NULL)		{			SUREWAREerr(SUREWARE_F_SUREWAREHK_DSA_DO_SIGN,ERR_R_MALLOC_FAILURE);			goto err;		}		psign->r=BN_new();		psign->s=BN_new();		bn_expand2(psign->r, 20/sizeof(BN_ULONG));		bn_expand2(psign->s, 20/sizeof(BN_ULONG));		if (!psign->r || psign->r->dmax!=20/sizeof(BN_ULONG) ||			!psign->s || psign->s->dmax!=20/sizeof(BN_ULONG))			goto err;		ret=p_surewarehk_Dsa_Sign(msg,flen,from,					  (unsigned long *)psign->r->d,					  (unsigned long *)psign->s->d,					  hptr);		surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_DSA_DO_SIGN,ret);	}	psign->r->top=20/sizeof(BN_ULONG);	bn_fix_top(psign->r);	psign->s->top=20/sizeof(BN_ULONG);	bn_fix_top(psign->s);err:		if (psign)	{		DSA_SIG_free(psign);		psign=NULL;	}	return psign;}#endifstatic int surewarehk_modexp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,			     const BIGNUM *m, BN_CTX *ctx){	int ret=0;	char msg[64]="ENGINE_modexp";	if (!p_surewarehk_Mod_Exp)	{		SUREWAREerr(SUREWARE_F_SUREWAREHK_MODEXP,ENGINE_R_NOT_INITIALISED);	}	else	{		bn_expand2(r,m->top);		if (r && r->dmax==m->top)		{			/* do it*/			ret=p_surewarehk_Mod_Exp(msg,						 m->top*sizeof(BN_ULONG),						 (unsigned long *)m->d,						 p->top*sizeof(BN_ULONG),						 (unsigned long *)p->d,						 a->top*sizeof(BN_ULONG),						 (unsigned long *)a->d,						 (unsigned long *)r->d);			surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_MODEXP,ret);			if (ret==1)			{				/* normalise result */				r->top=m->top;				bn_fix_top(r);			}		}	}	return ret;}#endif /* !OPENSSL_NO_HW_SureWare */#endif /* !OPENSSL_NO_HW */

⌨️ 快捷键说明

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