Coverage Report

Created: 2026-01-17 06:31

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/qpdf/libqpdf/Pl_SHA2.cc
Line
Count
Source
1
#include <qpdf/Pl_SHA2.hh>
2
3
#include <qpdf/QPDFCryptoProvider.hh>
4
#include <qpdf/QUtil.hh>
5
#include <qpdf/Util.hh>
6
7
using namespace qpdf;
8
9
Pl_SHA2::Pl_SHA2(int bits, Pipeline* next) :
10
138k
    Pipeline("sha2", next)
11
138k
{
12
138k
    if (bits) {
13
138k
        resetBits(bits);
14
138k
    }
15
138k
}
16
17
void
18
Pl_SHA2::write(unsigned char const* buf, size_t len)
19
142k
{
20
142k
    if (!in_progress) {
21
138k
        in_progress = true;
22
138k
    }
23
24
    // Write in chunks in case len is too big to fit in an int. Assume int is at least 32 bits.
25
142k
    static size_t const max_bytes = 1 << 30;
26
142k
    size_t bytes_left = len;
27
142k
    unsigned char const* data = buf;
28
280k
    while (bytes_left > 0) {
29
138k
        size_t bytes = (bytes_left >= max_bytes ? max_bytes : bytes_left);
30
138k
        crypto->SHA2_update(data, bytes);
31
138k
        bytes_left -= bytes;
32
138k
        data += bytes;
33
138k
    }
34
35
142k
    if (next()) {
36
0
        next()->write(buf, len);
37
0
    }
38
142k
}
39
40
void
41
Pl_SHA2::finish()
42
138k
{
43
138k
    if (next()) {
44
0
        next()->finish();
45
0
    }
46
138k
    crypto->SHA2_finalize();
47
138k
    in_progress = false;
48
138k
}
49
50
void
51
Pl_SHA2::resetBits(int bits)
52
138k
{
53
138k
    util::assertion(!in_progress, "bit reset requested for in-progress SHA2 Pipeline");
54
138k
    crypto = QPDFCryptoProvider::getImpl();
55
138k
    crypto->SHA2_init(bits);
56
138k
}
57
58
std::string
59
Pl_SHA2::getRawDigest()
60
138k
{
61
138k
    util::assertion(!in_progress, "digest requested for in-progress SHA2 Pipeline");
62
138k
    return crypto->SHA2_digest();
63
138k
}
64
65
std::string
66
Pl_SHA2::getHexDigest()
67
0
{
68
0
    util::assertion(!in_progress, "digest requested for in-progress SHA2 Pipeline");
69
0
    return QUtil::hex_encode(getRawDigest());
70
0
}