Coverage Report

Created: 2025-07-01 06:13

/src/qpdf/libqpdf/QPDFCryptoProvider.cc
Line
Count
Source (jump to first uncovered line)
1
#include <qpdf/QPDFCryptoProvider.hh>
2
3
#include <qpdf/QUtil.hh>
4
#include <qpdf/qpdf-config.h>
5
#include <stdexcept>
6
7
#ifdef USE_CRYPTO_NATIVE
8
# include <qpdf/QPDFCrypto_native.hh>
9
#endif
10
#ifdef USE_CRYPTO_GNUTLS
11
# include <qpdf/QPDFCrypto_gnutls.hh>
12
#endif
13
#ifdef USE_CRYPTO_OPENSSL
14
# include <qpdf/QPDFCrypto_openssl.hh>
15
#endif
16
17
std::shared_ptr<QPDFCryptoImpl>
18
QPDFCryptoProvider::getImpl()
19
335k
{
20
335k
    QPDFCryptoProvider& p = getInstance();
21
335k
    if (p.m->default_provider.empty()) {
22
0
        throw std::logic_error("QPDFCryptoProvider::getImpl called with no default provider.");
23
0
    }
24
335k
    return p.getImpl_internal(p.m->default_provider);
25
335k
}
26
27
std::shared_ptr<QPDFCryptoImpl>
28
QPDFCryptoProvider::getImpl(std::string const& name)
29
0
{
30
0
    return getInstance().getImpl_internal(name);
31
0
}
32
33
void
34
QPDFCryptoProvider::registerImpl(std::string const& name, provider_fn f)
35
0
{
36
0
    getInstance().registerImpl_internal(name, std::move(f));
37
0
}
38
39
void
40
QPDFCryptoProvider::setDefaultProvider(std::string const& name)
41
0
{
42
0
    getInstance().setDefaultProvider_internal(name);
43
0
}
44
45
QPDFCryptoProvider::QPDFCryptoProvider() :
46
1
    m(std::make_shared<Members>())
47
1
{
48
1
#ifdef USE_CRYPTO_NATIVE
49
1
    registerImpl_internal("native", std::make_shared<QPDFCrypto_native>);
50
1
#endif
51
#ifdef USE_CRYPTO_GNUTLS
52
    registerImpl_internal("gnutls", std::make_shared<QPDFCrypto_gnutls>);
53
#endif
54
#ifdef USE_CRYPTO_OPENSSL
55
    registerImpl_internal("openssl", std::make_shared<QPDFCrypto_openssl>);
56
#endif
57
1
    std::string default_crypto;
58
1
    if (!QUtil::get_env("QPDF_CRYPTO_PROVIDER", &default_crypto)) {
59
1
        default_crypto = DEFAULT_CRYPTO;
60
1
    }
61
1
    setDefaultProvider_internal(default_crypto);
62
1
}
63
64
QPDFCryptoProvider&
65
QPDFCryptoProvider::getInstance()
66
335k
{
67
335k
    static QPDFCryptoProvider instance;
68
335k
    return instance;
69
335k
}
70
71
std::shared_ptr<QPDFCryptoImpl>
72
QPDFCryptoProvider::getImpl_internal(std::string const& name) const
73
335k
{
74
335k
    auto iter = m->providers.find(name);
75
335k
    if (iter == m->providers.end()) {
76
0
        throw std::logic_error(
77
0
            "QPDFCryptoProvider requested unknown implementation \"" + name + "\"");
78
0
    }
79
335k
    return m->providers[name]();
80
335k
}
81
82
void
83
QPDFCryptoProvider::registerImpl_internal(std::string const& name, provider_fn f)
84
1
{
85
1
    m->providers[name] = std::move(f);
86
1
}
87
88
void
89
QPDFCryptoProvider::setDefaultProvider_internal(std::string const& name)
90
1
{
91
1
    if (!m->providers.contains(name)) {
92
0
        throw std::logic_error(
93
0
            "QPDFCryptoProvider: request to set default provider to unknown implementation \"" +
94
0
            name + "\"");
95
0
    }
96
1
    m->default_provider = name;
97
1
}
98
99
std::set<std::string>
100
QPDFCryptoProvider::getRegisteredImpls()
101
0
{
102
0
    std::set<std::string> result;
103
0
    QPDFCryptoProvider& p = getInstance();
104
0
    for (auto const& iter: p.m->providers) {
105
0
        result.insert(iter.first);
106
0
    }
107
0
    return result;
108
0
}
109
110
std::string
111
QPDFCryptoProvider::getDefaultProvider()
112
0
{
113
0
    return getInstance().m->default_provider;
114
0
}