5#include <QtCore/QDateTime>
10mavlink_signing_t* _getChannelSigning(uint8_t channel)
17 return status->signing;
25void _setSigningKey(mavlink_signing_t *signing, QByteArrayView key,
bool randomize =
false)
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));
36 (void) memset(signing->secret_key, 0,
sizeof(signing->secret_key));
40void _setSigningTimestamp(mavlink_signing_t *signing)
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;
65 static const QSet<uint32_t> unsigned_messages({MAVLINK_MSG_ID_RADIO_STATUS});
67 return unsigned_messages.contains(message_id);
74 if (!key.isEmpty() && !callback) {
75 qWarning() << Q_FUNC_INFO <<
"callback must be specified";
81 qWarning() << Q_FUNC_INFO <<
"Invalid channel:" << channel;
86 status->signing =
nullptr;
87 status->signing_streams =
nullptr;
90 static mavlink_signing_streams_t s_signing_streams;
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;
97 _setSigningKey(signing, key);
98 _setSigningTimestamp(signing);
100 status->signing = signing;
101 status->signing_streams = &s_signing_streams;
109 const mavlink_signing_t*
const signing = _getChannelSigning(channel);
111 qCWarning(QGCMAVLinkLog) << Q_FUNC_INFO <<
"Invalid Signing Pointer for Channel:" << channel;
115 return (signing->link_id == _getMessageChannel(message));
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;
126 const mavlink_signing_t*
const signing = _getChannelSigning(channel);
128 setup_signing.initial_timestamp = signing->timestamp;
129 (void) memcpy(setup_signing.secret_key, signing->secret_key,
sizeof(setup_signing.secret_key));
mavlink_status_t * mavlink_get_channel_status(uint8_t chan)
#define MAVLINK_COMM_NUM_BUFFERS
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)