Skip to content

framing/frame_cipher.hpp

Namespaces

Name
rlpx
rlpx::framing

Classes

Name
struct rlpx::framing::FrameEncryptParams
struct rlpx::framing::FrameDecryptParams
class rlpx::framing::FrameCipher

Source code

// Copyright 2025 GeniusVentures
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include "../rlpx_types.hpp"
#include "../rlpx_error.hpp"
#include "../auth/auth_keys.hpp"
#include <memory>

namespace rlpx::framing {

// Frame encryption parameters
struct FrameEncryptParams {
    ByteView frame_data;
    bool is_first_frame;
};

// Frame decryption parameters
struct FrameDecryptParams {
    ByteView header_ciphertext;
    ByteView header_mac;
    ByteView frame_ciphertext;
    ByteView frame_mac;
};

// Frame cipher for RLPx message encryption
class FrameCipher {
public:
    // Initialize with secrets from handshake
    explicit FrameCipher(const auth::FrameSecrets& secrets) noexcept;

    ~FrameCipher();

    // Encrypt frame: returns [header || header_mac || frame || frame_mac]
    [[nodiscard]] FramingResult<ByteBuffer>
    encrypt_frame(const FrameEncryptParams& params) noexcept;

    // Decrypt header to get frame size
    [[nodiscard]] FramingResult<size_t>
    decrypt_header(
        gsl::span<const uint8_t, kFrameHeaderSize> header_ciphertext,
        gsl::span<const uint8_t, kMacSize> header_mac
    ) noexcept;

    [[nodiscard]] FramingResult<ByteBuffer>
    decrypt_frame(const FrameDecryptParams& params) noexcept;

    [[nodiscard]] FramingResult<ByteBuffer>
    decrypt_frame_body(size_t fsize,
                       ByteView frame_ct_padded,
                       ByteView frame_mac) noexcept;

    // Return const reference to secrets (grouped values)
    [[nodiscard]] const auth::FrameSecrets& secrets() const noexcept {
        return secrets_;
    }

private:
    // Update rolling MAC state — legacy stubs, logic now in FrameCipherImpl
    void update_egress_mac(ByteView data) noexcept;
    void update_ingress_mac(ByteView data) noexcept;

    [[nodiscard]] MacDigest compute_header_mac(ByteView header_ct) noexcept;
    [[nodiscard]] MacDigest compute_frame_mac(ByteView frame_ct) noexcept;

    auth::FrameSecrets secrets_;

    struct FrameCipherImpl;
    std::unique_ptr<FrameCipherImpl> impl_;  
};

} // namespace rlpx::framing

Updated on 2026-04-13 at 23:22:46 -0700