swift
cryptodtoserializer.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2019 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 namespace swift::core::afv::crypto
7 {
9  const QByteArray &bytes, bool loopback)
10  {
11  return Deserializer(channel, bytes, loopback);
12  }
13 
14  CryptoDtoSerializer::Deserializer::Deserializer(CCryptoDtoChannel &channel, const QByteArray &bytes, bool loopback)
15  {
16  QByteArray data(bytes);
17  QBuffer buffer(&data);
18  buffer.open(QIODevice::ReadOnly);
19 
20  buffer.read((char *)&m_headerLength, sizeof(m_headerLength));
21 
22  QByteArray headerBuffer = buffer.read(m_headerLength);
23 
24  msgpack::object_handle oh = msgpack::unpack(headerBuffer.data(), headerBuffer.size());
25  m_header = oh.get().as<CryptoDtoHeaderDto>();
26 
27  if (m_header.Mode == CryptoDtoMode::AEAD_ChaCha20Poly1305)
28  {
29  int aeLength = buffer.size() - (2 + m_headerLength);
30  const QByteArray aePayloadBuffer = buffer.read(aeLength);
31 
32  const QByteArray adBuffer = data.left(2 + m_headerLength);
33 
34  QByteArray nonce;
35  nonce.fill(0, crypto_aead_chacha20poly1305_IETF_NPUBBYTES);
36  QBuffer nonceBuffer(&nonce);
37  nonceBuffer.open(QIODevice::WriteOnly);
38  uint32_t id = 0;
39  nonceBuffer.write(reinterpret_cast<const char *>(&id), sizeof(id));
40  nonceBuffer.write(reinterpret_cast<const char *>(&m_header.Sequence), sizeof(m_header.Sequence));
41  nonceBuffer.close();
42 
43  QByteArray decryptedPayload;
44  unsigned long long mlen = 500;
45  decryptedPayload.fill(0, mlen);
46 
47  QByteArray key;
48  if (loopback) { key = channel.getTransmitKey(CryptoDtoMode::AEAD_ChaCha20Poly1305); }
49  else { key = channel.getReceiveKey(CryptoDtoMode::AEAD_ChaCha20Poly1305); }
50  Q_ASSERT_X(key.size() == crypto_aead_chacha20poly1305_IETF_KEYBYTES, Q_FUNC_INFO, "");
51  int result = crypto_aead_chacha20poly1305_ietf_decrypt(
52  reinterpret_cast<unsigned char *>(decryptedPayload.data()), &mlen, nullptr,
53  reinterpret_cast<const unsigned char *>(aePayloadBuffer.constData()), aePayloadBuffer.size(),
54  reinterpret_cast<const unsigned char *>(adBuffer.constData()), adBuffer.size(),
55  reinterpret_cast<const unsigned char *>(nonce.constData()),
56  reinterpret_cast<const unsigned char *>(key.constData()));
57 
58  if (result == 0)
59  {
60  decryptedPayload.resize(mlen);
61 
62  // FIXME:
63  // if (! channel.checkReceivedSequence(header.Sequence)) { }
64 
65  QBuffer decryptedPayloadBuffer(&decryptedPayload);
66  decryptedPayloadBuffer.open(QIODevice::ReadOnly);
67  decryptedPayloadBuffer.read((char *)&m_dtoNameLength, sizeof(m_dtoNameLength));
68  m_dtoNameBuffer = decryptedPayloadBuffer.read(m_dtoNameLength);
69 
70  decryptedPayloadBuffer.read((char *)&m_dataLength, sizeof(m_dataLength));
71  m_dataBuffer = decryptedPayloadBuffer.read(m_dataLength);
72  m_verified = true;
73  }
74  }
75  }
76 } // namespace swift::core::afv::crypto
QByteArray getReceiveKey(CryptoDtoMode mode)
Receiver key.
QByteArray getTransmitKey(CryptoDtoMode mode)
Transmit key.
static Deserializer deserialize(CCryptoDtoChannel &channel, const QByteArray &bytes, bool loopback)
Deserialize.
Deserializer(CCryptoDtoChannel &channel, const QByteArray &bytes, bool loopback)
Ctor.