8 #include "sodium/crypto_aead_chacha20poly1305.h"
14 namespace swift::core::afv::crypto
17 : m_aeadTransmitKey(channelConfig.aeadTransmitKey), m_aeadReceiveKey(channelConfig.aeadReceiveKey),
18 m_receiveSequenceSizeMaxSize(receiveSequenceHistorySize), m_hmacKey(channelConfig.hmacKey),
19 m_channelTag(channelConfig.channelTag)
21 if (m_aeadTransmitKey.size() != crypto_aead_chacha20poly1305_IETF_KEYBYTES)
24 throw std::invalid_argument(
"wrong transmit key size");
27 if (m_aeadReceiveKey.size() != crypto_aead_chacha20poly1305_IETF_KEYBYTES)
30 throw std::invalid_argument(
"wrong receive key size");
33 m_receiveSequenceSizeMaxSize = std::max(m_receiveSequenceSizeMaxSize, 1);
34 m_receiveSequenceHistory.fill(0, m_receiveSequenceSizeMaxSize);
35 m_receiveSequenceHistoryDepth = 0;
42 case CryptoDtoMode::AEAD_ChaCha20Poly1305:
return m_aeadTransmitKey;
43 case CryptoDtoMode::Undefined:
44 case CryptoDtoMode::None:
45 SWIFT_VERIFY_X(
false, Q_FUNC_INFO,
"GetTransmitKey called with wrong argument.");
54 sequenceToSend = m_transmitSequence;
56 m_LastTransmitUtc = QDateTime::currentDateTimeUtc();
60 case CryptoDtoMode::AEAD_ChaCha20Poly1305:
return m_aeadTransmitKey;
61 case CryptoDtoMode::Undefined:
62 case CryptoDtoMode::None:
63 SWIFT_VERIFY_X(
false, Q_FUNC_INFO,
"GetTransmitKey called with wrong argument.");
76 case CryptoDtoMode::AEAD_ChaCha20Poly1305:
return m_aeadReceiveKey;
77 case CryptoDtoMode::Undefined:
78 case CryptoDtoMode::None:
79 SWIFT_VERIFY_X(
false, Q_FUNC_INFO,
"GetReceiveKey called with wrong argument.");
88 if (contains(sequenceReceived))
94 if (m_receiveSequenceHistoryDepth < m_receiveSequenceSizeMaxSize)
96 m_receiveSequenceHistory[m_receiveSequenceHistoryDepth++] = sequenceReceived;
101 uint minValue = getMin(minIndex);
102 if (sequenceReceived < minValue) {
return false; }
103 m_receiveSequenceHistory[minIndex] = sequenceReceived;
106 m_lastReceiveUtc = QDateTime::currentDateTimeUtc();
110 bool CCryptoDtoChannel::contains(uint sequence)
const
112 for (
int i = 0; i < m_receiveSequenceHistoryDepth; i++)
114 if (m_receiveSequenceHistory[i] == sequence) {
return true; }
119 uint CCryptoDtoChannel::getMin(
int &minIndex)
const
121 uint minValue = std::numeric_limits<uint>::max();
125 for (
int i = 0; i < m_receiveSequenceHistoryDepth; i++)
128 if (m_receiveSequenceHistory[i] <= minValue)
130 minValue = m_receiveSequenceHistory[i];
QByteArray getReceiveKey(CryptoDtoMode mode)
Receiver key.
bool checkReceivedSequence(uint sequenceReceived)
check the received sequence
QByteArray getTransmitKey(CryptoDtoMode mode)
Transmit key.
QString getChannelTag() const
Channel tag.
Free functions in swift::misc.
#define SWIFT_AUDIT_X(COND, WHERE, WHAT)
A weaker kind of verify.
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.