blob: 4a072e3fc286f1df3fd0abbc757d800f2cc6ad0a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#include "coding/sha1.hpp"
#include "coding/internal/file_data.hpp"
#include "coding/file_reader.hpp"
#include "base/assert.hpp"
#include "base/logging.hpp"
#include "base/macros.hpp"
#include "3party/liboauthcpp/src/SHA1.h"
#include "3party/liboauthcpp/src/base64.h"
#include <algorithm>
namespace coding
{
// static
SHA1::Hash SHA1::Calculate(std::string const & filePath)
{
uint32_t constexpr kFileBufferSize = 8192;
try
{
my::FileData file(filePath, my::FileData::OP_READ);
uint64_t const fileSize = file.Size();
CSHA1 sha1;
uint64_t currSize = 0;
unsigned char buffer[kFileBufferSize];
while (currSize < fileSize)
{
auto const toRead = std::min(kFileBufferSize, static_cast<uint32_t>(fileSize - currSize));
file.Read(currSize, buffer, toRead);
sha1.Update(buffer, toRead);
currSize += toRead;
}
sha1.Final();
Hash result;
ASSERT_EQUAL(result.size(), ARRAY_SIZE(sha1.m_digest), ());
std::copy(std::begin(sha1.m_digest), std::end(sha1.m_digest), std::begin(result));
return result;
}
catch (Reader::Exception const & ex)
{
LOG(LERROR, ("Error reading file:", filePath, ex.what()));
}
return {};
}
// static
std::string SHA1::CalculateBase64(std::string const & filePath)
{
auto sha1 = Calculate(filePath);
return base64_encode(sha1.data(), sha1.size());
}
} // coding
|