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,
"");
41 const CryptoDtoHeaderDto header = { channelTag.toStdString(), sequenceToBeSent, mode };
44 headerBuffer.open(QIODevice::WriteOnly);
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());
53 dtoBuffer.open(QIODevice::WriteOnly);
54 msgpack::pack(dtoBuffer, dto);
56 const auto dtoLength =
static_cast<quint16
>(dtoBuffer.buffer().size());
58 if (header.
Mode == CryptoDtoMode::AEAD_ChaCha20Poly1305)
60 QBuffer aePayloadBuffer;
61 aePayloadBuffer.open(QIODevice::WriteOnly);
62 aePayloadBuffer.write(
reinterpret_cast<const char *
>(&dtoNameLength),
sizeof(dtoNameLength));
63 aePayloadBuffer.write(dtoShortName);
64 aePayloadBuffer.write(
reinterpret_cast<const char *
>(&dtoLength),
sizeof(dtoLength));
65 aePayloadBuffer.write(dtoBuffer.buffer());
66 aePayloadBuffer.close();
68 QBuffer adPayloadBuffer;
69 adPayloadBuffer.open(QIODevice::WriteOnly);
70 adPayloadBuffer.write(
reinterpret_cast<const char *
>(&headerLength),
sizeof(headerLength));
71 adPayloadBuffer.write(headerBuffer.buffer());
72 adPayloadBuffer.close();
75 nonce.fill(0, crypto_aead_chacha20poly1305_IETF_NPUBBYTES);
76 QBuffer nonceBuffer(&nonce);
77 nonceBuffer.open(QIODevice::WriteOnly);
79 nonceBuffer.write(
reinterpret_cast<const char *
>(&
id),
sizeof(
id));
80 nonceBuffer.write(
reinterpret_cast<const char *
>(&header.
Sequence),
sizeof(header.
Sequence));
83 unsigned long long clen {};
84 QByteArray aeadPayload;
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 {}; }
97 packetBuffer.open(QIODevice::WriteOnly);
98 packetBuffer.write(
reinterpret_cast<const char *
>(&headerLength),
sizeof(headerLength));
99 packetBuffer.write(headerBuffer.buffer());
100 packetBuffer.write(aeadPayload);
101 packetBuffer.close();
103 return packetBuffer.buffer();
110 template <
typename T>
113 uint sequenceToSend = 0;
114 QByteArray transmitKey = channel.
getTransmitKey(mode, sequenceToSend);
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.
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.