addresses issue #691

This commit is contained in:
Michael Baentsch 2020-04-06 14:51:54 +02:00
parent c254fddf18
commit c847efab8f
18 changed files with 597 additions and 80 deletions

View File

@ -1,10 +1,43 @@
{% for family in instructions['kems'] %}
option(OQS_ENABLE_KEM_{{ family['name']|upper }} "" ON)
{%- for scheme in family['schemes'] %}
cmake_dependent_option(OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['scheme'] }} "" ON "OQS_ENABLE_KEM_{{ family['name']|upper }}" OFF){% endfor %}
cmake_dependent_option(OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['scheme'] }} "" ON "OQS_ENABLE_KEM_{{ family['name']|upper }}" OFF)
{% for impl in scheme['metadata']['implementations'] -%}
{% if impl['supported_platforms'] -%}
{% for platform in impl['supported_platforms'] -%}
{% for os in platform['operating_systems'] -%}
if ({{ os }} STREQUAL CMAKE_SYSTEM_NAME)
if ({{ impl['cmake_options'] }})
set(OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['scheme'] }}_{{ impl['name'] }} ON)
endif()
endif()
{% endfor -%}
{% endfor -%}
{% else -%}
set(OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['scheme'] }}_{{ impl['name'] }} ON)
{% endif -%}
{% endfor -%}
{% endfor %}
{% endfor -%}
{% for family in instructions['sigs'] %}
option(OQS_ENABLE_SIG_{{ family['name']|upper }} "" ON)
{%- for scheme in family['schemes'] %}
cmake_dependent_option(OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['scheme'] }} "" ON "OQS_ENABLE_SIG_{{ family['name']|upper }}" OFF){% endfor %}
cmake_dependent_option(OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['scheme'] }} "" ON "OQS_ENABLE_SIG_{{ family['name']|upper }}" OFF)
{% for impl in scheme['metadata']['implementations'] -%}
{% if impl['supported_platforms'] -%}
{% for platform in impl['supported_platforms'] -%}
{% for os in platform['operating_systems'] -%}
if ({{ os }} STREQUAL CMAKE_SYSTEM_NAME)
if ({{ impl['cmake_options'] }})
set(OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['scheme'] }}_{{ impl['name'] }} ON)
endif()
endif()
{% endfor -%}
{% endfor -%}
{% else -%}
set(OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['scheme'] }}_{{ impl['name'] }} ON)
{% endif -%}
{% endfor -%}
{% endfor %}
{% endfor %}

View File

@ -7,6 +7,14 @@ import os
import shutil
import subprocess
import yaml
from pathlib import Path
INSTR_MAP = {
"avx2": "OQS_USE_AVX2_INSTRUCTIONS",
"bmi2": "OQS_USE_BMI2_INSTRUCTIONS",
"aes": "OQS_USE_AES_INSTRUCTIONS",
"popcnt": "OQS_USE_POPCNT_INSTRUCTIONS"
}
if 'PQCLEAN_DIR' not in os.environ:
print("Must set environment variable PQCLEAN_DIR")
@ -26,9 +34,7 @@ def generator(destination_filename, template_filename, family, scheme_desired):
if scheme_desired != None:
f['schemes'] = [x for x in f['schemes'] if x == scheme_desired]
assert(len(f['schemes']) == 1)
for scheme in f['schemes']:
scheme['metadata']['implementations'] = [imp for imp in scheme['metadata']['implementations'] if imp['name'] == scheme['implementation']]
assert(len(scheme['metadata']['implementations']) == 1)
# if scheme['implementation'] is not set, run over all implementations!
file_put_contents(destination_filename, jinja2.Template(template).render(f))
def generator_all(filename, instructions):
@ -72,6 +78,27 @@ def load_instructions():
scheme['scheme_c'] = scheme['scheme'].replace('-', '')
return instructions
# Copy over all files for a given impl in a family using scheme
# Returns list of all relative source files
def handle_implementation(impl, family, scheme):
shutil.rmtree(os.path.join('src', family['type'], family['name'], 'pqclean_{}_{}'.format(scheme['pqclean_scheme'].replace('-','_'), impl)), ignore_errors=True)
srcfolder = os.path.join('src', family['type'], family['name'], 'pqclean_{}_{}'.format(scheme['pqclean_scheme'].replace('-','_'), impl))
subprocess.run([
'cp',
'-pr',
os.path.join(os.environ['PQCLEAN_DIR'], 'crypto_' + family['pqclean_type'], scheme['pqclean_scheme'], impl),
srcfolder
])
try:
os.remove(os.path.join('src', family['type'], family['name'], 'pqclean_{}_{}'.format(scheme['pqclean_scheme'].replace('-','_'), impl), 'Makefile'))
os.remove(os.path.join('src', family['type'], family['name'], 'pqclean_{}_{}'.format(scheme['pqclean_scheme'].replace('-','_'), impl), 'Makefile.Microsoft_nmake'))
except FileNotFoundError:
pass
extensions = [ '.c', '.s' ]
return [str(x.relative_to(srcfolder)) for x in Path(srcfolder).iterdir() if x.suffix.lower() in extensions]
instructions = load_instructions()
for family in instructions['kems'] + instructions['sigs']:
@ -80,15 +107,53 @@ for family in instructions['kems'] + instructions['sigs']:
os.mkdir(os.path.join('src', family['type'], family['name']))
except:
pass
shutil.rmtree(os.path.join('src', family['type'], family['name'], 'pqclean_{}_{}'.format(scheme['pqclean_scheme'], scheme['implementation'])), ignore_errors=True)
subprocess.run([
'cp',
'-pr',
os.path.join(os.environ['PQCLEAN_DIR'], 'crypto_' + family['pqclean_type'], scheme['pqclean_scheme'], scheme['implementation']),
os.path.join('src', family['type'], family['name'], 'pqclean_{}_{}'.format(scheme['pqclean_scheme'], scheme['implementation']))
])
os.remove(os.path.join('src', family['type'], family['name'], 'pqclean_{}_{}'.format(scheme['pqclean_scheme'], scheme['implementation']), 'Makefile'))
os.remove(os.path.join('src', family['type'], family['name'], 'pqclean_{}_{}'.format(scheme['pqclean_scheme'], scheme['implementation']), 'Makefile.Microsoft_nmake'))
# If no scheme['implementation'] given, get the list from META.yml and add all implementations
try:
impl = scheme['implementation']
except KeyError:
impl = None
if (impl):
srcs = handle_implementation(impl, family, scheme)
if (scheme['sources']):
assert(len(scheme['sources']) == len(srcs))
# in any case: add 'sources' to implementation(s)
# Only retain this 1 implementation:
scheme['metadata']['implementations'] = [imp for imp in scheme['metadata']['implementations'] if imp['name'] == impl]
scheme['metadata']['implementations'][0]['sources'] = srcs
else:
for impl in scheme['metadata']['implementations']:
srcs = handle_implementation(impl['name'], family, scheme)
# in any case: add 'sources' to implementation(s)
impl['sources'] = srcs
# generate 'oqs_unsupported.c' files to permit building also on platforms where the optimized code cannot compile
if (impl['name'] != 'clean'):
unsupported_filename = os.path.join('src', family['type'], family['name'], 'pqclean_{}_{}'.format(scheme['pqclean_scheme'].replace('-','_'), impl['name']) , 'oqs_unsupported.c')
with open(unsupported_filename, 'w') as gen_file:
gen_file.write('int {}_{}_unsupported=1;\n'.format(scheme['pqclean_scheme'].replace('-','_'), impl['name']))
# also add suitable defines:
try:
comp_opts = ""
rt_opts = ""
cmake_opts = ""
for i in range(len(impl['supported_platforms'])):
req = impl['supported_platforms'][i]
if (req['architecture'] == "x86_64"):
for i in range(len(req['required_flags'])):
rt_opts = rt_opts + "OQS_RT_cpu_flags()."+req['required_flags'][i].upper()+"_INSTRUCTIONS "
cmake_opts = cmake_opts + INSTR_MAP[req['required_flags'][i]] + " "
comp_opts = comp_opts + "-m"+req['required_flags'][i]
if (i < len(req['required_flags'])-1):
rt_opts = rt_opts + " && "
cmake_opts = cmake_opts + " AND "
comp_opts = comp_opts + " "
impl['compile_options'] = comp_opts
impl['rt_options'] = rt_opts
impl['cmake_options'] = cmake_opts
except KeyError as ke:
if (impl['name'] != "clean"):
print("No required flags found for %s (KeyError %s on impl %s)\n" % (scheme['scheme'], str(ke), impl['name']))
pass
generator(
os.path.join('src', family['type'], family['name'], family['type'] + '_{}.h'.format(family['name'])),

View File

@ -69,38 +69,26 @@ kems:
scheme: "512"
pqclean_scheme: kyber512
pretty_name_full: Kyber512
implementation: clean
sources: ['cbd.c', 'indcpa.c', 'kem.c', 'ntt.c', 'poly.c', 'polyvec.c', 'reduce.c', 'verify.c', 'symmetric-fips202.c']
-
scheme: "768"
pqclean_scheme: kyber768
pretty_name_full: Kyber768
implementation: clean
sources: ['cbd.c', 'indcpa.c', 'kem.c', 'ntt.c', 'poly.c', 'polyvec.c', 'reduce.c', 'verify.c', 'symmetric-fips202.c']
-
scheme: "1024"
pqclean_scheme: kyber1024
pretty_name_full: Kyber1024
implementation: clean
sources: ['cbd.c', 'indcpa.c', 'kem.c', 'ntt.c', 'poly.c', 'polyvec.c', 'reduce.c', 'verify.c', 'symmetric-fips202.c']
-
scheme: "512_90s"
pqclean_scheme: kyber512-90s
pretty_name_full: Kyber512-90s
implementation: clean
sources: ['aes256ctr.c', 'cbd.c', 'indcpa.c', 'kem.c', 'ntt.c', 'poly.c', 'polyvec.c', 'reduce.c', 'verify.c']
-
scheme: "768_90s"
pqclean_scheme: kyber768-90s
pretty_name_full: Kyber768-90s
implementation: clean
sources: ['aes256ctr.c', 'cbd.c', 'indcpa.c', 'kem.c', 'ntt.c', 'poly.c', 'polyvec.c', 'reduce.c', 'verify.c']
-
scheme: "1024_90s"
pqclean_scheme: kyber1024-90s
pretty_name_full: Kyber1024-90s
implementation: clean
sources: ['aes256ctr.c', 'cbd.c', 'indcpa.c', 'kem.c', 'ntt.c', 'poly.c', 'polyvec.c', 'reduce.c', 'verify.c']
-
name: ledacrypt
schemes:
@ -232,22 +220,16 @@ sigs:
scheme: "2"
pqclean_scheme: dilithium2
pretty_name_full: DILITHIUM_2
implementation: clean
sources: ['sign.c', 'polyvec.c', 'poly.c', 'packing.c', 'ntt.c', 'reduce.c', 'rounding.c', 'stream.c']
signed_msg_order: sig_then_msg
-
scheme: "3"
pqclean_scheme: dilithium3
pretty_name_full: DILITHIUM_3
implementation: clean
sources: ['sign.c', 'polyvec.c', 'poly.c', 'packing.c', 'ntt.c', 'reduce.c', 'rounding.c', 'stream.c']
signed_msg_order: sig_then_msg
-
scheme: "4"
pqclean_scheme: dilithium4
pretty_name_full: DILITHIUM_4
implementation: clean
sources: ['sign.c', 'polyvec.c', 'poly.c', 'packing.c', 'ntt.c', 'reduce.c', 'rounding.c', 'stream.c']
signed_msg_order: sig_then_msg
-
name: falcon

View File

@ -1,11 +1,9 @@
{%- for family in instructions['kems'] %}
if(OQS_ENABLE_KEM_{{ family['name']|upper }})
add_subdirectory(kem/{{ family['name'] }})
set(KEM_OBJS ${KEM_OBJS} $<TARGET_OBJECTS:{{ family['name'] }}>)
endif(){% endfor %}
{%- for family in instructions['sigs'] %}
if(OQS_ENABLE_SIG_{{ family['name']|upper }})
add_subdirectory(sig/{{ family['name'] }})
set(SIG_OBJS ${SIG_OBJS} $<TARGET_OBJECTS:{{ family['name'] }}>)
endif(){% endfor %}

View File

@ -0,0 +1,15 @@
{% for family in instructions['kems'] -%}
{% for scheme in family['schemes'] -%}
{% for impl in scheme['metadata']['implementations'] -%}
$<TARGET_OBJECTS:{{ family['name'] }}_{{ scheme['scheme'] }}_{{ impl['name'] }}>
{% endfor -%}
{% endfor -%}
{% endfor -%}
{% for family in instructions['sigs'] -%}
{% for scheme in family['schemes'] -%}
{% for impl in scheme['metadata']['implementations'] -%}
$<TARGET_OBJECTS:{{ family['name'] }}_{{ scheme['scheme'] }}_{{ impl['name'] }}>
{% endfor -%}
{% endfor -%}
{% endfor -%}

View File

@ -1,9 +1,33 @@
# This file was generated by
# scripts/copy_from_pqclean/copy_from_pqclean.py
{% for scheme in schemes -%}
{% for scheme in schemes %}
if(OQS_ENABLE_KEM_{{ family }}_{{ scheme['scheme_c'] }})
set(SRCS ${SRCS} kem_{{ family }}_{{ scheme['scheme_c'] }}.c {% for source in scheme['sources'] %}pqclean_{{ scheme['pqclean_scheme'] }}_{{ scheme['implementation'] }}/{{ source }}{% if not loop.last %} {% endif %}{% endfor -%})
{% for impl in scheme['metadata']['implementations'] %}
{%- if impl['name']|upper != "CLEAN" %}
if(OQS_ENABLE_KEM_{{ family }}_{{ scheme['scheme_c'] }}_{{ impl['name'] }})
{%- endif %}
set(SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_{{ impl['name']|upper }}_SRCS {% for source in impl['sources'] %}pqclean_{{ scheme['pqclean_scheme'].replace('-','_') }}_{{ impl['name'] }}/{{ source }}{% if not loop.last %} {% endif %}{% endfor %})
{%- if impl['name']|upper != "CLEAN" %}
else()
set(SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_{{ impl['name']|upper }}_SRCS pqclean_{{ family }}{{ scheme['scheme'] }}_{{ impl['name'] }}/oqs_unsupported.c )
endif()
{%- endif %}
{% endfor %}
{% if scheme['metadata']['implementations']|length > 1 -%}
set(SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_CLEAN_SRCS ${SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_CLEAN_SRCS} kem_{{ family }}_{{ scheme['scheme_c'] }}.c )
{% else %}
set(SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_{{ scheme['metadata']['implementations'][0]['name']|upper }}_SRCS ${SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_{{ scheme['metadata']['implementations'][0]['name']|upper }}_SRCS} kem_{{ family }}_{{ scheme['scheme_c'] }}.c )
{% endif %}
endif()
{% endfor %}
add_library({{ family }} OBJECT ${SRCS})
target_include_directories({{ family }} PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims)
{% for scheme in schemes %}
{% for impl in scheme['metadata']['implementations'] %}
add_library({{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }} OBJECT ${SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_{{ impl['name']|upper }}_SRCS})
target_include_directories({{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }} PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims)
target_include_directories({{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }} PRIVATE ${PROJECT_SOURCE_DIR}/src/kem/{{ family }}/pqclean_{{ family }}{{ scheme['scheme'] }}_{{ impl['name'] }})
target_compile_options({{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }} PUBLIC {{ impl['compile_options'] }})
{% endfor %}
{% endfor %}

View File

@ -29,18 +29,103 @@ OQS_KEM *OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_new() {
return kem;
}
int PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['implementation']|upper }}_crypto_kem_keypair(unsigned char *pk, unsigned char *sk);
int PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['implementation']|upper }}_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk);
int PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['implementation']|upper }}_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk);
{% for impl in scheme['metadata']['implementations'] %}
{% if impl['name']|upper != "CLEAN" -%}
#if defined(OQS_ENABLE_KEM_{{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }})
{% endif -%}
int PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_kem_keypair(unsigned char *pk, unsigned char *sk);
int PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_kem_enc(unsigned char *ct, unsigned char *ss, const unsigned char *pk);
int PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_kem_dec(unsigned char *ss, const unsigned char *ct, const unsigned char *sk);
{% if impl['name']|upper != "CLEAN" -%}
#endif
{% endif -%}
{% endfor %}
OQS_API OQS_STATUS OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_keypair(uint8_t *public_key, uint8_t *secret_key) {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['implementation']|upper }}_crypto_kem_keypair(public_key, secret_key);
{% if scheme['metadata']['implementations']|length > 1 -%}
{% for impl in scheme['metadata']['implementations'] -%}
{% if impl['name'] != 'clean' -%}
#ifdef OQS_ENABLE_KEM_{{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }}
#ifdef OQS_ENABLE_CPUFEATURES
if ({{ impl['rt_options'] }}) {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_kem_keypair(public_key, secret_key);
} else {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['metadata']['implementations'][0]['name']|upper }}_crypto_kem_keypair(public_key, secret_key);
}
#else
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_kem_keypair(public_key, secret_key);
#endif
{% endif -%}
{% endfor -%}
{% endif -%}
{% if scheme['metadata']['implementations']|length > 1 -%}
#else
// Assume CLEAN always compiles
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_CLEAN_crypto_kem_keypair(public_key, secret_key);
{% else %}
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['metadata']['implementations'][0]['name']|upper }}_crypto_kem_keypair(public_key, secret_key);
{% endif -%}
{% if scheme['metadata']['implementations']|length > 1 -%}
#endif
{% endif -%}
}
OQS_API OQS_STATUS OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['implementation']|upper }}_crypto_kem_enc(ciphertext, shared_secret, public_key);
{% if scheme['metadata']['implementations']|length > 1 -%}
{% for impl in scheme['metadata']['implementations'] -%}
{% if impl['name'] != 'clean' -%}
#ifdef OQS_ENABLE_KEM_{{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }}
#ifdef OQS_ENABLE_CPUFEATURES
if ({{ impl['rt_options'] }}) {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_kem_enc(ciphertext, shared_secret, public_key);
} else {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_CLEAN_crypto_kem_enc(ciphertext, shared_secret, public_key);
}
#else
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_kem_enc(ciphertext, shared_secret, public_key);
#endif
{% endif -%}
{% endfor -%}
{% endif -%}
{% if scheme['metadata']['implementations']|length > 1 -%}
#else
// Assume CLEAN always compiles
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_CLEAN_crypto_kem_enc(ciphertext, shared_secret, public_key);
{% else %}
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['metadata']['implementations'][0]['name']|upper }}_crypto_kem_enc(ciphertext, shared_secret, public_key);
{% endif -%}
{% if scheme['metadata']['implementations']|length > 1 -%}
#endif
{% endif -%}
}
OQS_API OQS_STATUS OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_decaps(uint8_t *shared_secret, const unsigned char *ciphertext, const uint8_t *secret_key) {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['implementation']|upper }}_crypto_kem_dec(shared_secret, ciphertext, secret_key);
{% if scheme['metadata']['implementations']|length > 1 -%}
{% for impl in scheme['metadata']['implementations'] -%}
{% if impl['name'] != 'clean' -%}
#ifdef OQS_ENABLE_KEM_{{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }}
#ifdef OQS_ENABLE_CPUFEATURES
if ({{ impl['rt_options'] }}) {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_kem_dec(shared_secret, ciphertext, secret_key);
} else {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_CLEAN_crypto_kem_dec(shared_secret, ciphertext, secret_key);
}
#else
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_kem_dec(shared_secret, ciphertext, secret_key);
#endif
{% endif -%}
{% endfor -%}
{% endif -%}
{% if scheme['metadata']['implementations']|length > 1 -%}
#else
// Assume CLEAN always compiles
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_CLEAN_crypto_kem_dec(shared_secret, ciphertext, secret_key);
{% else %}
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['metadata']['implementations'][0]['name']|upper }}_crypto_kem_dec(shared_secret, ciphertext, secret_key);
{% endif -%}
{% if scheme['metadata']['implementations']|length > 1 -%}
#endif
{% endif -%}
}
#endif

