blob: f7e81170dfadce10525f3d6cb87774664186c8f8 (
plain)
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
|
//========================================================================
//
// GPGMECryptoSignBackend.h
//
// This file is licensed under the GPLv2 or later
//
// Copyright 2023, 2024 g10 Code GmbH, Author: Sune Stolborg Vuorela <sune@vuorela.dk>
//========================================================================
#include "CryptoSignBackend.h"
#include <gpgme++/data.h>
#include <gpgme++/context.h>
#include <optional>
#include <future>
class GpgSignatureBackend : public CryptoSign::Backend
{
public:
GpgSignatureBackend();
std::unique_ptr<CryptoSign::VerificationInterface> createVerificationHandler(std::vector<unsigned char> &&pkcs7) final;
std::unique_ptr<CryptoSign::SigningInterface> createSigningHandler(const std::string &certID, HashAlgorithm digestAlgTag) final;
std::vector<std::unique_ptr<X509CertificateInfo>> getAvailableSigningCertificates() final;
static bool hasSufficientVersion();
};
class GpgSignatureCreation : public CryptoSign::SigningInterface
{
public:
GpgSignatureCreation(const std::string &certId);
void addData(unsigned char *dataBlock, int dataLen) final;
std::unique_ptr<X509CertificateInfo> getCertificateInfo() const final;
std::optional<GooString> signDetached(const std::string &password) final;
private:
std::unique_ptr<GpgME::Context> gpgContext;
GpgME::Data gpgData;
std::optional<GpgME::Key> key;
};
class GpgSignatureVerification : public CryptoSign::VerificationInterface
{
public:
explicit GpgSignatureVerification(const std::vector<unsigned char> &pkcs7data);
SignatureValidationStatus validateSignature() final;
void addData(unsigned char *dataBlock, int dataLen) final;
std::chrono::system_clock::time_point getSigningTime() const final;
std::string getSignerName() const final;
std::string getSignerSubjectDN() const final;
HashAlgorithm getHashAlgorithm() const final;
CertificateValidationStatus validateCertificateResult() final;
void validateCertificateAsync(std::chrono::system_clock::time_point validation_time, bool ocspRevocationCheck, bool useAIACertFetch, const std::function<void()> &doneCallback) final;
std::unique_ptr<X509CertificateInfo> getCertificateInfo() const final;
private:
std::unique_ptr<GpgME::Context> gpgContext;
GpgME::Data signatureData;
GpgME::Data signedData;
std::optional<GpgME::VerificationResult> gpgResult;
std::future<CertificateValidationStatus> validationStatus;
std::optional<CertificateValidationStatus> cachedValidationStatus;
};
|