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, ×); 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