Packages
Signal Protocol cryptographic primitives NIF implementation
Current section
Files
Jump to
Current section
Files
c_src/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(signal_nif C)
# Set C standard
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
# Find libsodium with better error handling
find_package(PkgConfig REQUIRED)
pkg_check_modules(SODIUM REQUIRED libsodium)
if(NOT SODIUM_FOUND)
message(FATAL_ERROR "libsodium not found. Please install libsodium-dev (Ubuntu/Debian) or libsodium (macOS)")
endif()
# Use pkg-config results
include_directories(${SODIUM_INCLUDE_DIRS})
link_directories(${SODIUM_LIBRARY_DIRS})
set(SODIUM_LIBRARIES ${SODIUM_LIBRARIES})
# OpenSSL provides AES-256-CBC (libsodium does not). Used by the Signal-spec
# DR AEAD construction (AES-256-CBC + HMAC-SHA-256 + PKCS#7).
# On macOS with Homebrew openssl@3 is keg-only; CMake's FindOpenSSL needs a
# hint when the brew install isn't on the default search path.
if(APPLE AND NOT DEFINED OPENSSL_ROOT_DIR)
execute_process(
COMMAND brew --prefix openssl@3
OUTPUT_VARIABLE _BREW_OPENSSL_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE _BREW_OPENSSL_RESULT
)
if(_BREW_OPENSSL_RESULT EQUAL 0)
set(OPENSSL_ROOT_DIR "${_BREW_OPENSSL_PREFIX}")
endif()
endif()
find_package(OpenSSL REQUIRED)
# Detect Erlang include directory automatically
execute_process(
COMMAND erl -noshell -eval "io:format(\"~s\", [code:root_dir()]), halt()."
OUTPUT_VARIABLE ERLANG_ROOT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Try different possible Erlang include paths
set(ERLANG_INCLUDE_DIR "${ERLANG_ROOT}/usr/include")
if(NOT EXISTS "${ERLANG_INCLUDE_DIR}")
set(ERLANG_INCLUDE_DIR "${ERLANG_ROOT}/include")
endif()
# Add include directories
include_directories(${ERLANG_INCLUDE_DIR})
# Add source files - use the fixed version
add_library(signal_nif SHARED
signal_nif.c
)
# Add the libsignal_protocol_nif library
add_library(libsignal_protocol_nif SHARED
libsignal_protocol_nif.c
dr.c
dr_chain.c
dr_crypto.c
dr_proto.c
keys.c
pksm.c
session.c
)
# Link libsodium to all libraries; OpenSSL only needed by the DR AEAD in
# libsignal_protocol_nif.
target_link_libraries(signal_nif ${SODIUM_LIBRARIES})
target_link_libraries(libsignal_protocol_nif ${SODIUM_LIBRARIES} OpenSSL::Crypto)
# Remove explicit erl_nif linking; use dynamic lookup on macOS
if(APPLE)
target_link_options(signal_nif PRIVATE "-undefined" "dynamic_lookup")
target_link_options(libsignal_protocol_nif PRIVATE "-undefined" "dynamic_lookup")
endif()
# Set output directory and name for signal_nif
set_target_properties(signal_nif PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/../priv"
OUTPUT_NAME "signal_nif"
PREFIX "" # Remove the "lib" prefix
)
# Set output directory and name for libsignal_protocol_nif
set_target_properties(libsignal_protocol_nif PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/../priv"
OUTPUT_NAME "libsignal_protocol_nif"
PREFIX "" # Remove the "lib" prefix
)
# Set compile flags based on platform.
# Note: BEAM expects .so for NIFs on macOS too, so APPLE is intentionally
# folded into the UNIX branch — do not split out a .dylib case.
if(UNIX)
set_target_properties(signal_nif PROPERTIES
SUFFIX ".so"
)
set_target_properties(libsignal_protocol_nif PROPERTIES
SUFFIX ".so"
)
elseif(WIN32)
set_target_properties(signal_nif PROPERTIES
SUFFIX ".dll"
)
set_target_properties(libsignal_protocol_nif PROPERTIES
SUFFIX ".dll"
)
endif()