View File

@ -1,11 +1,23 @@
{% for family in instructions['kems'] %}
#cmakedefine OQS_ENABLE_KEM_{{ family['name']|upper }} 1
{%- for scheme in family['schemes'] %}
#cmakedefine OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['scheme'] }} 1{%- endfor %}
#cmakedefine OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['scheme'] }} 1
{% for impl in scheme['metadata']['implementations'] -%}
{% if impl['name']|upper != "CLEAN" -%}
#cmakedefine OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['scheme'] }}_{{ impl['name'] }} 1
{%- endif -%}
{% endfor -%}
{% endfor %}
{% endfor -%}
{% for family in instructions['sigs'] %}
#cmakedefine OQS_ENABLE_SIG_{{ family['name']|upper }}
{%- for scheme in family['schemes'] %}
#cmakedefine OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['scheme'] }} 1{%- endfor %}
#cmakedefine OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['scheme'] }} 1
{% for impl in scheme['metadata']['implementations'] -%}
{% if impl['name']|upper != "CLEAN" -%}
#cmakedefine OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['scheme'] }}_{{ impl['name'] }} 1
{%- endif -%}
{% endfor -%}
{% endfor %}
{% endfor %}

View File

@ -1,9 +1,33 @@
# This file was generated by
# scripts/copy_from_pqclean/copy_from_pqclean.py
{% for scheme in schemes -%}
{% for scheme in schemes %}
if(OQS_ENABLE_SIG_{{ family }}_{{ scheme['scheme_c'] }})
set(SRCS ${SRCS} sig_{{ family }}_{{ scheme['scheme_c'] }}.c {% for source in scheme['sources'] %}pqclean_{{ scheme['pqclean_scheme'] }}_{{ scheme['implementation'] }}/{{ source }}{% if not loop.last %} {% endif %}{% endfor -%})
{% for impl in scheme['metadata']['implementations'] %}
{%- if impl['name']|upper != "CLEAN" %}
if(OQS_ENABLE_SIG_{{ family }}_{{ scheme['scheme_c'] }}_{{ impl['name'] }})
{%- endif %}
set(SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_{{ impl['name']|upper }}_SRCS {% for source in impl['sources'] %}pqclean_{{ scheme['pqclean_scheme'].replace('-','_') }}_{{ impl['name'] }}/{{ source }}{% if not loop.last %} {% endif %}{% endfor %})
{%- if impl['name']|upper != "CLEAN" %}
else()
set(SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_{{ impl['name']|upper }}_SRCS pqclean_{{ family }}{{ scheme['scheme'] }}_{{ impl['name'] }}/oqs_unsupported.c )
endif()
{%- endif %}
{% endfor %}
{% if scheme['metadata']['implementations']|length > 1 -%}
set(SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_CLEAN_SRCS ${SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_CLEAN_SRCS} sig_{{ family }}_{{ scheme['scheme_c'] }}.c )
{% else %}
set(SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_{{ scheme['metadata']['implementations'][0]['name']|upper }}_SRCS ${SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_{{ scheme['metadata']['implementations'][0]['name']|upper }}_SRCS} sig_{{ family }}_{{ scheme['scheme_c'] }}.c )
{% endif %}
endif()
{% endfor %}
add_library({{ family }} OBJECT ${SRCS})
target_include_directories({{ family }} PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims)
{% for scheme in schemes %}
{% for impl in scheme['metadata']['implementations'] %}
add_library({{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }} OBJECT ${SRCS_{{ family|upper }}_{{ scheme['scheme']|upper }}_{{ impl['name']|upper }}_SRCS})
target_include_directories({{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }} PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims)
target_include_directories({{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }} PRIVATE ${PROJECT_SOURCE_DIR}/src/sig/{{ family }}/pqclean_{{ family }}{{ scheme['scheme'] }}_{{ impl['name'] }})
target_compile_options({{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }} PUBLIC {{ impl['compile_options'] }})
{% endfor %}
{% endfor %}

