Skip to content

Commit f5067ad

Browse files
committed
FCMP++: Rust FFI + crypto conversion selene_scalar_from_bytes
1 parent f9f16c7 commit f5067ad

File tree

9 files changed

+979
-5
lines changed

9 files changed

+979
-5
lines changed

src/fcmp_pp/CMakeLists.txt

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,42 @@
2929
set(fcmp_pp_sources
3030
curve_trees.cpp
3131
fcmp_pp_crypto.cpp
32-
fcmp_pp_types.cpp)
32+
fcmp_pp_types.cpp
33+
tower_cycle.cpp)
3334

3435
monero_find_all_headers(fcmp_pp_headers "${CMAKE_CURRENT_SOURCE_DIR}")
3536

3637
add_subdirectory(fcmp_pp_rust)
3738

38-
monero_add_library(fcmp_pp
39-
${fcmp_pp_sources}
40-
${fcmp_pp_headers})
39+
monero_add_library_with_deps(
40+
NAME fcmp_pp
41+
DEPENDS fcmp_pp_rust
42+
SOURCES
43+
${fcmp_pp_sources}
44+
${fcmp_pp_headers})
45+
46+
if(WIN32)
47+
set(EXTRA_RUST_LIBRARIES ws2_32 ntdll userenv)
48+
else()
49+
set(EXTRA_RUST_LIBRARIES )
50+
endif()
4151

4252
target_link_libraries(fcmp_pp
4353
PUBLIC
4454
cncrypto
4555
PRIVATE
46-
${EXTRA_LIBRARIES})
56+
${CMAKE_CURRENT_BINARY_DIR}/fcmp_pp_rust/libfcmp_pp_rust.a
57+
${EXTRA_LIBRARIES}
58+
${EXTRA_RUST_LIBRARIES})
59+
60+
# Try compiling C file ffi_api_c_compat.c which includes fcmp++.h, and throw an error if C compilation fails
61+
try_compile(FFI_API_C_COMPAT_RES
62+
"${CMAKE_CURRENT_BINARY_DIR}/fcmp_ffi_c"
63+
"${CMAKE_CURRENT_SOURCE_DIR}/ffi_api_c_compat.c"
64+
CMAKE_FLAGS -DCMAKE_C_STANDARD=11
65+
COMPILE_DEFINITIONS -I"${CMAKE_CURRENT_SOURCE_DIR}/fcmp_pp_rust"
66+
OUTPUT_VARIABLE FFI_API_C_COMPAT_OUTPUT)
67+
if(NOT FFI_API_C_COMPAT_RES)
68+
message(SEND_ERROR "Error compiling ffi_api_c_compat.c: ${FFI_API_C_COMPAT_OUTPUT}")
69+
message(FATAL_ERROR "The FCMP++ FFI API header 'fcmp++.h' has broken compatibility with C")
70+
endif()
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# If a developer runs cargo build inside this sub-directory to only work with
2+
# the Rust side of things, they'll create this target directory which shouldn't
3+
# be committed
4+
target

