1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| int tckx_tcf_prepare_update_boot_measure_references( const struct boot_ref_item_user *references,int num, unsigned char *tpcm_id,int tpcm_id_length, int action, uint64_t replay_counter, struct boot_references_update **obuffer,int *olen) { int i = 0; int ret = 0; int ref_opt = 0; int name_length = 0; int item_size = 0; int hash_total_length = 0; struct boot_ref_item *ref = NULL; struct boot_references_update *ref_update = NULL; if ((num && !references) || !tpcm_id || !olen) return TCDEF_TCF_ERROR_INVALID_PARAM; if (tpcm_id_length > MAX_TPCM_ID_SIZE){ tckx_error ("tpcm_id_length is too long (%d > %d)\n", tpcm_id_length, MAX_TPCM_ID_SIZE); return TCDEF_TCF_ERROR_INPUT_EXCEEDED; } if (NULL == (ref_update = tcutils_malloc (sizeof (struct boot_references_update) + MAX_BOOT_REFERENCE_ITEM_SIZE * num))){ tckx_error ("No mem for ref update data!\n"); return TCDEF_TCF_ERROR_NO_MEMORY; } memset (ref_update, 0, sizeof (struct boot_references_update) + MAX_BOOT_REFERENCE_ITEM_SIZE * num); for (i = 0; i < num; i ++){ ref = (struct boot_ref_item *)(ref_update->data + ref_opt); if (!references[i].name || !references[i].hash){ tcutils_free (ref_update); return TCDEF_TCF_ERROR_INVALID_PARAM; } if ((references[i].hash_number < 0) || (references[i].hash_number > MAX_BOOT_HASH_VERSION_NUMBER)){ tckx_error ("Invalid hash version number: %d\n", references[i].hash_number); tcutils_free (ref_update); return TCDEF_TCF_ERROR_INVALID_PARAM; } if (references[i].hash_length != DEFAULT_HASH_SIZE){ tckx_error ("Invalid hash_length: %d\n", references[i].hash_length); tcutils_free (ref_update); return TCDEF_TCF_ERROR_INVALID_PARAM; } if (references[i].extend_size && !references[i].extend_buffer){ tckx_error ("extend_size: %d, extend_buffer: %p\n", references[i].extend_size, references[i].extend_buffer); tcutils_free (ref_update); return TCDEF_TCF_ERROR_INVALID_PARAM; } if (references[i].extend_buffer && ((references[i].extend_size <= 0) || (references[i].extend_size > MAX_BOOT_EXTERN_SIZE))){ tckx_error ("Invalid extend_size: %d\n", references[i].extend_size); tcutils_free (ref_update); return TCDEF_TCF_ERROR_INVALID_PARAM; } name_length = strlen ((const char *)references[i].name) + 1; if (name_length > MAX_PATH_LENGTH){ tckx_error ("Invalid name_length: %d\n", name_length); tcutils_free (ref_update); return TCDEF_TCF_ERROR_INVALID_PARAM; } hash_total_length = references[i].hash_length * references[i].hash_number; item_size = sizeof (struct boot_ref_item) + hash_total_length + TCUTILS_ALIGN_SIZE (references[i].extend_size + name_length, 4); if ((ref_opt + item_size) > MAX_BOOT_REFERENCE_ITEM_SIZE * num){ tckx_error ("Invalid item data\n"); tcutils_free (ref_update); return TCDEF_TCF_ERROR_INVALID_PARAM; } ref->be_hash_length = htons (references[i].hash_length); if (!is_bool_value_legal(references[i].is_enable)){ tckx_error ("Invalid item data, is_enable:%d, not in (ture,false)\n", references[i].is_enable); tcutils_free (ref_update); return TCDEF_TCF_ERROR_INVALID_PARAM; } if (!is_bool_value_legal(references[i].is_control)){ tckx_error ("Invalid item data, is_control:%d, not in (ture,false)\n", references[i].is_control); tcutils_free (ref_update); return TCDEF_TCF_ERROR_INVALID_PARAM; } ref->be_flags = htons ((references[i].is_enable << BOOT_REFERENCE_FLAG_ENABLE) | (references[i].is_control << BOOT_REFERENCE_FLAG_CONTROL)); ref->be_name_length = htons (name_length); ref->be_hash_number = htons (references[i].hash_number); if ((references[i].stage < 0) || (references[i].stage > ((1 << (sizeof(ref->be_stage)*8)) - 1))){ tckx_error ("Invalid stage : %d\n", references[i].stage); tcutils_free (ref_update); return TCDEF_TCF_ERROR_INVALID_PARAM; } ref->be_stage = htons (references[i].stage); ref->be_extend_size = htons (references[i].extend_size); memcpy (ref->data, references[i].hash, references[i].hash_length * references[i].hash_number); if (references[i].extend_buffer) memcpy (ref->data + hash_total_length, references[i].extend_buffer, references[i].extend_size); memcpy (ref->data + hash_total_length + references[i].extend_size, references[i].name, name_length); ref_opt += item_size; } ref_update->be_size = htonl (sizeof (struct boot_references_update)); ref_update->be_action = htonl (action); ref_update->be_replay_counter = htonll (replay_counter); ref_update->be_item_number = htonl (num); ref_update->be_data_length = htonl (ref_opt); memcpy (ref_update->tpcm_id, tpcm_id, tpcm_id_length); *obuffer = ref_update; *olen = sizeof (struct boot_references_update) + ref_opt; return ret; }
|