View File

@ -28,18 +28,103 @@ OQS_SIG *OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_new() {
return sig;
}
int PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['implementation']|upper }}_crypto_sign_keypair(uint8_t *pk, uint8_t *sk);
int PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['implementation']|upper }}_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk);
int PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['implementation']|upper }}_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk);
{% for impl in scheme['metadata']['implementations'] %}
{% if impl['name']|upper != "CLEAN" -%}
#if defined(OQS_ENABLE_SIG_{{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }})
{% endif -%}
int PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_sign_keypair(uint8_t *pk, uint8_t *sk);
int PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk);
int PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk);
{% if impl['name']|upper != "CLEAN" -%}
#endif
{% endif -%}
{% endfor %}
OQS_API OQS_STATUS OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_keypair(uint8_t *public_key, uint8_t *secret_key) {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['implementation']|upper }}_crypto_sign_keypair(public_key, secret_key);
{% if scheme['metadata']['implementations']|length > 1 -%}
{% for impl in scheme['metadata']['implementations'] -%}
{% if impl['name'] != 'clean' -%}
#ifdef OQS_ENABLE_SIG_{{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }}
#ifdef OQS_ENABLE_CPUFEATURES
if ({{ impl['rt_options'] }}) {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_sign_keypair(public_key, secret_key);
} else {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_CLEAN_crypto_sign_keypair(public_key, secret_key);
}
#else
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_sign_keypair(public_key, secret_key);
#endif
{% endif -%}
{% endfor -%}
{% endif -%}
{% if scheme['metadata']['implementations']|length > 1 -%}
#else
// Assume CLEAN always compiles
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_CLEAN_crypto_sign_keypair(public_key, secret_key);
{% else %}
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['metadata']['implementations'][0]['name']|upper }}_crypto_sign_keypair(public_key, secret_key);
{% endif -%}
{% if scheme['metadata']['implementations']|length > 1 -%}
#endif
{% endif -%}
}
OQS_API OQS_STATUS OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['implementation']|upper }}_crypto_sign_signature(signature, signature_len, message, message_len, secret_key);
{% if scheme['metadata']['implementations']|length > 1 -%}
{% for impl in scheme['metadata']['implementations'] -%}
{% if impl['name'] != 'clean' -%}
#ifdef OQS_ENABLE_SIG_{{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }}
#ifdef OQS_ENABLE_CPUFEATURES
if ({{ impl['rt_options'] }}) {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_sign_signature(signature, signature_len, message, message_len, secret_key);
} else {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_CLEAN_crypto_sign_signature(signature, signature_len, message, message_len, secret_key);
}
#else
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_sign_signature(signature, signature_len, message, message_len, secret_key);
#endif
{% endif -%}
{% endfor -%}
{% endif -%}
{% if scheme['metadata']['implementations']|length > 1 -%}
#else
// Assume CLEAN always compiles
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_CLEAN_crypto_sign_signature(signature, signature_len, message, message_len, secret_key);
{% else %}
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['metadata']['implementations'][0]['name']|upper }}_crypto_sign_signature(signature, signature_len, message, message_len, secret_key);
{% endif -%}
{% if scheme['metadata']['implementations']|length > 1 -%}
#endif
{% endif -%}
}
OQS_API OQS_STATUS OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['implementation']|upper }}_crypto_sign_verify(signature, signature_len, message, message_len, public_key);
{% if scheme['metadata']['implementations']|length > 1 -%}
{% for impl in scheme['metadata']['implementations'] -%}
{% if impl['name'] != 'clean' -%}
#ifdef OQS_ENABLE_KEM_{{ family }}_{{ scheme['scheme'] }}_{{ impl['name'] }}
#ifdef OQS_ENABLE_CPUFEATURES
if ({{ impl['rt_options'] }}) {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_sign_verify(signature, signature_len, message, message_len, public_key);
} else {
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_CLEAN_crypto_sign_verify(signature, signature_len, message, message_len, public_key);
}
#else
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ impl['name']|upper }}_crypto_sign_verify(signature, signature_len, message, message_len, public_key);
#endif
{% endif -%}
{% endfor -%}
{% endif -%}
{% if scheme['metadata']['implementations']|length > 1 -%}
#else
// Assume CLEAN always compiles
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_CLEAN_crypto_sign_verify(signature, signature_len, message, message_len, public_key);
{% else %}
return (OQS_STATUS) PQCLEAN_{{ scheme['pqclean_scheme_c']|upper }}_{{ scheme['metadata']['implementations'][0]['name']|upper }}_crypto_sign_verify(signature, signature_len, message, message_len, public_key);
{% endif -%}
{% if scheme['metadata']['implementations']|length > 1 -%}
#endif
{% endif -%}
}
#endif

