Coverage Report

Created: 2025-11-24 06:51

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