Vanetza
Loading...
Searching...
No Matches
certificate.hpp
1#pragma once
2#include <vanetza/asn1/asn1c_wrapper.hpp>
3#include <vanetza/asn1/security_profile.hpp>
4#include VANETZA_ASN1_SECURITY_HEADER(EtsiTs103097Certificate.h)
5#include <vanetza/common/clock.hpp>
6#include <vanetza/common/its_aid.hpp>
7#include <vanetza/common/position_fix.hpp>
8#include <vanetza/net/packet_variant.hpp>
9#include <vanetza/security/hashed_id.hpp>
10#include <vanetza/security/key_type.hpp>
11#include <vanetza/security/public_key.hpp>
12#include <vanetza/security/signature.hpp>
13#include <vanetza/security/v3/asn1_types.hpp>
14#include <vanetza/security/v3/location_checker.hpp>
15#include <vanetza/security/v3/validity_restriction.hpp>
16#include <boost/optional/optional_fwd.hpp>
17#include <cstdint>
18#include <list>
19
20namespace vanetza
21{
22namespace security
23{
24namespace v3
25{
26
27// forward declaration
28class Certificate;
29
30/**
31 * Read-only view on a certificate
32 *
33 * In contrast to Certificate, a view does not own the certificate data.
34 * A view can be created with low overhead as no heavy copying is required.
35 */
37{
38public:
39 explicit CertificateView(const asn1::EtsiTs103097Certificate* cert);
40
41 /**
42 * Calculate digest of certificate
43 * \return digest if possible
44 */
45 boost::optional<HashedId8> calculate_digest() const;
46
47 /**
48 * Get start and end validity
49 * \return certificate start and end validity
50 */
52
53 /**
54 * Get verification key type
55 * \return verification key type if possible; otherwise unspecified
56 */
57 KeyType get_verification_key_type() const;
58
59 /**
60 * Get issuer digest (if any)
61 * \return issuer digest
62 */
63 boost::optional<HashedId8> issuer_digest() const;
64
65 /**
66 * Check if certificate is self-signed
67 * \return true if certificate is self-signed
68 */
69 bool issuer_is_self() const;
70
71 /**
72 * Check if certificate is a Certification Authority certificate
73 * \return true if certificate is a CA certificate
74 */
75 bool is_ca_certificate() const;
76
77 /**
78 * Check if certificate is an Authorization Ticket certificate
79 * \return true if certificate is an AT certificate
80 */
81 bool is_at_certificate() const;
82
83 /**
84 * Check if certificate has an region restriction
85 * \return true if certificate is only valid within a specific region
86 */
87 bool has_region_restriction() const;
88
89 /**
90 * Check if certificate is valid at given location
91 *
92 * \param location location to be checked
93 * \return true if certificate is valid at location
94 */
95 bool valid_at_location(const PositionFix& location, const LocationChecker* lc) const;
96
97 /**
98 * Check if certificate is valid at given time point
99 *
100 * \param time_point time point to be checked
101 * \return true if certificate is valid at time point
102 */
103 bool valid_at_timepoint(const Clock::time_point& time_point) const;
104
105 /**
106 * Check if certificate is valid for given application
107 *
108 * \param aid application to be checked
109 * \return true if certificate is valid for application
110 */
111 bool valid_for_application(ItsAid aid) const;
112
113 /**
114 * Check if certificate issue permissions allow issuing a given application.
115 *
116 * \param aid application to be checked
117 * \return true if certificate may issue certificates for application
118 */
119 bool is_allowed_to_issue(ItsAid aid) const;
120
121 /**
122 * Get subject assurance level encoded in this certificate.
123 *
124 * \return raw assurance level byte if present
125 */
126 boost::optional<std::uint8_t> assurance_level() const;
127
128 /**
129 * Check if this certificate's region restriction is within issuer's region restriction.
130 *
131 * If issuer has no region restriction, any subject region is accepted.
132 * Currently supports circular regions and exact rectangular-region equality;
133 * unsupported region combinations are rejected conservatively.
134 *
135 * \param issuer issuing certificate
136 * \return true if this certificate's region is contained in issuer's region
137 */
138 bool region_is_within(const CertificateView& issuer) const;
139
140 /**
141 * Check if certificate has a canonical format
142 * \return true if certificate is in canonical format
143 */
144 bool is_canonical() const;
145
146 /**
147 * Convert certificate into its canonical format if possible.
148 * \return canonical certificate (or none if conversion failed)
149 */
150 boost::optional<Certificate> canonicalize() const;
151
152 /**
153 * Encode certificate.
154 * \return encoded certificate
155 */
156 ByteBuffer encode() const;
157
158protected:
159 const asn1::EtsiTs103097Certificate* m_cert = nullptr;
160};
161
163{
164 using Wrapper = asn1::asn1c_oer_wrapper<asn1::EtsiTs103097Certificate>;
165
166 Certificate();
167 explicit Certificate(const asn1::EtsiTs103097Certificate&);
168
169 Certificate(const Certificate&);
170 Certificate& operator=(const Certificate&);
171
172 Certificate(Certificate&&);
173 Certificate& operator=(Certificate&&);
174
175 // resolve ambiguity
176 ByteBuffer encode() const;
177
178 /**
179 * \brief add application permissions as bitmap
180 *
181 * \param aid application identifier
182 * \param ssp permission bitmap
183 */
184 void add_app_permission(ItsAid aid, const ByteBuffer& ssp);
185
186 /**
187 * \brief add cert issuing permission
188 *
189 * \param group_permission to be added permission
190 */
191 void add_cert_issue_permission(asn1::PsidGroupPermissions* group_permission);
192
193 void set_signature(const SomeEcdsaSignature& signature);
194};
195
196/**
197 * Calculate digest of v3 certificate
198 * \param cert certificate
199 * \return digest if possible
200 */
201boost::optional<HashedId8> calculate_digest(const asn1::EtsiTs103097Certificate& cert);
202
203/**
204 * Check if certificate is in canonical format suitable for digest calculation.
205 * \param cert certificate
206 * \return true if certificate is in canonical format
207 */
208bool is_canonical(const asn1::EtsiTs103097Certificate& cert);
209
210/**
211 * Convert certificate into its canonical format if possible.
212 * \param cert certificate
213 * \return canonical certificate (or none if conversion failed)
214 */
215boost::optional<Certificate> canonicalize(const asn1::EtsiTs103097Certificate& cert);
216
217/**
218 * Check if certificate is valid at given time point
219 *
220 * \param cert certificate to be checked
221 * \param time_point time point to be checked
222 * \return true if certificate is valid at time point
223 */
224bool valid_at_timepoint(const asn1::EtsiTs103097Certificate& cert, const Clock::time_point& time_point);
225
226/**
227 * Check if certificate is valid for given application
228 *
229 * \param cert certificate to be checked
230 * \param aid application to be checked
231 * \return true if certificate is valid for application
232 */
233bool valid_for_application(const asn1::EtsiTs103097Certificate& cert, ItsAid aid);
234
235/**
236 * Extract the public key out of a certificate
237 * \param cert certificate
238 * \return public key if possible
239 */
240boost::optional<PublicKey> get_public_key(const asn1::EtsiTs103097Certificate& cert);
241
242/**
243 * Get verification key type
244 * \param cert certificate
245 * \return verification key type (maybe unspecified)
246 */
247KeyType get_verification_key_type(const asn1::EtsiTs103097Certificate& cert);
248
249/**
250 * Extract the public key for encrypting out of a certificate
251 * \param cert certificate
252 * \return encryption key if possible
253 */
254boost::optional<PublicKey> get_public_encryption_key(const asn1::EtsiTs103097Certificate& cert);
255
256/**
257 * Extract the signature out of a certificate
258 * \param cert certificate
259 * \return signature if possible
260 */
261boost::optional<Signature> get_signature(const asn1::EtsiTs103097Certificate& cert);
262
263/**
264 * Get list of ITS AID permissions from certificate
265 * \param cert certificate
266 * \return list of ITS AIDs
267 */
268std::list<ItsAid> get_aids(const asn1::EtsiTs103097Certificate& cert);
269
270/**
271 * Get application permissions (SSP = service specific permissions)
272 * \param cert certificate containing application permissions
273 * \param aid look up permissions for this application identifier
274 * \return SSP bitmap or empty buffer
275 */
276ByteBuffer get_app_permissions(const asn1::EtsiTs103097Certificate& cert, ItsAid aid);
277
278void add_psid_group_permission(asn1::PsidGroupPermissions* group_permission, ItsAid aid, const ByteBuffer& ssp, const ByteBuffer& bitmask);
279
280void serialize(OutputArchive& ar, const Certificate& certificate);
281
282Certificate fake_certificate();
283
284} // namespace v3
285} // namespace security
286} // namespace vanetza
#define FWD_STRUCT(name)
#define FWD_OCTET_STRING(name)
#define ASN1_TYPE_DESC(name)
#define FWD_ALIAS(name, base)
#define FWD_NATIVE_INTEGER(name)
ChunckPacket is a packet consisting of several memory chunks.
ByteBufferConvertible & operator[](OsiLayer ol)
ChunkPacket & merge(ChunkPacket &packet, OsiLayer from, OsiLayer to)
std::size_t size() const
const ByteBufferConvertible & layer(OsiLayer ol) const
const ByteBufferConvertible & operator[](OsiLayer ol) const
ByteBufferConvertible & layer(OsiLayer ol)
std::size_t size(OsiLayer from, OsiLayer to) const
ChunkPacket extract(OsiLayer from, OsiLayer to)
std::size_t size(OsiLayer from, OsiLayer to) const
buffer_const_range operator[](OsiLayer layer) const
std::size_t size() const
void set_boundary(OsiLayer, unsigned bytes)
const ByteBuffer & buffer() const
CohesivePacket(const ByteBuffer &buffer, OsiLayer layer)
void trim(OsiLayer from, unsigned bytes)
std::size_t size(OsiLayer single_layer) const
Result create(const std::string &name, Args... args) const
Definition factory.hpp:31
bool configure_default(const std::string &name)
Definition factory.hpp:70
bool add(const std::string &name, Function f)
Definition factory.hpp:60
Result create(Args... args) const
Definition factory.hpp:45
value_type operator[](size_type) const
Definition byte_view.cpp:48
byte_view_range(ByteBuffer &&)
Definition byte_view.cpp:37
byte_view_range(const ByteBuffer::const_iterator &, const ByteBuffer::const_iterator &)
Definition byte_view.cpp:27
ByteBuffer::const_pointer data() const
Definition byte_view.cpp:42
void encode(units::Duration)
Definition lifetime.cpp:45
units::Duration decode() const
Definition lifetime.cpp:59
bool after(const Timestamp &other) const
Definition timestamp.cpp:76
bool before(const Timestamp &other) const
Definition timestamp.cpp:71
virtual ecdsa256::KeyPair generate_key_pair()=0
generate a private key and the corresponding public key
virtual boost::optional< Uncompressed > decompress_point(const EccPoint &ecc_point)=0
decompress a possibly compressed elliptic curve point
virtual Signature sign_digest(const PrivateKey &, const ByteBuffer &digest)=0
calculate signature for given digest and private key
virtual EcdsaSignature sign_data(const ecdsa256::PrivateKey &private_key, const ByteBuffer &data)=0
calculate signature for given data and private key
virtual bool verify_data(const ecdsa256::PublicKey &public_key, const ByteBuffer &data, const EcdsaSignature &sig)=0
try to verify data using public key and signature
virtual bool verify_digest(const PublicKey &public_key, const ByteBuffer &digest, const Signature &sig)=0
try to verify digest using public key and signature
virtual ByteBuffer calculate_hash(HashAlgorithm algo, const ByteBuffer &data)=0
calculate hash value of data
static CertificateValidity valid()
Create CertificateValidity signalling a valid certificate This method is equivalent to default constr...
CertificateValidity(CertificateInvalidReason reason)
CertificateInvalidReason reason() const
Get reason for certificate invalidity This call is only safe if reason is available,...
std::chrono::seconds to_seconds() const
IntX specified in TS 103 097 v1.2.1, section 4.2.1.
Definition int_x.hpp:21
boost::optional< Certificate > canonicalize() const
bool valid_at_timepoint(const Clock::time_point &time_point) const
StartAndEndValidity get_start_and_end_validity() const
bool is_allowed_to_issue(ItsAid aid) const
bool valid_for_application(ItsAid aid) const
boost::optional< HashedId8 > calculate_digest() const
bool valid_at_location(const PositionFix &location, const LocationChecker *lc) const
bool region_is_within(const CertificateView &issuer) const
boost::optional< std::uint8_t > assurance_level() const
boost::optional< HashedId8 > issuer_digest() const
Compressed_Lsb_Y_0 specified in TS 103 097 v1.2.1 in section 4.2.5.
Definition ecc_point.hpp:24
Compressed_Lsb_Y_1 specified in TS 103 097 v1.2.1 in section 4.2.5.
Definition ecc_point.hpp:30
static DecapConfirm from(VerifyConfirm &&verify_confirm, const SecuredMessageView &msg_view)
Input data for decapsulating a secured message.
EcdsaSignature specified in TS 103 097 v1.2.1, section 4.2.9.
Definition signature.hpp:17
Uncompressed specified in TS 103 097 v1.2.1 in section 4.2.5.
Definition ecc_point.hpp:36
X_Coordinate_Only specified in TS 103 097 v1.2.1 in section 4.2.5.
Definition ecc_point.hpp:18
described in TS 103 097 v1.2.1, section 4.2.10
described in TS 103 097 v1.2.1 (2015-06), section 6.1
void add_permission(ItsAid aid, const ByteBuffer &ssp)
const ValidityRestriction * get_restriction(ValidityRestrictionType type) const
const SubjectAttribute * get_attribute(SubjectAttributeType type) const
void remove_attribute(SubjectAttributeType type)
const validity_restriction_type< T > * get_restriction() const
const subject_attribute_type< T > * get_attribute() const
void remove_restriction(ValidityRestrictionType type)
CircularRegion specified in TS 103 097 v1.2.1, section 4.2.22.
Definition region.hpp:74
EciesEncryptedKey specified in TS 103 097 v1.2.1, section 5.9.
EncryptionKey specified in TS 103 097 v1.2.1, section 6.4.
IdentifiedRegion specified in TS 103 097 v1.2.1, section 4.2.25.
Definition region.hpp:110
ItsAidSsp specified in TS 103 097 v1.2.1, section 6.9.
Specified in TS 103 097 v1.2.1, section 4.2.20.
Definition region.hpp:65
OpaqueKey specified in TS 103 097 v1.2.1, section 5.8.
Payload specified in TS 103 097 v1.2.1, section 5.2.
Definition payload.hpp:28
RecipientInfo specified in TS 103 097 v1.2.1, section 5.8.
RectangularRegion specified in TS 103 097 v1.2.1, section 4.2.23.
Definition region.hpp:90
SecuredMessage as specified in TS 103 097 v1.2.1, section 5.1.
HeaderField * header_field(HeaderFieldType)
const TrailerField * trailer_field(TrailerFieldType type) const
const HeaderField * header_field(HeaderFieldType type) const
TrailerField * trailer_field(TrailerFieldType)
SubjectAssurance specified in TS 103 097 v1.2.1 in section 6.6 and 7.4.1.
described in TS 103 097 v1.2.1, section 6.2
ThreeDLocation specified in TS 103 097 v1.2.1, section 4.2.19.
Definition region.hpp:21
Time64WithStandardDeviation specified in TS 103 097 v1.2.1, section 4.2.16.
TwoDLocation specified in TS 103 097 v1.2.1, section 4.2.18.
Definition region.hpp:47
VerificationKey specified in TS 103 097 v1.2.1, section 6.4.
ecdsa_nistp256_with_sha256 specified in TS 103 097 v1.2.1, section 4.2.4
ecies_nistp256 specified in TS 103 097 v1.2.1, section 4.2.4
resolve type for matching HeaderFieldType
resolve type for matching TrailerFieldType
void add_cert_issue_permission(asn1::PsidGroupPermissions *group_permission)
add cert issuing permission
void add_app_permission(ItsAid aid, const ByteBuffer &ssp)
add application permissions as bitmap