Coverage Report

Created: 2026-01-09 06:29

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
114k
    Pipeline("sha2", next)
11
114k
{
12
114k
    if (bits) {
13
114k
        resetBits(bits);
14
114k
    }
15
114k
}
16
17
void
18
Pl_SHA2::write(unsigned char const* buf, size_t len)
19
118k
{
20
118k
    if (!in_progress) {
21
114k
        in_progress = true;
22
114k
    }
23
24
    // Write in chunks in case len is too big to fit in an int. Assume int is at least 32 bits.
25
118k
    static size_t const max_bytes = 1 << 30;
26
118k
    size_t bytes_left = len;
27
118k
    unsigned char const* data = buf;
28
233k
    while (bytes_left > 0) {
29
115k
        size_t bytes = (bytes_left >= max_bytes ? max_bytes : bytes_left);
30
115k
        crypto->SHA2_update(data, bytes);
31
115k
        bytes_left -= bytes;
32
115k
        data += bytes;
33
115k
    }
34
35
118k
    if (next()) {
36
0
        next()->write(buf, len);
37
0
    }
38
118k
}
39
40
void
41
Pl_SHA2::finish()
42
114k
{
43
114k
    if (next()) {
44
0
        next()->finish();
45
0
    }
46
114k
    crypto->SHA2_finalize();
47
114k
    in_progress = false;
48
114k
}
49
50
void
51
Pl_SHA2::resetBits(int bits)
52
114k
{
53
114k
    util::assertion(!in_progress, "bit reset requested for in-progress SHA2 Pipeline");
54
114k
    crypto = QPDFCryptoProvider::getImpl();
55
114k
    crypto->SHA2_init(bits);
56
114k
}
57
58
std::string
59
Pl_SHA2::getRawDigest()
60
114k
{
61
114k
    util::assertion(!in_progress, "digest requested for in-progress SHA2 Pipeline");
62
114k
    return crypto->SHA2_digest();
63
114k
}
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
}