liboqs/tests/system_info.c
Pravek Sharma e520ec1c38
Integrate Kyber from libjade (#1745)
* Add copy_from_libjade.yml

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Modify copy_from_upstream.py

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Add patches for libjade Kyber code

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update alg_support.cmake templates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update KEM famiy templates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Fix copy_from_upstream.py

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Correct copy_from_upstream.py

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Modify copy_from_upstream.yml

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update KEM family templates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Fix copy_from_upstream.py

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Fix KEM family templates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Fix KEM family templates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update templates for build system files

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update build system files

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Fix add_enable_by_alg_conditional.libjade

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Run copy_from_upstream.py

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update KEM family templates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update KEM templates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update KEM templates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update copy_from_upstream.yml with libjade implementation info

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update KEM templates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Edit KEM templates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Run copy_from_upstream.py

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update copy_from_upstream.py

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Fix KEM temlates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Run copy_from_upstream.py

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Add libjade_shim

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Add jasmin/libjade namespaces to test_binary.py

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update testing

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Allow manually triggering CI tests

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Change container for upstreamcheck in unix.yml

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update copy_from_upstream.py

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Edit unix.yml

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Edit unix.yml

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Restrict copying of code from libjade repo to relevant files

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Remove irrelevant libjade code

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Remove redundant KEM templates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update KEM template to accomodate new dir structure

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Debug: tweak unix.yml

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Re-build libjade with jasmin version used in CI

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Debug: undo unix.yml tweak

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Allow MSVC to ignore libjade_shims

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Simplify name scheme for libjade code

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update alg docs, libjade code name scheme, and license

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update copy_from_upstream documentation

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Fix copy_from_upstream.py and simply libjade code name scheme

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update alg docs and CBOM

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Correct alg doc generation

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Generate CBOM with unique bom-ref

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Cleanup unix.yml

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* fix patches to include api.c; fix kem templates

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* fix kyber patch

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* turn off weekly constant time tests for libjade implementations

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* update documentation

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* change upstream to stable libjade release

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* fix kyber documentation

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* fix kyber documentation

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* fix kem template again

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* fix weekly.yml and unix.yml to test libjade code

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* rename libjade asm files from *.s to *.S

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* end libjade_kyber*/api.c files with newline

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* fix kem template to prevent duplicate symbols in object files

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* fix indentation in weekly.yml

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* skip testing libjade on macos-14 in CI

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* use release tag/branch with libjade upstream url instead of commit

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* fix build error when OQS_ENABLE_LIBJADE_KEM_ALG=OFF

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* initialize LIBJADE_RANDOMBYTES when OQS_LIBJADE_BUILD=OFF

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* remove redundant comment

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* fix comment typo

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* make string explicit when comparing with variable in cmake

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* add libjade kyber licensing to README.md

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* remove reference to oldpqclean_kyber* code from libjade if branchin kem_kyber_*.c

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update CMakeLists.txt

Co-authored-by: Spencer Wilson <spencer.wilson@uwaterloo.ca>
Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* track jasminc version in copy_from_libjade.yml; check jasminc version in copy_from_upstream.py

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* add OQS_LIBJADE_BUILD to build flags output

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* remove link from CONFIGURE.md

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Update libjade to dual license

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Patch gcc version for MacOS CI runs

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Fix doc generation

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* Fix libjade docs

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* fix license info in README.md

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

* update libjade_randombytes spdx-license

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>

---------

Signed-off-by: Pravek Sharma <sharmapravek@gmail.com>
Co-authored-by: Spencer Wilson <spencer.wilson@uwaterloo.ca>
2024-08-18 12:02:37 -04:00

298 lines
7.9 KiB
C

// SPDX-License-Identifier: MIT
#include <oqs/oqs.h>
#include <stdio.h>
#include <string.h>
// based on macros in https://sourceforge.net/p/predef/wiki/Compilers/
static void print_compiler_info(void) {
#if defined(__clang__)
printf("Compiler: clang (%s)\n", __clang_version__);
#elif defined(__GNUC_PATCHLEVEL__)
printf("Compiler: gcc (%d.%d.%d)\n", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
#elif defined(__GNUC_MINOR__)
printf("Compiler: gcc (%d.%d)\n", __GNUC__, __GNUC_MINOR__);
#elif defined(__INTEL_COMPILER)
printf("Compiler: Intel C/C++ (%d)\n", __INTEL_COMPILER);
#elif defined(_MSC_FULL_VER)
printf("Compiler: Microsoft C/C++ (%d)\n", _MSC_FULL_VER);
#else
printf("Compiler: Unknown"\n);
#endif
#if defined(OQS_COMPILE_OPTIONS)
printf("Compile options: %s\n", OQS_COMPILE_OPTIONS);
#endif
}
// based on macros in https://sourceforge.net/p/predef/wiki/Architectures/
static void print_platform_info(void) {
#if defined(OQS_COMPILE_BUILD_TARGET)
printf("Target platform: %s", OQS_COMPILE_BUILD_TARGET);
#elif defined(_WIN64)
printf("Target platform: Windows (64-bit)");
#elif defined(_WIN32)
printf("Target platform: Windows (32-bit)");
#else
printf("Target platform: Unknown");
#endif
#if defined(OQS_SPEED_USE_ARM_PMU)
printf(" - ARM PMU options enabled");
#endif
printf("\n");
}
#if defined(OQS_USE_OPENSSL)
#include <openssl/opensslv.h>
#endif
#if defined(OQS_DIST_X86_64_BUILD)
#define AES_C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
do { \
if (OQS_CPU_has_extension(OQS_CPU_EXT_AES)) { \
stmt_ni; \
} else { \
stmt_c; \
} \
} while(0)
#elif defined(OQS_DIST_ARM64_V8_BUILD)
#define AES_C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
do { \
if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_AES)) { \
stmt_arm; \
} else { \
stmt_c; \
} \
} while(0)
#elif defined(OQS_USE_AES_INSTRUCTIONS)
#define AES_C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
stmt_ni
#elif defined(OQS_USE_ARM_AES_INSTRUCTIONS)
#define AES_C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
stmt_arm
#else
#define AES_C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
stmt_c
#endif
#if defined(OQS_DIST_ARM64_V8_BUILD)
#define SHA2_C_OR_ARM(stmt_c, stmt_arm) \
do { \
if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_SHA2)) { \
stmt_arm; \
} else { \
stmt_c; \
} \
} while(0)
#elif defined(OQS_USE_ARM_SHA2_INSTRUCTIONS)
#define SHA2_C_OR_ARM(stmt_c, stmt_arm) \
stmt_arm
#else
#define SHA2_C_OR_ARM(stmt_c, stmt_arm) \
stmt_c
#endif
/* Display all active CPU extensions: */
static void print_cpu_extensions(void) {
#if defined(OQS_DIST_BUILD)
printf("CPU exts active: ");
if (OQS_CPU_has_extension(OQS_CPU_EXT_ADX)) {
printf(" ADX");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_AES)) {
printf(" AES");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX)) {
printf(" AVX");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) {
printf(" AVX2");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX512)) {
printf(" AVX512");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_BMI1)) {
printf(" BMI1");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_BMI2)) {
printf(" BMI2");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_PCLMULQDQ)) {
printf(" PCLMULQDQ");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_VPCLMULQDQ)) {
printf(" VPCLMULQDQ");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) {
printf(" POPCNT");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_SSE)) {
printf(" SSE");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_SSE2)) {
printf(" SSE2");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_SSE3)) {
printf(" SSE3");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_AES)) {
printf(" AES");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_SHA2)) {
printf(" SHA2");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_SHA3)) {
printf(" SHA3");
}
if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) {
printf(" NEON");
}
#else
printf("CPU exts compile-time: ");
#ifdef OQS_USE_ADX_INSTRUCTIONS
printf(" ADX");
#endif
#ifdef OQS_USE_AES_INSTRUCTIONS
printf(" AES");
#endif
#ifdef OQS_USE_AVX_INSTRUCTIONS
printf(" AVX");
#endif
#ifdef OQS_USE_AVX2_INSTRUCTIONS
printf(" AVX2");
#endif
#ifdef OQS_USE_AVX512_INSTRUCTIONS
printf(" AVX512");
#endif
#ifdef OQS_USE_BMI1_INSTRUCTIONS
printf(" BMI1");
#endif
#ifdef OQS_USE_BMI2_INSTRUCTIONS
printf(" BMI2");
#endif
#ifdef OQS_USE_PCLMULQDQ_INSTRUCTIONS
printf(" PCLMULQDQ");
#endif
#ifdef OQS_USE_POPCNT_INSTRUCTIONS
printf(" POPCNT");
#endif
#ifdef OQS_USE_SSE_INSTRUCTIONS
printf(" SSE");
#endif
#ifdef OQS_USE_SSE2_INSTRUCTIONS
printf(" SSE2");
#endif
#ifdef OQS_USE_SSE3_INSTRUCTIONS
printf(" SSE3");
#endif
#ifdef OQS_USE_ARM_AES_INSTRUCTIONS
printf(" AES");
#endif
#ifdef OQS_USE_ARM_SHA2_INSTRUCTIONS
printf(" SHA2");
#endif
#ifdef OQS_USE_ARM_SHA3_INSTRUCTIONS
printf(" SHA3");
#endif
#ifdef OQS_USE_ARM_NEON_INSTRUCTIONS
printf(" NEON");
#endif
printf("\n");
#endif
}
static void print_oqs_configuration(void) {
/* Display all options as per https://github.com/open-quantum-safe/liboqs/wiki/Customizing-liboqs:
* BUILD_SHARED_LIBS: Performance relevance small/improbable
* CMAKE_BUILD_TYPE: If Debug, -g compiler option will be shown;
* -O3 for Release build
* CMAKE_INSTALL_PREFIX: Not performance relevant
* OQS_ENABLE_KEM|SIG: alg absence/presence detected on run; can be output
* by not passing an alg name to the test programs
* OQS_BUILD_ONLY_LIB: Not performance relevant
* OQS_DIST_BUILD: Set if output "CPU exts active" present;
* otherwise, "CPU exts compile-time:" output
* OQS_USE_OPENSSL: Explicitly output
* OQS_OPT_TARGET: Visible by looking at compile options (-march or -mcpu):
* 'auto' -> "-march|cpu=native"
* OQS_SPEED_USE_ARM_PMU: Output with Target platform
* USE_SANITIZER: -fsanitize= option present in compile options
* OQS_ENABLE_TEST_CONSTANT_TIME: only shown below
*/
printf("OQS version: %s\n", OQS_VERSION_TEXT);
#if defined(OQS_COMPILE_GIT_COMMIT)
printf("Git commit: %s\n", OQS_COMPILE_GIT_COMMIT);
#endif
#if defined(OQS_USE_OPENSSL)
printf("OpenSSL enabled: Yes (%s)\n", OPENSSL_VERSION_TEXT);
#else
printf("OpenSSL enabled: No\n");
#endif
#if defined(OQS_USE_AES_OPENSSL)
printf("AES: OpenSSL\n");
#else
AES_C_OR_NI_OR_ARM(
printf("AES: C\n"),
printf("AES: NI\n"),
printf("AES: C and ARM CRYPTO extensions\n")
);
#endif
#if defined(OQS_USE_SHA2_OPENSSL)
printf("SHA-2: OpenSSL\n");
#else
SHA2_C_OR_ARM(
printf("SHA-2: C\n"),
printf("SHA-2: C and ARM CRYPTO extensions\n")
);
#endif
#if defined(OQS_USE_SHA3_OPENSSL)
printf("SHA-3: OpenSSL\n");
#else
printf("SHA-3: C\n");
#endif
printf("OQS build flags: ");
#ifdef BUILD_SHARED_LIBS
printf("BUILD_SHARED_LIBS ");
#endif
#ifdef OQS_ENABLE_TEST_CONSTANT_TIME
printf("OQS_ENABLE_TEST_CONSTANT_TIME ");
#endif
#ifdef OQS_SPEED_USE_ARM_PMU
printf("OQS_SPEED_USE_ARM_PMU ");
#endif
#ifdef OQS_DIST_BUILD
printf("OQS_DIST_BUILD ");
#endif
#ifdef OQS_LIBJADE_BUILD
printf("OQS_LIBJADE_BUILD ");
#endif
#ifdef OQS_BUILD_ONLY_LIB
printf("OQS_BUILD_ONLY_LIB "); // pretty much impossible to appear but added for completeness
#endif
#ifdef USE_SANITIZER
printf("USE_SANITIZER=%s ", USE_SANITIZER);
#endif
#ifdef OQS_OPT_TARGET
printf("OQS_OPT_TARGET=%s ", OQS_OPT_TARGET);
#endif
#ifdef CMAKE_BUILD_TYPE
printf("CMAKE_BUILD_TYPE=%s ", CMAKE_BUILD_TYPE);
#else
#ifdef OQS_DEBUG_BUILD
guard against impossible configuration (no CMAKE_BUILD_TYPE but DEBUG_BUILD)
#endif
printf("CMAKE_BUILD_TYPE=Release ");
#endif
printf("\n");
}
static void print_system_info(void) {
printf("Configuration info\n");
printf("==================\n");
print_platform_info();
print_compiler_info();
print_oqs_configuration();
print_cpu_extensions();
printf("\n");
}