Exemplo n.º 1
0
TSS_RESULT
obj_nvstore_get_writelocalityatrelease(TSS_HNVSTORE hNvstore, UINT32 * writelocalityatrelease)
{
	BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE];
	UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
	UINT32 offset;
	UINT16 pcrread_sizeOfSelect;
	UINT16 pcrwrite_sizeOfSelect;
	TPM_LOCALITY_SELECTION locality_value;
	TSS_RESULT result;

	if ((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
		return result;

	offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
	pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
	offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect
			+ sizeof(TPM_LOCALITY_SELECTION)
			+ sizeof(TPM_COMPOSITE_HASH);
	pcrwrite_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
	offset = offset + sizeof(UINT16) + pcrwrite_sizeOfSelect;

	locality_value = *((TPM_LOCALITY_SELECTION *)(nv_data_public + offset));
	*writelocalityatrelease = locality_value;

	return result;
}
Exemplo n.º 2
0
TSS_RESULT
obj_nvstore_get_writepcrselection(TSS_HNVSTORE hNvstore, UINT32 *size, BYTE **data)
{
	BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE];
	UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
	UINT32 offset;
	UINT16 pcrread_sizeOfSelect;
	UINT16 pcrwrite_sizeOfSelect;
	TSS_HCONTEXT tspContext;
	TSS_RESULT result;

	if((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
		return result;

	if ((result = obj_nvstore_get_tsp_context(hNvstore, &tspContext)))
		return result;

	offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
	pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
	offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect
			+ sizeof(TPM_LOCALITY_SELECTION)
			+ sizeof(TPM_COMPOSITE_HASH);
	pcrwrite_sizeOfSelect = Decode_UINT16(nv_data_public + offset);

	*size = sizeof(UINT16) + pcrwrite_sizeOfSelect;
	*data = calloc_tspi(tspContext, *size);
	if (*data == NULL) {
		LogError("malloc of %u bytes failed.", *size);
		result = TSPERR(TSS_E_OUTOFMEMORY);
		return result;
	}

	memcpy(*data, nv_data_public + offset, *size);
	return result;
}
Exemplo n.º 3
0
TSS_RESULT
obj_nvstore_get_state_readstclear(TSS_HNVSTORE hNvstore, UINT32 * readstclear)
{
	BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE];
	UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
	UINT32 offset;
	UINT16 pcrread_sizeOfSelect;
	UINT16 pcrwrite_sizeOfSelect;
	TPM_BOOL value;
	TSS_RESULT result;

	if ((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
		return result;

	offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
	pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
	offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect
			+ sizeof(TPM_LOCALITY_SELECTION)
			+ sizeof(TPM_COMPOSITE_HASH);

	pcrwrite_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
	offset = offset + sizeof(UINT16) + pcrwrite_sizeOfSelect
			+ sizeof(TPM_LOCALITY_SELECTION)
			+ sizeof(TPM_COMPOSITE_HASH)
			+ sizeof(TPM_NV_ATTRIBUTES);

	value = *((TPM_BOOL *)(nv_data_public + offset));

	*readstclear = value;

	return result;
}
Exemplo n.º 4
0
TSS_RESULT
obj_nvstore_get_permission_from_tpm(TSS_HNVSTORE hNvstore, UINT32 * permission)
{
	BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE] = {0};
	UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
	UINT32 offset;
	UINT16 pcrread_sizeOfSelect;
	UINT16 pcrwrite_sizeOfSelect;
	TPM_NV_ATTRIBUTES nv_attributes_value;
	TSS_HCONTEXT tspContext;
	TSS_RESULT result;

	if((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
		return result;

	if ((result = obj_nvstore_get_tsp_context(hNvstore, &tspContext)))
		return result;

	offset = 0;
	offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
	pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);

	offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect
			+ sizeof(TPM_LOCALITY_SELECTION)
			+ sizeof(TPM_COMPOSITE_HASH);
	pcrwrite_sizeOfSelect = Decode_UINT16(nv_data_public + offset);

	offset = offset + sizeof(UINT16) + pcrwrite_sizeOfSelect
			+ sizeof(TPM_LOCALITY_SELECTION)
			+ sizeof(TPM_COMPOSITE_HASH);

	nv_attributes_value.attributes = Decode_UINT32(nv_data_public
						       + offset + sizeof(TPM_STRUCTURE_TAG));
	*permission = nv_attributes_value.attributes;

	return result;
}
Exemplo n.º 5
0
int json_2_struct_write_elem(void * node,void * addr,TEMPLATE_ELEM * elem_template)
{
   JSON_NODE * json_node = (JSON_NODE *)node;

   struct struct_elem_attr * elem_attr;	
   BYTE * buf;
   int retval;
   int int_value;
   unsigned char char_value;
   UINT16 short_value;
   long long long_long_value;
   int i,j;
   BYTE * data;
   V_String * vstring;
   TEMPLATE_ELEM * elem_define;
   int define_value;

   retval=0;
   elem_attr=elem_template->elem_desc;
   switch(elem_attr->type) {
	case OS210_TYPE_STRING :
		if(json_node->elem_type!=JSON_ELEM_STRING)
			return -EINVAL;	
  		retval=elem_attr->size;
		memset(addr,0,retval);
		strncpy(addr,json_node->value_str,retval);
		break;
	case OS210_TYPE_INT :
  		retval=sizeof(int);
		if(json_node->elem_type!=JSON_ELEM_NUM)
			return -EINVAL;	
		int_value=atoi(json_node->value_str);
		memcpy(addr,&int_value,retval);
		break;
	case OS210_TYPE_ENUM :
  		retval=sizeof(int);
		if(json_node->elem_type == JSON_ELEM_NUM)
		{
			int_value=atoi(json_node->value_str);
			memcpy(addr,&int_value,retval);
		}
		else if(json_node->elem_type ==JSON_ELEM_STRING)
		{
			if(!strcmp(nulstring,json_node->value_str))
			{
				int_value=0;
			}
			else
			{
				NAME2VALUE * EnumList;
				if((elem_template->elem_var != NULL) && !IS_ERR(elem_template->elem_var))
					EnumList=elem_template->elem_var;
				else
					EnumList=elem_template->elem_desc->attr;

				if((EnumList==NULL)||IS_ERR(EnumList))
					return -EINVAL;
				char * string=json_node->value_str;
			
				for(i=0;EnumList[i].name!=NULL;i++)
				{
					if(!strcmp(EnumList[i].name,string))
					{	
						int_value=EnumList[i].value;
						memcpy(addr,&int_value,retval);
						break;
					}
				}
				if(EnumList[i].name==NULL)
					return -EINVAL;
			}
		}
		else
			return -EINVAL;
		break;
	case OS210_TYPE_FLAG :
  		retval=sizeof(int);
		if(json_node->elem_type == JSON_ELEM_NUM)
		{
			int_value=atoi(json_node->value_str);
			memcpy(addr,&int_value,retval);
		}
		else if(json_node->elem_type ==JSON_ELEM_STRING)
		{
			if(!strcmp(nulstring,json_node->value_str))
			{
				int_value=0;
			}
			else
			{
				NAME2VALUE * FlagList;
				if((elem_template->elem_var != NULL) && !IS_ERR(elem_template->elem_var))
					FlagList=elem_template->elem_var;
				else
					FlagList=elem_template->elem_desc->attr;

				if((FlagList==NULL)||IS_ERR(FlagList))
					return -EINVAL;
			
				int_value=0;
				char temp_string[256];
				int  stroffset=0;
				char * string=json_node->value_str;
	
				for(i=0;string[i]==' ';i++);
				if(string[i]==0)
					return 0;

				for(;i<strlen(string);i++)
				{
					// duplicate one flag bit string
					
					temp_string[stroffset++]=string[i];
					if((string[i+1]!='|') && (string[i+1]!=0))
						continue;
					i++;
					for(;string[i]==' ';i++)
					{
						if(string[i]==0)
							break;
					}
					 
					temp_string[stroffset]=0;
					stroffset=0;

				// find the flag's value

					for(j=0;FlagList[j].name!=NULL;j++)
					{
						if(strcmp(FlagList[j].name,temp_string))
							continue;
						int_value|=FlagList[j].value;
						break;
					}
					if(FlagList[j].name==NULL)
						return -EINVAL;
				}

				memcpy(addr,&int_value,retval);
			}
		}
		else
			return -EINVAL;
		break;
	case TPM_TYPE_UINT32 :
  		retval=sizeof(int);
		if(json_node->elem_type == JSON_ELEM_NUM)
		{
			int_value=atoi(json_node->value_str);
  			*(int *)addr=Decode_UINT32(&int_value);
		}
		else
			return -EINVAL;
		break;
	case OS210_TYPE_TIME :
  		retval=sizeof(time_t);
//		memcpy(addr,elem_data,retval);
		break;
	case OS210_TYPE_UCHAR :
  		retval=sizeof(unsigned char);
		memcpy(addr,json_node->value_str,retval);
		break;
	case OS210_TYPE_USHORT :
  		retval=sizeof(unsigned short);
		if(json_node->elem_type == JSON_ELEM_NUM)
		{
			short_value=atoi(json_node->value_str);
			memcpy(addr,&short_value,retval);
		}
		else
			return -EINVAL;
		break;
	case TPM_TYPE_UINT16 :
  		retval=sizeof(UINT16);
		if(json_node->elem_type == JSON_ELEM_NUM)
		{
			short_value=atoi(json_node->value_str);
  			*(UINT16 *)addr=Decode_UINT16(&short_value);
		}
		else
			return -EINVAL;
		break;
	case OS210_TYPE_LONGLONG:
  		retval=sizeof(long long);
		if(json_node->elem_type == JSON_ELEM_NUM)
		{
			long_long_value=atoi(json_node->value_str);
			memcpy(addr,&long_long_value,retval);
		}
		else
			return -EINVAL;
		break;
	case TPM_TYPE_UINT64 :
  		retval=sizeof(UINT64);
		if(json_node->elem_type == JSON_ELEM_NUM)
		{
			long_long_value=atoi(json_node->value_str);
  			*(UINT64 *)addr=Decode_UINT64(&long_long_value);
		}
		else
			return -EINVAL;
		break;
	case OS210_TYPE_BINDATA:
		if(json_node->elem_type != JSON_ELEM_STRING)
			return -EINVAL;
  		retval=elem_attr->size;
		radix64_to_bin(addr,bin_to_radix64_len(retval),json_node->value_str);
		break;
	case OS210_TYPE_BITMAP:
		if(json_node->elem_type != JSON_ELEM_STRING)
			return -EINVAL;
		{
			char * tempstring;
			BYTE * tempbuf;
			retval=elem_attr->size;
			tempbuf=(BYTE * )addr;
			tempstring=json_node->value_str;
			for(i=0;i<retval;i++)
			{
				tempbuf[i]=0;
				while(*tempstring==' ')
					tempstring++;
				for(j=0;j<8;j++)
				{
					if((*tempstring!= '0') &&(*tempstring!='1'))
						return -EINVAL;
					tempbuf[i]=tempbuf[i]<<1+(*tempstring-'0');
					tempstring++;	
				}
			}
		}
		break;
	case OS210_TYPE_HEXDATA:
		if(json_node->elem_type != JSON_ELEM_STRING)
			return -EINVAL;
		{
			char * tempstring;
			BYTE * tempbuf;
			retval=elem_attr->size;
			tempbuf=(BYTE * )addr;
			tempstring=json_node->value_str;
			for(i=0;i<retval;i++)
			{
				tempbuf[i]=0;
				while(*tempstring==' ')
					tempstring++;
				for(j=0;j<2;j++)
				{
					if((*tempstring>='0') &&(*tempstring<='9'))
					{
						tempbuf[i]=tempbuf[i]*0x10+(*tempstring-'0');
					}
					else if((*tempstring>='A') &&(*tempstring<='F'))
					{
						tempbuf[i]=tempbuf[i]*0x10+(*tempstring-'A'+9);
					}
					else if((*tempstring>='a') &&(*tempstring<='f'))
					{
						tempbuf[i]=tempbuf[i]*0x10+(*tempstring-'a'+9);
					}
					else
						return -EINVAL;
					tempstring++;	
				}
			}
		}
		break;
	case OS210_TYPE_BINARRAY:
		if(json_node->elem_type != JSON_ELEM_ARRAY)
			return -EINVAL;
		{
	  		retval=elem_attr->size*(int)(elem_attr->attr);
			memset(addr,0,retval);
		
			JSON_VALUE * curr_value;
			for(i=0;i<(int)(elem_attr->attr);i++) 
			{
				if(i==0)
					curr_value=get_first_json_child(json_node);
				else
					curr_value=get_next_json_child(json_node);
				if(curr_value==NULL)
					break;
				if(curr_value->value_type!=JSON_ELEM_STRING)
					return -EINVAL;
				radix64_to_bin(addr+i*elem_attr->size,bin_to_radix64_len(elem_attr->size),json_node->value_str);
			}
				
		}

		break;
	case OS210_TYPE_VSTRING:
		if(json_node->elem_type != JSON_ELEM_STRING)
			return -EINVAL;
		int_value=strlen(json_node->value_str);
		vstring = (V_String *)addr;
		vstring->length=int_value;
		if((vstring->length <0) || vstring->length> OS210_MAX_BUF)
		{
			retval=-EINVAL;	
		}
		vstring->String=kmalloc(vstring->length,GFP_KERNEL);
		if(vstring->String==NULL)
			return -ENOMEM;
		memcpy(vstring->String,json_node->value_str,vstring->length);
		retval=sizeof(V_String);
		break;
	case OS210_TYPE_ESTRING:
		if(json_node->elem_type != JSON_ELEM_STRING)
			return -EINVAL;
		{
			char * estring;
			retval=strlen(json_node->value_str);
			if(retval<0)
				retval=-EINVAL;	
			if((elem_attr->size!=0) && (retval>elem_attr->size))
				retval=-EINVAL;	
			retval++;
			estring=kmalloc(retval,GFP_KERNEL);
			if(estring==NULL)
				return -ENOMEM;
			memcpy(estring,json_node->value_str,retval);
			*(char **)addr=estring;
			retval=sizeof(char *);
		}
		break;

	case OS210_TYPE_DEFINE:
		if(json_node->elem_type != JSON_ELEM_STRING)
			return -EINVAL;
		elem_define=(TEMPLATE_ELEM *)(elem_template->elem_var);
		retval=elem_attr->size*(*(int*)(elem_define->elem_var));
		if(retval!=radix64_to_bin(addr,strlen(json_node->value_str),json_node->value_str))
			return -EINVAL;
		break;
	case OS210_TYPE_DEFSTR:
		if(json_node->elem_type != JSON_ELEM_STRING)
			return -EINVAL;
		elem_define=(TEMPLATE_ELEM *)(elem_template->elem_var);
		retval=elem_attr->size*(*(int*)(elem_define->elem_var));
		{
			char * estring;
			retval++;
			estring=kmalloc(retval,GFP_KERNEL);
			if(estring==NULL)
				return -ENOMEM;
			memcpy(estring,json_node->value_str,retval);
			*(char **)addr=estring;
		}
		retval=sizeof(char *);
		break;
		
	case OS210_TYPE_DEFSTRARRAY:
		if(json_node->elem_type != JSON_ELEM_ARRAY)
			return -EINVAL;
		elem_define=(TEMPLATE_ELEM *)(elem_template->elem_var);
		define_value=*(int *)elem_define->elem_var;
		if(define_value<0)
			return -EINVAL;
		if(define_value>32768)
			return -EINVAL;
		retval=elem_attr->size*define_value;

		{
			char * estring;
			estring=kmalloc(retval,GFP_KERNEL);
			if(estring==NULL)
			return -ENOMEM;
			memset(estring,0,retval);
		
			JSON_NODE * curr_node;
//			JSON_VALUE * curr_value;
			for(i=0;i<define_value;i++) 
			{
				if(i==0)
					curr_node=get_first_json_child(json_node);
				else
					curr_node=get_next_json_child(json_node);
				if(curr_node==NULL)
					break;
				if(curr_node->elem_type!=JSON_ELEM_STRING)
					return -EINVAL;
//				radix64_to_bin(addr+i*elem_attr->size,bin_to_radix64_len(elem_attr->size),json_node->value_str);
				strncpy(estring+i*elem_attr->size,curr_node->value_str,elem_attr->size);
			}
			*(char **)addr=estring;	
		}
		break;
	case OS210_TYPE_ORGCHAIN:
		retval= 0;
//		retval = os210_struct_size_sum(elem_attr->attr);
		break;
	case OS210_TYPE_NODATA:
	default:
		break;
	}	
 	return retval;
}