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

📄 e_4758cca.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 2 页
字号:
	long returnCode;	long reasonCode;	long exitDataLength = 0;	long ruleArrayLength = 0;	unsigned char exitData[8];	unsigned char ruleArray[8];	unsigned char keyLabel[64];	unsigned long keyLabelLength = strlen(key_id);	unsigned char modulus[512];	long modulusFieldLength = sizeof(modulus);	long modulusLength = 0;	unsigned char exponent[512];	long exponentLength = sizeof(exponent);	if (keyLabelLength > sizeof(keyLabel))		{		CCA4758err(CCA4758_F_IBM_4758_LOAD_PUBKEY,			CCA4758_R_SIZE_TOO_LARGE_OR_TOO_SMALL);		return NULL;		}	memset(keyLabel,' ', sizeof(keyLabel));	memcpy(keyLabel, key_id, keyLabelLength);	keyToken = OPENSSL_malloc(MAX_CCA_PKA_TOKEN_SIZE + sizeof(long));	if (!keyToken)		{		CCA4758err(CCA4758_F_IBM_4758_LOAD_PUBKEY,				ERR_R_MALLOC_FAILURE);		goto err;		}	keyRecordRead(&returnCode, &reasonCode, &exitDataLength, exitData,		&ruleArrayLength, ruleArray, keyLabel, &keyTokenLength,		keyToken+sizeof(long));	if (returnCode)		{		CCA4758err(CCA4758_F_IBM_4758_LOAD_PUBKEY,				ERR_R_MALLOC_FAILURE);		goto err;		}	if (!getModulusAndExponent(keyToken+sizeof(long), &exponentLength,			exponent, &modulusLength, &modulusFieldLength, modulus))		{		CCA4758err(CCA4758_F_IBM_4758_LOAD_PUBKEY,			CCA4758_R_FAILED_LOADING_PUBLIC_KEY);		goto err;		}	(*(long*)keyToken) = keyTokenLength;	rtmp = RSA_new_method(e);	RSA_set_ex_data(rtmp, hndidx, (char *)keyToken);	rtmp->e = BN_bin2bn(exponent, exponentLength, NULL);	rtmp->n = BN_bin2bn(modulus, modulusFieldLength, NULL);	rtmp->flags |= RSA_FLAG_EXT_PKEY;	res = EVP_PKEY_new();	EVP_PKEY_assign_RSA(res, rtmp);	return res;err:	if (keyToken)		OPENSSL_free(keyToken);	if (res)		EVP_PKEY_free(res);	if (rtmp)		RSA_free(rtmp);	return NULL;	}static int cca_rsa_pub_enc(int flen, const unsigned char *from,			unsigned char *to, RSA *rsa,int padding)	{	long returnCode;	long reasonCode;	long lflen = flen;	long exitDataLength = 0;	unsigned char exitData[8];	long ruleArrayLength = 1;	unsigned char ruleArray[8] = "PKCS-1.2";	long dataStructureLength = 0;	unsigned char dataStructure[8];	long outputLength = RSA_size(rsa);	long keyTokenLength;	unsigned char* keyToken = (unsigned char*)RSA_get_ex_data(rsa, hndidx);	keyTokenLength = *(long*)keyToken;	keyToken+=sizeof(long);	pkaEncrypt(&returnCode, &reasonCode, &exitDataLength, exitData,		&ruleArrayLength, ruleArray, &lflen, (unsigned char*)from,		&dataStructureLength, dataStructure, &keyTokenLength,		keyToken, &outputLength, to);	if (returnCode || reasonCode)		return -(returnCode << 16 | reasonCode);	return outputLength;	}static int cca_rsa_priv_dec(int flen, const unsigned char *from,			unsigned char *to, RSA *rsa,int padding)	{	long returnCode;	long reasonCode;	long lflen = flen;	long exitDataLength = 0;	unsigned char exitData[8];	long ruleArrayLength = 1;	unsigned char ruleArray[8] = "PKCS-1.2";	long dataStructureLength = 0;	unsigned char dataStructure[8];	long outputLength = RSA_size(rsa);	long keyTokenLength;	unsigned char* keyToken = (unsigned char*)RSA_get_ex_data(rsa, hndidx);	keyTokenLength = *(long*)keyToken;	keyToken+=sizeof(long);	pkaDecrypt(&returnCode, &reasonCode, &exitDataLength, exitData,		&ruleArrayLength, ruleArray, &lflen, (unsigned char*)from,		&dataStructureLength, dataStructure, &keyTokenLength,		keyToken, &outputLength, to);	return (returnCode | reasonCode) ? 0 : 1;	}#define SSL_SIG_LEN 36static int cca_rsa_verify(int type, const unsigned char *m, unsigned int m_len,		unsigned char *sigbuf, unsigned int siglen, const RSA *rsa)	{	long returnCode;	long reasonCode;	long lsiglen = siglen;	long exitDataLength = 0;	unsigned char exitData[8];	long ruleArrayLength = 1;	unsigned char ruleArray[8] = "PKCS-1.1";	long keyTokenLength;	unsigned char* keyToken = (unsigned char*)RSA_get_ex_data(rsa, hndidx);	long length = SSL_SIG_LEN;	long keyLength ;	unsigned char *hashBuffer = NULL;	X509_SIG sig;	ASN1_TYPE parameter;	X509_ALGOR algorithm;	ASN1_OCTET_STRING digest;	keyTokenLength = *(long*)keyToken;	keyToken+=sizeof(long);	if (type == NID_md5 || type == NID_sha1)		{		sig.algor = &algorithm;		algorithm.algorithm = OBJ_nid2obj(type);		if (!algorithm.algorithm)			{			CCA4758err(CCA4758_F_CCA_RSA_VERIFY,				CCA4758_R_UNKNOWN_ALGORITHM_TYPE);			return 0;			}		if (!algorithm.algorithm->length)			{			CCA4758err(CCA4758_F_CCA_RSA_VERIFY,				CCA4758_R_ASN1_OID_UNKNOWN_FOR_MD);			return 0;			}		parameter.type = V_ASN1_NULL;		parameter.value.ptr = NULL;		algorithm.parameter = &parameter;		sig.digest = &digest;		sig.digest->data = (unsigned char*)m;		sig.digest->length = m_len;		length = i2d_X509_SIG(&sig, NULL);		}	keyLength = RSA_size(rsa);	if (length - RSA_PKCS1_PADDING > keyLength)		{		CCA4758err(CCA4758_F_CCA_RSA_VERIFY,			CCA4758_R_SIZE_TOO_LARGE_OR_TOO_SMALL);		return 0;		}	switch (type)		{		case NID_md5_sha1 :			if (m_len != SSL_SIG_LEN)				{				CCA4758err(CCA4758_F_CCA_RSA_VERIFY,				CCA4758_R_SIZE_TOO_LARGE_OR_TOO_SMALL);				return 0;				}			hashBuffer = (unsigned char *)m;			length = m_len;			break;		case NID_md5 :			{			unsigned char *ptr;			ptr = hashBuffer = OPENSSL_malloc(					(unsigned int)keyLength+1);			if (!hashBuffer)				{				CCA4758err(CCA4758_F_CCA_RSA_VERIFY,						ERR_R_MALLOC_FAILURE);				return 0;				}			i2d_X509_SIG(&sig, &ptr);			}			break;		case NID_sha1 :			{			unsigned char *ptr;			ptr = hashBuffer = OPENSSL_malloc(					(unsigned int)keyLength+1);			if (!hashBuffer)				{				CCA4758err(CCA4758_F_CCA_RSA_VERIFY,						ERR_R_MALLOC_FAILURE);				return 0;				}			i2d_X509_SIG(&sig, &ptr);			}			break;		default:			return 0;		}	digitalSignatureVerify(&returnCode, &reasonCode, &exitDataLength,		exitData, &ruleArrayLength, ruleArray, &keyTokenLength,		keyToken, &length, hashBuffer, &lsiglen, sigbuf);	if (type == NID_sha1 || type == NID_md5)		{		OPENSSL_cleanse(hashBuffer, keyLength+1);		OPENSSL_free(hashBuffer);		}	return ((returnCode || reasonCode) ? 0 : 1);	}#define SSL_SIG_LEN 36static int cca_rsa_sign(int type, const unsigned char *m, unsigned int m_len,		unsigned char *sigret, unsigned int *siglen, const RSA *rsa)	{	long returnCode;	long reasonCode;	long exitDataLength = 0;	unsigned char exitData[8];	long ruleArrayLength = 1;	unsigned char ruleArray[8] = "PKCS-1.1";	long outputLength=256;	long outputBitLength;	long keyTokenLength;	unsigned char *hashBuffer = NULL;	unsigned char* keyToken = (unsigned char*)RSA_get_ex_data(rsa, hndidx);	long length = SSL_SIG_LEN;	long keyLength ;	X509_SIG sig;	ASN1_TYPE parameter;	X509_ALGOR algorithm;	ASN1_OCTET_STRING digest;	keyTokenLength = *(long*)keyToken;	keyToken+=sizeof(long);	if (type == NID_md5 || type == NID_sha1)		{		sig.algor = &algorithm;		algorithm.algorithm = OBJ_nid2obj(type);		if (!algorithm.algorithm)			{			CCA4758err(CCA4758_F_CCA_RSA_SIGN,				CCA4758_R_UNKNOWN_ALGORITHM_TYPE);			return 0;			}		if (!algorithm.algorithm->length)			{			CCA4758err(CCA4758_F_CCA_RSA_SIGN,				CCA4758_R_ASN1_OID_UNKNOWN_FOR_MD);			return 0;			}		parameter.type = V_ASN1_NULL;		parameter.value.ptr = NULL;		algorithm.parameter = &parameter;		sig.digest = &digest;		sig.digest->data = (unsigned char*)m;		sig.digest->length = m_len;		length = i2d_X509_SIG(&sig, NULL);		}	keyLength = RSA_size(rsa);	if (length - RSA_PKCS1_PADDING > keyLength)		{		CCA4758err(CCA4758_F_CCA_RSA_SIGN,			CCA4758_R_SIZE_TOO_LARGE_OR_TOO_SMALL);		return 0;		}	switch (type)		{		case NID_md5_sha1 :			if (m_len != SSL_SIG_LEN)				{				CCA4758err(CCA4758_F_CCA_RSA_SIGN,				CCA4758_R_SIZE_TOO_LARGE_OR_TOO_SMALL);				return 0;				}			hashBuffer = (unsigned char*)m;			length = m_len;			break;		case NID_md5 :			{			unsigned char *ptr;			ptr = hashBuffer = OPENSSL_malloc(					(unsigned int)keyLength+1);			if (!hashBuffer)				{				CCA4758err(CCA4758_F_CCA_RSA_SIGN,						ERR_R_MALLOC_FAILURE);				return 0;				}			i2d_X509_SIG(&sig, &ptr);			}			break;		case NID_sha1 :			{			unsigned char *ptr;			ptr = hashBuffer = OPENSSL_malloc(					(unsigned int)keyLength+1);			if (!hashBuffer)				{				CCA4758err(CCA4758_F_CCA_RSA_SIGN,						ERR_R_MALLOC_FAILURE);				return 0;				}			i2d_X509_SIG(&sig, &ptr);			}			break;		default:			return 0;		}	digitalSignatureGenerate(&returnCode, &reasonCode, &exitDataLength,		exitData, &ruleArrayLength, ruleArray, &keyTokenLength,		keyToken, &length, hashBuffer, &outputLength, &outputBitLength,		sigret);	if (type == NID_sha1 || type == NID_md5)		{		OPENSSL_cleanse(hashBuffer, keyLength+1);		OPENSSL_free(hashBuffer);		}	*siglen = outputLength;	return ((returnCode || reasonCode) ? 0 : 1);	}static int getModulusAndExponent(const unsigned char*token, long *exponentLength,		unsigned char *exponent, long *modulusLength, long *modulusFieldLength,		unsigned char *modulus)	{	unsigned long len;	if (*token++ != (char)0x1E) /* internal PKA token? */		return 0;	if (*token++) /* token version must be zero */		return 0;	len = *token++;	len = len << 8;	len |= (unsigned char)*token++;	token += 4; /* skip reserved bytes */	if (*token++ == (char)0x04)		{		if (*token++) /* token version must be zero */			return 0;		len = *token++;		len = len << 8;		len |= (unsigned char)*token++;		token+=2; /* skip reserved section */		len = *token++;		len = len << 8;		len |= (unsigned char)*token++;		*exponentLength = len;		len = *token++;		len = len << 8;		len |= (unsigned char)*token++;		*modulusLength = len;		len = *token++;		len = len << 8;		len |= (unsigned char)*token++;		*modulusFieldLength = len;		memcpy(exponent, token, *exponentLength);		token+= *exponentLength;		memcpy(modulus, token, *modulusFieldLength);		return 1;		}	return 0;	}#endif /* OPENSSL_NO_RSA */static int cca_random_status(void)	{	return 1;	}static int cca_get_random_bytes(unsigned char* buf, int num)	{	long ret_code;	long reason_code;	long exit_data_length;	unsigned char exit_data[4];	unsigned char form[] = "RANDOM  ";	unsigned char rand_buf[8];	while(num >= (int)sizeof(rand_buf))		{		randomNumberGenerate(&ret_code, &reason_code, &exit_data_length,			exit_data, form, rand_buf);		if (ret_code)			return 0;		num -= sizeof(rand_buf);		memcpy(buf, rand_buf, sizeof(rand_buf));		buf += sizeof(rand_buf);		}	if (num)		{		randomNumberGenerate(&ret_code, &reason_code, NULL, NULL,			form, rand_buf);		if (ret_code)			return 0;		memcpy(buf, rand_buf, num);		}	return 1;	}#ifndef OPENSSL_NO_RSAstatic void cca_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad, int idx,		long argl, void *argp)	{	if (item)		OPENSSL_free(item);	}#endif/* Goo to handle building as a dynamic engine */#ifndef OPENSSL_NO_DYNAMIC_ENGINE static int bind_fn(ENGINE *e, const char *id)	{	if(id && (strcmp(id, engine_4758_cca_id) != 0) &&			(strcmp(id, engine_4758_cca_id_alt) != 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_4758_CCA */#endif /* !OPENSSL_NO_HW */

⌨️ 快捷键说明

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