Skip to content

trustedpeer/CanonicalTrustCodec.hpp

Bounded canonical byte primitives for trusted-policy identities.

Namespaces

Name
sgns
sgns::trustedpeer

Classes

Name
class sgns::trustedpeer::CanonicalTrustCodec
class sgns::trustedpeer::CanonicalTrustCodec::Writer
class sgns::trustedpeer::CanonicalTrustCodec::Reader

Source code

#ifndef SUPERGENIUS_CANONICAL_TRUST_CODEC_HPP
#define SUPERGENIUS_CANONICAL_TRUST_CODEC_HPP

#include <cstddef>
#include <cstdint>
#include <optional>
#include <string>
#include <string_view>
#include <vector>

#include <gsl/span>

namespace sgns::trustedpeer
{
    class CanonicalTrustCodec
    {
    public:
        static constexpr std::string_view GENESIS_DOMAIN    = "SGNS_TRUST_GENESIS_V1";
        static constexpr size_t           MAX_TRUSTED_PEERS = 256;
        static constexpr size_t           PUBLIC_KEY_BYTES  = 64;

        class Writer
        {
        public:
            void               WriteU8( uint8_t value );
            void               WriteU16( uint16_t value );
            void               WriteU32( uint32_t value );
            void               WriteU64( uint64_t value );
            void               WriteBytes( gsl::span<const uint8_t> bytes );
            void               WriteBytes( std::string_view bytes );
            [[nodiscard]] bool WriteLengthPrefixedBytes( gsl::span<const uint8_t> bytes );

            [[nodiscard]] std::vector<uint8_t> Take();

        private:
            std::vector<uint8_t> bytes_;
        };

        class Reader
        {
        public:
            explicit Reader( gsl::span<const uint8_t> bytes );

            [[nodiscard]] std::optional<uint8_t>              ReadU8();
            [[nodiscard]] std::optional<uint16_t>             ReadU16();
            [[nodiscard]] std::optional<uint32_t>             ReadU32();
            [[nodiscard]] std::optional<uint64_t>             ReadU64();
            [[nodiscard]] std::optional<std::vector<uint8_t>> ReadBytes( size_t length );
            [[nodiscard]] std::optional<std::vector<uint8_t>> ReadLengthPrefixedBytes( size_t maximum_length );
            [[nodiscard]] bool                                Exhausted() const;

        private:
            gsl::span<const uint8_t> bytes_;
            size_t                   offset_ = 0;
        };

        [[nodiscard]] static std::optional<std::vector<uint8_t>> DecodePublicKey( std::string_view public_key );
        [[nodiscard]] static std::string                         EncodePublicKey( gsl::span<const uint8_t> public_key );
        [[nodiscard]] static std::optional<std::vector<std::string>> NormalizePublicKeys(
            const std::vector<std::string> &public_keys );
        [[nodiscard]] static std::string Sha256Hex( gsl::span<const uint8_t> canonical_bytes );
    };
} // namespace sgns::trustedpeer

#endif // SUPERGENIUS_CANONICAL_TRUST_CODEC_HPP

Updated on 2026-09-25 at 15:46:12 +0000