29#include "pprzlink/messages.h"
32#if PPRZLINK_DEFAULT_VER == 2
36#define PPRZ_PLAINTEXT_MSG_ID_IDX 4
38#define PPRZ_PLAINTEXT_MSG_MIN_LEN 5
40#define PPRZ_ENCRYPTED_MSG_MIN_LEN 25
42#define PPRZ_AUTH_LEN 2
44#define PPRZ_CIPH_IDX 7
46#if PPRZLINK_DEFAULT_VER == 1
50#define PPRZ_PLAINTEXT_MSG_ID_IDX 2
52#define PPRZ_PLAINTEXT_MSG_MIN_LEN 3
54#define PPRZ_ENCRYPTED_MSG_MIN_LEN 23
56#define PPRZ_AUTH_LEN 1
58#define PPRZ_CIPH_IDX 6
67#define GEC_UPDATE_DL TRUE
91 t->tx_msg[
t->tx_msg_idx] =
byte;
95#if PPRZLINK_DEFAULT_VER == 2
116 for (i = 0; i < len; i++) {
227#if PPRZLINK_DEFAULT_VER == 1
240 for (i = 0; i < len; i++) {
309 trans->
pprz_tp.trans_tx.count_bytes(trans,
dev, bytes);
317 return trans->
pprz_tp.trans_tx.check_available_space(trans,
dev,
fd, bytes);
327 t->trans_rx.msg_received =
false;
329 t->trans_tx.check_available_space =
337 t->trans_tx.impl = (
void *)(
t);
360#if PERIODIC_TELEMETRY
411 *payload_len +=
mlen;
442 memmove(buf, &buf[1], *payload_len - 1);
490 *payload_len +=
mlen;
662#if PPRZLINK_DEFAULT_VER == 2
694#if PPRZLINK_DEFAULT_VER ==1
808 whitelist->
init =
true;
816 if (whitelist->
init) {
817 for (
uint8_t i = 0; i < whitelist->
idx; i++) {
Handling of messages coming from ground and other A/Cs.
#define DatalinkFillDlBuffer(_buf, _len)
Convenience macro to fill dl_buffer.
static void DlCheckAndParse(struct link_device *dev, struct transport_tx *trans, uint8_t *buf, bool *msg_available, bool update_dl)
Check for new message and parse.
void gec_counter_to_bytes(uint32_t n, uint8_t *bytes)
Convert counter to bytes in network byte order.
void gec_sts_init(struct gec_sts_ctx *sts)
void gec_generate_ephemeral_keys(struct gec_privkey *sk)
Generate private and public key pairs for future use.
void gec_derive_key_material(struct gec_sts_ctx *ctx, uint8_t *z)
Derive key material for both sender and receiver.
uint32_t gec_bytes_to_counter(uint8_t *bytes)
Convert from network byte order (big endian) to the machine byte order.
Galois embedded crypto implementation.
struct gec_pubkey their_public_key
uint8_t pub[PPRZ_KEY_LEN]
uint8_t pub[PPRZ_KEY_LEN]
struct gec_privkey my_private_ephemeral
struct gec_sym_key tx_sym_key
uint8_t nonce[PPRZ_NONCE_LEN]
#define PPRZ_CRYPTO_OVERHEAD
uint8_t priv[PPRZ_KEY_LEN]
struct gec_pubkey their_public_ephemeral
@ UNEXPECTED_MSG_TYPE_ERROR
@ UNEXPECTED_MSG_DATA_ERROR
#define PPRZ_MSG_TYPE_ENCRYPTED
#define PPRZ_MSG_TYPE_PLAINTEXT
struct gec_sym_key rx_sym_key
uint8_t key[PPRZ_KEY_LEN]
struct gec_privkey my_private_key
void gec_dl_init(void)
Init function.
static void send_secure_link_info(struct transport_tx *trans, struct link_device *dev)
bool gec_process_msg3(uint8_t *buf)
Process incoming message (expected MSG3) if the right (KEY_EXCHANGE) message received with the right ...
void gec_add_to_whitelist(struct gec_whitelist *whitelist, uint8_t id)
void gec_dl_event(void)
Parse incoming message bytes (PPRZ_STX..CHCKSUM B) and returns a new decrypted message if it is avail...
bool gec_encrypt_message(uint8_t *buf, uint8_t *payload_len)
Attempts message encryption Adds crypto_byte, counter and tag Returns encrypted pprzlink message (cry...
struct gec_transport gec_tp
PPRZ transport structure.
bool gec_is_in_the_whitelist(struct gec_whitelist *whitelist, uint8_t id)
bool gec_decrypt_message(uint8_t *buf, volatile uint8_t *payload_len)
Attemp message decryption If a message is unencrypted, pass it through only if the MSG_ID is in the w...
void gec_process_msg1(uint8_t *buf)
NOTE: for RESPONDER party only Process incoming message (expected MSG1) if the right (KEY_EXCHANGE) m...
static void insert_byte(struct gec_transport *t, const uint8_t byte)
Simply insert byte to the message buffer.
void gec_transport_init(struct gec_transport *t)
Datalink using Galois Embedded Crypto.
#define KEY_EXCHANGE_MSG_ID_GCS
uint8_t whitelist[WHITELIST_LEN]
#define KEY_EXCHANGE_MSG_ID_UAV
Whitelist for sending and receiving unencrypted messages (mostly for KEY_EXCHANGE messages)
uint8_t msg[10]
Buffer used for general comunication over SPI (out buffer)
arch independent LED (Light Emitting Diodes) API
uint8_t dl_buffer[MSG_SIZE]
bool dl_msg_available
Flag provided to control calls to dl_parse_msg.
static float sign(float x)
sign function
#define PPRZ_MUTEX_LOCK(_mtx)
#define PPRZ_MUTEX_UNLOCK(_mtx)
#define PPRZ_MUTEX_INIT(_mtx)
static const struct usb_device_descriptor dev
uint8_t tx_msg[TRANSPORT_PAYLOAD_LEN]
struct transport_tx trans_tx
struct transport_rx trans_rx
struct pprz_transport pprz_tp
struct gec_whitelist whitelist
int8_t register_periodic_telemetry(struct periodic_telemetry *_pt, uint8_t _id, telemetry_cb _cb)
Register a telemetry callback function.
Periodic telemetry system header (includes downlink utility and generated code).
#define DefaultPeriodic
Set default periodic telemetry.
unsigned short uint16_t
Typedef defining 16 bit unsigned short type.
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.