QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
MAVLinkSigning.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QByteArray>
4#include <QtCore/QByteArrayView>
5#include <QtCore/QDateTime>
6#include <QtCore/QHash>
7#include <QtCore/QString>
8#include <QtCore/QTimeZone>
9#include <array>
10#include <cstdint>
11#include <optional>
12
13#include "MAVLinkMessageType.h"
14
15// createSetupSigning takes mavlink_setup_signing_t&; full def lives in MAVLinkLib.h. Callers must include it.
16struct __mavlink_setup_signing_t;
17typedef struct __mavlink_setup_signing_t mavlink_setup_signing_t;
18
19namespace MAVLinkSigning {
20static constexpr int kSigningKeySize = 32; // SHA-256 output / MAVLink secret_key size
21static constexpr int kSignatureHashBytes = 6; // truncated SHA-256 in wire signature
22static constexpr int kSignaturePrefixBytes = 7; // link_id(1) + timestamp(6) before hash
23
25using SigningKey = std::array<uint8_t, kSigningKeySize>;
26
28inline const QDateTime& signingEpoch()
29{
30 static const QDateTime epoch = QDate(2015, 1, 1).startOfDay(QTimeZone::UTC);
31 return epoch;
32}
33
36{
37 return static_cast<uint64_t>(signingEpoch().msecsTo(QDateTime::currentDateTimeUtc())) * 100;
38}
39
41std::optional<SigningKey> makeSigningKey(QByteArrayView bytes);
42
45enum class UnsignedAcceptancePolicy : uint8_t {
46 Strict, // RADIO_STATUS only (hop-by-hop). Default for confirmed-signing.
47 Pending, // RADIO_STATUS + HEARTBEAT + STATUSTEXT while awaiting enable/disable confirmation.
48};
49
50bool secureConnectionAcceptUnsignedCallback(const mavlink_status_t* status, uint32_t message_id);
51bool insecureConnectionAcceptUnsignedCallback(const mavlink_status_t* status, uint32_t message_id);
52
54mavlink_accept_unsigned_t callbackForPolicy(UnsignedAcceptancePolicy policy);
55
57void createSetupSigning(mavlink_channel_t channel, mavlink_system_t target_system, QByteArrayView keyBytes,
58 mavlink_setup_signing_t& setup_signing);
59
62bool encodeSetupSigning(mavlink_channel_t channel, uint8_t srcSysId, uint8_t srcCompId, mavlink_system_t target_system,
63 QByteArrayView keyBytes, mavlink_message_t& message);
64
66bool isMessageSigned(const mavlink_message_t& message);
67
69void setMessageSigned(mavlink_message_t& message, bool isSigned);
70
75QByteArray serializeUnsignedCopy(const mavlink_message_t& message);
76
78bool verifySignature(QByteArrayView key, const mavlink_message_t& message);
79bool verifySignature(const SigningKey& key, const mavlink_message_t& message);
80
83{
84 QString keyHint;
85 bool inCooldown = false;
86 bool autoDetectSuspended = false;
87};
88
89// Pure reads from mavlink_get_channel_status(); no SigningChannel state dependency.
91bool checkSigningLinkId(mavlink_channel_t channel, const mavlink_message_t& message);
94
95} // namespace MAVLinkSigning
mavlink_channel_t
struct __mavlink_setup_signing_t mavlink_setup_signing_t
struct __mavlink_message mavlink_message_t
QByteArray serializeUnsignedCopy(const mavlink_message_t &message)
static constexpr int kSignatureHashBytes
bool checkSigningLinkId(mavlink_channel_t channel, const mavlink_message_t &message)
bool encodeSetupSigning(mavlink_channel_t channel, uint8_t srcSysId, uint8_t srcCompId, mavlink_system_t target_system, QByteArrayView keyBytes, mavlink_message_t &message)
std::array< uint8_t, kSigningKeySize > SigningKey
std::array avoids QByteArray COW detach so secureZero() actually wipes the bytes.
QString signingStatusString(mavlink_channel_t channel)
const QDateTime & signingEpoch()
MAVLink wire-protocol epoch; must be UTC per spec.
bool verifySignature(QByteArrayView key, const mavlink_message_t &message)
Verify a key against a signed message's signature.
uint64_t currentSigningTimestampTicks()
Current signing timestamp in 10µs ticks since 2015-01-01.
void createSetupSigning(mavlink_channel_t channel, mavlink_system_t target_system, QByteArrayView keyBytes, mavlink_setup_signing_t &setup_signing)
Build a SETUP_SIGNING payload. Empty keyBytes produces a disable payload (zero key,...
bool secureConnectionAcceptUnsignedCallback(const mavlink_status_t *status, uint32_t message_id)
std::optional< SigningKey > makeSigningKey(QByteArrayView bytes)
Build a SigningKey from arbitrary bytes. Returns nullopt if input is the wrong size.
bool isMessageSigned(const mavlink_message_t &message)
Returns true if the message has a MAVLink2 signature.
mavlink_accept_unsigned_t callbackForPolicy(UnsignedAcceptancePolicy policy)
Maps a high-level policy to the underlying libmavlink callback.
void logSigningFailure(mavlink_channel_t channel)
static constexpr int kSigningKeySize
void setMessageSigned(mavlink_message_t &message, bool isSigned)
Set or clear the MAVLink2 signature incompatibility flag on a message.
static constexpr int kSignaturePrefixBytes
bool insecureConnectionAcceptUnsignedCallback(const mavlink_status_t *status, uint32_t message_id)
int signingStreamCount(mavlink_channel_t channel)
Single-lock snapshot struct; fields populated by SigningChannel::detectSnapshot().