LIEF: Library to Instrument Executable Formats Version 2.0.0
Loading...
Searching...
No Matches
Signature.hpp
Go to the documentation of this file.
1/* Copyright 2017 - 2026 R. Thomas
2 * Copyright 2017 - 2026 Quarkslab
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#ifndef LIEF_PE_SIGNATURE_H
17#define LIEF_PE_SIGNATURE_H
18
19#include <string_view>
20
21#include "LIEF/Object.hpp"
23#include "LIEF/span.hpp"
24#include "LIEF/visibility.h"
25
29
30#include "LIEF/PE/enums.hpp"
31
32#include "LIEF/enums.hpp"
33#include "LIEF/iterators.hpp"
34
35
36namespace LIEF::PE {
37
38class SignatureParser;
39class Binary;
40
42class LIEF_API Signature : public Object {
43
44 friend class SignatureParser;
45 friend class Parser;
46 friend class Binary;
47
48 public:
50 static std::vector<uint8_t> hash(const std::vector<uint8_t>& input,
51 ALGORITHMS algo) {
52 return hash(input.data(), input.size(), algo);
53 }
54
55 static std::vector<uint8_t> hash(const uint8_t* buffer, size_t size,
56 ALGORITHMS algo);
57
58 public:
61
64
67
70
72 enum class VERIFICATION_FLAGS : uint32_t {
73 // clang-format off
74 OK = 0,
75 INVALID_SIGNER = 1 << 0,
76 UNSUPPORTED_ALGORITHM = 1 << 1,
77 INCONSISTENT_DIGEST_ALGORITHM = 1 << 2,
78 CERT_NOT_FOUND = 1 << 3,
79 CORRUPTED_CONTENT_INFO = 1 << 4,
80 CORRUPTED_AUTH_DATA = 1 << 5,
81 MISSING_PKCS9_MESSAGE_DIGEST = 1 << 6,
82 BAD_DIGEST = 1 << 7,
83 BAD_SIGNATURE = 1 << 8,
84 NO_SIGNATURE = 1 << 9,
85 CERT_EXPIRED = 1 << 10,
86 CERT_FUTURE = 1 << 11,
87 // clang-format on
88 };
89
93 static std::string flag_to_string(VERIFICATION_FLAGS flag);
94
98 enum class VERIFICATION_CHECKS : uint32_t {
101 DEFAULT = 1 << 0,
102
105 HASH_ONLY = 1 << 1,
106
109 LIFETIME_SIGNING = 1 << 2,
110
113 SKIP_CERT_TIME = 1 << 3,
114 };
115
119
122
124 uint32_t version() const {
125 return version_;
126 }
127
132 return digest_algorithm_;
133 }
134
137 return content_info_;
138 }
139
142 return certificates_;
143 }
144
146 return certificates_;
147 }
148
152 return signers_;
153 }
154
156 return signers_;
157 }
158
161 return original_raw_signature_;
162 }
163
165 const x509*
166 find_crt(const std::vector<uint8_t>& serialno) const LIEF_LIFETIMEBOUND;
167
169 const x509* find_crt_subject(std::string_view subject) const LIEF_LIFETIMEBOUND;
170
173 std::string_view subject, const std::vector<uint8_t>& serialno
174 ) const LIEF_LIFETIMEBOUND;
175
177 const x509* find_crt_issuer(std::string_view issuer) const LIEF_LIFETIMEBOUND;
178
181 std::string_view issuer, const std::vector<uint8_t>& serialno
182 ) const LIEF_LIFETIMEBOUND;
183
212
213 void accept(Visitor& visitor) const override;
214
215 ~Signature() override;
216
217 LIEF_API friend std::ostream& operator<<(std::ostream& os,
218 const Signature& signature);
219
220 private:
221 uint32_t version_ = 0;
222 ALGORITHMS digest_algorithm_ = ALGORITHMS::UNKNOWN;
223 ContentInfo content_info_;
224 std::vector<x509> certificates_;
225 std::vector<SignerInfo> signers_;
226
227 uint64_t content_info_start_ = 0;
228 uint64_t content_info_end_ = 0;
229
230 std::vector<uint8_t> original_raw_signature_;
231};
232
233
234}
235
236
239
240
241#endif
Class which represents a PE binary This is the main interface to manage and modify a PE executable.
Definition PE/Binary.hpp:58
Definition ContentInfo.hpp:81
Definition SignatureParser.hpp:36
Signature(Signature &&)
it_signers_t signers()
Definition Signature.hpp:155
const x509 * find_crt(const std::vector< uint8_t > &serialno) const
Find x509 certificate according to its serial number.
static std::vector< uint8_t > hash(const uint8_t *buffer, size_t size, ALGORITHMS algo)
Signature & operator=(Signature &&)
VERIFICATION_FLAGS check(VERIFICATION_CHECKS checks=VERIFICATION_CHECKS::DEFAULT) const
Check if this signature is valid according to the Authenticode/PKCS #7 verification scheme.
const_ref_iterator< const std::vector< SignerInfo > & > it_const_signers_t
Iterator which outputs const SignerInfo&.
Definition Signature.hpp:66
span< const uint8_t > raw_der() const
Return the raw original PKCS7 signature.
Definition Signature.hpp:160
static std::string flag_to_string(VERIFICATION_FLAGS flag)
Convert a verification flag into a human-readable representation. e.g VERIFICATION_FLAGS....
const_ref_iterator< const std::vector< x509 > & > it_const_crt
Iterator which outputs const x509& certificates.
Definition Signature.hpp:60
ref_iterator< std::vector< x509 > & > it_crt
Iterator which outputs x509& certificates.
Definition Signature.hpp:63
const ContentInfo & content_info() const
Return the ContentInfo.
Definition Signature.hpp:136
Signature(const Signature &)
~Signature() override
friend class SignatureParser
Definition Signature.hpp:44
friend class Binary
Definition Signature.hpp:46
it_crt certificates()
Definition Signature.hpp:145
Signature & operator=(const Signature &)
ref_iterator< std::vector< SignerInfo > & > it_signers_t
Iterator which outputs SignerInfo&.
Definition Signature.hpp:69
static std::vector< uint8_t > hash(const std::vector< uint8_t > &input, ALGORITHMS algo)
Hash the input given the algorithm.
Definition Signature.hpp:50
const x509 * find_crt_issuer(std::string_view issuer, const std::vector< uint8_t > &serialno) const
Find x509 certificate according to its issuer AND serial number.
friend class Parser
Definition Signature.hpp:45
VERIFICATION_CHECKS
Flags to tweak the verification process of the signature.
Definition Signature.hpp:98
@ DEFAULT
Default behavior that tries to follow the Microsoft verification process as close as possible.
Definition Signature.hpp:101
void accept(Visitor &visitor) const override
it_const_signers_t signers() const
Return an iterator over the signers (SignerInfo) defined in the PKCS #7 signature.
Definition Signature.hpp:151
it_const_crt certificates() const
Return an iterator over x509 certificates.
Definition Signature.hpp:141
uint32_t version() const
Should be 1.
Definition Signature.hpp:124
friend std::ostream & operator<<(std::ostream &os, const Signature &signature)
ALGORITHMS digest_algorithm() const
Algorithm used to digest the file.
Definition Signature.hpp:131
const x509 * find_crt_issuer(std::string_view issuer) const
Find x509 certificate according to its issuer.
VERIFICATION_FLAGS
Flags returned by the verification functions.
Definition Signature.hpp:72
const x509 * find_crt_subject(std::string_view subject) const
Find x509 certificate according to its subject.
const x509 * find_crt_subject(std::string_view subject, const std::vector< uint8_t > &serialno) const
Find x509 certificate according to its subject AND serial number.
Interface over a x509 certificate.
Definition x509.hpp:43
Definition Visitor.hpp:212
Iterator which returns reference on container's values.
Definition iterators.hpp:47
#define LIEF_LIFETIMEBOUND
Definition compiler_attributes.hpp:72
#define ENABLE_BITMASK_OPERATORS(X)
Definition enums.hpp:24
Namespace related to the LIEF's PE module.
Definition Abstract/Header.hpp:32
ALGORITHMS
Cryptography algorithms.
Definition PE/enums.hpp:28
@ UNKNOWN
Definition PE/enums.hpp:29
@ DEFAULT
Default implementation.
Definition PE/utils.hpp:35
tcb::span< ElementType, Extent > span
Definition span.hpp:22
ref_iterator< CT, U, typename decay_t< CT >::const_iterator > const_ref_iterator
Iterator which returns a const ref on container's values.
Definition iterators.hpp:316
#define LIEF_API
Definition visibility.h:45