std::string AlibabaCloud::PDS::ComputeContentSha1()

in sdk/src/utils/Utils.cc [387:445]


std::string AlibabaCloud::PDS::ComputeContentSha1(std::istream& stream, ProgressControl progressControl)
{
    auto ctx = EVP_MD_CTX_create();

    unsigned char md_value[EVP_MAX_MD_SIZE];
    unsigned int md_len = 0;

    EVP_MD_CTX_init(ctx);
#ifndef OPENSSL_IS_BORINGSSL
    EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
#endif
    EVP_DigestInit_ex(ctx, EVP_sha1(), nullptr);

    auto currentPos = stream.tellg();
    if (currentPos == static_cast<std::streampos>(-1)) {
        currentPos = 0;
        stream.clear();
    }
    stream.seekg(0, stream.beg);

    char streamBuffer[2048];
    uint64_t count = 0;
    while (stream.good())
    {
        count++;
        // 10MB check once
        if (count == 5120) {
            if (progressControl.Handler) {
                if (progressControl.Handler(progressControl.UserData) != 0) {
                    EVP_MD_CTX_destroy(ctx);
                    stream.clear();
                    stream.seekg(currentPos, stream.beg);
                    return "";
                }
            }
            count = 0;
        }

        stream.read(streamBuffer, 2048);
        auto bytesRead = stream.gcount();

        if (bytesRead > 0)
        {
            EVP_DigestUpdate(ctx, streamBuffer, static_cast<size_t>(bytesRead));
        }
    }

    EVP_DigestFinal_ex(ctx, md_value, &md_len);
    EVP_MD_CTX_destroy(ctx);
    stream.clear();
    stream.seekg(currentPos, stream.beg);

    std::ostringstream sout;
    sout<<std::hex<<std::setfill('0');
    for(unsigned int idx = 0; idx < md_len; idx++)
        sout<<std::setw(2)<<(int)md_value[idx];

    return sout.str();
}