1bc2ed2b3Sopenharmony_ci/*
2bc2ed2b3Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd.
3bc2ed2b3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4bc2ed2b3Sopenharmony_ci * you may not use this file except in compliance with the License.
5bc2ed2b3Sopenharmony_ci * You may obtain a copy of the License at
6bc2ed2b3Sopenharmony_ci *
7bc2ed2b3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8bc2ed2b3Sopenharmony_ci *
9bc2ed2b3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10bc2ed2b3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11bc2ed2b3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12bc2ed2b3Sopenharmony_ci * See the License for the specific language governing permissions and
13bc2ed2b3Sopenharmony_ci * limitations under the License.
14bc2ed2b3Sopenharmony_ci */
15bc2ed2b3Sopenharmony_ci#include "nfc_sdk_common.h"
16bc2ed2b3Sopenharmony_ci
17bc2ed2b3Sopenharmony_ci#include <algorithm>
18bc2ed2b3Sopenharmony_ci#include <sstream>
19bc2ed2b3Sopenharmony_ci#include <securec.h>
20bc2ed2b3Sopenharmony_ci#include <sys/time.h>
21bc2ed2b3Sopenharmony_ci
22bc2ed2b3Sopenharmony_ci#include "loghelper.h"
23bc2ed2b3Sopenharmony_ci
24bc2ed2b3Sopenharmony_cinamespace OHOS {
25bc2ed2b3Sopenharmony_cinamespace NFC {
26bc2ed2b3Sopenharmony_cinamespace KITS {
27bc2ed2b3Sopenharmony_ci
28bc2ed2b3Sopenharmony_cibool NfcSdkCommon::IsLittleEndian()
29bc2ed2b3Sopenharmony_ci{
30bc2ed2b3Sopenharmony_ci    const char LAST_DATA_BYTE = 0x78;
31bc2ed2b3Sopenharmony_ci    union CheckData {
32bc2ed2b3Sopenharmony_ci        int x;
33bc2ed2b3Sopenharmony_ci        char y;
34bc2ed2b3Sopenharmony_ci    };
35bc2ed2b3Sopenharmony_ci
36bc2ed2b3Sopenharmony_ci    union CheckData data;
37bc2ed2b3Sopenharmony_ci    data.x = 0x12345678;
38bc2ed2b3Sopenharmony_ci    if (data.y == LAST_DATA_BYTE) {
39bc2ed2b3Sopenharmony_ci        return true;
40bc2ed2b3Sopenharmony_ci    }
41bc2ed2b3Sopenharmony_ci    return false;
42bc2ed2b3Sopenharmony_ci}
43bc2ed2b3Sopenharmony_ci
44bc2ed2b3Sopenharmony_cistd::string NfcSdkCommon::BytesVecToHexString(const unsigned char* src, uint32_t length)
45bc2ed2b3Sopenharmony_ci{
46bc2ed2b3Sopenharmony_ci    std::string result = "";
47bc2ed2b3Sopenharmony_ci    if (length <= 0) {
48bc2ed2b3Sopenharmony_ci        return result;
49bc2ed2b3Sopenharmony_ci    }
50bc2ed2b3Sopenharmony_ci    const std::string hexKeys = "0123456789ABCDEF";
51bc2ed2b3Sopenharmony_ci    for (uint32_t i = 0; i < length; i++) {
52bc2ed2b3Sopenharmony_ci        result.push_back(hexKeys[(src[i] & 0xF0) >> HALF_BYTE_BITS]);
53bc2ed2b3Sopenharmony_ci        result.push_back(hexKeys[src[i] & 0x0F]);
54bc2ed2b3Sopenharmony_ci    }
55bc2ed2b3Sopenharmony_ci    return result;
56bc2ed2b3Sopenharmony_ci}
57bc2ed2b3Sopenharmony_ci
58bc2ed2b3Sopenharmony_cistd::string NfcSdkCommon::UnsignedCharToHexString(const unsigned char src)
59bc2ed2b3Sopenharmony_ci{
60bc2ed2b3Sopenharmony_ci    std::string result = "";
61bc2ed2b3Sopenharmony_ci    const std::string hexKeys = "0123456789ABCDEF";
62bc2ed2b3Sopenharmony_ci    result.push_back(hexKeys[(src & 0xF0) >> HALF_BYTE_BITS]);
63bc2ed2b3Sopenharmony_ci    result.push_back(hexKeys[src & 0x0F]);
64bc2ed2b3Sopenharmony_ci    return result;
65bc2ed2b3Sopenharmony_ci}
66bc2ed2b3Sopenharmony_ci
67bc2ed2b3Sopenharmony_civoid NfcSdkCommon::HexStringToBytes(const std::string &src, std::vector<unsigned char> &bytes)
68bc2ed2b3Sopenharmony_ci{
69bc2ed2b3Sopenharmony_ci    if (src.empty()) {
70bc2ed2b3Sopenharmony_ci        return;
71bc2ed2b3Sopenharmony_ci    }
72bc2ed2b3Sopenharmony_ci
73bc2ed2b3Sopenharmony_ci    uint32_t bytesLen = src.length() / HEX_BYTE_LEN;
74bc2ed2b3Sopenharmony_ci    std::string strByte;
75bc2ed2b3Sopenharmony_ci    unsigned int srcIntValue;
76bc2ed2b3Sopenharmony_ci    for (uint32_t i = 0; i < bytesLen; i++) {
77bc2ed2b3Sopenharmony_ci        strByte = src.substr(i * HEX_BYTE_LEN, HEX_BYTE_LEN);
78bc2ed2b3Sopenharmony_ci        if (sscanf_s(strByte.c_str(), "%x", &srcIntValue) <= 0) {
79bc2ed2b3Sopenharmony_ci            ErrorLog("HexStringToBytes, sscanf_s failed.");
80bc2ed2b3Sopenharmony_ci            bytes.clear();
81bc2ed2b3Sopenharmony_ci            return;
82bc2ed2b3Sopenharmony_ci        }
83bc2ed2b3Sopenharmony_ci        bytes.push_back(static_cast<unsigned char>(srcIntValue & 0xFF));
84bc2ed2b3Sopenharmony_ci    }
85bc2ed2b3Sopenharmony_ci}
86bc2ed2b3Sopenharmony_ci
87bc2ed2b3Sopenharmony_ciuint32_t NfcSdkCommon::GetHexStrBytesLen(const std::string src)
88bc2ed2b3Sopenharmony_ci{
89bc2ed2b3Sopenharmony_ci    // 2 charactors consist of one byte.
90bc2ed2b3Sopenharmony_ci    if (src.empty()) {
91bc2ed2b3Sopenharmony_ci        return 0;
92bc2ed2b3Sopenharmony_ci    }
93bc2ed2b3Sopenharmony_ci    uint32_t length = src.length();
94bc2ed2b3Sopenharmony_ci    if (length % HEX_BYTE_LEN == 0) {
95bc2ed2b3Sopenharmony_ci        return (length / HEX_BYTE_LEN);
96bc2ed2b3Sopenharmony_ci    } else {
97bc2ed2b3Sopenharmony_ci        return ((length / HEX_BYTE_LEN) + 1);
98bc2ed2b3Sopenharmony_ci    }
99bc2ed2b3Sopenharmony_ci}
100bc2ed2b3Sopenharmony_ci
101bc2ed2b3Sopenharmony_ciunsigned char NfcSdkCommon::GetByteFromHexStr(const std::string src, uint32_t index)
102bc2ed2b3Sopenharmony_ci{
103bc2ed2b3Sopenharmony_ci    // 2 charactors consist of one byte.
104bc2ed2b3Sopenharmony_ci    if (src.empty() || (src.length() < index * HEX_BYTE_LEN + HEX_BYTE_LEN)) {
105bc2ed2b3Sopenharmony_ci        ErrorLog("GetByteFromHexStr, src length error.");
106bc2ed2b3Sopenharmony_ci        return 0;
107bc2ed2b3Sopenharmony_ci    }
108bc2ed2b3Sopenharmony_ci    std::string strByte = src.substr(index * HEX_BYTE_LEN, HEX_BYTE_LEN);
109bc2ed2b3Sopenharmony_ci    unsigned int srcIntValue;
110bc2ed2b3Sopenharmony_ci    if (sscanf_s(strByte.c_str(), "%x", &srcIntValue) <= 0) {
111bc2ed2b3Sopenharmony_ci        ErrorLog("GetByteFromHexStr, sscanf_s failed.");
112bc2ed2b3Sopenharmony_ci        return 0;
113bc2ed2b3Sopenharmony_ci    }
114bc2ed2b3Sopenharmony_ci    return static_cast<unsigned char>(srcIntValue & 0xFF);
115bc2ed2b3Sopenharmony_ci}
116bc2ed2b3Sopenharmony_ci
117bc2ed2b3Sopenharmony_ciuint32_t NfcSdkCommon::StringToInt(std::string src, bool bLittleEndian)
118bc2ed2b3Sopenharmony_ci{
119bc2ed2b3Sopenharmony_ci    uint32_t value = 0;
120bc2ed2b3Sopenharmony_ci    if (bLittleEndian) {
121bc2ed2b3Sopenharmony_ci        for (size_t i = SHIFT_TIME; i > 0; i--) {
122bc2ed2b3Sopenharmony_ci            value += static_cast<uint32_t>((src.at(SHIFT_TIME - i)) << (i * SHIFT_SIZE - SHIFT_SIZE));
123bc2ed2b3Sopenharmony_ci        }
124bc2ed2b3Sopenharmony_ci    } else {
125bc2ed2b3Sopenharmony_ci        for (size_t i = 0; i < SHIFT_TIME; i++) {
126bc2ed2b3Sopenharmony_ci            value += static_cast<uint32_t>((src.at(i)) << (i * SHIFT_SIZE));
127bc2ed2b3Sopenharmony_ci        }
128bc2ed2b3Sopenharmony_ci    }
129bc2ed2b3Sopenharmony_ci    return value;
130bc2ed2b3Sopenharmony_ci}
131bc2ed2b3Sopenharmony_ci
132bc2ed2b3Sopenharmony_cistd::string NfcSdkCommon::IntToHexString(uint32_t num)
133bc2ed2b3Sopenharmony_ci{
134bc2ed2b3Sopenharmony_ci    std::stringstream ss;
135bc2ed2b3Sopenharmony_ci    ss << std::hex << num;
136bc2ed2b3Sopenharmony_ci    std::string result = ss.str();
137bc2ed2b3Sopenharmony_ci    transform(result.begin(), result.end(), result.begin(), ::toupper);
138bc2ed2b3Sopenharmony_ci    if (result.length() % HEX_BYTE_LEN > 0) { // expend "0" if string length is odd
139bc2ed2b3Sopenharmony_ci        result = "0" + result;
140bc2ed2b3Sopenharmony_ci    }
141bc2ed2b3Sopenharmony_ci    return result;
142bc2ed2b3Sopenharmony_ci}
143bc2ed2b3Sopenharmony_ci
144bc2ed2b3Sopenharmony_civoid NfcSdkCommon::StringToAsciiBytes(const std::string &src, std::vector<unsigned char> &bytes)
145bc2ed2b3Sopenharmony_ci{
146bc2ed2b3Sopenharmony_ci    if (src.empty()) {
147bc2ed2b3Sopenharmony_ci        return;
148bc2ed2b3Sopenharmony_ci    }
149bc2ed2b3Sopenharmony_ci    uint32_t bytesLen = src.length();
150bc2ed2b3Sopenharmony_ci    for (uint32_t i = 0; i < bytesLen; i++) {
151bc2ed2b3Sopenharmony_ci        unsigned int srcAsciiIntVal = static_cast<unsigned int>(src[i]);
152bc2ed2b3Sopenharmony_ci        bytes.push_back(static_cast<unsigned char>(srcAsciiIntVal & 0xFF));
153bc2ed2b3Sopenharmony_ci    }
154bc2ed2b3Sopenharmony_ci}
155bc2ed2b3Sopenharmony_ci
156bc2ed2b3Sopenharmony_cistd::string NfcSdkCommon::StringToHexString(const std::string &src)
157bc2ed2b3Sopenharmony_ci{
158bc2ed2b3Sopenharmony_ci    std::vector<unsigned char> bytes;
159bc2ed2b3Sopenharmony_ci    StringToAsciiBytes(src, bytes);
160bc2ed2b3Sopenharmony_ci    uint32_t len = src.length();
161bc2ed2b3Sopenharmony_ci    std::string result = BytesVecToHexString(&bytes[0], len);
162bc2ed2b3Sopenharmony_ci    return result;
163bc2ed2b3Sopenharmony_ci}
164bc2ed2b3Sopenharmony_ci
165bc2ed2b3Sopenharmony_cistd::string NfcSdkCommon::HexStringToAsciiString(const std::string &src)
166bc2ed2b3Sopenharmony_ci{
167bc2ed2b3Sopenharmony_ci    if (src.size() % HEX_BYTE_LEN != 0 || src.empty()) {  // 2 is Even number judgement
168bc2ed2b3Sopenharmony_ci        ErrorLog("HexStringToAsciiString length error");
169bc2ed2b3Sopenharmony_ci        return "";
170bc2ed2b3Sopenharmony_ci    }
171bc2ed2b3Sopenharmony_ci    std::string result = "";
172bc2ed2b3Sopenharmony_ci    for (size_t i = 0; i < src.size() / HEX_BYTE_LEN; i++) {
173bc2ed2b3Sopenharmony_ci        unsigned char byteVal = GetByteFromHexStr(src, i);
174bc2ed2b3Sopenharmony_ci        const char minPrintChar = ' ';
175bc2ed2b3Sopenharmony_ci        const char maxPrintChar = '~';
176bc2ed2b3Sopenharmony_ci        /* ' ' to '~' is the printable char range */
177bc2ed2b3Sopenharmony_ci        if (static_cast<char>(byteVal) < minPrintChar || static_cast<char>(byteVal) > maxPrintChar) {
178bc2ed2b3Sopenharmony_ci            return "";
179bc2ed2b3Sopenharmony_ci        }
180bc2ed2b3Sopenharmony_ci        result.push_back(static_cast<char>(byteVal));
181bc2ed2b3Sopenharmony_ci    }
182bc2ed2b3Sopenharmony_ci    return result;
183bc2ed2b3Sopenharmony_ci}
184bc2ed2b3Sopenharmony_ci
185bc2ed2b3Sopenharmony_ci/*
186bc2ed2b3Sopenharmony_ci * transfer Hex array to String without checking Ascii validation, compatible with Chinese characters
187bc2ed2b3Sopenharmony_ci */
188bc2ed2b3Sopenharmony_cistd::string NfcSdkCommon::HexArrayToStringWithoutChecking(const std::string &src)
189bc2ed2b3Sopenharmony_ci{
190bc2ed2b3Sopenharmony_ci    if (src.size() % HEX_BYTE_LEN != 0 || src.empty()) {  // 2 is Even number judgement
191bc2ed2b3Sopenharmony_ci        ErrorLog("HexStringToAsciiString length error");
192bc2ed2b3Sopenharmony_ci        return "";
193bc2ed2b3Sopenharmony_ci    }
194bc2ed2b3Sopenharmony_ci    std::string result = "";
195bc2ed2b3Sopenharmony_ci    for (size_t i = 0; i < src.size() / HEX_BYTE_LEN; i++) {
196bc2ed2b3Sopenharmony_ci        unsigned char byteVal = GetByteFromHexStr(src, i);
197bc2ed2b3Sopenharmony_ci        result.push_back(static_cast<char>(byteVal));
198bc2ed2b3Sopenharmony_ci    }
199bc2ed2b3Sopenharmony_ci    return result;
200bc2ed2b3Sopenharmony_ci}
201bc2ed2b3Sopenharmony_ci
202bc2ed2b3Sopenharmony_ciuint64_t NfcSdkCommon::GetCurrentTime()
203bc2ed2b3Sopenharmony_ci{
204bc2ed2b3Sopenharmony_ci    // get the time since 1970/1/1
205bc2ed2b3Sopenharmony_ci    constexpr int timeRate = 1000;
206bc2ed2b3Sopenharmony_ci    struct timeval time = {0};
207bc2ed2b3Sopenharmony_ci    gettimeofday(&time, nullptr);
208bc2ed2b3Sopenharmony_ci    return static_cast<uint64_t>(time.tv_sec * timeRate + time.tv_usec / timeRate);
209bc2ed2b3Sopenharmony_ci}
210bc2ed2b3Sopenharmony_ci
211bc2ed2b3Sopenharmony_ciuint64_t NfcSdkCommon::GetRelativeTime()
212bc2ed2b3Sopenharmony_ci{
213bc2ed2b3Sopenharmony_ci    // get the time since the system was booted
214bc2ed2b3Sopenharmony_ci    constexpr int64_t msPerSecond = 1000;
215bc2ed2b3Sopenharmony_ci    constexpr int64_t nsPerMs = 1000000;
216bc2ed2b3Sopenharmony_ci
217bc2ed2b3Sopenharmony_ci    struct timespec times = {0};
218bc2ed2b3Sopenharmony_ci    clock_gettime(CLOCK_MONOTONIC, &times);
219bc2ed2b3Sopenharmony_ci    return ((times.tv_sec * msPerSecond) + (times.tv_nsec / nsPerMs));
220bc2ed2b3Sopenharmony_ci}
221bc2ed2b3Sopenharmony_ci
222bc2ed2b3Sopenharmony_cistd::string NfcSdkCommon::CodeMiddlePart(const std::string &src)
223bc2ed2b3Sopenharmony_ci{
224bc2ed2b3Sopenharmony_ci    std::string res = "";
225bc2ed2b3Sopenharmony_ci    if (src.empty()) {
226bc2ed2b3Sopenharmony_ci        return res;
227bc2ed2b3Sopenharmony_ci    }
228bc2ed2b3Sopenharmony_ci    const char code = 'X';
229bc2ed2b3Sopenharmony_ci    const uint32_t maxStrLen = 1024;
230bc2ed2b3Sopenharmony_ci    uint32_t len = src.length();
231bc2ed2b3Sopenharmony_ci    if (len > maxStrLen) {
232bc2ed2b3Sopenharmony_ci        return res;
233bc2ed2b3Sopenharmony_ci    }
234bc2ed2b3Sopenharmony_ci
235bc2ed2b3Sopenharmony_ci    uint32_t head = (len / 2) / 2; // Divide the string evenly into 2 * 2 parts
236bc2ed2b3Sopenharmony_ci    if (len <= head * 2) {  // The length of the head * 2 is greater than src
237bc2ed2b3Sopenharmony_ci        return src;
238bc2ed2b3Sopenharmony_ci    }
239bc2ed2b3Sopenharmony_ci    for (uint32_t i = 0; i < head; i++) {
240bc2ed2b3Sopenharmony_ci        res.push_back(src[i]);
241bc2ed2b3Sopenharmony_ci    }
242bc2ed2b3Sopenharmony_ci    for (uint32_t i = head; i < (len - head); i++) {
243bc2ed2b3Sopenharmony_ci        res.push_back(code);
244bc2ed2b3Sopenharmony_ci    }
245bc2ed2b3Sopenharmony_ci    for (uint32_t i = (len - head); i < len; i++) {
246bc2ed2b3Sopenharmony_ci        res.push_back(src[i]);
247bc2ed2b3Sopenharmony_ci    }
248bc2ed2b3Sopenharmony_ci    return res;
249bc2ed2b3Sopenharmony_ci}
250bc2ed2b3Sopenharmony_ci}  // namespace KITS
251bc2ed2b3Sopenharmony_ci}  // namespace NFC
252bc2ed2b3Sopenharmony_ci}  // namespace OHOS
253