Files
security_deviceauth/frameworks/deviceauth_lite/source/json/commonutil.c
T
2022-03-17 15:04:49 +08:00

129 lines
4.3 KiB
C
Executable File

/*
* Copyright (c) 2020-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "commonutil.h"
#include "securec.h"
#include "base.h"
#include "log.h"
#include "mem_stat.h"
#include "hichain.h"
char hex_to_char(uint8_t hex)
{
/* Convert to the corresponding character, hex + 0x37 -> A-F, hex + 0x30 -> 0-9 */
return (hex > 9) ? hex + 0x37 : hex + 0x30;
}
void byte_to_hex_string(const uint8_t *hex, int32_t hex_len, uint8_t *buf, int32_t buf_len)
{
if (buf_len < hex_len * BYTE_TO_HEX_OPER_LENGTH) {
return;
}
for (int32_t i = 0; i < hex_len; i++) {
buf[i * BYTE_TO_HEX_OPER_LENGTH] = hex_to_char((hex[i] & 0xF0) >> 4); /* shift right for filling */
buf[i * BYTE_TO_HEX_OPER_LENGTH + 1] = hex_to_char(hex[i] & 0x0F); /* get low four bits */
}
}
int32_t hex_string_to_byte(const char *str, int32_t len, uint8_t *hex)
{
if (len % BYTE_TO_HEX_OPER_LENGTH) { /* even number or not */
LOGE("Length is not even number");
return HC_INPUT_ERROR;
}
int32_t hex_len = len / BYTE_TO_HEX_OPER_LENGTH; /* Halve the length */
uint8_t nibble[BYTE_TO_HEX_OPER_LENGTH]; /* create array */
for (int32_t i = 0; i < hex_len; i++) {
nibble[0] = str[i * BYTE_TO_HEX_OPER_LENGTH]; /* hex conversion */
nibble[1] = str[i * BYTE_TO_HEX_OPER_LENGTH + 1]; /* hex conversion */
for (int32_t j = 0; j < BYTE_TO_HEX_OPER_LENGTH; j++) { /* iterate through array */
if ((nibble[j] <= 'F') && (nibble[j] >= 'A')) {
nibble[j] = nibble[j] - 'A' + 10; /* decimal conversion */
} else if ((nibble[j] <= 'f') && (nibble[j] >= 'a')) {
nibble[j] = nibble[j] - 'a' + 10; /* decimal conversion */
} else if ((nibble[j] >= '0') && (nibble[j] <= '9')) {
nibble[j] = nibble[j] - '0';
} else {
LOGE("Message is invalid");
return HC_INPUT_ERROR;
}
}
hex[i] = nibble[0] << 4; /* Set the high nibble */
hex[i] |= nibble[1]; /* Set the low nibble */
}
return HC_OK;
}
void print_bytes(uint8_t *buf, int32_t buf_len)
{
int32_t tmp_data_hex_len = buf_len * BYTE_TO_HEX_OPER_LENGTH + sizeof("");
uint8_t *tmp_data_hex = (uint8_t *)MALLOC(tmp_data_hex_len);
if (tmp_data_hex == NULL) {
LOGE("Malloc failed");
return;
}
(void)memset_s(tmp_data_hex, tmp_data_hex_len, 0, tmp_data_hex_len);
byte_to_hex_string(buf, buf_len, tmp_data_hex, buf_len * BYTE_TO_HEX_OPER_LENGTH);
DBG_OUT("PrintBytes:%s", (char *)tmp_data_hex);
FREE(tmp_data_hex);
}
int32_t byte_convert(json_pobject obj, const char *field, uint8_t *hex, uint32_t *length, uint32_t max_len)
{
const char *str_json = get_json_string(obj, field);
if (str_json == NULL) {
return HC_INPUT_ERROR;
}
uint32_t len = strlen(str_json);
if ((len / BYTE_TO_HEX_OPER_LENGTH) > max_len) {
return HC_INPUT_ERROR;
}
if (hex_string_to_byte(str_json, len, hex) != HC_OK) {
return HC_INPUT_ERROR;
}
*length = len / BYTE_TO_HEX_OPER_LENGTH;
return HC_OK;
}
int32_t string_convert(json_pobject obj, const char *field, uint8_t *str, uint32_t *length, uint32_t max_len)
{
const char *str_json = get_json_string(obj, field);
if (str_json == NULL) {
return HC_INPUT_ERROR;
}
uint32_t len = strlen(str_json);
if (len > max_len) {
return HC_INPUT_ERROR;
}
if (memcpy_s(str, max_len, str_json, len) != EOK) {
return memory_copy_error(__func__, __LINE__);
}
*length = len;
return HC_OK;
}
int32_t memory_copy_error(const char *fun, unsigned int line)
{
(void)fun;
(void)line;
LOGE("memory copy error in fun:%s line:%u", fun, line);
return HC_MEMCPY_ERROR;
}