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 + -
显示快捷键?