11c1b0f19Sopenharmony_ci/*
21c1b0f19Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
31c1b0f19Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
41c1b0f19Sopenharmony_ci * you may not use this file except in compliance with the License.
51c1b0f19Sopenharmony_ci * You may obtain a copy of the License at
61c1b0f19Sopenharmony_ci *
71c1b0f19Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
81c1b0f19Sopenharmony_ci *
91c1b0f19Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
101c1b0f19Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
111c1b0f19Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121c1b0f19Sopenharmony_ci * See the License for the specific language governing permissions and
131c1b0f19Sopenharmony_ci * limitations under the License.
141c1b0f19Sopenharmony_ci */
151c1b0f19Sopenharmony_ci
161c1b0f19Sopenharmony_ci#include "anonymous_string.h"
171c1b0f19Sopenharmony_ci
181c1b0f19Sopenharmony_ci#include <cstddef>
191c1b0f19Sopenharmony_ci#include <iomanip>
201c1b0f19Sopenharmony_ci#include <random>
211c1b0f19Sopenharmony_ci#include <string>
221c1b0f19Sopenharmony_ci#include <sstream>
231c1b0f19Sopenharmony_ci
241c1b0f19Sopenharmony_ci#include "securec.h"
251c1b0f19Sopenharmony_ci
261c1b0f19Sopenharmony_cinamespace OHOS {
271c1b0f19Sopenharmony_cinamespace DistributedHardware {
281c1b0f19Sopenharmony_ciconstexpr int32_t WORD_WIDTH_8 = 8;
291c1b0f19Sopenharmony_ciconstexpr int32_t WORD_WIDTH_4 = 4;
301c1b0f19Sopenharmony_ci
311c1b0f19Sopenharmony_cistd::string GetRandomID()
321c1b0f19Sopenharmony_ci{
331c1b0f19Sopenharmony_ci    static std::random_device rd;
341c1b0f19Sopenharmony_ci    static std::uniform_int_distribution<uint64_t> dist(0ULL, 0xFFFFFFFFFFFFFFFFULL);
351c1b0f19Sopenharmony_ci    uint64_t ab = dist(rd);
361c1b0f19Sopenharmony_ci    uint64_t cd = dist(rd);
371c1b0f19Sopenharmony_ci    uint32_t a, b, c, d;
381c1b0f19Sopenharmony_ci    std::stringstream ss;
391c1b0f19Sopenharmony_ci    ab = (ab & 0xFFFFFFFFFFFF0FFFULL) | 0x0000000000004000ULL;
401c1b0f19Sopenharmony_ci    cd = (cd & 0x3FFFFFFFFFFFFFFFULL) | 0x8000000000000000ULL;
411c1b0f19Sopenharmony_ci    a = (ab >> 32U);
421c1b0f19Sopenharmony_ci    b = (ab & 0xFFFFFFFFU);
431c1b0f19Sopenharmony_ci    c = (cd >> 32U);
441c1b0f19Sopenharmony_ci    d = (cd & 0xFFFFFFFFU);
451c1b0f19Sopenharmony_ci    ss << std::hex << std::nouppercase << std::setfill('0');
461c1b0f19Sopenharmony_ci    ss << std::setw(WORD_WIDTH_8) << (a);
471c1b0f19Sopenharmony_ci    ss << std::setw(WORD_WIDTH_4) << (b >> 16U);
481c1b0f19Sopenharmony_ci    ss << std::setw(WORD_WIDTH_4) << (b & 0xFFFFU);
491c1b0f19Sopenharmony_ci    ss << std::setw(WORD_WIDTH_4) << (c >> 16U);
501c1b0f19Sopenharmony_ci    ss << std::setw(WORD_WIDTH_4) << (c & 0xFFFFU);
511c1b0f19Sopenharmony_ci    ss << std::setw(WORD_WIDTH_8) << d;
521c1b0f19Sopenharmony_ci
531c1b0f19Sopenharmony_ci    return ss.str();
541c1b0f19Sopenharmony_ci}
551c1b0f19Sopenharmony_ci
561c1b0f19Sopenharmony_cistd::string GetAnonyString(const std::string &value)
571c1b0f19Sopenharmony_ci{
581c1b0f19Sopenharmony_ci    constexpr size_t INT32_SHORT_ID_LENGTH = 20;
591c1b0f19Sopenharmony_ci    constexpr size_t INT32_PLAINTEXT_LENGTH = 4;
601c1b0f19Sopenharmony_ci    constexpr size_t INT32_MIN_ID_LENGTH = 3;
611c1b0f19Sopenharmony_ci    std::string res;
621c1b0f19Sopenharmony_ci    std::string tmpStr("******");
631c1b0f19Sopenharmony_ci    size_t strLen = value.length();
641c1b0f19Sopenharmony_ci    if (strLen < INT32_MIN_ID_LENGTH) {
651c1b0f19Sopenharmony_ci        return tmpStr;
661c1b0f19Sopenharmony_ci    }
671c1b0f19Sopenharmony_ci
681c1b0f19Sopenharmony_ci    if (strLen <= INT32_SHORT_ID_LENGTH) {
691c1b0f19Sopenharmony_ci        res += value[0];
701c1b0f19Sopenharmony_ci        res += tmpStr;
711c1b0f19Sopenharmony_ci        res += value[strLen - 1];
721c1b0f19Sopenharmony_ci    } else {
731c1b0f19Sopenharmony_ci        res.append(value, 0, INT32_PLAINTEXT_LENGTH);
741c1b0f19Sopenharmony_ci        res += tmpStr;
751c1b0f19Sopenharmony_ci        res.append(value, strLen - INT32_PLAINTEXT_LENGTH, INT32_PLAINTEXT_LENGTH);
761c1b0f19Sopenharmony_ci    }
771c1b0f19Sopenharmony_ci
781c1b0f19Sopenharmony_ci    return res;
791c1b0f19Sopenharmony_ci}
801c1b0f19Sopenharmony_ci
811c1b0f19Sopenharmony_cistd::string GetAnonyInt32(const int32_t value)
821c1b0f19Sopenharmony_ci{
831c1b0f19Sopenharmony_ci    constexpr int32_t INT32_STRING_LENGTH = 40;
841c1b0f19Sopenharmony_ci    char tempBuffer[INT32_STRING_LENGTH] = "";
851c1b0f19Sopenharmony_ci    int32_t secRet = sprintf_s(tempBuffer, INT32_STRING_LENGTH, "%d", value);
861c1b0f19Sopenharmony_ci    if (secRet <= 0) {
871c1b0f19Sopenharmony_ci        std::string nullString("");
881c1b0f19Sopenharmony_ci        return nullString;
891c1b0f19Sopenharmony_ci    }
901c1b0f19Sopenharmony_ci    size_t length = strlen(tempBuffer);
911c1b0f19Sopenharmony_ci    for (size_t i = 1; i <= length - 1; i++) {
921c1b0f19Sopenharmony_ci        tempBuffer[i] = '*';
931c1b0f19Sopenharmony_ci    }
941c1b0f19Sopenharmony_ci    if (length == 0x01) {
951c1b0f19Sopenharmony_ci        tempBuffer[0] = '*';
961c1b0f19Sopenharmony_ci    }
971c1b0f19Sopenharmony_ci
981c1b0f19Sopenharmony_ci    std::string tempString(tempBuffer);
991c1b0f19Sopenharmony_ci    return tempString;
1001c1b0f19Sopenharmony_ci}
1011c1b0f19Sopenharmony_ci} // namespace DistributedHardware
1021c1b0f19Sopenharmony_ci} // namespace OHOS
103