Add BLAKE3 cryptographic hash function integration

This commit is contained in:
2025-10-03 03:46:55 +01:00
parent 6ebf65d36d
commit 5a8a8c630f
4 changed files with 113 additions and 0 deletions

1
3rdparty/BLAKE3 vendored Submodule

Submodule 3rdparty/BLAKE3 added at f8dbfe0b18

105
3rdparty/blake3.cmake vendored Normal file
View File

@@ -0,0 +1,105 @@
# BLAKE3 - cryptographic hash function (https://github.com/BLAKE3-team/BLAKE3)
# Lightweight static library integration (pure C + optional assembly) for libaaruformat.
# Option to use hand-written x86-64 assembly when available
option(ENABLE_BLAKE3_ASM "Use hand-written x86-64 assembly for BLAKE3" ON)
set(BLAKE3_C_DIRECTORY "3rdparty/BLAKE3/c")
# Prevent redefinition if included multiple times
if(TARGET blake3)
return()
endif()
message(STATUS "BLAKE3: Building static library (custom minimal integration)")
add_library(blake3 STATIC)
# Core required sources (portable implementation + dispatcher)
set(BLAKE3_CORE_SOURCES
${BLAKE3_C_DIRECTORY}/blake3.c
${BLAKE3_C_DIRECTORY}/blake3_dispatch.c
${BLAKE3_C_DIRECTORY}/blake3_portable.c
)
target_sources(blake3 PRIVATE ${BLAKE3_CORE_SOURCES})
# Architecture-specific optimizations / assembly
if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
# MSVC path: decide between assembly or portable-only (no intrinsics C files if assembly enabled)
if(ENABLE_BLAKE3_ASM AND (CMAKE_SYSTEM_PROCESSOR MATCHES "[Xx]64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64"))
message(STATUS "BLAKE3: Using MSVC x86-64 MASM assembly implementation")
enable_language(ASM_MASM)
target_sources(blake3 PRIVATE
${BLAKE3_C_DIRECTORY}/blake3_avx2_x86-64_windows_msvc.asm
${BLAKE3_C_DIRECTORY}/blake3_avx512_x86-64_windows_msvc.asm
${BLAKE3_C_DIRECTORY}/blake3_sse2_x86-64_windows_msvc.asm
${BLAKE3_C_DIRECTORY}/blake3_sse41_x86-64_windows_msvc.asm)
else()
message(STATUS "BLAKE3: Using portable-only (MSVC minimal) variant")
endif()
else()
# Non-MSVC compilers (Clang/GCC/AppleClang)
if(ENABLE_BLAKE3_ASM AND (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64") AND CMAKE_SIZEOF_VOID_P EQUAL 8)
# Choose correct assembly source variants
if(WIN32)
message(STATUS "BLAKE3: Using x86-64 GNU (Windows) assembly implementation")
set(_BLAKE3_ASM_SOURCES
${BLAKE3_C_DIRECTORY}/blake3_avx2_x86-64_windows_gnu.S
${BLAKE3_C_DIRECTORY}/blake3_avx512_x86-64_windows_gnu.S
${BLAKE3_C_DIRECTORY}/blake3_sse2_x86-64_windows_gnu.S
${BLAKE3_C_DIRECTORY}/blake3_sse41_x86-64_windows_gnu.S)
else()
message(STATUS "BLAKE3: Using x86-64 UNIX assembly implementation")
set(_BLAKE3_ASM_SOURCES
${BLAKE3_C_DIRECTORY}/blake3_avx2_x86-64_unix.S
${BLAKE3_C_DIRECTORY}/blake3_avx512_x86-64_unix.S
${BLAKE3_C_DIRECTORY}/blake3_sse2_x86-64_unix.S
${BLAKE3_C_DIRECTORY}/blake3_sse41_x86-64_unix.S)
endif()
# Enable generic ASM language (GNU/Clang handle preprocessed .S automatically, but be explicit)
enable_language(ASM)
target_sources(blake3 PRIVATE ${_BLAKE3_ASM_SOURCES})
unset(_BLAKE3_ASM_SOURCES)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i386" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
# Fallback to intrinsics C sources (no assembly or disabled)
message(STATUS "BLAKE3: Enabling x86/x64 intrinsics (SSE2,SSE4.1,AVX2,AVX512*)")
target_sources(blake3 PRIVATE
${BLAKE3_C_DIRECTORY}/blake3_sse2.c
${BLAKE3_C_DIRECTORY}/blake3_sse41.c
${BLAKE3_C_DIRECTORY}/blake3_avx2.c)
set_source_files_properties(${BLAKE3_C_DIRECTORY}/blake3_sse2.c PROPERTIES COMPILE_OPTIONS "-msse2")
set_source_files_properties(${BLAKE3_C_DIRECTORY}/blake3_sse41.c PROPERTIES COMPILE_OPTIONS "-msse4.1")
set_source_files_properties(${BLAKE3_C_DIRECTORY}/blake3_avx2.c PROPERTIES COMPILE_OPTIONS "-mavx2")
if(NOT CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
target_sources(blake3 PRIVATE ${BLAKE3_C_DIRECTORY}/blake3_avx512.c)
set_source_files_properties(${BLAKE3_C_DIRECTORY}/blake3_avx512.c PROPERTIES COMPILE_OPTIONS "-mavx512f;-mavx512vl")
endif()
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "arm64")
message(STATUS "BLAKE3: Enabling NEON for AArch64")
target_sources(blake3 PRIVATE ${BLAKE3_C_DIRECTORY}/blake3_neon.c)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
message(STATUS "BLAKE3: Attempting NEON on 32-bit ARM")
target_sources(blake3 PRIVATE ${BLAKE3_C_DIRECTORY}/blake3_neon.c)
target_compile_options(blake3 PRIVATE -mfpu=neon)
else()
message(STATUS "BLAKE3: Unknown arch -> portable only")
endif()
endif()
# Public include for blake3.h
target_include_directories(blake3 PUBLIC ${BLAKE3_C_DIRECTORY})
# PIC for inclusion into shared library
set_property(TARGET blake3 PROPERTY POSITION_INDEPENDENT_CODE TRUE)
# Optimize in Release
if(CMAKE_BUILD_TYPE STREQUAL "Release")
if(MSVC)
target_compile_options(blake3 PRIVATE /O2)
else()
target_compile_options(blake3 PRIVATE -O3 -ffast-math)
endif()
endif()
# Do NOT link aaruformat here; top-level handles linkage.