Vanetza
Loading...
Searching...
No Matches
certificate.hpp
1#pragma once
2#include <vanetza/asn1/asn1c_wrapper.hpp>
3#include <vanetza/asn1/security/EtsiTs103097Certificate.h>
4#include <vanetza/common/clock.hpp>
5#include <vanetza/common/its_aid.hpp>
6#include <vanetza/common/position_fix.hpp>
7#include <vanetza/net/packet_variant.hpp>
8#include <vanetza/security/hashed_id.hpp>
9#include <vanetza/security/key_type.hpp>
10#include <vanetza/security/public_key.hpp>
11#include <vanetza/security/signature.hpp>
12#include <vanetza/security/v3/asn1_types.hpp>
13#include <vanetza/security/v3/location_checker.hpp>
14#include <vanetza/security/v3/validity_restriction.hpp>
15#include <boost/optional/optional_fwd.hpp>
16#include <list>
17
18namespace vanetza
19{
20namespace security
21{
22namespace v3
23{
24
25// forward declaration
26class Certificate;
27
28/**
29 * Read-only view on a certificate
30 *
31 * In contrast to Certificate, a view does not own the certificate data.
32 * A view can be created with low overhead as no heavy copying is required.
33 */
35{
36public:
37 explicit CertificateView(const asn1::EtsiTs103097Certificate* cert);
38
39 /**
40 * Calculate digest of certificate
41 * \return digest if possible
42 */
43 boost::optional<HashedId8> calculate_digest() const;
44
45 /**
46 * Get start and end validity
47 * \return certificate start and end validity
48 */
50
51 /**
52 * Get verification key type
53 * \return verification key type if possible; otherwise unspecified
54 */
55 KeyType get_verification_key_type() const;
56
57 /**
58 * Get issuer digest (if any)
59 * \return issuer digest
60 */
61 boost::optional<HashedId8> issuer_digest() const;
62
63 /**
64 * Check if certificate is self-signed
65 * \return true if certificate is self-signed
66 */
67 bool issuer_is_self() const;
68
69 /**
70 * Check if certificate is a Certification Authority certificate
71 * \return true if certificate is a CA certificate
72 */
73 bool is_ca_certificate() const;
74
75 /**
76 * Check if certificate is an Authorization Ticket certificate
77 * \return true if certificate is an AT certificate
78 */
79 bool is_at_certificate() const;
80
81 /**
82 * Check if certificate has an region restriction
83 * \return true if certificate is only valid within a specific region
84 */
85 bool has_region_restriction() const;
86
87 /**
88 * Check if certificate is valid at given location
89 *
90 * \param location location to be checked
91 * \return true if certificate is valid at location
92 */
93 bool valid_at_location(const PositionFix& location, const LocationChecker* lc) const;
94
95 /**
96 * Check if certificate is valid at given time point
97 *
98 * \param time_point time point to be checked
99 * \return true if certificate is valid at time point
100 */
101 bool valid_at_timepoint(const Clock::time_point& time_point) const;
102
103 /**
104 * Check if certificate is valid for given application
105 *
106 * \param aid application to be checked
107 * \return true if certificate is valid for application
108 */
109 bool valid_for_application(ItsAid aid) const;
110
111 /**
112 * Check if certificate has a canonical format
113 * \return true if certificate is in canonical format
114 */
115 bool is_canonical() const;
116
117 /**
118 * Convert certificate into its canonical format if possible.
119 * \return canonical certificate (or none if conversion failed)
120 */
121 boost::optional<Certificate> canonicalize() const;
122
123 /**
124 * Encode certificate.
125 * \return encoded certificate
126 */
127 ByteBuffer encode() const;
128
129protected:
130 const asn1::EtsiTs103097Certificate* m_cert = nullptr;
131};
132
134{
135 using Wrapper = asn1::asn1c_oer_wrapper<asn1::EtsiTs103097Certificate>;
136
137 Certificate();
138 explicit Certificate(const asn1::EtsiTs103097Certificate&);
139
140 Certificate(const Certificate&);
141 Certificate& operator=(const Certificate&);
142
143 Certificate(Certificate&&);
144 Certificate& operator=(Certificate&&);
145
146 // resolve ambiguity
147 ByteBuffer encode() const;
148
149 void add_permission(ItsAid aid, const ByteBuffer& ssp);
150
151 void add_cert_permission(asn1::PsidGroupPermissions* group_permission);
152
153 void set_signature(const SomeEcdsaSignature& signature);
154};
155
156/**
157 * Calculate digest of v3 certificate
158 * \param cert certificate
159 * \return digest if possible
160 */
161boost::optional<HashedId8> calculate_digest(const asn1::EtsiTs103097Certificate& cert);
162
163/**
164 * Check if certificate is in canonical format suitable for digest calculation.
165 * \param cert certificate
166 * \return true if certificate is in canonical format
167 */
168bool is_canonical(const asn1::EtsiTs103097Certificate& cert);
169
170/**
171 * Convert certificate into its canonical format if possible.
172 * \param cert certificate
173 * \return canonical certificate (or none if conversion failed)
174 */
175boost::optional<Certificate> canonicalize(const asn1::EtsiTs103097Certificate& cert);
176
177/**
178 * Check if certificate is valid at given time point
179 *
180 * \param cert certificate to be checked
181 * \param time_point time point to be checked
182 * \return true if certificate is valid at time point
183 */
184bool valid_at_timepoint(const asn1::EtsiTs103097Certificate& cert, const Clock::time_point& time_point);
185
186/**
187 * Check if certificate is valid for given application
188 *
189 * \param cert certificate to be checked
190 * \param aid application to be checked
191 * \return true if certificate is valid for application
192 */
193bool valid_for_application(const asn1::EtsiTs103097Certificate& cert, ItsAid aid);
194
195/**
196 * Extract the public key out of a certificate
197 * \param cert certificate
198 * \return public key if possible
199 */
200boost::optional<PublicKey> get_public_key(const asn1::EtsiTs103097Certificate& cert);
201
202/**
203 * Get verification key type
204 * \param cert certificate
205 * \return verification key type (maybe unspecified)
206 */
207KeyType get_verification_key_type(const asn1::EtsiTs103097Certificate& cert);
208
209/**
210 * Extract the public key for encrypting out of a certificate
211 * \param cert certificate
212 * \return encryption key if possible
213 */
214boost::optional<PublicKey> get_public_encryption_key(const asn1::EtsiTs103097Certificate& cert);
215
216/**
217 * Extract the signature out of a certificate
218 * \param cert certificate
219 * \return signature if possible
220 */
221boost::optional<Signature> get_signature(const asn1::EtsiTs103097Certificate& cert);
222
223/**
224 * Get list of ITS AID permissions from certificate
225 * \param cert certificate
226 * \return list of ITS AIDs
227 */
228std::list<ItsAid> get_aids(const asn1::EtsiTs103097Certificate& cert);
229
230/**
231 * Get application permissions (SSP = service specific permissions)
232 * \param cert certificate containing application permissions
233 * \param aid look up permissions for this application identifier
234 * \return SSP bitmap or empty buffer
235 */
236ByteBuffer get_app_permissions(const asn1::EtsiTs103097Certificate& cert, ItsAid aid);
237
238void add_psid_group_permission(asn1::PsidGroupPermissions* group_permission, ItsAid aid, const ByteBuffer& ssp, const ByteBuffer& bitmask);
239
240void serialize(OutputArchive& ar, const Certificate& certificate);
241
242Certificate fake_certificate();
243
244} // namespace v3
245} // namespace security
246} // namespace vanetza
#define FWD_STRUCT(name)
#define FWD_OCTET_STRING(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(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 boost::optional< Uncompressed > decompress_point(const EccPoint &ecc_point)=0
decompress a possibly compressed elliptic curve point
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 valid_for_application(ItsAid aid) const
boost::optional< HashedId8 > calculate_digest() const
bool valid_at_location(const PositionFix &location, const LocationChecker *lc) 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