Skip to content

Jostle Support for Windows #5

@Ali-Sayedsalehi

Description

@Ali-Sayedsalehi

We have been building jostle on Windows. I will share our build steps below in case it helps others build it on Windows.

Update to CMakeLists.txt:

    elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")

    #
    # Windows
    #
    SET(OPTIONS "-O2")
    SET(OPEN_SSL_LIB "${OPENSSL_PREFIX}/lib64/libcrypto.lib")
    SET(OPEN_SSL_DLL "${OPENSSL_PREFIX}/lib64/libcrypto-3-x64.dll")
    SET(INSTALL_PATH "${JAVA_PRJ_HOME}/jostle/src/main/resources/native/windows/amd64/")
    SET(JNI_INCLUDE "${JAVA_HOME}/include/" "${JAVA_HOME}/include/win32" "${JAVA_PRJ_HOME}/jostle/build/generated/sources/headers/java/main")

    add_library(interface_jni SHARED
            jni/native_info_jni.c
            jni/open_ssl_jni.c
            jni/block_cipher_ni_jni.c
            jni/spec_ni_jni.c
            jni/mldsa_ni_jni.c
            jni/slhdsa_ni_jni.c
            jni/mlkem_ni_jni.c
            jni/asn1_ni_jni.c
            util/mldsa.h
            util/mldsa.c
            util/slhdsa.h
            util/slhdsa.c
            util/mlkem.h
            util/mlkem.c
            util/encapdecap.h
            util/encapdecap.c
            util/block_cipher_ctx.h
            util/block_cipher_ctx.c
            util/ctr_u128_t.h
            util/ctr_u128_t.c
            util/bc_err_codes.h
            util/key_spec.c
            util/key_spec.h
            jni/byte_array_critical.c
            jni/byte_array_critical.h
            jni/bytearrays.c
            jni/bytearrays.h
            util/asn1_util.c
            util/asn1_util.h
            util/ops.h
            util/ops.c
            jni/ops.c
    )

    target_include_directories(interface_jni PUBLIC "${OPENSSL_PREFIX}/include" "${JNI_INCLUDE}")
    target_link_libraries(interface_jni PUBLIC "${OPEN_SSL_LIB}")
    target_compile_options(interface_jni PRIVATE /W4 /O2)
    if (DEFINED ENV{JOSTLE_OPS_TEST})
        target_compile_definitions(interface_jni PUBLIC JOSTLE_OPS)
    endif ()

    add_library(interface_ffi SHARED
            ffi/ffi.h
            ffi/ffi.c
            ffi/types.h
            ffi/native_info_ffi.h
            ffi/native_info_ffi.c
            ffi/openssl_ffi.h
            ffi/openssl_ffi.c
            ffi/block_cipher_ni_ffi.c
            ffi/spec_ni_ffi.c
            ffi/mldsa_ni_ffi.c
            ffi/mlkem_ni_ffi.c
            ffi/slh_dsa_ni_ffi.c
            ffi/asn1_ni_ffi.c
            util/mldsa.h
            util/mldsa.c
            util/slhdsa.h
            util/slhdsa.c
            util/mlkem.h
            util/mlkem.c
            util/encapdecap.h
            util/encapdecap.c
            util/block_cipher_ctx.h
            util/block_cipher_ctx.c
            util/ctr_u128_t.h
            util/ctr_u128_t.c
            util/bc_err_codes.h
            util/key_spec.c
            util/key_spec.h
            util/asn1_util.c
            util/asn1_util.h
            util/ops.h
            util/ops.c
    )

    set_target_properties(interface_ffi PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)

    target_include_directories(interface_ffi PUBLIC "${OPENSSL_PREFIX}/include")
    target_link_libraries(interface_ffi PUBLIC "${OPEN_SSL_LIB}")
    target_compile_options(interface_ffi PRIVATE /W4 /O2)
    if (DEFINED ENV{JOSTLE_OPS_TEST})
        target_compile_definitions(interface_ffi PUBLIC JOSTLE_OPS)
    endif ()

    install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/loading/native" DESTINATION "${JAVA_PRJ_HOME}/jostle/src/main/resources")
    install(TARGETS interface_jni RUNTIME DESTINATION ${INSTALL_PATH})
    install(TARGETS interface_ffi RUNTIME DESTINATION ${INSTALL_PATH})
    install(FILES "${OPEN_SSL_DLL}" DESTINATION ${INSTALL_PATH})

endif ()

Changes to interface/loading/native/resolutions.txt:

#
# Windows amd64
#
"^Windows.*" "^amd64" "/native/windows/amd64"

We also add this file:
interface/loading/native/windows/amd64/deps.txt

OSSL:libcrypto-3-x64.dll

JNI:interface_jni.dll
FFI:interface_ffi.dll

How we build native libraries:

cd interface
mkdir build
cd build
cmake  -DCMAKE_BUILD_TYPE=Release -G "Ninja" -DCMAKE_C_COMPILER=clang-cl ..
cmake --build . --config Release
cmake --install . --config Release

Dumpinfo:

DumpInfo

Provider:
  Info: Jostle Provider for OpenSSL v1.0.0-SNAPSHOT
  Name: JSL
  OS: Windows 11
  Version: 10.0
  Arch: amd64
  Java Version: 25
  Java Vendor: Eclipse Adoptium

Loader:
  Load Attempted: true
  Load Successful: true
  Loader Message: Loader Finished Successfully
  Loader Interface Resolution Strategy: auto
  Loader Interface: FFI
  Loaded Native Libraries:
    Extracted: /native/windows/amd64/libcrypto-3-x64.dll
    Extracted: /native/windows/amd64/interface_ffi.dll

Native Status:
  Native Available: true
  OpenSSL Version: 3.6.0-dev
.END
Use: -fine to emit FINE level logs

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions