File: crypto_provider.cc

package info (click to toggle)
qpdf 12.3.2-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 72,660 kB
  • sloc: cpp: 59,054; perl: 12,189; ansic: 6,809; sh: 1,231; python: 1,041; xml: 43; makefile: 42
file content (98 lines) | stat: -rw-r--r-- 2,172 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <qpdf/assert_test.h>

#include <qpdf/MD5.hh>
#include <qpdf/QPDFCryptoImpl.hh>
#include <qpdf/QPDFCryptoProvider.hh>
#include <cstring>
#include <iostream>

// This is a dummy crypto implementation that only implements MD5 digest. It doesn't work, but
// it enables us to exercise the wiring of registering, querying, and setting a crypto provider.
class Potato: public QPDFCryptoImpl
{
  public:
    void
    provideRandomData(unsigned char* data, size_t len) override
    {
    }
    void
    MD5_init() override
    {
    }
    void
    MD5_update(const unsigned char* data, size_t len) override
    {
    }
    void
    MD5_finalize() override
    {
    }
    void
    MD5_digest(unsigned char* digest) override
    {
        std::memcpy(digest, "0123456789abcdef", sizeof(QPDFCryptoImpl::MD5_Digest));
    }
    void
    SHA2_init(int bits) override
    {
    }
    void
    SHA2_update(const unsigned char* data, size_t len) override
    {
    }
    void
    SHA2_finalize() override
    {
    }
    std::string
    SHA2_digest() override
    {
        return {};
    }
    void
    RC4_init(const unsigned char* key_data, int key_len) override
    {
    }
    void
    RC4_process(const unsigned char* in_data, size_t len, unsigned char* out_data) override
    {
    }
    void
    RC4_finalize() override
    {
    }
    void
    rijndael_init(
        bool encrypt,
        const unsigned char* key_data,
        size_t key_len,
        bool cbc_mode,
        unsigned char* cbc_block) override
    {
    }
    void
    rijndael_process(unsigned char* in_data, unsigned char* out_data) override
    {
    }
    void
    rijndael_finalize() override
    {
    }
};

int
main()
{
    auto initial = QPDFCryptoProvider::getDefaultProvider();
    QPDFCryptoProvider::registerImpl<Potato>("potato");
    QPDFCryptoProvider::setDefaultProvider("potato");
    assert(QPDFCryptoProvider::getDefaultProvider() == "potato");
    MD5 m;
    m.encodeString("quack"); // anything
    MD5::Digest d;
    m.digest(d);
    // hex for 0123456789abcdef
    assert(m.unparse() == "30313233343536373839616263646566");
    std::cout << "assertions passed\n";
    return 0;
}