src/fcmp_pp/fcmp_pp_rust/CMakeLists.txt

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,101 @@
2525
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
2626
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
2727
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28+
29+
if(ARCH_ID MATCHES "x86-64" OR ARCH_ID MATCHES "amd64")
30+
set(RUST_ARCH "x86_64")
31+
elseif(ARCH_ID MATCHES "(arm64|armv8a|armv8-a)")
32+
set(RUST_ARCH "aarch64")
33+
elseif(ARCH_ID MATCHES "armv7-a")
34+
set(RUST_ARCH "armv7")
35+
elseif(ARCH_ID MATCHES "i386")
36+
set(RUST_ARCH "i686")
37+
elseif(ARCH_ID MATCHES "riscv64")
38+
set(RUST_ARCH "riscv64gc")
39+
else()
40+
set(RUST_ARCH "${ARCH_ID}")
41+
endif()
42+
43+
if(MINGW)
44+
set(RUST_PLATFORM "pc-windows")
45+
set(RUST_TOOLCHAIN "-gnu")
46+
elseif(MSVC)
47+
set(RUST_PLATFORM "pc-windows")
48+
set(RUST_TOOLCHAIN "-msvc")
49+
elseif(APPLE)
50+
set(RUST_PLATFORM "apple-darwin")
51+
set(RUST_TOOLCHAIN "")
52+
elseif(FREEBSD)
53+
set(RUST_PLATFORM "unknown-freebsd")
54+
set(RUST_TOOLCHAIN "")
55+
elseif(OPENBSD)
56+
set(RUST_PLATFORM "unknown-openbsd")
57+
set(RUST_TOOLCHAIN "")
58+
elseif(ANDROID)
59+
set(RUST_PLATFORM "linux-android")
60+
if(RUST_ARCH MATCHES "(arm|armv7)")
61+
set(RUST_TOOLCHAIN "eabi")
62+
else()
63+
set(RUST_TOOLCHAIN "")
64+
endif()
65+
elseif(DRAGONFLY)
66+
set(RUST_PLATFORM "unknown-dragonfly")
67+
set(RUST_TOOLCHAIN "")
68+
elseif(CMAKE_SYSTEM_NAME MATCHES "(SunOS|Solaris)")
69+
if(RUST_ARCH MATCHES "x86_64")
70+
set(RUST_PLATFORM "pc-solaris")
71+
set(RUST_TOOLCHAIN "")
72+
elseif(RUST_ARCH MATCHES "sparcv9")
73+
set(RUST_PLATFORM "sun-solaris")
74+
set(RUST_TOOLCHAIN "")
75+
endif()
76+
else()
77+
set(RUST_PLATFORM "unknown-linux")
78+
if(RUST_ARCH MATCHES "armv7")
79+
# Rust does support non-HF, yet Monero assumes HF for armv7
80+
set(RUST_TOOLCHAIN "-gnueabihf")
81+
else()
82+
set(RUST_TOOLCHAIN "-gnu")
83+
endif()
84+
endif()
85+
86+
set(RUST_TARGET "${RUST_ARCH}-${RUST_PLATFORM}${RUST_TOOLCHAIN}")
87+
message(STATUS "Using Rust target ${RUST_TARGET}")
88+
89+
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
90+
if(SANITIZE)
91+
message(STATUS "Using Rust ASAN")
92+
# Rust ASAN is an experimental feature included in nightly at time of writing
93+
set(CARGO_CMD RUSTFLAGS=-Zsanitizer=address cargo +nightly build --target "${RUST_TARGET}")
94+
else()
95+
set(CARGO_CMD cargo build --target "${RUST_TARGET}")
96+
endif()
97+
set(TARGET_DIR "debug")
98+
else ()
99+
set(CARGO_CMD cargo build --target "${RUST_TARGET}" --release)
100+
set(TARGET_DIR "release")
101+
endif ()
102+
103+
set(FCMP_PP_RUST_HEADER_DIR "${MONERO_GENERATED_HEADERS_DIR}/fcmp_pp_rust")
104+
set(FCMP_PP_RUST_HEADER "${FCMP_PP_RUST_HEADER_DIR}/fcmp++.h")
105+
set(FCMP_PP_RUST_LIB "${CMAKE_CURRENT_BINARY_DIR}/libfcmp_pp_rust.a")
106+
107+
# Removing OUTPUT files makes sure custom command runs every time
108+
file(REMOVE_RECURSE "${FCMP_PP_RUST_HEADER_DIR}")
109+
file(MAKE_DIRECTORY "${FCMP_PP_RUST_HEADER_DIR}")
110+
111+
file(REMOVE "${FCMP_PP_RUST_LIB}")
112+
113+
add_custom_command(
114+
COMMENT "Building fcmp++ rust lib"
115+
OUTPUT ${FCMP_PP_RUST_HEADER}
116+
OUTPUT ${FCMP_PP_RUST_LIB}
117+
COMMAND ${CMAKE_COMMAND} -E env CARGO_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR} ${CARGO_CMD}
118+
COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/fcmp++.h ${FCMP_PP_RUST_HEADER}
119+
COMMAND cp ${CMAKE_CURRENT_BINARY_DIR}/${RUST_TARGET}/${TARGET_DIR}/libfcmp_pp_rust.a ${FCMP_PP_RUST_LIB}
120+
COMMAND echo "Finished copying fcmp++ rust targets"
121+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
122+
VERBATIM
123+
)
124+
125+
add_custom_target(fcmp_pp_rust DEPENDS ${FCMP_PP_RUST_LIB})

0 commit comments

Comments
 (0)