Bitcoin Core 31.99.0
P2P Digital Currency
bip324.h
Go to the documentation of this file.
1// Copyright (c) 2023-present The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#ifndef BITCOIN_BIP324_H
6#define BITCOIN_BIP324_H
7
8#include <array>
9#include <cstddef>
10#include <optional>
11
12#include <crypto/chacha20.h>
14#include <key.h>
15#include <pubkey.h>
16#include <span.h>
17
18static constexpr unsigned BIP324_SHORTIDS_IMPLEMENTED{38};
19
22{
23public:
24 static constexpr unsigned SESSION_ID_LEN{32};
25 static constexpr unsigned GARBAGE_TERMINATOR_LEN{16};
26 static constexpr unsigned REKEY_INTERVAL{224};
27 static constexpr unsigned LENGTH_LEN{3};
28 static constexpr unsigned HEADER_LEN{1};
30 static constexpr std::byte IGNORE_BIT{0x80};
31
32private:
33 std::optional<FSChaCha20> m_send_l_cipher;
34 std::optional<FSChaCha20> m_recv_l_cipher;
35 std::optional<FSChaCha20Poly1305> m_send_p_cipher;
36 std::optional<FSChaCha20Poly1305> m_recv_p_cipher;
37
40
41 std::array<std::byte, SESSION_ID_LEN> m_session_id;
42 std::array<std::byte, GARBAGE_TERMINATOR_LEN> m_send_garbage_terminator;
43 std::array<std::byte, GARBAGE_TERMINATOR_LEN> m_recv_garbage_terminator;
44
45public:
47 BIP324Cipher() = delete;
48
50 BIP324Cipher(const CKey& key, std::span<const std::byte> ent32) noexcept;
51
53 BIP324Cipher(const CKey& key, const EllSwiftPubKey& pubkey) noexcept;
54
56 const EllSwiftPubKey& GetOurPubKey() const noexcept { return m_our_pubkey; }
57
64 void Initialize(const EllSwiftPubKey& their_pubkey, bool initiator, bool self_decrypt = false) noexcept;
65
67 explicit operator bool() const noexcept { return m_send_l_cipher.has_value(); }
68
73 void Encrypt(std::span<const std::byte> contents, std::span<const std::byte> aad, bool ignore, std::span<std::byte> output) noexcept;
74
79 unsigned DecryptLength(std::span<const std::byte> input) noexcept;
80
86 bool Decrypt(std::span<const std::byte> input, std::span<const std::byte> aad, bool& ignore, std::span<std::byte> contents) noexcept;
87
89 std::span<const std::byte> GetSessionID() const noexcept { return m_session_id; }
90
92 std::span<const std::byte> GetSendGarbageTerminator() const noexcept { return m_send_garbage_terminator; }
93
95 std::span<const std::byte> GetReceiveGarbageTerminator() const noexcept { return m_recv_garbage_terminator; }
96};
97
98#endif // BITCOIN_BIP324_H
static constexpr unsigned BIP324_SHORTIDS_IMPLEMENTED
Definition: bip324.h:18
The BIP324 packet cipher, encapsulating its key derivation, stream cipher, and AEAD.
Definition: bip324.h:22
static constexpr unsigned REKEY_INTERVAL
Definition: bip324.h:26
bool Decrypt(std::span< const std::byte > input, std::span< const std::byte > aad, bool &ignore, std::span< std::byte > contents) noexcept
Decrypt a packet.
Definition: bip324.cpp:100
std::span< const std::byte > GetSendGarbageTerminator() const noexcept
Get the Garbage Terminator to send.
Definition: bip324.h:92
static constexpr unsigned GARBAGE_TERMINATOR_LEN
Definition: bip324.h:25
static constexpr unsigned HEADER_LEN
Definition: bip324.h:28
unsigned DecryptLength(std::span< const std::byte > input) noexcept
Decrypt the length of a packet.
Definition: bip324.cpp:89
std::span< const std::byte > GetSessionID() const noexcept
Get the Session ID.
Definition: bip324.h:89
EllSwiftPubKey m_our_pubkey
Definition: bip324.h:39
const EllSwiftPubKey & GetOurPubKey() const noexcept
Retrieve our public key.
Definition: bip324.h:56
static constexpr std::byte IGNORE_BIT
Definition: bip324.h:30
BIP324Cipher()=delete
No default constructor; keys must be provided to create a BIP324Cipher.
std::span< const std::byte > GetReceiveGarbageTerminator() const noexcept
Get the expected Garbage Terminator to receive.
Definition: bip324.h:95
std::optional< FSChaCha20Poly1305 > m_recv_p_cipher
Definition: bip324.h:36
CKey m_key
Definition: bip324.h:38
std::array< std::byte, GARBAGE_TERMINATOR_LEN > m_recv_garbage_terminator
Definition: bip324.h:43
std::array< std::byte, SESSION_ID_LEN > m_session_id
Definition: bip324.h:41
std::array< std::byte, GARBAGE_TERMINATOR_LEN > m_send_garbage_terminator
Definition: bip324.h:42
std::optional< FSChaCha20 > m_recv_l_cipher
Definition: bip324.h:34
static constexpr unsigned LENGTH_LEN
Definition: bip324.h:27
static constexpr unsigned EXPANSION
Definition: bip324.h:29
void Initialize(const EllSwiftPubKey &their_pubkey, bool initiator, bool self_decrypt=false) noexcept
Initialize when the other side's public key is received.
Definition: bip324.cpp:34
std::optional< FSChaCha20Poly1305 > m_send_p_cipher
Definition: bip324.h:35
static constexpr unsigned SESSION_ID_LEN
Definition: bip324.h:24
std::optional< FSChaCha20 > m_send_l_cipher
Definition: bip324.h:33
void Encrypt(std::span< const std::byte > contents, std::span< const std::byte > aad, bool ignore, std::span< std::byte > output) noexcept
Encrypt a packet.
Definition: bip324.cpp:73
An encapsulated private key.
Definition: key.h:37
static constexpr auto EXPANSION
Expansion when encrypting.
An ElligatorSwift-encoded public key.
Definition: pubkey.h:307