xref: /base/startup/hvb/libhvb/src/utils/hvb_util.c (revision 7310c0d0)
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}