QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
MAVLinkSigning.cc
Go to the documentation of this file.
1#include "MAVLinkSigning.h"
2#include "QGCMAVLink.h"
3#include "DeviceInfo.h"
4
5#include <QtCore/QDateTime>
6
7namespace
8{
9
10mavlink_signing_t* _getChannelSigning(uint8_t channel)
11{
12 mavlink_status_t* const status = mavlink_get_channel_status(channel);
13 if (!status) {
14 return nullptr;
15 }
16
17 return status->signing;
18}
19
20mavlink_channel_t _getMessageChannel(const mavlink_message_t &message)
21{
22 return static_cast<mavlink_channel_t>(message.signature[0]);
23}
24
25void _setSigningKey(mavlink_signing_t *signing, QByteArrayView key, bool randomize = false)
26{
27 if (randomize) {
28 const size_t key_size = sizeof(signing->secret_key) / 4;
29 uint32_t secret_key[key_size];
30 QRandomGenerator::global()->fillRange(secret_key, key_size);
31 (void) memcpy(signing->secret_key, secret_key, sizeof(signing->secret_key));
32 } else if (!key.isEmpty()) {
33 const QByteArray hash = QCryptographicHash::hash(key, QCryptographicHash::Sha256);
34 (void) memcpy(signing->secret_key, hash.constData(), sizeof(signing->secret_key));
35 } else {
36 (void) memset(signing->secret_key, 0, sizeof(signing->secret_key));
37 }
38}
39
40void _setSigningTimestamp(mavlink_signing_t *signing)
41{
42 static const QDateTime offset_time = QDateTime(QDate(2015, 1, 1).startOfDay());
43 const uint64_t current_timestamp = offset_time.msecsTo(QDateTime::currentDateTimeUtc());
44 const uint64_t signing_timestamp = current_timestamp * 100;
45 signing->timestamp = signing_timestamp;
46}
47
48} // namespace
49
51{
52
53bool secureConnectionAccceptUnsignedCallback(const mavlink_status_t *status, uint32_t message_id)
54{
55 Q_UNUSED(status);
56 Q_UNUSED(message_id);
57
58 return true;
59}
60
61bool insecureConnectionAccceptUnsignedCallback(const mavlink_status_t *status, uint32_t message_id)
62{
63 Q_UNUSED(status);
64
65 static const QSet<uint32_t> unsigned_messages({MAVLINK_MSG_ID_RADIO_STATUS});
66
67 return unsigned_messages.contains(message_id);
68}
69
72bool initSigning(mavlink_channel_t channel, QByteArrayView key, mavlink_accept_unsigned_t callback)
73{
74 if (!key.isEmpty() && !callback) {
75 qWarning() << Q_FUNC_INFO << "callback must be specified";
76 return false;
77 }
78
79 mavlink_status_t* const status = mavlink_get_channel_status(channel);
80 if (!status) {
81 qWarning() << Q_FUNC_INFO << "Invalid channel:" << channel;
82 return false;
83 }
84
85 if (key.isEmpty()) {
86 status->signing = nullptr;
87 status->signing_streams = nullptr;
88 } else {
89 static mavlink_signing_t s_signing[MAVLINK_COMM_NUM_BUFFERS];
90 static mavlink_signing_streams_t s_signing_streams;
91
92 mavlink_signing_t* const signing = &s_signing[channel];
93 signing->link_id = channel;
94 signing->flags |= MAVLINK_SIGNING_FLAG_SIGN_OUTGOING;
95 signing->accept_unsigned_callback = callback;
96
97 _setSigningKey(signing, key);
98 _setSigningTimestamp(signing);
99
100 status->signing = signing;
101 status->signing_streams = &s_signing_streams;
102 }
103
104 return true;
105}
106
108{
109 const mavlink_signing_t* const signing = _getChannelSigning(channel);
110 if (!signing) {
111 qCWarning(QGCMAVLinkLog) << Q_FUNC_INFO << "Invalid Signing Pointer for Channel:" << channel;
112 return false;
113 }
114
115 return (signing->link_id == _getMessageChannel(message));
116}
117
120void createSetupSigning(mavlink_channel_t channel, mavlink_system_t target_system, mavlink_setup_signing_t &setup_signing)
121{
122 (void) memset(&setup_signing, 0, sizeof(setup_signing));
123 setup_signing.target_system = target_system.sysid;
124 setup_signing.target_component = target_system.compid;
125
126 const mavlink_signing_t* const signing = _getChannelSigning(channel);
127 if (signing) {
128 setup_signing.initial_timestamp = signing->timestamp;
129 (void) memcpy(setup_signing.secret_key, signing->secret_key, sizeof(setup_signing.secret_key));
130 }
131}
132
133} // namespace MAVLinkSigning
mavlink_channel_t
Definition MAVLinkLib.h:7
mavlink_status_t * mavlink_get_channel_status(uint8_t chan)
Definition QGCMAVLink.cc:50
#define MAVLINK_COMM_NUM_BUFFERS
Definition MAVLinkLib.h:27
struct __mavlink_message mavlink_message_t
bool checkSigningLinkId(mavlink_channel_t channel, const mavlink_message_t &message)
bool insecureConnectionAccceptUnsignedCallback(const mavlink_status_t *status, uint32_t message_id)
void createSetupSigning(mavlink_channel_t channel, mavlink_system_t target_system, mavlink_setup_signing_t &setup_signing)
bool initSigning(mavlink_channel_t channel, QByteArrayView key, mavlink_accept_unsigned_t callback)
bool secureConnectionAccceptUnsignedCallback(const mavlink_status_t *status, uint32_t message_id)