Coverage Report

Created: 2026-01-10 07:03

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