View File

@ -23,51 +23,39 @@ endif()
##### OQS_COPY_FROM_PQCLEAN_FRAGMENT_ADD_ALG_OBJECTS_START
if(OQS_ENABLE_KEM_CLASSIC_MCELIECE)
add_subdirectory(kem/classic_mceliece)
set(KEM_OBJS ${KEM_OBJS} $<TARGET_OBJECTS:classic_mceliece>)
endif()
if(OQS_ENABLE_KEM_KYBER)
add_subdirectory(kem/kyber)
set(KEM_OBJS ${KEM_OBJS} $<TARGET_OBJECTS:kyber>)
endif()
if(OQS_ENABLE_KEM_LEDACRYPT)
add_subdirectory(kem/ledacrypt)
set(KEM_OBJS ${KEM_OBJS} $<TARGET_OBJECTS:ledacrypt>)
endif()
if(OQS_ENABLE_KEM_NEWHOPE)
add_subdirectory(kem/newhope)
set(KEM_OBJS ${KEM_OBJS} $<TARGET_OBJECTS:newhope>)
endif()
if(OQS_ENABLE_KEM_NTRU)
add_subdirectory(kem/ntru)
set(KEM_OBJS ${KEM_OBJS} $<TARGET_OBJECTS:ntru>)
endif()
if(OQS_ENABLE_KEM_SABER)
add_subdirectory(kem/saber)
set(KEM_OBJS ${KEM_OBJS} $<TARGET_OBJECTS:saber>)
endif()
if(OQS_ENABLE_KEM_THREEBEARS)
add_subdirectory(kem/threebears)
set(KEM_OBJS ${KEM_OBJS} $<TARGET_OBJECTS:threebears>)
endif()
if(OQS_ENABLE_SIG_DILITHIUM)
add_subdirectory(sig/dilithium)
set(SIG_OBJS ${SIG_OBJS} $<TARGET_OBJECTS:dilithium>)
endif()
if(OQS_ENABLE_SIG_FALCON)
add_subdirectory(sig/falcon)
set(SIG_OBJS ${SIG_OBJS} $<TARGET_OBJECTS:falcon>)
endif()
if(OQS_ENABLE_SIG_MQDSS)
add_subdirectory(sig/mqdss)
set(SIG_OBJS ${SIG_OBJS} $<TARGET_OBJECTS:mqdss>)
endif()
if(OQS_ENABLE_SIG_RAINBOW)
add_subdirectory(sig/rainbow)
set(SIG_OBJS ${SIG_OBJS} $<TARGET_OBJECTS:rainbow>)
endif()
if(OQS_ENABLE_SIG_SPHINCS)
add_subdirectory(sig/sphincs)
set(SIG_OBJS ${SIG_OBJS} $<TARGET_OBJECTS:sphincs>)
endif()
##### OQS_COPY_FROM_PQCLEAN_FRAGMENT_ADD_ALG_OBJECTS_END
@ -75,18 +63,115 @@ add_library(oqs kem/kem.c
${KEM_OBJS}
sig/sig.c
${SIG_OBJS}
##### OQS_COPY_FROM_PQCLEAN_FRAGMENT_ADD_TEMPLATE_OBJECTS_START
$<TARGET_OBJECTS:classic_mceliece_348864_vec>
$<TARGET_OBJECTS:classic_mceliece_348864f_vec>
$<TARGET_OBJECTS:classic_mceliece_460896_vec>
$<TARGET_OBJECTS:classic_mceliece_460896f_vec>
$<TARGET_OBJECTS:classic_mceliece_6688128_vec>
$<TARGET_OBJECTS:classic_mceliece_6688128f_vec>
$<TARGET_OBJECTS:classic_mceliece_6960119_vec>
$<TARGET_OBJECTS:classic_mceliece_6960119f_vec>
$<TARGET_OBJECTS:classic_mceliece_8192128_vec>
$<TARGET_OBJECTS:classic_mceliece_8192128f_vec>
$<TARGET_OBJECTS:kyber_512_clean>
$<TARGET_OBJECTS:kyber_512_avx2>
$<TARGET_OBJECTS:kyber_768_clean>
$<TARGET_OBJECTS:kyber_768_avx2>
$<TARGET_OBJECTS:kyber_1024_clean>
$<TARGET_OBJECTS:kyber_1024_avx2>
$<TARGET_OBJECTS:kyber_512_90s_clean>
$<TARGET_OBJECTS:kyber_512_90s_avx2>
$<TARGET_OBJECTS:kyber_768_90s_clean>
$<TARGET_OBJECTS:kyber_768_90s_avx2>
$<TARGET_OBJECTS:kyber_1024_90s_clean>
$<TARGET_OBJECTS:kyber_1024_90s_avx2>
$<TARGET_OBJECTS:ledacrypt_ledakemlt12_leaktime>
$<TARGET_OBJECTS:ledacrypt_ledakemlt32_leaktime>
$<TARGET_OBJECTS:ledacrypt_ledakemlt52_leaktime>
$<TARGET_OBJECTS:newhope_512cca_clean>
$<TARGET_OBJECTS:newhope_1024cca_clean>
$<TARGET_OBJECTS:ntru_hps2048509_clean>
$<TARGET_OBJECTS:ntru_hps2048677_clean>
$<TARGET_OBJECTS:ntru_hps4096821_clean>
$<TARGET_OBJECTS:ntru_hrss701_clean>
$<TARGET_OBJECTS:saber_lightsaber_clean>
$<TARGET_OBJECTS:saber_saber_clean>
$<TARGET_OBJECTS:saber_firesaber_clean>
$<TARGET_OBJECTS:threebears_babybear_clean>
$<TARGET_OBJECTS:threebears_babybear_ephem_clean>
$<TARGET_OBJECTS:threebears_mamabear_clean>
$<TARGET_OBJECTS:threebears_mamabear_ephem_clean>
$<TARGET_OBJECTS:threebears_papabear_clean>
$<TARGET_OBJECTS:threebears_papabear_ephem_clean>
$<TARGET_OBJECTS:dilithium_2_clean>
$<TARGET_OBJECTS:dilithium_2_avx2>
$<TARGET_OBJECTS:dilithium_3_clean>
$<TARGET_OBJECTS:dilithium_3_avx2>
$<TARGET_OBJECTS:dilithium_4_clean>
$<TARGET_OBJECTS:dilithium_4_avx2>
$<TARGET_OBJECTS:falcon_512_clean>
$<TARGET_OBJECTS:falcon_1024_clean>
$<TARGET_OBJECTS:mqdss_31_48_clean>
$<TARGET_OBJECTS:mqdss_31_64_clean>
$<TARGET_OBJECTS:rainbow_Ia_classic_clean>
$<TARGET_OBJECTS:rainbow_Ia_cyclic_clean>
$<TARGET_OBJECTS:rainbow_Ia_cyclic_compressed_clean>
$<TARGET_OBJECTS:rainbow_IIIc_classic_clean>
$<TARGET_OBJECTS:rainbow_IIIc_cyclic_clean>
$<TARGET_OBJECTS:rainbow_IIIc_cyclic_compressed_clean>
$<TARGET_OBJECTS:rainbow_Vc_classic_clean>
$<TARGET_OBJECTS:rainbow_Vc_cyclic_clean>
$<TARGET_OBJECTS:rainbow_Vc_cyclic_compressed_clean>
$<TARGET_OBJECTS:sphincs_haraka_128f_robust_clean>
$<TARGET_OBJECTS:sphincs_haraka_128f_simple_clean>
$<TARGET_OBJECTS:sphincs_haraka_128s_robust_clean>
$<TARGET_OBJECTS:sphincs_haraka_128s_simple_clean>
$<TARGET_OBJECTS:sphincs_haraka_192f_robust_clean>
$<TARGET_OBJECTS:sphincs_haraka_192f_simple_clean>
$<TARGET_OBJECTS:sphincs_haraka_192s_robust_clean>
$<TARGET_OBJECTS:sphincs_haraka_192s_simple_clean>
$<TARGET_OBJECTS:sphincs_haraka_256f_robust_clean>
$<TARGET_OBJECTS:sphincs_haraka_256f_simple_clean>
$<TARGET_OBJECTS:sphincs_haraka_256s_robust_clean>
$<TARGET_OBJECTS:sphincs_haraka_256s_simple_clean>
$<TARGET_OBJECTS:sphincs_sha256_128f_robust_clean>
$<TARGET_OBJECTS:sphincs_sha256_128f_simple_clean>
$<TARGET_OBJECTS:sphincs_sha256_128s_robust_clean>
$<TARGET_OBJECTS:sphincs_sha256_128s_simple_clean>
$<TARGET_OBJECTS:sphincs_sha256_192f_robust_clean>
$<TARGET_OBJECTS:sphincs_sha256_192f_simple_clean>
$<TARGET_OBJECTS:sphincs_sha256_192s_robust_clean>
$<TARGET_OBJECTS:sphincs_sha256_192s_simple_clean>
$<TARGET_OBJECTS:sphincs_sha256_256f_robust_clean>
$<TARGET_OBJECTS:sphincs_sha256_256f_simple_clean>
$<TARGET_OBJECTS:sphincs_sha256_256s_robust_clean>
$<TARGET_OBJECTS:sphincs_sha256_256s_simple_clean>
$<TARGET_OBJECTS:sphincs_shake256_128f_robust_clean>
$<TARGET_OBJECTS:sphincs_shake256_128f_simple_clean>
$<TARGET_OBJECTS:sphincs_shake256_128s_robust_clean>
$<TARGET_OBJECTS:sphincs_shake256_128s_simple_clean>
$<TARGET_OBJECTS:sphincs_shake256_192f_robust_clean>
$<TARGET_OBJECTS:sphincs_shake256_192f_simple_clean>
$<TARGET_OBJECTS:sphincs_shake256_192s_robust_clean>
$<TARGET_OBJECTS:sphincs_shake256_192s_simple_clean>
$<TARGET_OBJECTS:sphincs_shake256_256f_robust_clean>
$<TARGET_OBJECTS:sphincs_shake256_256f_simple_clean>
$<TARGET_OBJECTS:sphincs_shake256_256s_robust_clean>
$<TARGET_OBJECTS:sphincs_shake256_256s_simple_clean>
##### OQS_COPY_FROM_PQCLEAN_FRAGMENT_ADD_TEMPLATE_OBJECTS_END
$<TARGET_OBJECTS:common>)
if(DEFINED SANITIZER_LD_FLAGS)
target_link_libraries(oqs PUBLIC ${SANITIZER_LD_FLAGS})
endif()
if(OQS_USE_OPENSSL)
target_link_libraries(oqs PUBLIC ${OPENSSL_CRYPTO_LIBRARY})
target_include_directories(oqs PUBLIC ${OPENSSL_INCLUDE_DIR})
endif()
if(DEFINED CPUFEATURES_LIBRARY)
target_link_libraries(oqs PRIVATE ${CPUFEATURES_LIBRARY})
endif()
if(OQS_USE_OPENSSL)
target_link_libraries(oqs PUBLIC ${OPENSSL_CRYPTO_LIBRARY})
target_include_directories(oqs PUBLIC ${OPENSSL_INCLUDE_DIR})
endif()
set_target_properties(oqs
PROPERTIES

View File

@ -21,6 +21,7 @@
#endif
static OQS_RT rt_cpu_flags = {0};
static int rt_cpu_flags_initialized = 0;
OQS_API void OQS_init(void) {
#if defined(CPU_FEATURES_ARCH_X86)
@ -84,6 +85,10 @@ OQS_API void OQS_init(void) {
}
OQS_API OQS_RT OQS_RT_cpu_flags(void) {
if (!rt_cpu_flags_initialized) {
OQS_init();
rt_cpu_flags_initialized = 1;
}
return rt_cpu_flags;
}
#else /* OQS_ENABLE_CPUFEATURES */

View File

@ -80,111 +80,197 @@
///// OQS_COPY_FROM_PQCLEAN_FRAGMENT_ADD_ALG_ENABLE_DEFINES_START
#cmakedefine OQS_ENABLE_KEM_CLASSIC_MCELIECE 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_348864 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_348864_vec 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_348864f 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_348864f_vec 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_460896 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_460896_vec 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_460896f 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_460896f_vec 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_6688128 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_6688128_vec 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_6688128f 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_6688128f_vec 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_6960119 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_6960119_vec 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_6960119f 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_6960119f_vec 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_8192128 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_8192128_vec 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_8192128f 1
#cmakedefine OQS_ENABLE_KEM_classic_mceliece_8192128f_vec 1
#cmakedefine OQS_ENABLE_KEM_KYBER 1
#cmakedefine OQS_ENABLE_KEM_kyber_512 1
#cmakedefine OQS_ENABLE_KEM_kyber_512_avx2 1
#cmakedefine OQS_ENABLE_KEM_kyber_768 1
#cmakedefine OQS_ENABLE_KEM_kyber_768_avx2 1
#cmakedefine OQS_ENABLE_KEM_kyber_1024 1
#cmakedefine OQS_ENABLE_KEM_kyber_1024_avx2 1
#cmakedefine OQS_ENABLE_KEM_kyber_512_90s 1
#cmakedefine OQS_ENABLE_KEM_kyber_512_90s_avx2 1
#cmakedefine OQS_ENABLE_KEM_kyber_768_90s 1
#cmakedefine OQS_ENABLE_KEM_kyber_768_90s_avx2 1
#cmakedefine OQS_ENABLE_KEM_kyber_1024_90s 1
#cmakedefine OQS_ENABLE_KEM_kyber_1024_90s_avx2 1
#cmakedefine OQS_ENABLE_KEM_LEDACRYPT 1
#cmakedefine OQS_ENABLE_KEM_ledacrypt_ledakemlt12 1
#cmakedefine OQS_ENABLE_KEM_ledacrypt_ledakemlt12_leaktime 1
#cmakedefine OQS_ENABLE_KEM_ledacrypt_ledakemlt32 1
#cmakedefine OQS_ENABLE_KEM_ledacrypt_ledakemlt32_leaktime 1
#cmakedefine OQS_ENABLE_KEM_ledacrypt_ledakemlt52 1
#cmakedefine OQS_ENABLE_KEM_ledacrypt_ledakemlt52_leaktime 1
#cmakedefine OQS_ENABLE_KEM_NEWHOPE 1
#cmakedefine OQS_ENABLE_KEM_newhope_512cca 1
#cmakedefine OQS_ENABLE_KEM_newhope_1024cca 1
#cmakedefine OQS_ENABLE_KEM_NTRU 1
#cmakedefine OQS_ENABLE_KEM_ntru_hps2048509 1
#cmakedefine OQS_ENABLE_KEM_ntru_hps2048677 1
#cmakedefine OQS_ENABLE_KEM_ntru_hps4096821 1
#cmakedefine OQS_ENABLE_KEM_ntru_hrss701 1
#cmakedefine OQS_ENABLE_KEM_SABER 1
#cmakedefine OQS_ENABLE_KEM_saber_lightsaber 1
#cmakedefine OQS_ENABLE_KEM_saber_saber 1
#cmakedefine OQS_ENABLE_KEM_saber_firesaber 1
#cmakedefine OQS_ENABLE_KEM_THREEBEARS 1
#cmakedefine OQS_ENABLE_KEM_threebears_babybear 1
#cmakedefine OQS_ENABLE_KEM_threebears_babybear_ephem 1
#cmakedefine OQS_ENABLE_KEM_threebears_mamabear 1
#cmakedefine OQS_ENABLE_KEM_threebears_mamabear_ephem 1
#cmakedefine OQS_ENABLE_KEM_threebears_papabear 1
#cmakedefine OQS_ENABLE_KEM_threebears_papabear_ephem 1
#cmakedefine OQS_ENABLE_SIG_DILITHIUM
#cmakedefine OQS_ENABLE_SIG_dilithium_2 1
#cmakedefine OQS_ENABLE_SIG_dilithium_2_avx2 1
#cmakedefine OQS_ENABLE_SIG_dilithium_3 1
#cmakedefine OQS_ENABLE_SIG_dilithium_3_avx2 1
#cmakedefine OQS_ENABLE_SIG_dilithium_4 1
#cmakedefine OQS_ENABLE_SIG_dilithium_4_avx2 1
#cmakedefine OQS_ENABLE_SIG_FALCON
#cmakedefine OQS_ENABLE_SIG_falcon_512 1
#cmakedefine OQS_ENABLE_SIG_falcon_1024 1
#cmakedefine OQS_ENABLE_SIG_MQDSS
#cmakedefine OQS_ENABLE_SIG_mqdss_31_48 1
#cmakedefine OQS_ENABLE_SIG_mqdss_31_64 1
#cmakedefine OQS_ENABLE_SIG_RAINBOW
#cmakedefine OQS_ENABLE_SIG_rainbow_Ia_classic 1
#cmakedefine OQS_ENABLE_SIG_rainbow_Ia_cyclic 1
#cmakedefine OQS_ENABLE_SIG_rainbow_Ia_cyclic_compressed 1
#cmakedefine OQS_ENABLE_SIG_rainbow_IIIc_classic 1
#cmakedefine OQS_ENABLE_SIG_rainbow_IIIc_cyclic 1
#cmakedefine OQS_ENABLE_SIG_rainbow_IIIc_cyclic_compressed 1
#cmakedefine OQS_ENABLE_SIG_rainbow_Vc_classic 1
#cmakedefine OQS_ENABLE_SIG_rainbow_Vc_cyclic 1
#cmakedefine OQS_ENABLE_SIG_rainbow_Vc_cyclic_compressed 1
#cmakedefine OQS_ENABLE_SIG_SPHINCS
#cmakedefine OQS_ENABLE_SIG_sphincs_haraka_128f_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_haraka_128f_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_haraka_128s_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_haraka_128s_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_haraka_192f_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_haraka_192f_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_haraka_192s_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_haraka_192s_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_haraka_256f_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_haraka_256f_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_haraka_256s_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_haraka_256s_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_sha256_128f_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_sha256_128f_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_sha256_128s_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_sha256_128s_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_sha256_192f_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_sha256_192f_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_sha256_192s_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_sha256_192s_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_sha256_256f_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_sha256_256f_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_sha256_256s_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_sha256_256s_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_shake256_128f_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_shake256_128f_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_shake256_128s_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_shake256_128s_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_shake256_192f_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_shake256_192f_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_shake256_192s_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_shake256_192s_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_shake256_256f_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_shake256_256f_simple 1
#cmakedefine OQS_ENABLE_SIG_sphincs_shake256_256s_robust 1
#cmakedefine OQS_ENABLE_SIG_sphincs_shake256_256s_simple 1
///// OQS_COPY_FROM_PQCLEAN_FRAGMENT_ADD_ALG_ENABLE_DEFINES_END

View File

@ -77,9 +77,15 @@ set(API_TEST_DEPS oqs ${LIBM})
# KEM API tests
add_executable(example_kem example_kem.c)
target_link_libraries(example_kem PRIVATE ${API_TEST_DEPS})
if(DEFINED CPUFEATURES_LIBRARY)
target_link_libraries(example_kem PUBLIC ${CPUFEATURES_LIBRARY})
endif()
add_executable(kat_kem kat_kem.c)
target_link_libraries(kat_kem PRIVATE ${API_TEST_DEPS})
if(DEFINED CPUFEATURES_LIBRARY)
target_link_libraries(kat_kem PRIVATE ${CPUFEATURES_LIBRARY})
endif()
add_executable(test_kem test_kem.c)
if((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_C_COMPILER_ID STREQUAL "GNU"))
@ -87,16 +93,28 @@ if((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_C_COMPILER_ID STREQUAL "GNU")
else ()
target_link_libraries(test_kem PRIVATE ${API_TEST_DEPS})
endif()
if(DEFINED CPUFEATURES_LIBRARY)
target_link_libraries(test_kem PRIVATE ${CPUFEATURES_LIBRARY})
endif()
add_executable(speed_kem speed_kem.c)
target_link_libraries(speed_kem PRIVATE ${API_TEST_DEPS})
if(DEFINED CPUFEATURES_LIBRARY)
target_link_libraries(speed_kem PRIVATE ${CPUFEATURES_LIBRARY})
endif()
# SIG API tests
add_executable(example_sig example_sig.c)
target_link_libraries(example_sig PRIVATE ${API_TEST_DEPS})
if(DEFINED CPUFEATURES_LIBRARY)
target_link_libraries(example_sig PRIVATE ${CPUFEATURES_LIBRARY})
endif()
add_executable(kat_sig kat_sig.c)
target_link_libraries(kat_sig PRIVATE ${API_TEST_DEPS})
if(DEFINED CPUFEATURES_LIBRARY)
target_link_libraries(kat_sig PRIVATE ${CPUFEATURES_LIBRARY})
endif()
add_executable(test_sig test_sig.c)
if((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_C_COMPILER_ID STREQUAL "GNU"))
@ -104,9 +122,15 @@ if((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_C_COMPILER_ID STREQUAL "GNU")
else ()
target_link_libraries(test_sig PRIVATE ${API_TEST_DEPS})
endif()
if(DEFINED CPUFEATURES_LIBRARY)
target_link_libraries(test_sig PRIVATE ${CPUFEATURES_LIBRARY})
endif()
add_executable(speed_sig speed_sig.c)
target_link_libraries(speed_sig PRIVATE ${API_TEST_DEPS})
if(DEFINED CPUFEATURES_LIBRARY)
target_link_libraries(speed_sig PRIVATE ${CPUFEATURES_LIBRARY})
endif()
# TODO: Get CMake to find python.
# and set PATH variable in Windows

View File

@ -139,8 +139,6 @@ int main(int argc, char **argv) {
return EXIT_FAILURE;
}
OQS_init();
print_system_info();
printf("Speed test\n");

View File

@ -43,6 +43,8 @@ static OQS_STATUS sig_speed_wrapper(const char *method_name, uint64_t duration,
printf("%-30s | %10s | %14s | %15s | %10s | %25s | %10s\n", sig->method_name, "", "", "", "", "", "");
TIME_OPERATION_SECONDS(OQS_SIG_keypair(sig, public_key, secret_key), "keypair", duration)
TIME_OPERATION_SECONDS(OQS_SIG_sign(sig, signature, &signature_len, message, message_len, secret_key), "sign", duration)
//message[0]=0;
// printf("verify result = %d\n", OQS_SIG_verify(sig, message, message_len, signature, signature_len, public_key));
TIME_OPERATION_SECONDS(OQS_SIG_verify(sig, message, message_len, signature, signature_len, public_key), "verify", duration)
if (printInfo) {
@ -140,8 +142,6 @@ int main(int argc, char **argv) {
return EXIT_FAILURE;
}
OQS_init();
print_system_info();
printf("Speed test\n");

View File

@ -158,8 +158,6 @@ int main(int argc, char **argv) {
return EXIT_FAILURE;
}
OQS_init();
print_system_info();
char *alg_name = argv[1];

View File

@ -119,8 +119,6 @@ int main(int argc, char **argv) {
return EXIT_FAILURE;
}
OQS_init();
print_system_info();
char *alg_name = argv[1];