mirror of
https://github.com/open-quantum-safe/liboqs.git
synced 2025-10-04 00:02:01 -04:00
* Adding cuPQC as a backend for ML-KEM. Signed-off-by: Steven Reeves <sreeves@nvidia.com> * Fixing transposition error that left out OQS_USE_CUPQC in CMake system. Signed-off-by: Steven Reeves <sreeves@nvidia.com> * Add CMake dependent options for cupqc. Fixed formatting in kem_ml_kem_####.c and kem/family/kem_scheme.c Signed-off-by: Steven Reeves <sreeves@nvidia.com> * Move cupqc_ml-kem source files to correctly named dir Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * Stop piggybacking on pqcrystals-kyber-standard and move cupqc_ml-kem metadata to separate upstream repo Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * Update licensing information Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * Update PLATFORMS.md Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * Fix kem_family cmakelists template Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * Run copy_from_upsream.py and pull updated upstream Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * Add cupqc build test to basic.yml Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * Move cupqc build test from basic.yml to linux.yml Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * Fix error in linux.yml Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * fixup! Fix error in linux.yml Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * Redo cupqc build check Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * Supply default CUDA arch to cupqc-buildcheck configuration stage Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * Specify CUDAXX in cupqc-buildcheck Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> * Make cuPQC_DIR explicit in cupqc-buildcheck Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> --------- Signed-off-by: Steven Reeves <sreeves@nvidia.com> Signed-off-by: Pravek Sharma <sharmapravek@gmail.com> Co-authored-by: Pravek Sharma <sharmapravek@gmail.com>
109 lines
4.3 KiB
C
109 lines
4.3 KiB
C
// SPDX-License-Identifier: MIT
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <oqs/kem_ml_kem.h>
|
|
|
|
#if defined(OQS_ENABLE_KEM_ml_kem_768)
|
|
|
|
OQS_KEM *OQS_KEM_ml_kem_768_new(void) {
|
|
|
|
OQS_KEM *kem = OQS_MEM_malloc(sizeof(OQS_KEM));
|
|
if (kem == NULL) {
|
|
return NULL;
|
|
}
|
|
kem->method_name = OQS_KEM_alg_ml_kem_768;
|
|
kem->alg_version = "FIPS203";
|
|
|
|
kem->claimed_nist_level = 3;
|
|
kem->ind_cca = true;
|
|
|
|
kem->length_public_key = OQS_KEM_ml_kem_768_length_public_key;
|
|
kem->length_secret_key = OQS_KEM_ml_kem_768_length_secret_key;
|
|
kem->length_ciphertext = OQS_KEM_ml_kem_768_length_ciphertext;
|
|
kem->length_shared_secret = OQS_KEM_ml_kem_768_length_shared_secret;
|
|
|
|
kem->keypair = OQS_KEM_ml_kem_768_keypair;
|
|
kem->encaps = OQS_KEM_ml_kem_768_encaps;
|
|
kem->decaps = OQS_KEM_ml_kem_768_decaps;
|
|
|
|
return kem;
|
|
}
|
|
|
|
extern int pqcrystals_ml_kem_768_ref_keypair(uint8_t *pk, uint8_t *sk);
|
|
extern int pqcrystals_ml_kem_768_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk);
|
|
extern int pqcrystals_ml_kem_768_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk);
|
|
|
|
#if defined(OQS_ENABLE_KEM_ml_kem_768_avx2)
|
|
extern int pqcrystals_ml_kem_768_avx2_keypair(uint8_t *pk, uint8_t *sk);
|
|
extern int pqcrystals_ml_kem_768_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk);
|
|
extern int pqcrystals_ml_kem_768_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk);
|
|
#endif
|
|
|
|
#if defined(OQS_USE_CUPQC)
|
|
#if defined(OQS_ENABLE_KEM_ml_kem_768_cuda)
|
|
extern int cupqc_ml_kem_768_keypair(uint8_t *pk, uint8_t *sk);
|
|
extern int cupqc_ml_kem_768_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk);
|
|
extern int cupqc_ml_kem_768_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk);
|
|
#endif
|
|
#endif /* OQS_USE_CUPQC */
|
|
|
|
OQS_API OQS_STATUS OQS_KEM_ml_kem_768_keypair(uint8_t *public_key, uint8_t *secret_key) {
|
|
#if defined(OQS_USE_CUPQC) && defined(OQS_ENABLE_KEM_ml_kem_768_cuda)
|
|
return (OQS_STATUS) cupqc_ml_kem_768_keypair(public_key, secret_key);
|
|
#endif /* OQS_USE_CUPQC && OQS_ENABLE_KEM_ml_kem_768_cuda */
|
|
#if defined(OQS_ENABLE_KEM_ml_kem_768_avx2)
|
|
#if defined(OQS_DIST_BUILD)
|
|
if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) {
|
|
#endif /* OQS_DIST_BUILD */
|
|
return (OQS_STATUS) pqcrystals_ml_kem_768_avx2_keypair(public_key, secret_key);
|
|
#if defined(OQS_DIST_BUILD)
|
|
} else {
|
|
return (OQS_STATUS) pqcrystals_ml_kem_768_ref_keypair(public_key, secret_key);
|
|
}
|
|
#endif /* OQS_DIST_BUILD */
|
|
#else
|
|
return (OQS_STATUS) pqcrystals_ml_kem_768_ref_keypair(public_key, secret_key);
|
|
#endif
|
|
}
|
|
|
|
OQS_API OQS_STATUS OQS_KEM_ml_kem_768_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) {
|
|
#if defined(OQS_USE_CUPQC) && defined(OQS_ENABLE_KEM_ml_kem_768_cuda)
|
|
return (OQS_STATUS) cupqc_ml_kem_768_enc(ciphertext, shared_secret, public_key);
|
|
#endif /* OQS_USE_CUPQC && OQS_ENABLE_KEM_ml_kem_768_cuda */
|
|
#if defined(OQS_ENABLE_KEM_ml_kem_768_avx2)
|
|
#if defined(OQS_DIST_BUILD)
|
|
if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) {
|
|
#endif /* OQS_DIST_BUILD */
|
|
return (OQS_STATUS) pqcrystals_ml_kem_768_avx2_enc(ciphertext, shared_secret, public_key);
|
|
#if defined(OQS_DIST_BUILD)
|
|
} else {
|
|
return (OQS_STATUS) pqcrystals_ml_kem_768_ref_enc(ciphertext, shared_secret, public_key);
|
|
}
|
|
#endif /* OQS_DIST_BUILD */
|
|
#else
|
|
return (OQS_STATUS) pqcrystals_ml_kem_768_ref_enc(ciphertext, shared_secret, public_key);
|
|
#endif
|
|
}
|
|
|
|
OQS_API OQS_STATUS OQS_KEM_ml_kem_768_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key) {
|
|
#if defined(OQS_USE_CUPQC) && defined(OQS_ENABLE_KEM_ml_kem_768_cuda)
|
|
return (OQS_STATUS) cupqc_ml_kem_768_dec(shared_secret, ciphertext, secret_key);
|
|
#endif /* OQS_USE_CUPQC && OQS_ENABLE_KEM_ml_kem_768_cuda */
|
|
#if defined(OQS_ENABLE_KEM_ml_kem_768_avx2)
|
|
#if defined(OQS_DIST_BUILD)
|
|
if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) {
|
|
#endif /* OQS_DIST_BUILD */
|
|
return (OQS_STATUS) pqcrystals_ml_kem_768_avx2_dec(shared_secret, ciphertext, secret_key);
|
|
#if defined(OQS_DIST_BUILD)
|
|
} else {
|
|
return (OQS_STATUS) pqcrystals_ml_kem_768_ref_dec(shared_secret, ciphertext, secret_key);
|
|
}
|
|
#endif /* OQS_DIST_BUILD */
|
|
#else
|
|
return (OQS_STATUS) pqcrystals_ml_kem_768_ref_dec(shared_secret, ciphertext, secret_key);
|
|
#endif
|
|
}
|
|
|
|
#endif
|