.\" Automatically generated by Pandoc 2.17.1.1 .\" .\" Define V font for inline verbatim, using C font in formats .\" that render this, and otherwise B font. .ie "\f[CB]x\f[]"x" \{\ . ftr V B . ftr VI BI . ftr VB B . ftr VBI BI .\} .el \{\ . ftr V CR . ftr VI CI . ftr VB CB . ftr VBI CBI .\} .TH "mceliece" "3" "" "" "" .hy .SS NAME .PP mceliece - C API for the libmceliece implementation of the Classic McEliece cryptosystem .SS SYNOPSIS .PP Using libmceliece: .IP .nf \f[C] #include \f[R] .fi .PP Link with \f[V]-lmceliece\f[R]. .PP Key generation (for, e.g., \f[V]mceliece6960119\f[R]): .IP .nf \f[C] unsigned char pk[mceliece6960119_PUBLICKEYBYTES]; unsigned char sk[mceliece6960119_SECRETKEYBYTES]; mceliece6960119_keypair(pk,sk); \f[R] .fi .PP Encapsulation (for, e.g., \f[V]mceliece6960119\f[R]): .IP .nf \f[C] unsigned char ct[mceliece6960119_CIPHERTEXTBYTES]; unsigned char k[mceliece6960119_BYTES]; const unsigned char pk[mceliece6960119_PUBLICKEYBYTES]; int ret; ret = mceliece6960119_enc(ct,k,pk); \f[R] .fi .PP Decapsulation (for, e.g., \f[V]mceliece6960119\f[R]): .IP .nf \f[C] unsigned char k[mceliece6960119_BYTES]; const unsigned char ct[mceliece6960119_CIPHERTEXTBYTES]; const unsigned char sk[mceliece6960119_SECRETKEYBYTES]; int ret; ret = mceliece6960119_dec(k,ct,sk); \f[R] .fi .SS DESCRIPTION .PP libmceliece is an implementation of the Classic McEliece (https://classic.mceliece.org) cryptosystem. The C API for libmceliece provides the following functions: .IP .nf \f[C] mceliece{6960119,6688128,8192128,460896,348864}_keypair mceliece{6960119,6688128,8192128,460896,348864}_enc mceliece{6960119,6688128,8192128,460896,348864}_dec mceliece{6960119,6688128,8192128,460896,348864}f_keypair mceliece{6960119,6688128,8192128,460896,348864}f_enc mceliece{6960119,6688128,8192128,460896,348864}f_dec \f[R] .fi .PP All of these functions follow the SUPERCOP API for KEMs (https://bench.cr.yp.to/call-kem.html) except that .IP \[bu] 2 the function names are libmceliece-specific instead of \f[V]crypto_kem_*\f[R], .IP \[bu] 2 message lengths are \f[V]long long\f[R] instead of \f[V]unsigned long long\f[R], and .IP \[bu] 2 the \f[V]keypair\f[R] functions return \f[V]void\f[R] instead of \f[V]int\f[R]. .PP The details below use \f[V]mceliece6960119\f[R] as an example. .SS KEY GENERATION .PP The \f[V]mceliece6960119_keypair\f[R] function randomly generates Alice\[cq]s secret key \f[V]sk[0]\f[R], \f[V]sk[1]\f[R], \&..., \f[V]sk[mceliece6960119_SECRETKEYBYTES-1]\f[R] and Alice\[cq]s corresponding public key \f[V]pk[0]\f[R], \f[V]pk[1]\f[R], \&..., \f[V]pk[mceliece6960119_PUBLICKEYBYTES-1]\f[R]. .SS ENCAPSULATION .PP The \f[V]mceliece6960119_enc\f[R] function randomly generates a ciphertext \f[V]ct[0]\f[R], \f[V]ct[1]\f[R], \&..., \f[V]ct[mceliece6960119_CIPHERTEXTBYTES-1]\f[R] and the corresponding session key \f[V]k[0]\f[R], \f[V]k[1]\f[R], \&..., \f[V]k[mceliece6960119_BYTES-1]\f[R] given Alice\[cq]s public key \f[V]pk[0]\f[R], \f[V]pk[1]\f[R], \&..., \f[V]pk[mceliece6960119_PUBLICKEYBYTES-1]\f[R]. This function then returns \f[V]0\f[R]. .PP Exception: If the input public key is not \[lq]narrowly decodable\[rq] (i.e., if bits at particular positions in \f[V]pk\f[R] are set), this function returns \f[V]-1\f[R]. Currently the function also handles such public keys by clearing \f[V]ct\f[R] and \f[V]k\f[R], but callers should not rely on this. .PP For \f[V]{6688128,8192128,460896,348864}{,f}\f[R], all byte strings of the correct length are narrowly decodable, and the return value is always \f[V]0\f[R]. For \f[V]6960119{,f}\f[R], the return value can be \f[V]-1\f[R]. .SS DECAPSULATION .PP The \f[V]mceliece6960119_dec\f[R] function, given Alice\[cq]s secret key \f[V]sk[0]\f[R], \f[V]sk[1]\f[R], \&..., \f[V]sk[mceliece6960119_SECRETKEYBYTES-1]\f[R], computes the session key \f[V]k[0]\f[R], \f[V]k[1]\f[R], \&..., \f[V]k[mceliece6960119_BYTES-1]\f[R] corresponding to a ciphertext \f[V]ct[0]\f[R], \f[V]ct[1]\f[R], \&..., \f[V]ct[mceliece6960119_CIPHERTEXTBYTES-1]\f[R] that was encapsulated to Alice. This function then returns \f[V]0\f[R]. .PP Exception: If the input ciphertext is not \[lq]narrowly decodable\[rq] (i.e., if bits at particular positions in \f[V]ct\f[R] are set), this function returns \f[V]-1\f[R]. Currently this function also handles such ciphertexts by setting all bytes of \f[V]k\f[R] to \f[V]255\f[R], but callers should not rely on this. .PP For \f[V]{6688128,8192128,460896,348864}{,f}\f[R], all byte strings of the correct length are narrowly decodable, and the return value is always \f[V]0\f[R]. For \f[V]6960119{,f}\f[R], the return value can be \f[V]-1\f[R]. .SS THE f VARIANTS .PP The \f[V]f\f[R] variants are internally more complicated than the non-\f[V]f\f[R] variants but provide faster key generation. The \f[V]f\f[R] variants are interoperable with the non-\f[V]f\f[R] variants: for example, a key generated with \f[V]mceliece6960119f_keypair\f[R] can decapsulate ciphertexts that were encapsulated with \f[V]mceliece6960119_enc\f[R]. The secret-key sizes (and formats) are the same, the \f[V]enc\f[R] functions are the same, and the \f[V]dec\f[R] functions are the same. .SS SEE ALSO .PP \f[B]mceliece\f[R](1), \f[B]randombytes\f[R](3)