int read_typelist_json_desc(void * root,void * record) { int ret; struct struct_namelist * namelist; struct struct_namelist * baselist; struct struct_typelist * typelist; struct struct_typelist * basetypelist; int * temp_node; void * namelist_template; void * typelist_template; DB_RECORD * db_record=record; DB_RECORD * namelist_record; ret=Galloc0(&typelist,sizeof(struct struct_typelist)); if(ret<0) return ret; if(db_record->head.type!=DB_TYPELIST) return -EINVAL; // store the namelist (if exists) and compute the uuid temp_node=json_find_elem("uuid",root); if(temp_node == NULL) { // this typelist use namelist describe, // we should finish namelist store first ret=Galloc0(&namelist_record,sizeof(DB_RECORD)); if(ret<0) return ret; namelist_record->head.type=DB_NAMELIST; ret=read_namelist_json_desc(root,namelist_record); if(ret<0) return ret; Memcpy(typelist->uuid,namelist_record->head.uuid,DIGEST_SIZE); namelist=namelist_record->record; typelist->elem_no=namelist->elem_no; } else { typelist_template=memdb_get_template(DB_TYPELIST,0); if(typelist_template==NULL) return -EINVAL; ret=json_2_struct(root,typelist,typelist_template); namelist_record=memdb_find(typelist->uuid,DB_NAMELIST,0); if(namelist_record==NULL) return -EINVAL; namelist=namelist_record->record; if(typelist->elem_no==0) typelist->elem_no=namelist->elem_no; } db_record->record=typelist; ret=memdb_store_record(db_record); // merge the typelist namelist_record=memdb_find_byname("typeenumlist",DB_NAMELIST,0); if(namelist_record==NULL) return -EINVAL; baselist=_merge_namelist(namelist_record->record,db_record->tail); if(baselist==NULL) return -EINVAL; ret=memdb_remove_byname("typeenumlist",DB_NAMELIST,0); if(ret<0) return -EINVAL; memdb_store(baselist,DB_NAMELIST,0,"typeenumlist"); typeenumlist=baselist; return ret; }
int proc_tcm_activateidentity(void * sub_proc,void * recv_msg) { int ret=0; int fd; BYTE Buf[DIGEST_SIZE*32]; BYTE NameBuf[DIGEST_SIZE*4]; BYTE KeyBuf[DIGEST_SIZE*4]; BYTE digest[DIGEST_SIZE]; UINT32 result; DB_RECORD * db_record; RECORD(TCM_PIK_DESC,USERINFO) * pik_userinfo; RECORD(TCM_PIK_DESC,CADATA) * pik_cadata; RECORD(TCM_PIK_DESC,PIKCERT) * pik_cert; RECORD(VTCM_IN_KEY,TCM_BIN_KEY) tcm_pik; RECORD(VTCM_IN_KEY,TCM_BIN_PUBKEY) tcm_pikpub; RECORD(TCM_KEY_MANAGE,PRIVATE_KEY) * tcm_pik_info; TCM_SYMMETRIC_KEY symmkey; void * new_msg; int key_len; void * tcm_key_template; UINT32 smkHandle; UINT32 ownerHandle; UINT32 keyHandle; UINT32 keyAuthHandle; char uuid[DIGEST_SIZE*2+1]; printf("begin pik activateidentity!\n"); // get pik cadata from message ret=message_get_record(recv_msg,&pik_cadata,0); if(ret<0) return -EINVAL; if(pik_cadata==NULL) return -EINVAL; // find pikinfo record db_record=memdb_find_first(TYPE_PAIR(TCM_KEY_MANAGE,PRIVATE_KEY),"pubkey_uuid",pik_cadata->pikpub_uuid); if(db_record==NULL) { print_cubeerr("can't find pik record!\n"); return -EINVAL; } tcm_pik_info=db_record->record; // get pik file name digest_to_uuid(tcm_pik_info->uuid,uuid); uuid[DIGEST_SIZE*2]=0; printf("get pik's uuid is %s!\n",uuid); Strcpy(NameBuf,"tcmkey/"); Strcat(NameBuf,uuid); ret=TCM_ExLoadTcmKey(&tcm_pik,NameBuf); if(ret!=0) { print_cubeerr("Load TCMKey from file failed!\n"); return ret; } // Load pik to TCM ret=TCM_APCreate(TCM_ET_SMK, NULL, "sss", &smkHandle); printf("smkHandle is : %x\n",smkHandle); if(ret<0) { printf("TCM_APCreate failed!\n"); return -EINVAL; } ret=TCM_LoadKey(smkHandle,NameBuf,&keyHandle); if(ret!=0) { print_cubeerr("TCM_LoadKey failed!\n"); return ret; } ret=TCM_APTerminate(smkHandle); if(ret!=0) { printf("TCM_APTerminate failed!\n"); return ret; } // do the activateidentity ret=TCM_APCreate(TCM_ET_OWNER, NULL, "ooo", &ownerHandle); printf("ownerHandle is : %x\n",ownerHandle); if(ret<0) { print_cubeerr("TCM_APCreate failed!\n"); return -EINVAL; } ret=TCM_APCreate(TCM_ET_KEYHANDLE,keyHandle, "kkk", &keyAuthHandle); printf("pikHandle is : %x\n",keyAuthHandle); if(ret!=0) { printf("TCM_APCreate failed!\n"); return -EINVAL; } ret=TCM_ActivateIdentity(keyHandle,keyAuthHandle,ownerHandle, pik_cadata->symmkey_len,pik_cadata->symmkey,&symmkey,"ooo","kkk"); if(ret!=0) { printf("TCM_ActivateIdentity failed!\n"); return -EINVAL; } ret=TCM_APTerminate(ownerHandle); if(ret<0) { printf("TCM_APTerminate failed!\n"); return -EINVAL; } ret=TCM_APTerminate(keyAuthHandle); if(ret<0) { printf("TCM_APTerminate failed!\n"); return -EINVAL; } ret=TCM_EvictKey(keyHandle); if(ret<0) { printf("TCM_APTerminate failed!\n"); return -EINVAL; } // decrypt cert blob int blobsize; BYTE * cert; int certsize; ret=TCM_ExSymmkeyDecrypt(&symmkey,pik_cadata->cert,pik_cadata->certlen,&cert,&certsize); if(ret!=0) { printf("decrypt cert blob file error!\n"); return -EINVAL; } int offset; for(offset=0;cert[offset]==0;offset++) { if((offset>=16)|| (offset>=certsize)) { print_cubeerr("cert data failed!\n"); return -EINVAL; } } // build pik cert, it is organized by userinfo, pubkey and ca_conts // pik_cert=Talloc0(sizeof(*pik_cert)); if(pik_cert==NULL) return -ENOMEM; tcm_key_template=memdb_get_template(TYPE_PAIR(TCM_PIK_DESC,VERIFYDATA)); if(tcm_key_template==NULL) return -EINVAL; ret=blob_2_struct(cert+offset,&pik_cert->verifydata,tcm_key_template); if(ret<0) return -EINVAL; db_record=memdb_find(pik_cadata->userinfo_uuid,TYPE_PAIR(TCM_PIK_DESC,USERINFO)); if(db_record==NULL) { print_cubeerr("can't find user info data!\n"); return -EINVAL; } pik_userinfo=db_record->record; tcm_key_template=memdb_get_template(TYPE_PAIR(TCM_PIK_DESC,USERINFO)); if(tcm_key_template==NULL) return -EINVAL; ret=struct_clone(pik_userinfo,&pik_cert->userinfo,tcm_key_template); if(ret<0) return -EINVAL; ret=TCM_ExGetPubkeyFromTcmkey(&tcm_pikpub,&tcm_pik); if(ret!=0) { print_cubeerr("Get Pubpik failed!\n"); return -EINVAL; } tcm_key_template=memdb_get_template(TYPE_PAIR(VTCM_IN_KEY,TCM_BIN_PUBKEY)); if(tcm_key_template==NULL) return -EINVAL; ret=struct_clone(&tcm_pikpub,&pik_cert->pikpub,tcm_key_template); if(ret<0) return -EINVAL; // build a message and send it new_msg=message_create(TYPE_PAIR(TCM_PIK_DESC,PIKCERT),recv_msg); if(new_msg==NULL) return -EINVAL; ret=message_add_record(new_msg,pik_cert); if(ret<0) return ret; ret=ex_module_sendmsg(sub_proc,new_msg); return ret; }
int read_subtypelist_json_desc(void * root,void * record) { int ret; struct struct_namelist * namelist; struct struct_subtypelist * subtypelist; int * temp_node; void * namelist_template; void * subtypelist_template; DB_RECORD * db_record=record; DB_RECORD * namelist_record; ret=Galloc0(&subtypelist,sizeof(struct struct_subtypelist)); if(ret<0) return ret; if(db_record->head.type!=DB_SUBTYPELIST) return -EINVAL; // store the namelist (if exists) and compute the uuid temp_node=json_find_elem("uuid",root); if(temp_node == NULL) { // this typelist use namelist describe, // we should finish namelist store first ret=Galloc0(&namelist_record,sizeof(DB_RECORD)); if(ret<0) return ret; namelist_record->head.type=DB_NAMELIST; ret=read_namelist_json_desc(root,namelist_record); if(ret<0) { Free0(namelist_record); return ret; } Memcpy(subtypelist->uuid,namelist_record->head.uuid,DIGEST_SIZE); namelist=namelist_record->record; subtypelist->elem_no=namelist->elem_no; temp_node=json_find_elem("type",root); if(temp_node==NULL) { return -EINVAL; } subtypelist->type=memdb_get_typeno(json_get_valuestr(temp_node)); if(subtypelist->type<0) { return -EINVAL; } } else { subtypelist_template=memdb_get_template(DB_SUBTYPELIST,0); if(subtypelist_template==NULL) return -EINVAL; ret=json_2_struct(root,subtypelist,subtypelist_template); namelist_record=memdb_find(subtypelist->uuid,DB_NAMELIST,0); if(namelist_record==NULL) return -EINVAL; namelist=namelist_record->record; if(subtypelist->elem_no==0) subtypelist->elem_no=namelist->elem_no; } db_record->record=subtypelist; ret=memdb_store_record(db_record); return ret; }