The C API follows the principles of the NaCl/TweetNaCl/SUPERCOP/libsodium API, and in particular supports the previously defined crypto_sign and crypto_kem interfaces. However, to avoid namespace conflicts with NaCl, libpqcrypto uses pqcrypto_* names instead of crypto_* names. For example, put the following code into testsign.c:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "pqcrypto_sign_mqdss64.h"

    unsigned char pk[pqcrypto_sign_mqdss64_PUBLICKEYBYTES];
    unsigned char sk[pqcrypto_sign_mqdss64_SECRETKEYBYTES];

    #define mlen 7
    unsigned char m[mlen] = "hello\n";
    unsigned char sm[pqcrypto_sign_mqdss64_BYTES + mlen];
    unsigned long long smlen;
    unsigned char t[sizeof sm];
    unsigned long long tlen;

    int main()
      if (pqcrypto_sign_mqdss64_keypair(pk,sk)) abort();
      if (pqcrypto_sign_mqdss64(sm,&smlen,m,mlen,sk)) abort();
      if (pqcrypto_sign_mqdss64_open(t,&tlen,sm,smlen,pk)) abort();
      if (tlen != mlen) abort();
      if (memcmp(t,m,mlen)) abort();
      return 0;

Compile and run as follows:

    gcc -o testsign testsign.c \
      -I /home/libpqcrypto/include \
      -L /home/libpqcrypto/lib -Wl,-rpath=/home/libpqcrypto/lib \
    ./testsign && echo ok

The output will be ok.

If you have also compiled x86 libraries on an amd64 machine, you can compile in 32-bit mode as follows:

    gcc -m32 -o testsign testsign.c \
      -I /home/libpqcrypto/include \
      -L /home/libpqcrypto/lib-x86 -Wl,-rpath=/home/libpqcrypto/lib-x86 \

libpqcrypto does not include NaCl-type selection of default primitives. The caller needs to select which pqcrypto_sign function to use and which pqcrypto_kem function to use.

Some of the software included in libpqcrypto uses malloc and is not suitable for environments that control memory usage statically.

Version: This is version 2018.03.14 of the "C API" web page.