Vanetza
Loading...
Searching...
No Matches
location_checker.hpp
1#pragma once
2#include <vanetza/asn1/security_profile.hpp>
3#include VANETZA_ASN1_SECURITY_HEADER(Certificate.h)
4#include <vanetza/security/v3/asn1_types.hpp>
5
6// forward declaration
8
9namespace vanetza
10{
11
12// forward declarations
13struct PositionFix;
14namespace geodesy { class CountryDatabase; }
15
16namespace security
17{
18namespace v3
19{
20
21/**
22 * LocationChecker Interface
23 * Abstract base class defining the interface for location validation.
24 */
26{
27public:
28 // Returns true if the given PositionFix lies within the specified GeographicRegion.
29 virtual bool valid_at_location(const asn1::EtsiTs103097Certificate& cert, const PositionFix& location) const = 0;
30 virtual ~LocationChecker() = default;
31};
32
33/**
34 * Always allow all the requests
35 */
37{
38public:
39 bool valid_at_location(const asn1::EtsiTs103097Certificate& cert, const PositionFix& location) const override;
40};
41
42/**
43 * Always deny all the requests
44 */
46{
47public:
48 bool valid_at_location(const asn1::EtsiTs103097Certificate& cert, const PositionFix& location) const override;
49};
50
51/**
52 * Default implementation that checks whether a position lies within a certificate's GeographicRegion.
53 * Supports: no restriction, CircularRegion, RectangularRegion, PolygonalRegion, IdentifiedRegion
54 * (only ISO 3166/M49 country codes).
55 * For unsupported IdentifiedRegion variants, the permissive flag controls their acceptance or rejection.
56 * IdentifiedRegion (ISO 3166 country codes): unsupported; returns false (conservative) unless
57 * Entirely unknown region types are always rejected conservatively.
58 */
60{
61public:
62 bool valid_at_location(const asn1::EtsiTs103097Certificate& cert, const PositionFix& location) const override;
63
64 /**
65 * Change permissive behaviour regarding unsupported IdentifiedRegion types.
66 *
67 * When set to true, unsupported IdentifiedRegion (country and region, country and sub-regions)
68 * are not checked but still accepted. These regions are only defined for the United States, i.e.
69 * they have no meaning for European C-ITS deployments.
70 * Default behaviour is conservative rejection (false), user must explicitly opt in.
71 */
73 {
74 permissive_identified_region_ = permissive;
75 }
76
77 bool permissive_identified_region() const
78 {
79 return permissive_identified_region_;
80 }
81
82 /**
83 * Register country database for IdentifiedRegion validations.
84 *
85 * If a database is registered, validation of countryOnly IdentifiedRegion takes place.
86 * If database is missing, validation falls back to the defined permissive behaviour.
87 */
88 void use_country_database(const geodesy::CountryDatabase* db)
89 {
90 country_db_ = db;
91 }
92
93private:
94 bool check_identified_region(const PositionFix& location, const Vanetza_Security_SequenceOfIdentifiedRegion& seq) const;
95
96 bool permissive_identified_region_ = false;
97 const geodesy::CountryDatabase* country_db_ = nullptr;
98};
99
100} // namespace v3
101} // namespace security
102} // 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
void use_country_database(const geodesy::CountryDatabase *db)
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