_KEM_DHKEMP384R1=44,
#define GCRY_KEM_DHKEMP384R1 GCRY_KEM_DHKEMP384R1
    GCRY_KEM_DHKEMP521R1=45
#define GCRY_KEM_DHKEMP521R1 GCRY_KEM_DHKEMP521R1
  };

/*
 * Before C99, limitation is 31 significant initial characters in a
 * macro name
 *
 *      1 ...                        31
 *      |                             |
 *      v                             v
 *      _______________________________
 */
#define GCRY_KEM_SNTRUP761_SECKEY_LEN   1763
#define GCRY_KEM_SNTRUP761_PUBKEY_LEN   1158
#define GCRY_KEM_SNTRUP761_ENCAPS_LEN   1039
#define GCRY_KEM_SNTRUP761_CIPHER_LEN   GCRY_KEM_SNTRUP761_ENCAPS_LEN
#define GCRY_KEM_SNTRUP761_SHARED_LEN   32

#define GCRY_KEM_CM6688128F_SECKEY_LEN  13932
#define GCRY_KEM_CM6688128F_PUBKEY_LEN  1044992
#define GCRY_KEM_CM6688128F_ENCAPS_LEN  208
#define GCRY_KEM_CM6688128F_CIPHER_LEN  GCRY_KEM_CM6688128F_ENCAPS_LEN
#define GCRY_KEM_CM6688128F_SHARED_LEN  32

#ifdef _GCRYPT_IN_LIBGCRYPT  /* This is not yet part of the public API.  */
#define GCRY_KEM_MLKEM_RANDOM_LEN       32
#define GCRY_KEM_MLKEM512_RANDOM_LEN    GCRY_KEM_MLKEM_RANDOM_LEN
#define GCRY_KEM_MLKEM768_RANDOM_LEN    GCRY_KEM_MLKEM_RANDOM_LEN
#define GCRY_KEM_MLKEM1024_RANDOM_LEN   GCRY_KEM_MLKEM_RANDOM_LEN
#endif /*_GCRYPT_IN_LIBGCRYPT*/

#define GCRY_KEM_MLKEM512_SECKEY_LEN    (2*384+2*384+32+2*32)  /* 1632 */
#define GCRY_KEM_MLKEM512_PUBKEY_LEN    (2*384+32)             /*  800 */
#define GCRY_KEM_MLKEM512_ENCAPS_LEN    (128+2*320)            /*  768 */
#define GCRY_KEM_MLKEM512_CIPHER_LEN    GCRY_KEM_MLKEM512_ENCAPS_LEN
#define GCRY_KEM_MLKEM512_SHARED_LEN    32

#define GCRY_KEM_MLKEM768_SECKEY_LEN    (3*384+3*384+32+2*32)  /* 2400 */
#define GCRY_KEM_MLKEM768_PUBKEY_LEN    (3*384+32)             /* 1184 */
#define GCRY_KEM_MLKEM768_ENCAPS_LEN    (128+3*320)            /* 1088 */
#define GCRY_KEM_MLKEM768_CIPHER_LEN    GCRY_KEM_MLKEM768_ENCAPS_LEN
#define GCRY_KEM_MLKEM768_SHARED_LEN    32

#define GCRY_KEM_MLKEM1024_SECKEY_LEN   (4*384+4*384+32+2*32)  /* 3168 */
#define GCRY_KEM_MLKEM1024_PUBKEY_LEN   (4*384+32)             /* 1568 */
#define GCRY_KEM_MLKEM1024_ENCAPS_LEN   (160+4*352)            /* 1568 */
#define GCRY_KEM_MLKEM1024_CIPHER_LEN   GCRY_KEM_MLKEM1024_ENCAPS_LEN
#define GCRY_KEM_MLKEM1024_SHARED_LEN   32

/* For ECC, seckey, pubkey, and ciphertext is defined by the curve.  */
#define GCRY_KEM_ECC_X25519_SECKEY_LEN  32
#define GCRY_KEM_ECC_X25519_PUBKEY_LEN  32
#define GCRY_KEM_ECC_X25519_ENCAPS_LEN  32
#define GCRY_KEM_ECC_X25519_CIPHER_LEN  GCRY_KEM_ECC_X25519_ENCAPS_LEN
/* And shared secret is specific to the protocol.  */
#define GCRY_KEM_RAW_X25519_SHARED_LEN  32

#define GCRY_KEM_DHKEM25519_SECKEY_LEN  GCRY_KEM_ECC_X25519_SECKEY_LEN
#define GCRY_KEM_DHKEM25519_PUBKEY_LEN  GCRY_KEM_ECC_X25519_PUBKEY_LEN
#define GCRY_KEM_DHKEM25519_ENCAPS_LEN  GCRY_KEM_ECC_X25519_ENCAPS_LEN
#define GCRY_KEM_DHKEM25519_CIPHER_LEN  GCRY_KEM_DHKEM25519_ENCAPS_LEN
#define GCRY_KEM_DHKEM25519_SHARED_LEN  32

#define GCRY_KEM_ECC_BP256_SECKEY_LEN   32
#define GCRY_KEM_ECC_BP256_PUBKEY_LEN   (1+32+32)
#define GCRY_KEM_ECC_BP256_ENCAPS_LEN   (1+32+32)
#define GCRY_KEM_ECC_BP256_CIPHER_LEN   GCRY_KEM_ECC_BP256_ENCAPS_LEN
#define GCRY_KEM_RAW_BP256_SHARED_LEN   (1+32+32)

#define GCRY_KEM_ECC_BP384_SECKEY_LEN   48
#define GCRY_KEM_ECC_BP384_PUBKEY_LEN   (1+48+48)
#define GCRY_KEM_ECC_BP384_ENCAPS_LEN   (1+48+48)
#define GCRY_KEM_ECC_BP384_CIPHER_LEN   GCRY_KEM_ECC_BP384_ENCAPS_LEN
#define GCRY_KEM_RAW_BP384_SHARED_LEN   (1+48+48)

/* Generate a new key pair with ALGO.  */
gcry_error_t gcry_kem_keypair (int algo,
                               void *pubkey, size_t pubkey_len,
                               void *seckey, size_t seckey_len);

/* With ALGO, for a PUBKEY, generate SHARED secret and encapsulate
   it into CIPHERTEXT.  */
gcry_error_t gcry_kem_encap (int algo,
                             const void *pubkey, size_t pubkey_len,
                             void *ciphertext, size_t ciphertext_len,
                             void *shared, size_t shared_len,
                             const void *optional, size_t optional_len);

/* With ALGO, for a SECKEY and CIPHERTEXT, compute its SHARED secret.  */
gcry_error_t gcry_kem_decap (int algo,
                             const void *seckey, size_t seckey_len,
                             const void *ciphertext, size_t ciphertext_len,
                             void *shared, size_t shared_len,
                             const void *optional, size_t optional_len);

