-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.cpp
More file actions
84 lines (77 loc) · 3.49 KB
/
Copy pathutils.cpp
File metadata and controls
84 lines (77 loc) · 3.49 KB
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "utils.h"
#include <fstream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <filesystem>
#include <cstring>
class SimpleSHA256 {
public:
static std::string hash_file(const std::string &filename) {
std::ifstream file(filename, std::ios::binary);
if (!file) return "";
std::ostringstream contents;
contents << file.rdbuf();
std::string data = contents.str();
return hash_string(data);
}
static std::string hash_string(const std::string &data) {
unsigned int h[8] = {
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
};
static const unsigned int k[64] = {
0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
};
auto rotr = [](unsigned int x, int n){ return (x >> n) | (x << (32-n)); };
std::vector<unsigned char> msg(data.begin(), data.end());
uint64_t bitlen = msg.size() * 8;
msg.push_back(0x80);
while ((msg.size() % 64) != 56) msg.push_back(0x00);
for (int i = 7; i >= 0; --i)
msg.push_back(static_cast<unsigned char>((bitlen >> (i*8)) & 0xff));
for (size_t offset = 0; offset < msg.size(); offset += 64) {
unsigned int w[64];
for (int i = 0; i < 16; ++i)
w[i] = (msg[offset+4*i]<<24)|(msg[offset+4*i+1]<<16)|(msg[offset+4*i+2]<<8)|(msg[offset+4*i+3]);
for (int i = 16; i < 64; ++i) {
unsigned int s0 = rotr(w[i-15],7)^rotr(w[i-15],18)^(w[i-15]>>3);
unsigned int s1 = rotr(w[i-2],17)^rotr(w[i-2],19)^(w[i-2]>>10);
w[i] = w[i-16]+s0+w[i-7]+s1;
}
unsigned int a=h[0],b=h[1],c=h[2],d=h[3],e=h[4],f=h[5],g=h[6],hh=h[7];
for (int i=0;i<64;++i){
unsigned int S1=rotr(e,6)^rotr(e,11)^rotr(e,25);
unsigned int ch=(e&f)^(~e&g);
unsigned int temp1=hh+S1+ch+k[i]+w[i];
unsigned int S0=rotr(a,2)^rotr(a,13)^rotr(a,22);
unsigned int maj=(a&b)^(a&c)^(b&c);
unsigned int temp2=S0+maj;
hh=g; g=f; f=e; e=d+temp1; d=c; c=b; b=a; a=temp1+temp2;
}
h[0]+=a; h[1]+=b; h[2]+=c; h[3]+=d;
h[4]+=e; h[5]+=f; h[6]+=g; h[7]+=hh;
}
std::ostringstream out;
for (int i=0;i<8;++i)
out<<std::hex<<std::setw(8)<<std::setfill('0')<<h[i];
return out.str();
}
};
std::string sha256_of_file(const std::string &path) {
return SimpleSHA256::hash_file(path);
}
std::string time_to_string(std::time_t t) {
char buf[64];
std::tm tm;
localtime_s(&tm, &t);
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm);
return std::string(buf);
}