Skip to main content
  • Home
  • login
  • Browse the archive

    swh mirror partner logo
swh logo
SoftwareHeritage
Software
Heritage
Mirror
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

  • fe7dd1a
  • /
  • test
  • /
  • oqs_test_kems.c
Raw File
Permalinks

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • content
  • directory
content badge Iframe embedding
swh:1:cnt:a7cabc833f6d1fd51c7301b7b3fa01f2c888fcd7
directory badge Iframe embedding
swh:1:dir:afd609aa2aed1298dc68e73d964aeceb47031ec2
oqs_test_kems.c
// SPDX-License-Identifier: Apache-2.0 AND MIT

#include <openssl/evp.h>
#include <openssl/provider.h>
#include "test_common.h"
#include <string.h>
#include "oqs/oqs.h"

static OSSL_LIB_CTX *libctx = NULL;
static char *modulename = NULL;
static char *configfile = NULL;

#define ECP_NAME(secbits, oqsname) \
    (secbits == 128 ? "p256_" #oqsname "" : \
     secbits == 192 ? "p384_" #oqsname "" : \
                      "p521_" #oqsname "")
#define ECX_NAME(secbits, oqsname) \
    (secbits == 128 ? "x25519_" #oqsname "" : \
                        "x448_" #oqsname "")

#define KEMALG3(NAMES, SECBITS) \
  "" #NAMES "", ECP_NAME(SECBITS, NAMES), ECX_NAME(SECBITS, NAMES)
#define KEMALG2(NAMES, SECBITS) \
  "" #NAMES "", ECP_NAME(SECBITS, NAMES)

static const char *kemalg_names[] = {
///// OQS_TEMPLATE_FRAGMENT_KEM_CASES_START
#ifdef OQS_ENABLE_KEM_frodokem_640_aes
    KEMALG3(frodo640aes, 128),
#endif
#ifdef OQS_ENABLE_KEM_frodokem_640_shake
    KEMALG3(frodo640shake, 128),
#endif
#ifdef OQS_ENABLE_KEM_frodokem_976_aes
    KEMALG3(frodo976aes, 192),
#endif
#ifdef OQS_ENABLE_KEM_frodokem_976_shake
    KEMALG3(frodo976shake, 192),
#endif
#ifdef OQS_ENABLE_KEM_frodokem_1344_aes
    KEMALG2(frodo1344aes, 256),
#endif
#ifdef OQS_ENABLE_KEM_frodokem_1344_shake
    KEMALG2(frodo1344shake, 256),
#endif
#ifdef OQS_ENABLE_KEM_kyber_512
    KEMALG3(kyber512, 128),
#endif
#ifdef OQS_ENABLE_KEM_kyber_768
    KEMALG3(kyber768, 192),
#endif
#ifdef OQS_ENABLE_KEM_kyber_1024
    KEMALG2(kyber1024, 256),
#endif
#ifdef OQS_ENABLE_KEM_bike_l1
    KEMALG3(bikel1, 128),
#endif
#ifdef OQS_ENABLE_KEM_bike_l3
    KEMALG3(bikel3, 192),
#endif
#ifdef OQS_ENABLE_KEM_bike_l5
    KEMALG2(bikel5, 256),
#endif
#ifdef OQS_ENABLE_KEM_hqc_128
    KEMALG3(hqc128, 128),
#endif
#ifdef OQS_ENABLE_KEM_hqc_192
    KEMALG3(hqc192, 192),
#endif
#ifdef OQS_ENABLE_KEM_hqc_256
    KEMALG2(hqc256, 256),
#endif
///// OQS_TEMPLATE_FRAGMENT_KEM_CASES_END
};

static int test_oqs_kems(const char *kemalg_name)
{
  EVP_MD_CTX *mdctx = NULL;
  EVP_PKEY_CTX *ctx = NULL;
  EVP_PKEY *key = NULL;
  unsigned char *out, *secenc, *secdec;
  size_t outlen, seclen;

  int testresult = 1;

  if (!alg_is_enabled(kemalg_name)) {
     printf("Not testing disabled algorithm %s.\n", kemalg_name);
     return 1;
  }
  // test with built-in digest only if default provider is active:
  // TBD revisit when hybrids are activated: They always need default provider
  if (OSSL_PROVIDER_available(libctx, "default")) {
    testresult &=
      (ctx = EVP_PKEY_CTX_new_from_name(libctx, kemalg_name, NULL)) != NULL
      && EVP_PKEY_keygen_init(ctx)
      && EVP_PKEY_generate(ctx, &key);

    if (!testresult) goto err;
    OPENSSL_free(ctx);
    ctx = NULL;

    testresult &=
      (ctx = EVP_PKEY_CTX_new_from_pkey(libctx, key, NULL)) != NULL
      && EVP_PKEY_encapsulate_init(ctx, NULL)
      && EVP_PKEY_encapsulate(ctx, NULL, &outlen, NULL, &seclen)
      && (out = OPENSSL_malloc(outlen)) != NULL
      && (secenc = OPENSSL_malloc(seclen)) != NULL
      && memset(secenc, 0x11, seclen) != NULL
      && (secdec = OPENSSL_malloc(seclen)) != NULL
      && memset(secdec, 0xff, seclen) != NULL
      && EVP_PKEY_encapsulate(ctx, out, &outlen, secenc, &seclen)
      && EVP_PKEY_decapsulate_init(ctx, NULL)
      && EVP_PKEY_decapsulate(ctx, secdec, &seclen, out, outlen)
      && memcmp(secenc, secdec, seclen) == 0;
    if (!testresult) goto err;

    out[0] = ~out[0];
    out[outlen - 1] = ~out[outlen - 1];
    testresult &=
      memset(secdec, 0xff, seclen) != NULL
      && EVP_PKEY_decapsulate_init(ctx, NULL)
      && (EVP_PKEY_decapsulate(ctx, secdec, &seclen, out, outlen) || 1)
      && memcmp(secenc, secdec, seclen) != 0;
  }

err:
  EVP_PKEY_free(key);
  OPENSSL_free(ctx);
  return testresult;
}

#define nelem(a) (sizeof(a)/sizeof((a)[0]))

int main(int argc, char *argv[])
{
  size_t i;
  int errcnt = 0, test = 0;

  T((libctx = OSSL_LIB_CTX_new()) != NULL);
  T(argc == 3);
  modulename = argv[1];
  configfile = argv[2];

  T(OSSL_LIB_CTX_load_config(libctx, configfile));

  T(OSSL_PROVIDER_available(libctx, modulename));

  for (i = 0; i < nelem(kemalg_names); i++) {
    if (test_oqs_kems(kemalg_names[i])) {
      fprintf(stderr,
              cGREEN "  KEM test succeeded: %s" cNORM "\n",
              kemalg_names[i]);
    } else {
      fprintf(stderr,
              cRED "  KEM test failed: %s" cNORM "\n",
              kemalg_names[i]);
      ERR_print_errors_fp(stderr);
      errcnt++;
    }
  }

  OSSL_LIB_CTX_free(libctx);

  TEST_ASSERT(errcnt == 0)
  return !test;
}

ENEA — Copyright (C), ENEA. License: GNU AGPLv3+.
Legal notes  ::  JavaScript license information ::  Web API

back to top