17310c0d0Sopenharmony_ci/* 27310c0d0Sopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 37310c0d0Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 47310c0d0Sopenharmony_ci * you may not use this file except in compliance with the License. 57310c0d0Sopenharmony_ci * You may obtain a copy of the License at 67310c0d0Sopenharmony_ci * 77310c0d0Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 87310c0d0Sopenharmony_ci * 97310c0d0Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 107310c0d0Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 117310c0d0Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 127310c0d0Sopenharmony_ci * See the License for the specific language governing permissions and 137310c0d0Sopenharmony_ci * limitations under the License. 147310c0d0Sopenharmony_ci */ 157310c0d0Sopenharmony_ci#include "hvb_util.h" 167310c0d0Sopenharmony_ci#include "hvb_types.h" 177310c0d0Sopenharmony_ci 187310c0d0Sopenharmony_cichar *hvb_bin2hex(const uint8_t *value, size_t len) 197310c0d0Sopenharmony_ci{ 207310c0d0Sopenharmony_ci const char digits[MAX_STRING_LEN] = "0123456789abcdef"; 217310c0d0Sopenharmony_ci char *hex; 227310c0d0Sopenharmony_ci size_t n; 237310c0d0Sopenharmony_ci 247310c0d0Sopenharmony_ci hex = hvb_malloc(len * 2 + 1); 257310c0d0Sopenharmony_ci if (hex == NULL) 267310c0d0Sopenharmony_ci return NULL; 277310c0d0Sopenharmony_ci 287310c0d0Sopenharmony_ci for (n = 0; n < len; n++) { 297310c0d0Sopenharmony_ci hex[n * 2] = digits[value[n] >> 4]; 307310c0d0Sopenharmony_ci hex[n * 2 + 1] = digits[value[n] & 0x0f]; 317310c0d0Sopenharmony_ci } 327310c0d0Sopenharmony_ci hex[n * 2] = '\0'; 337310c0d0Sopenharmony_ci 347310c0d0Sopenharmony_ci return hex; 357310c0d0Sopenharmony_ci} 367310c0d0Sopenharmony_ci 377310c0d0Sopenharmony_ciuint64_t hvb_uint64_to_base10(uint64_t value, char digits[HVB_MAX_DIGITS_UINT64]) 387310c0d0Sopenharmony_ci{ 397310c0d0Sopenharmony_ci char rev_digits[HVB_MAX_DIGITS_UINT64]; 407310c0d0Sopenharmony_ci uint64_t n, num_digits; 417310c0d0Sopenharmony_ci 427310c0d0Sopenharmony_ci for (num_digits = 0; num_digits < HVB_MAX_DIGITS_UINT64 - 1;) { 437310c0d0Sopenharmony_ci rev_digits[num_digits++] = hvb_div_by_10(&value) + '0'; 447310c0d0Sopenharmony_ci if (value == 0) { 457310c0d0Sopenharmony_ci break; 467310c0d0Sopenharmony_ci } 477310c0d0Sopenharmony_ci } 487310c0d0Sopenharmony_ci 497310c0d0Sopenharmony_ci for (n = 0; n < num_digits; n++) 507310c0d0Sopenharmony_ci digits[n] = rev_digits[num_digits - 1 - n]; 517310c0d0Sopenharmony_ci digits[n] = '\0'; 527310c0d0Sopenharmony_ci 537310c0d0Sopenharmony_ci return n; 547310c0d0Sopenharmony_ci} 557310c0d0Sopenharmony_ci 567310c0d0Sopenharmony_ci 577310c0d0Sopenharmony_ciuint64_t hvb_be64toh(uint64_t data) 587310c0d0Sopenharmony_ci{ 597310c0d0Sopenharmony_ci uint8_t *value = (uint8_t *)&data; 607310c0d0Sopenharmony_ci uint64_t hex; 617310c0d0Sopenharmony_ci 627310c0d0Sopenharmony_ci hex = ((uint64_t)value[0]) << 56; 637310c0d0Sopenharmony_ci hex |= ((uint64_t)value[1]) << 48; 647310c0d0Sopenharmony_ci hex |= ((uint64_t)value[2]) << 40; 657310c0d0Sopenharmony_ci hex |= ((uint64_t)value[3]) << 32; 667310c0d0Sopenharmony_ci hex |= ((uint64_t)value[4]) << 24; 677310c0d0Sopenharmony_ci hex |= ((uint64_t)value[5]) << 16; 687310c0d0Sopenharmony_ci hex |= ((uint64_t)value[6]) << 8; 697310c0d0Sopenharmony_ci hex |= ((uint64_t)value[7]); 707310c0d0Sopenharmony_ci return hex; 717310c0d0Sopenharmony_ci} 727310c0d0Sopenharmony_ci 737310c0d0Sopenharmony_ciuint64_t hvb_htobe64(uint64_t data) 747310c0d0Sopenharmony_ci{ 757310c0d0Sopenharmony_ci union { 767310c0d0Sopenharmony_ci uint64_t word; 777310c0d0Sopenharmony_ci uint8_t bytes[8]; 787310c0d0Sopenharmony_ci } ret; 797310c0d0Sopenharmony_ci 807310c0d0Sopenharmony_ci ret.bytes[0] = (data >> 56) & 0xff; 817310c0d0Sopenharmony_ci ret.bytes[1] = (data >> 48) & 0xff; 827310c0d0Sopenharmony_ci ret.bytes[2] = (data >> 40) & 0xff; 837310c0d0Sopenharmony_ci ret.bytes[3] = (data >> 32) & 0xff; 847310c0d0Sopenharmony_ci ret.bytes[4] = (data >> 24) & 0xff; 857310c0d0Sopenharmony_ci ret.bytes[5] = (data >> 16) & 0xff; 867310c0d0Sopenharmony_ci ret.bytes[6] = (data >> 8) & 0xff; 877310c0d0Sopenharmony_ci ret.bytes[7] = data & 0xff; 887310c0d0Sopenharmony_ci return ret.word; 897310c0d0Sopenharmony_ci} 907310c0d0Sopenharmony_ci 917310c0d0Sopenharmony_civoid *hvb_malloc(uint64_t size) 927310c0d0Sopenharmony_ci{ 937310c0d0Sopenharmony_ci void *ret = hvb_malloc_(size); 947310c0d0Sopenharmony_ci 957310c0d0Sopenharmony_ci if (!ret) { 967310c0d0Sopenharmony_ci hvb_print("Failed to allocate memory.\n"); 977310c0d0Sopenharmony_ci return NULL; 987310c0d0Sopenharmony_ci } 997310c0d0Sopenharmony_ci return ret; 1007310c0d0Sopenharmony_ci} 1017310c0d0Sopenharmony_ci 1027310c0d0Sopenharmony_civoid *hvb_calloc(uint64_t size) 1037310c0d0Sopenharmony_ci{ 1047310c0d0Sopenharmony_ci void *ret = hvb_malloc(size); 1057310c0d0Sopenharmony_ci 1067310c0d0Sopenharmony_ci if (!ret) 1077310c0d0Sopenharmony_ci return NULL; 1087310c0d0Sopenharmony_ci 1097310c0d0Sopenharmony_ci if (hvb_memset_s(ret, size, 0, size) != 0) { 1107310c0d0Sopenharmony_ci hvb_free(ret); 1117310c0d0Sopenharmony_ci return NULL; 1127310c0d0Sopenharmony_ci } 1137310c0d0Sopenharmony_ci 1147310c0d0Sopenharmony_ci return ret; 1157310c0d0Sopenharmony_ci} 1167310c0d0Sopenharmony_ci 1177310c0d0Sopenharmony_cichar *hvb_strdup(const char *str) 1187310c0d0Sopenharmony_ci{ 1197310c0d0Sopenharmony_ci size_t len = hvb_strlen(str); 1207310c0d0Sopenharmony_ci char *new_str = hvb_malloc(len + 1); 1217310c0d0Sopenharmony_ci 1227310c0d0Sopenharmony_ci if (!new_str) 1237310c0d0Sopenharmony_ci return NULL; 1247310c0d0Sopenharmony_ci 1257310c0d0Sopenharmony_ci hvb_memcpy(new_str, str, len); 1267310c0d0Sopenharmony_ci 1277310c0d0Sopenharmony_ci new_str[len] = '\0'; 1287310c0d0Sopenharmony_ci 1297310c0d0Sopenharmony_ci return new_str; 1307310c0d0Sopenharmony_ci} 1317310c0d0Sopenharmony_ci 1327310c0d0Sopenharmony_cienum hvb_errno check_hvb_ops(struct hvb_ops *ops) 1337310c0d0Sopenharmony_ci{ 1347310c0d0Sopenharmony_ci hvb_return_hvb_err_if_null(ops); 1357310c0d0Sopenharmony_ci hvb_return_hvb_err_if_null(ops->user_data); 1367310c0d0Sopenharmony_ci hvb_return_hvb_err_if_null(ops->read_partition); 1377310c0d0Sopenharmony_ci hvb_return_hvb_err_if_null(ops->write_partition); 1387310c0d0Sopenharmony_ci hvb_return_hvb_err_if_null(ops->valid_rvt_key); 1397310c0d0Sopenharmony_ci hvb_return_hvb_err_if_null(ops->read_rollback); 1407310c0d0Sopenharmony_ci hvb_return_hvb_err_if_null(ops->write_rollback); 1417310c0d0Sopenharmony_ci hvb_return_hvb_err_if_null(ops->read_lock_state); 1427310c0d0Sopenharmony_ci hvb_return_hvb_err_if_null(ops->get_partiton_size); 1437310c0d0Sopenharmony_ci return HVB_OK; 1447310c0d0Sopenharmony_ci}