seraphis_crypto: remove unused transcript utility
What changed, and why it matters
This commit simply deletes an unused experimental utility for building cryptographic transcripts (data-to-be-hashed) in the Seraphis crypto work area. It removes the source files, the CMake build target, and test-suite links. There is no runtime code change, no bug fix, and no security patch.
No security action needed. Treat as routine dead-code removal.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit removes the src/seraphis_crypto directory (dummy.cpp, sp_transcript.h, CMakeLists.txt) and drops seraphis_crypto from src/CMakeLists.txt and the performance/unit test link lists. sp_transcript.h contained header-only transcript builders (SpTranscriptBuilder, SpFSTranscript, SpKDFTranscript) that were not wired into any active protocol logic. No callers are modified because none existed in the tree at this commit.
Changed components
src/seraphis_crypto/sp_transcript.hsrc/seraphis_crypto/dummy.cppsrc/seraphis_crypto/CMakeLists.txtsrc/CMakeLists.txttests/performance_tests/CMakeLists.txttests/unit_tests/CMakeLists.txtInspect captured patch +0 / −451
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 2bcc653..85116ae 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -94,7 +94,6 @@ add_subdirectory(hardforks)
add_subdirectory(blockchain_db)
add_subdirectory(mnemonics)
add_subdirectory(rpc)
-add_subdirectory(seraphis_crypto)
if(NOT IOS)
add_subdirectory(serialization)
endif()
diff --git a/src/seraphis_crypto/CMakeLists.txt b/src/seraphis_crypto/CMakeLists.txt
deleted file mode 100644
index 19b6ad7..0000000
--- a/src/seraphis_crypto/CMakeLists.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright (c) 2021-2024, The Monero Project
-#
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without modification, are
-# permitted provided that the following conditions are met:
-#
-# 1. Redistributions of source code must retain the above copyright notice, this list of
-# conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright notice, this list
-# of conditions and the following disclaimer in the documentation and/or other
-# materials provided with the distribution.
-#
-# 3. Neither the name of the copyright holder nor the names of its contributors may be
-# used to endorse or promote products derived from this software without specific
-# prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
-# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
-# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
-# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-set(seraphis_crypto_sources
- dummy.cpp)
-
-monero_find_all_headers(seraphis_crypto_headers, "${CMAKE_CURRENT_SOURCE_DIR}")
-
-monero_add_library(seraphis_crypto
- ${seraphis_crypto_sources}
- ${seraphis_crypto_headers})
-
-target_link_libraries(seraphis_crypto
- PUBLIC
- cncrypto
- common
- epee
- ringct
- PRIVATE
- ${EXTRA_LIBRARIES})
-
-target_include_directories(seraphis_crypto
- PUBLIC
- "${CMAKE_CURRENT_SOURCE_DIR}"
- PRIVATE
- ${Boost_INCLUDE_DIRS})
diff --git a/src/seraphis_crypto/dummy.cpp b/src/seraphis_crypto/dummy.cpp
deleted file mode 100644
index e69de29..0000000
diff --git a/src/seraphis_crypto/sp_transcript.h b/src/seraphis_crypto/sp_transcript.h
deleted file mode 100644
index bb99b56..0000000
--- a/src/seraphis_crypto/sp_transcript.h
+++ /dev/null
@@ -1,397 +0,0 @@
-// Copyright (c) 2022-2024, The Monero Project
-//
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification, are
-// permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this list of
-// conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice, this list
-// of conditions and the following disclaimer in the documentation and/or other
-// materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its contributors may be
-// used to endorse or promote products derived from this software without specific
-// prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
-// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
-// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
-// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Transcript class for assembling data that needs to be hashed.
-
-#pragma once
-
-//local headers
-#include "crypto/crypto.h"
-#include "cryptonote_config.h"
-#include "ringct/rctTypes.h"
-#include "wipeable_string.h"
-
-//third party headers
-#include <boost/utility/string_ref.hpp>
-
-//standard headers
-#include <list>
-#include <string>
-#include <type_traits>
-#include <vector>
-
-//forward declarations
-
-
-namespace sp
-{
-
-////
-// SpTranscriptBuilder
-// - build a transcript
-// - the user must provide a label when trying to append something to the transcript; labels are prepended to objects in
-// the transcript
-// - data types
-// - unsigned int: uint_flag || varint(uint_variable)
-// - signed int: int_flag || uchar{int_variable < 0 ? 1 : 0} || varint(abs(int_variable))
-// - byte buffer (assumed little-endian): buffer_flag || buffer_length || buffer
-// - all labels are treated as byte buffers
-// - named container: container_flag || container_name || data_member1 || ... || container_terminator_flag
-// - list-type container (same-type elements only): list_flag || list_length || element1 || element2 || ...
-// - the transcript can be used like a string via the .data() and .size() member functions
-// - simple mode: exclude all labels, flags, and lengths
-///
-class SpTranscriptBuilder final
-{
-public:
-//public member types
- /// transcript builder mode
- enum class Mode
- {
- FULL,
- SIMPLE
- };
-
-//constructors
- /// normal constructor
- SpTranscriptBuilder(const std::size_t estimated_data_size, const Mode mode) :
- m_mode{mode}
- {
- m_transcript.reserve(2 * estimated_data_size + 20);
- }
-
-//overloaded operators
- /// disable copy/move (this is a scoped manager [of the 'transcript' concept])
- SpTranscriptBuilder& operator=(SpTranscriptBuilder&&) = delete;
-
-//member functions
- /// append a value to the transcript
- template <typename T>
- void append(const boost::string_ref label, const T &value)
- {
- this->append_impl(label, value);
- }
-
- /// access the transcript data
- const void* data() const { return m_transcript.data(); }
- std::size_t size() const { return m_transcript.size(); }
-
-private:
-//member variables
- /// in simple mode, exclude labels, flags, and lengths
- Mode m_mode;
- /// the transcript buffer (wipeable in case it contains sensitive data)
- epee::wipeable_string m_transcript;
-
-//private member types
- /// flags for separating items added to the transcript
- enum SpTranscriptBuilderFlag : unsigned char
- {
- UNSIGNED_INTEGER = 0,
- SIGNED_INTEGER = 1,
- BYTE_BUFFER = 2,
- NAMED_CONTAINER = 3,
- NAMED_CONTAINER_TERMINATOR = 4,
- LIST_TYPE_CONTAINER = 5
- };
-
-//transcript builders
- void append_character(const unsigned char character)
- {
- m_transcript += static_cast<char>(character);
- }
- void append_uint(const std::uint64_t unsigned_integer)
- {
- unsigned char v_variable[(sizeof(std::uint64_t) * 8 + 6) / 7];
- unsigned char *v_variable_end = v_variable;
-
- // append uint to string as a varint
- tools::write_varint(v_variable_end, unsigned_integer);
- assert(v_variable_end <= v_variable + sizeof(v_variable));
- m_transcript.append(reinterpret_cast<const char*>(v_variable), v_variable_end - v_variable);
- }
- void append_flag(const SpTranscriptBuilderFlag flag)
- {
- if (m_mode == Mode::SIMPLE)
- return;
-
- static_assert(sizeof(SpTranscriptBuilderFlag) == sizeof(unsigned char), "");
- this->append_character(static_cast<unsigned char>(flag));
- }
- void append_length(const std::size_t length)
- {
- if (m_mode == Mode::SIMPLE)
- return;
-
- static_assert(sizeof(std::size_t) <= sizeof(std::uint64_t), "");
- this->append_uint(static_cast<std::uint64_t>(length));
- }
- void append_buffer(const void *data, const std::size_t length)
- {
- this->append_flag(SpTranscriptBuilderFlag::BYTE_BUFFER);
- this->append_length(length);
- m_transcript.append(reinterpret_cast<const char*>(data), length);
- }
- void append_label(const boost::string_ref label)
- {
- if (m_mode == Mode::SIMPLE ||
- label.size() == 0)
- return;
-
- this->append_buffer(label.data(), label.size());
- }
- void append_labeled_buffer(const boost::string_ref label, const void *data, const std::size_t length)
- {
- this->append_label(label);
- this->append_buffer(data, length);
- }
- void begin_named_container(const boost::string_ref container_name)
- {
- this->append_flag(SpTranscriptBuilderFlag::NAMED_CONTAINER);
- this->append_label(container_name);
- }
- void end_named_container()
- {
- this->append_flag(SpTranscriptBuilderFlag::NAMED_CONTAINER_TERMINATOR);
- }
- void begin_list_type_container(const std::size_t list_length)
- {
- this->append_flag(SpTranscriptBuilderFlag::LIST_TYPE_CONTAINER);
- this->append_length(list_length);
- }
-
-//append overloads
- void append_impl(const boost::string_ref label, const rct::key &key_buffer)
- {
- this->append_labeled_buffer(label, key_buffer.bytes, sizeof(key_buffer));
- }
- void append_impl(const boost::string_ref label, const rct::ctkey &ctkey)
- {
- this->append_label(label);
- this->append_impl("ctmask", ctkey.mask);
- this->append_impl("ctdest", ctkey.dest);
- }
- void append_impl(const boost::string_ref label, const crypto::secret_key &point_buffer)
- {
- this->append_labeled_buffer(label, point_buffer.data, sizeof(point_buffer));
- }
- void append_impl(const boost::string_ref label, const crypto::public_key &scalar_buffer)
- {
- this->append_labeled_buffer(label, scalar_buffer.data, sizeof(scalar_buffer));
- }
- void append_impl(const boost::string_ref label, const crypto::key_derivation &derivation_buffer)
- {
- this->append_labeled_buffer(label, derivation_buffer.data, sizeof(derivation_buffer));
- }
- void append_impl(const boost::string_ref label, const crypto::key_image &key_image_buffer)
- {
- this->append_labeled_buffer(label, key_image_buffer.data, sizeof(key_image_buffer));
- }
- void append_impl(const boost::string_ref label, const std::string &string_buffer)
- {
- this->append_labeled_buffer(label, string_buffer.data(), string_buffer.size());
- }
- void append_impl(const boost::string_ref label, const epee::wipeable_string &string_buffer)
- {
- this->append_labeled_buffer(label, string_buffer.data(), string_buffer.size());
- }
- void append_impl(const boost::string_ref label, const boost::string_ref string_buffer)
- {
- this->append_labeled_buffer(label, string_buffer.data(), string_buffer.size());
- }
- template<std::size_t Sz>
- void append_impl(const boost::string_ref label, const unsigned char(&uchar_buffer)[Sz])
- {
- this->append_labeled_buffer(label, uchar_buffer, Sz);
- }
- template<std::size_t Sz>
- void append_impl(const boost::string_ref label, const char(&char_buffer)[Sz])
- {
- this->append_labeled_buffer(label, char_buffer, Sz);
- }
- void append_impl(const boost::string_ref label, const std::vector<unsigned char> &vector_buffer)
- {
- this->append_labeled_buffer(label, vector_buffer.data(), vector_buffer.size());
- }
- void append_impl(const boost::string_ref label, const std::vector<char> &vector_buffer)
- {
- this->append_labeled_buffer(label, vector_buffer.data(), vector_buffer.size());
- }
- void append_impl(const boost::string_ref label, const char single_character)
- {
- this->append_label(label);
- this->append_character(static_cast<unsigned char>(single_character));
- }
- void append_impl(const boost::string_ref label, const unsigned char single_character)
- {
- this->append_label(label);
- this->append_character(single_character);
- }
- template<typename T,
- std::enable_if_t<std::is_unsigned<T>::value, bool> = true>
- void append_impl(const boost::string_ref label, const T unsigned_integer)
- {
- static_assert(sizeof(T) <= sizeof(std::uint64_t), "SpTranscriptBuilder: unsupported unsigned integer type.");
- this->append_label(label);
- this->append_flag(SpTranscriptBuilderFlag::UNSIGNED_INTEGER);
- this->append_uint(unsigned_integer);
- }
- template<typename T,
- std::enable_if_t<std::is_integral<T>::value, bool> = true,
- std::enable_if_t<!std::is_unsigned<T>::value, bool> = true>
- void append_impl(const boost::string_ref label, const T signed_integer)
- {
- using unsigned_type = std::make_unsigned<T>::type;
- static_assert(sizeof(unsigned_type) <= sizeof(std::uint64_t),
- "SpTranscriptBuilder: unsupported signed integer type.");
- this->append_label(label);
- this->append_flag(SpTranscriptBuilderFlag::SIGNED_INTEGER);
- this->append_uint(static_cast<std::uint64_t>(static_cast<unsigned_type>(signed_integer)));
- }
- template<typename T,
- std::enable_if_t<!std::is_integral<T>::value, bool> = true>
- void append_impl(const boost::string_ref label, const T &named_container)
- {
- // named containers must satisfy two concepts:
- // const boost::string_ref container_name(const T &container);
- // void append_to_transcript(const T &container, SpTranscriptBuilder &transcript_inout);
- //todo: container_name() and append_to_transcript() must be defined in the sp namespace, but that is not generic
- this->append_label(label);
- this->begin_named_container(container_name(named_container));
- append_to_transcript(named_container, *this); //non-member function assumed to be implemented elsewhere
- this->end_named_container();
- }
- template<typename T>
- void append_impl(const boost::string_ref label, const std::vector<T> &list_container)
- {
- this->append_label(label);
- this->begin_list_type_container(list_container.size());
- for (const T &element : list_container)
- this->append_impl("", element);
- }
- template<typename T>
- void append_impl(const boost::string_ref label, const std::list<T> &list_container)
- {
- this->append_label(label);
- this->begin_list_type_container(list_container.size());
- for (const T &element : list_container)
- this->append_impl("", element);
- }
-};
-
-////
-// SpFSTranscript
-// - build a Fiat-Shamir transcript
-// - main format: prefix || domain_separator || object1_label || object1 || object2_label || object2 || ...
-// note: prefix defaults to "monero"
-///
-class SpFSTranscript final
-{
-public:
-//constructors
- /// normal constructor: start building a transcript with the domain separator
- SpFSTranscript(const boost::string_ref domain_separator,
- const std::size_t estimated_data_size,
- const boost::string_ref prefix = config::TRANSCRIPT_PREFIX) :
- m_transcript_builder{15 + domain_separator.size() + estimated_data_size + prefix.size(),
- SpTranscriptBuilder::Mode::FULL}
- {
- // transcript = prefix || domain_separator
- m_transcript_builder.append("FSp", prefix);
- m_transcript_builder.append("ds", domain_separator);
- }
-
-//overloaded operators
- /// disable copy/move (this is a scoped manager [of the 'transcript' concept])
- SpFSTranscript& operator=(SpFSTranscript&&) = delete;
-
-//member functions
- /// build the transcript
- template<typename T>
- void append(const boost::string_ref label, const T &value)
- {
- m_transcript_builder.append(label, value);
- }
-
- /// access the transcript data
- const void* data() const { return m_transcript_builder.data(); }
- std::size_t size() const { return m_transcript_builder.size(); }
-
-//member variables
-private:
- /// underlying transcript builder
- SpTranscriptBuilder m_transcript_builder;
-};
-
-////
-// SpKDFTranscript
-// - build a data string for a key-derivation function
-// - mainly intended for short transcripts (~128 bytes or less) with fixed-length and statically ordered components
-// - main format: prefix || domain_separator || object1 || object2 || ...
-// - simple transcript mode: no labels, flags, or lengths
-// note: prefix defaults to "monero"
-///
-class SpKDFTranscript final
-{
-public:
-//constructors
- /// normal constructor: start building a transcript with the domain separator
- SpKDFTranscript(const boost::string_ref domain_separator,
- const std::size_t estimated_data_size,
- const boost::string_ref prefix = config::TRANSCRIPT_PREFIX) :
- m_transcript_builder{10 + domain_separator.size() + estimated_data_size + prefix.size(),
- SpTranscriptBuilder::Mode::SIMPLE}
- {
- // transcript = prefix || domain_separator
- m_transcript_builder.append("", prefix);
- m_transcript_builder.append("", domain_separator);
- }
-
-//overloaded operators
- /// disable copy/move (this is a scoped manager [of the 'transcript' concept])
- SpKDFTranscript& operator=(SpKDFTranscript&&) = delete;
-
-//member functions
- /// build the transcript
- template<typename T>
- void append(const boost::string_ref, const T &value)
- {
- m_transcript_builder.append("", value);
- }
-
- /// access the transcript data
- const void* data() const { return m_transcript_builder.data(); }
- std::size_t size() const { return m_transcript_builder.size(); }
-
-//member variables
-private:
- /// underlying transcript builder
- SpTranscriptBuilder m_transcript_builder;
-};
-
-} //namespace sp
diff --git a/tests/performance_tests/CMakeLists.txt b/tests/performance_tests/CMakeLists.txt
index a1158fc..4c32e5e 100644
--- a/tests/performance_tests/CMakeLists.txt
+++ b/tests/performance_tests/CMakeLists.txt
@@ -67,7 +67,6 @@ target_link_libraries(performance_tests
common
cncrypto
epee
- seraphis_crypto
${Boost_CHRONO_LIBRARY}
${CMAKE_THREAD_LIBS_INIT}
${EXTRA_LIBRARIES})
diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt
index ed53a54..dc30a24 100644
--- a/tests/unit_tests/CMakeLists.txt
+++ b/tests/unit_tests/CMakeLists.txt
@@ -125,7 +125,6 @@ target_link_libraries(unit_tests
rpc
net
serialization
- seraphis_crypto
wallet
p2p
version
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.