6 #ifndef SWIFT_CORE_AFV_CRYPTO_CRYPTODTO_SERIALIZER_H
7 #define SWIFT_CORE_AFV_CRYPTO_CRYPTODTO_SERIALIZER_H
19 #ifndef crypto_aead_chacha20poly1305_IETF_ABYTES
21 # define crypto_aead_chacha20poly1305_IETF_ABYTES 16U
24 namespace swift::core::afv::crypto
38 uint sequenceToBeSent, T dto)
40 Q_ASSERT_X(transmitKey.
size() == crypto_aead_chacha20poly1305_IETF_KEYBYTES, Q_FUNC_INFO,
"");
45 msgpack::pack(headerBuffer, header);
47 const auto headerLength =
static_cast<quint16
>(headerBuffer.
buffer().
size());
49 const QByteArray dtoShortName = T::getShortDtoName();
50 const auto dtoNameLength =
static_cast<quint16
>(dtoShortName.
size());
54 msgpack::pack(dtoBuffer, dto);
56 const auto dtoLength =
static_cast<quint16
>(dtoBuffer.
buffer().
size());
58 if (header.
Mode == CryptoDtoMode::AEAD_ChaCha20Poly1305)
62 aePayloadBuffer.
write(
reinterpret_cast<const char *
>(&dtoNameLength),
sizeof(dtoNameLength));
63 aePayloadBuffer.
write(dtoShortName);
64 aePayloadBuffer.
write(
reinterpret_cast<const char *
>(&dtoLength),
sizeof(dtoLength));
66 aePayloadBuffer.
close();
70 adPayloadBuffer.
write(
reinterpret_cast<const char *
>(&headerLength),
sizeof(headerLength));
72 adPayloadBuffer.
close();
75 nonce.
fill(0, crypto_aead_chacha20poly1305_IETF_NPUBBYTES);
79 nonceBuffer.
write(
reinterpret_cast<const char *
>(&
id),
sizeof(
id));
83 unsigned long long clen {};
87 int result = crypto_aead_chacha20poly1305_ietf_encrypt(
88 reinterpret_cast<unsigned char *
>(aeadPayload.
data()), &clen,
89 reinterpret_cast<const unsigned char *
>(aePayloadBuffer.
buffer().
constData()),
90 aePayloadBuffer.
size(),
91 reinterpret_cast<const unsigned char *
>(adPayloadBuffer.
buffer().
constData()),
92 adPayloadBuffer.
size(),
nullptr,
reinterpret_cast<const unsigned char *
>(nonce.
constData()),
93 reinterpret_cast<const unsigned char *
>(transmitKey.
constData()));
94 if (result != 0) {
return {}; }
98 packetBuffer.
write(
reinterpret_cast<const char *
>(&headerLength),
sizeof(headerLength));
100 packetBuffer.
write(aeadPayload);
101 packetBuffer.
close();
103 return packetBuffer.
buffer();
110 template <
typename T>
113 uint sequenceToSend = 0;
125 template <
typename T>
131 msgpack::object_handle oh2 =
133 msgpack::object obj = oh2.get();
QByteArray getTransmitKey(CryptoDtoMode mode)
Transmit key.
QString getChannelTag() const
Channel tag.
static QByteArray serialize(const QString &channelTag, CryptoDtoMode mode, const QByteArray &transmitKey, uint sequenceToBeSent, T dto)
Serialize a DTO.
static Deserializer deserialize(CCryptoDtoChannel &channel, const QByteArray &bytes, bool loopback)
Deserialize.
static QByteArray serialize(CCryptoDtoChannel &channel, CryptoDtoMode mode, T dto)
Serialize a DTO.
#define crypto_aead_chacha20poly1305_IETF_ABYTES
Number of a bytes.
virtual void close() override
virtual bool open(QIODeviceBase::OpenMode flags) override
virtual qint64 size() const const override
const char * constData() const const
QByteArray & fill(char ch, qsizetype size)
qsizetype size() const const
qint64 write(const QByteArray &data)
std::string toStdString() const const
bool m_verified
is verified
QByteArray m_dataBuffer
Data.
quint16 m_headerLength
Header data.
Deserializer(CCryptoDtoChannel &channel, const QByteArray &bytes, bool loopback)
Ctor.
CryptoDtoHeaderDto m_header
Header data.
quint16 m_dataLength
Data.
QByteArray m_dtoNameBuffer
Name data.
quint16 m_dtoNameLength
Name data.