z90hardware.c

来自「LINUX 2.6.17.4的源码」· C语言 代码 · 共 2,426 行 · 第 1/5 页

C
2,426
字号
	tmp_type4_msg->sme.header.request_code = TYPE4_REQU_CODE;	if (mod_len <= 128) {		tmp_type4_msg->sme.header.msg_fmt = TYPE4_SME_FMT;		tmp_type4_msg->sme.header.msg_len = TYPE4_SME_LEN;		mod_tgt = tmp_type4_msg->sme.modulus;		mod_tgt_len = sizeof(tmp_type4_msg->sme.modulus);		exp_tgt = tmp_type4_msg->sme.exponent;		exp_tgt_len = sizeof(tmp_type4_msg->sme.exponent);		inp_tgt = tmp_type4_msg->sme.message;		inp_tgt_len = sizeof(tmp_type4_msg->sme.message);	} else {		tmp_type4_msg->lme.header.msg_fmt = TYPE4_LME_FMT;		tmp_type4_msg->lme.header.msg_len = TYPE4_LME_LEN;		mod_tgt = tmp_type4_msg->lme.modulus;		mod_tgt_len = sizeof(tmp_type4_msg->lme.modulus);		exp_tgt = tmp_type4_msg->lme.exponent;		exp_tgt_len = sizeof(tmp_type4_msg->lme.exponent);		inp_tgt = tmp_type4_msg->lme.message;		inp_tgt_len = sizeof(tmp_type4_msg->lme.message);	}	mod_tgt += (mod_tgt_len - mod_len);	if (copy_from_user(mod_tgt, icaMex_p->n_modulus, mod_len))		return SEN_RELEASED;	if (is_empty(mod_tgt, mod_len))		return SEN_USER_ERROR;	exp_tgt += (exp_tgt_len - mod_len);	if (copy_from_user(exp_tgt, icaMex_p->b_key, mod_len))		return SEN_RELEASED;	if (is_empty(exp_tgt, mod_len))		return SEN_USER_ERROR;	inp_tgt += (inp_tgt_len - mod_len);	if (copy_from_user(inp_tgt, icaMex_p->inputdata, mod_len))		return SEN_RELEASED;	if (is_empty(inp_tgt, mod_len))		return SEN_USER_ERROR;	*z90cMsg_l_p = msg_size - CALLER_HEADER;	return 0;}static intICACRT_msg_to_type4CRT_msg(struct ica_rsa_modexpo_crt *icaMsg_p,			   int *z90cMsg_l_p, union type4_msg *z90cMsg_p){	int mod_len, short_len, long_len, tmp_size, p_tgt_len, q_tgt_len,	    dp_tgt_len, dq_tgt_len, u_tgt_len, inp_tgt_len;	unsigned char *p_tgt, *q_tgt, *dp_tgt, *dq_tgt, *u_tgt, *inp_tgt;	union type4_msg *tmp_type4_msg;	mod_len = icaMsg_p->inputdatalength;	short_len = mod_len / 2;	long_len = mod_len / 2 + 8;	tmp_size = ((mod_len <= 128) ? TYPE4_SCR_LEN : TYPE4_LCR_LEN) +		    CALLER_HEADER;	memset(z90cMsg_p, 0, tmp_size);	tmp_type4_msg = (union type4_msg *)		((unsigned char *) z90cMsg_p + CALLER_HEADER);	tmp_type4_msg->scr.header.msg_type_code = TYPE4_TYPE_CODE;	tmp_type4_msg->scr.header.request_code = TYPE4_REQU_CODE;	if (mod_len <= 128) {		tmp_type4_msg->scr.header.msg_fmt = TYPE4_SCR_FMT;		tmp_type4_msg->scr.header.msg_len = TYPE4_SCR_LEN;		p_tgt = tmp_type4_msg->scr.p;		p_tgt_len = sizeof(tmp_type4_msg->scr.p);		q_tgt = tmp_type4_msg->scr.q;		q_tgt_len = sizeof(tmp_type4_msg->scr.q);		dp_tgt = tmp_type4_msg->scr.dp;		dp_tgt_len = sizeof(tmp_type4_msg->scr.dp);		dq_tgt = tmp_type4_msg->scr.dq;		dq_tgt_len = sizeof(tmp_type4_msg->scr.dq);		u_tgt = tmp_type4_msg->scr.u;		u_tgt_len = sizeof(tmp_type4_msg->scr.u);		inp_tgt = tmp_type4_msg->scr.message;		inp_tgt_len = sizeof(tmp_type4_msg->scr.message);	} else {		tmp_type4_msg->lcr.header.msg_fmt = TYPE4_LCR_FMT;		tmp_type4_msg->lcr.header.msg_len = TYPE4_LCR_LEN;		p_tgt = tmp_type4_msg->lcr.p;		p_tgt_len = sizeof(tmp_type4_msg->lcr.p);		q_tgt = tmp_type4_msg->lcr.q;		q_tgt_len = sizeof(tmp_type4_msg->lcr.q);		dp_tgt = tmp_type4_msg->lcr.dp;		dp_tgt_len = sizeof(tmp_type4_msg->lcr.dp);		dq_tgt = tmp_type4_msg->lcr.dq;		dq_tgt_len = sizeof(tmp_type4_msg->lcr.dq);		u_tgt = tmp_type4_msg->lcr.u;		u_tgt_len = sizeof(tmp_type4_msg->lcr.u);		inp_tgt = tmp_type4_msg->lcr.message;		inp_tgt_len = sizeof(tmp_type4_msg->lcr.message);	}	p_tgt += (p_tgt_len - long_len);	if (copy_from_user(p_tgt, icaMsg_p->np_prime, long_len))		return SEN_RELEASED;	if (is_empty(p_tgt, long_len))		return SEN_USER_ERROR;	q_tgt += (q_tgt_len - short_len);	if (copy_from_user(q_tgt, icaMsg_p->nq_prime, short_len))		return SEN_RELEASED;	if (is_empty(q_tgt, short_len))		return SEN_USER_ERROR;	dp_tgt += (dp_tgt_len - long_len);	if (copy_from_user(dp_tgt, icaMsg_p->bp_key, long_len))		return SEN_RELEASED;	if (is_empty(dp_tgt, long_len))		return SEN_USER_ERROR;	dq_tgt += (dq_tgt_len - short_len);	if (copy_from_user(dq_tgt, icaMsg_p->bq_key, short_len))		return SEN_RELEASED;	if (is_empty(dq_tgt, short_len))		return SEN_USER_ERROR;	u_tgt += (u_tgt_len - long_len);	if (copy_from_user(u_tgt, icaMsg_p->u_mult_inv, long_len))		return SEN_RELEASED;	if (is_empty(u_tgt, long_len))		return SEN_USER_ERROR;	inp_tgt += (inp_tgt_len - mod_len);	if (copy_from_user(inp_tgt, icaMsg_p->inputdata, mod_len))		return SEN_RELEASED;	if (is_empty(inp_tgt, mod_len))		return SEN_USER_ERROR;	*z90cMsg_l_p = tmp_size - CALLER_HEADER;	return 0;}static intICAMEX_msg_to_type6MEX_de_msg(struct ica_rsa_modexpo *icaMsg_p, int cdx,			      int *z90cMsg_l_p, struct type6_msg *z90cMsg_p){	int mod_len, vud_len, tmp_size, total_CPRB_len, parmBlock_l;	unsigned char *temp;	struct type6_hdr *tp6Hdr_p;	struct CPRB *cprb_p;	struct cca_private_ext_ME *key_p;	static int deprecated_msg_count = 0;	mod_len = icaMsg_p->inputdatalength;	tmp_size = FIXED_TYPE6_ME_LEN + mod_len;	total_CPRB_len = tmp_size - sizeof(struct type6_hdr);	parmBlock_l = total_CPRB_len - sizeof(struct CPRB);	tmp_size = 4*((tmp_size + 3)/4) + CALLER_HEADER;	memset(z90cMsg_p, 0, tmp_size);	temp = (unsigned char *)z90cMsg_p + CALLER_HEADER;	memcpy(temp, &static_type6_hdr, sizeof(struct type6_hdr));	tp6Hdr_p = (struct type6_hdr *)temp;	tp6Hdr_p->ToCardLen1 = 4*((total_CPRB_len+3)/4);	tp6Hdr_p->FromCardLen1 = RESPONSE_CPRB_SIZE;	temp += sizeof(struct type6_hdr);	memcpy(temp, &static_cprb, sizeof(struct CPRB));	cprb_p = (struct CPRB *) temp;	cprb_p->usage_domain[0]= (unsigned char)cdx;	itoLe2(&parmBlock_l, cprb_p->req_parml);	itoLe2((int *)&(tp6Hdr_p->FromCardLen1), cprb_p->rpl_parml);	temp += sizeof(struct CPRB);	memcpy(temp, &static_pkd_function_and_rules,	       sizeof(struct function_and_rules_block));	temp += sizeof(struct function_and_rules_block);	vud_len = 2 + icaMsg_p->inputdatalength;	itoLe2(&vud_len, temp);	temp += 2;	if (copy_from_user(temp, icaMsg_p->inputdata, mod_len))		return SEN_RELEASED;	if (is_empty(temp, mod_len))		return SEN_USER_ERROR;	temp += mod_len;	memcpy(temp, &static_T6_keyBlock_hdr, sizeof(struct T6_keyBlock_hdr));	temp += sizeof(struct T6_keyBlock_hdr);	memcpy(temp, &static_pvt_me_key, sizeof(struct cca_private_ext_ME));	key_p = (struct cca_private_ext_ME *)temp;	temp = key_p->pvtMESec.exponent + sizeof(key_p->pvtMESec.exponent)	       - mod_len;	if (copy_from_user(temp, icaMsg_p->b_key, mod_len))		return SEN_RELEASED;	if (is_empty(temp, mod_len))		return SEN_USER_ERROR;	if (is_common_public_key(temp, mod_len)) {		if (deprecated_msg_count < 20) {			PRINTK("Common public key used for modex decrypt\n");			deprecated_msg_count++;			if (deprecated_msg_count == 20)				PRINTK("No longer issuing messages about common"				       " public key for modex decrypt.\n");		}		return SEN_NOT_AVAIL;	}	temp = key_p->pvtMESec.modulus + sizeof(key_p->pvtMESec.modulus)	       - mod_len;	if (copy_from_user(temp, icaMsg_p->n_modulus, mod_len))		return SEN_RELEASED;	if (is_empty(temp, mod_len))		return SEN_USER_ERROR;	key_p->pubMESec.modulus_bit_len = 8 * mod_len;	*z90cMsg_l_p = tmp_size - CALLER_HEADER;	return 0;}static intICAMEX_msg_to_type6MEX_en_msg(struct ica_rsa_modexpo *icaMsg_p, int cdx,			      int *z90cMsg_l_p, struct type6_msg *z90cMsg_p){	int mod_len, vud_len, exp_len, key_len;	int pad_len, tmp_size, total_CPRB_len, parmBlock_l, i;	unsigned char *temp_exp, *exp_p, *temp;	struct type6_hdr *tp6Hdr_p;	struct CPRB *cprb_p;	struct cca_public_key *key_p;	struct T6_keyBlock_hdr *keyb_p;	temp_exp = kmalloc(256, GFP_KERNEL);	if (!temp_exp)		return EGETBUFF;	mod_len = icaMsg_p->inputdatalength;	if (copy_from_user(temp_exp, icaMsg_p->b_key, mod_len)) {		kfree(temp_exp);		return SEN_RELEASED;	}	if (is_empty(temp_exp, mod_len)) {		kfree(temp_exp);		return SEN_USER_ERROR;	}	exp_p = temp_exp;	for (i = 0; i < mod_len; i++)		if (exp_p[i])			break;	if (i >= mod_len) {		kfree(temp_exp);		return SEN_USER_ERROR;	}	exp_len = mod_len - i;	exp_p += i;	PDEBUG("exp_len after computation: %08x\n", exp_len);	tmp_size = FIXED_TYPE6_ME_EN_LEN + 2 * mod_len + exp_len;	total_CPRB_len = tmp_size - sizeof(struct type6_hdr);	parmBlock_l = total_CPRB_len - sizeof(struct CPRB);	tmp_size = 4*((tmp_size + 3)/4) + CALLER_HEADER;	vud_len = 2 + mod_len;	memset(z90cMsg_p, 0, tmp_size);	temp = (unsigned char *)z90cMsg_p + CALLER_HEADER;	memcpy(temp, &static_type6_hdr, sizeof(struct type6_hdr));	tp6Hdr_p = (struct type6_hdr *)temp;	tp6Hdr_p->ToCardLen1 = 4*((total_CPRB_len+3)/4);	tp6Hdr_p->FromCardLen1 = RESPONSE_CPRB_SIZE;	memcpy(tp6Hdr_p->function_code, static_PKE_function_code,	       sizeof(static_PKE_function_code));	temp += sizeof(struct type6_hdr);	memcpy(temp, &static_cprb, sizeof(struct CPRB));	cprb_p = (struct CPRB *) temp;	cprb_p->usage_domain[0]= (unsigned char)cdx;	itoLe2((int *)&(tp6Hdr_p->FromCardLen1), cprb_p->rpl_parml);	temp += sizeof(struct CPRB);	memcpy(temp, &static_pke_function_and_rules,		 sizeof(struct function_and_rules_block));	temp += sizeof(struct function_and_rules_block);	temp += 2;	if (copy_from_user(temp, icaMsg_p->inputdata, mod_len)) {		kfree(temp_exp);		return SEN_RELEASED;	}	if (is_empty(temp, mod_len)) {		kfree(temp_exp);		return SEN_USER_ERROR;	}	if ((temp[0] != 0x00) || (temp[1] != 0x02)) {		kfree(temp_exp);		return SEN_NOT_AVAIL;	}	for (i = 2; i < mod_len; i++)		if (temp[i] == 0x00)			break;	if ((i < 9) || (i > (mod_len - 2))) {		kfree(temp_exp);		return SEN_NOT_AVAIL;	}	pad_len = i + 1;	vud_len = mod_len - pad_len;	memmove(temp, temp+pad_len, vud_len);	temp -= 2;	vud_len += 2;	itoLe2(&vud_len, temp);	temp += (vud_len);	keyb_p = (struct T6_keyBlock_hdr *)temp;	temp += sizeof(struct T6_keyBlock_hdr);	memcpy(temp, &static_public_key, sizeof(static_public_key));	key_p = (struct cca_public_key *)temp;	temp = key_p->pubSec.exponent;	memcpy(temp, exp_p, exp_len);	kfree(temp_exp);	temp += exp_len;	if (copy_from_user(temp, icaMsg_p->n_modulus, mod_len))		return SEN_RELEASED;	if (is_empty(temp, mod_len))		return SEN_USER_ERROR;	key_p->pubSec.modulus_bit_len = 8 * mod_len;	key_p->pubSec.modulus_byte_len = mod_len;	key_p->pubSec.exponent_len = exp_len;	key_p->pubSec.section_length = CALLER_HEADER + mod_len + exp_len;	key_len = key_p->pubSec.section_length + sizeof(struct cca_token_hdr);	key_p->pubHdr.token_length = key_len;	key_len += 4;	itoLe2(&key_len, keyb_p->ulen);	key_len += 2;	itoLe2(&key_len, keyb_p->blen);	parmBlock_l -= pad_len;	itoLe2(&parmBlock_l, cprb_p->req_parml);	*z90cMsg_l_p = tmp_size - CALLER_HEADER;	return 0;}static intICACRT_msg_to_type6CRT_msg(struct ica_rsa_modexpo_crt *icaMsg_p, int cdx,			   int *z90cMsg_l_p, struct type6_msg *z90cMsg_p){	int mod_len, vud_len, tmp_size, total_CPRB_len, parmBlock_l, short_len;	int long_len, pad_len, keyPartsLen, tmp_l;	unsigned char *tgt_p, *temp;	struct type6_hdr *tp6Hdr_p;	struct CPRB *cprb_p;	struct cca_token_hdr *keyHdr_p;	struct cca_pvt_ext_CRT_sec *pvtSec_p;	struct cca_public_sec *pubSec_p;	mod_len = icaMsg_p->inputdatalength;	short_len = mod_len / 2;	long_len = 8 + short_len;	keyPartsLen = 3 * long_len + 2 * short_len;	pad_len = (8 - (keyPartsLen % 8)) % 8;	keyPartsLen += pad_len + mod_len;	tmp_size = FIXED_TYPE6_CR_LEN + keyPartsLen + mod_len;	total_CPRB_len = tmp_size -  sizeof(struct type6_hdr);	parmBlock_l = total_CPRB_len - sizeof(struct CPRB);	vud_len = 2 + mod_len;	tmp_size = 4*((tmp_size + 3)/4) + CALLER_HEADER;	memset(z90cMsg_p, 0, tmp_size);	tgt_p = (unsigned char *)z90cMsg_p + CALLER_HEADER;	memcpy(tgt_p, &static_type6_hdr, sizeof(struct type6_hdr));	tp6Hdr_p = (struct type6_hdr *)tgt_p;	tp6Hdr_p->ToCardLen1 = 4*((total_CPRB_len+3)/4);	tp6Hdr_p->FromCardLen1 = RESPONSE_CPRB_SIZE;	tgt_p += sizeof(struct type6_hdr);	cprb_p = (struct CPRB *) tgt_p;	memcpy(tgt_p, &static_cprb, sizeof(struct CPRB));	cprb_p->usage_domain[0]= *((unsigned char *)(&(cdx))+3);	itoLe2(&parmBlock_l, cprb_p->req_parml);	memcpy(cprb_p->rpl_parml, cprb_p->req_parml,	       sizeof(cprb_p->req_parml));	tgt_p += sizeof(struct CPRB);	memcpy(tgt_p, &static_pkd_function_and_rules,	       sizeof(struct function_and_rules_block));	tgt_p += sizeof(struct function_and_rules_block);	itoLe2(&vud_len, tgt_p);	tgt_p += 2;	if (copy_from_user(tgt_p, icaMsg_p->inputdata, mod_len))		return SEN_RELEASED;	if (is_empty(tgt_p, mod_len))		return SEN_USER_ERROR;	tgt_p += mod_len;	tmp_l = sizeof(struct T6_keyBlock_hdr) + sizeof(struct cca_token_hdr) +		sizeof(struct cca_pvt_ext_CRT_sec) + 0x0F + keyPartsLen;	itoLe2(&tmp_l, tgt_p);	temp = tgt_p + 2;	tmp_l -= 2;	itoLe2(&tmp_l, temp);	tgt_p += sizeof(struct T6_keyBlock_hdr);	keyHdr_p = (struct cca_token_hdr *)tgt_p;	keyHdr_p->token_identifier = CCA_TKN_HDR_ID_EXT;	tmp_l -= 4;	keyHdr_p->token_length = tmp_l;	tgt_p += sizeof(struct cca_token_hdr);	pvtSec_p = (struct cca_pvt_ext_CRT_sec *)tgt_p;	pvtSec_p->section_identifier = CCA_PVT_EXT_CRT_SEC_ID_PVT;	pvtSec_p->section_length =		sizeof(struct cca_pvt_ext_CRT_sec) + keyPartsLen;	pvtSec_p->key_format = CCA_PVT_EXT_CRT_SEC_FMT_CL;	pvtSec_p->key_use_flags[0] = CCA_PVT_USAGE_ALL;	pvtSec_p->p_len = long_len;	pvtSec_p->q_len = short_len;	pvtSec_p->dp_len = long_len;	pvtSec_p->dq_len = short_len;	pvtSec_p->u_len = long_len;	pvtSec_p->mod_len = mod_len;	pvtSec_p->pad_len = pad_len;	tgt_p += sizeof(struct cca_pvt_ext_CRT_sec);	if (copy_from_user(tgt_p, icaMsg_p->np_prime, long_len))		return SEN_RELEASED;	if (is_empty(tgt_p, long_len))		return SEN_USER_ERROR;	tgt_p += long_len;	if (copy_from_user(tgt_p, icaMsg_p->nq_prime, short_len))		return SEN_RELEASED;	if (is_empty(tgt_p, short_len))		return SEN_USER_ERROR;	tgt_p += short_len;	if (copy_from_user(tgt_p, icaMsg_p->bp_key, long_len))		return SEN_RELEASED;	if (is_empty(tgt_p, long_len))		return SEN_USER_ERROR;	tgt_p += long_len;	if (copy_from_user(tgt_p, icaMsg_p->bq_key, short_len))		return SEN_RELEASED;	if (is_empty(tgt_p, short_len))		return SEN_USER_ERROR;	tgt_p += short_len;	if (copy_from_user(tgt_p, icaMsg_p->u_mult_inv, long_len))		return SEN_RELEASED;	if (is_empty(tgt_p, long_len))		return SEN_USER_ERROR;	tgt_p += long_len;	tgt_p += pad_len;	memset(tgt_p, 0xFF, mod_len);	tgt_p += mod_len;	memcpy(tgt_p, &static_cca_pub_sec, sizeof(struct cca_public_sec));	pubSec_p = (struct cca_public_sec *) tgt_p;	pubSec_p->modulus_bit_len = 8 * mod_len;	*z90cMsg_l_p = tmp_size - CALLER_HEADER;	return 0;}static intICAMEX_msg_to_type6MEX_msgX(struct ica_rsa_modexpo *icaMsg_p, int cdx,			    int *z90cMsg_l_p, struct type6_msg *z90cMsg_p,			    int dev_type){	int mod_len, exp_len, vud_len, tmp_size, total_CPRB_len, parmBlock_l;	int key_len, i;	unsigned char *temp_exp, *tgt_p, *temp, *exp_p;	struct type6_hdr *tp6Hdr_p;	struct CPRBX *cprbx_p;	struct cca_public_key *key_p;	struct T6_keyBlock_hdrX *keyb_p;	temp_exp = kmalloc(256, GFP_KERNEL);	if (!temp_exp)		return EGETBUFF;	mod_len = icaMsg_p->inputdatalength;	if (copy_from_user(temp_exp, icaMsg_p->b_key, mod_len)) {		kfree(temp_exp);		return SEN_RELEASED;	}	if (is_empty(temp_exp, mod_len)) {		kfree(temp_exp);		return SEN_USER_ERROR;	}	exp_p = temp_exp;	for (i = 0; i < mod_len; i++)		if (exp_p[i])			break;	if (i >= mod_len) {		kfree(temp_exp);		return SEN_USER_ERROR;	}	exp_len = mod_len - i;	exp_p += i;	PDEBUG("exp_len after computation: %08x\n", exp_len);	tmp_size = FIXED_TYPE6_ME_EN_LENX + 2 * mod_len + exp_len;	total_CPRB_len = tmp_size - sizeof(struct type6_hdr);	parmBlock_l = total_CPRB_len - sizeof(struct CPRBX);

⌨️ 快捷键说明

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