Home | History | Annotate | Line # | Download | only in dist
      1 /*	$NetBSD: crypto_api.h,v 1.9 2026/09/21 21:30:59 christos Exp $	*/
      2 /* $OpenBSD: crypto_api.h,v 1.12 2026/07/16 04:12:50 djm Exp $ */
      3 
      4 /*
      5  * Assembled from generated headers and source files by Markus Friedl.
      6  * Placed in the public domain.
      7  */
      8 
      9 #ifndef crypto_api_h
     10 #define crypto_api_h
     11 
     12 #include <stdint.h>
     13 #include <stdlib.h>
     14 
     15 typedef int8_t crypto_int8;
     16 typedef uint8_t crypto_uint8;
     17 typedef int16_t crypto_int16;
     18 typedef uint16_t crypto_uint16;
     19 typedef int32_t crypto_int32;
     20 typedef uint32_t crypto_uint32;
     21 typedef int64_t crypto_int64;
     22 typedef uint64_t crypto_uint64;
     23 
     24 #define randombytes(buf, buf_len) arc4random_buf((buf), (buf_len))
     25 #define small_random32() arc4random()
     26 
     27 #define crypto_hash_sha512_BYTES 64U
     28 
     29 #ifdef WITH_OPENSSL
     30 #include <openssl/evp.h>
     31 static inline int
     32 crypto_hash_sha512(unsigned char *out, const unsigned char *in,
     33     unsigned long long inlen)
     34 {
     35 
     36 	if (!EVP_Digest(in, inlen, out, NULL, EVP_sha512(), NULL))
     37 		return -1;
     38 	return 0;
     39 }
     40 #else /* WITH_OPENSSL */
     41 # include <sha2.h>
     42 static inline int
     43 crypto_hash_sha512(unsigned char *out, const unsigned char *in,
     44     unsigned long long inlen)
     45 {
     46 
     47 	SHA512_CTX ctx;
     48 
     49 	SHA512Init(&ctx);
     50 	SHA512Update(&ctx, in, inlen);
     51 	SHA512Final(out, &ctx);
     52 	return 0;
     53 }
     54 #endif /* WITH_OPENSSL */
     55 
     56 #define crypto_sign_ed25519_SECRETKEYBYTES 64U
     57 #define crypto_sign_ed25519_PUBLICKEYBYTES 32U
     58 #define crypto_sign_ed25519_SEEDBYTES 32U
     59 #define crypto_sign_ed25519_BYTES 64U
     60 
     61 int	crypto_sign_ed25519(unsigned char *, unsigned long long *,
     62     const unsigned char *, unsigned long long, const unsigned char *);
     63 int	crypto_sign_ed25519_open(unsigned char *, unsigned long long *,
     64     const unsigned char *, unsigned long long, const unsigned char *);
     65 int	crypto_sign_ed25519_keypair(unsigned char *, unsigned char *);
     66 int	crypto_sign_ed25519_keypair_from_seed(unsigned char *, unsigned char *,
     67     const unsigned char *);
     68 
     69 #define crypto_kem_sntrup761_PUBLICKEYBYTES 1158
     70 #define crypto_kem_sntrup761_SECRETKEYBYTES 1763
     71 #define crypto_kem_sntrup761_CIPHERTEXTBYTES 1039
     72 #define crypto_kem_sntrup761_BYTES 32
     73 
     74 int	crypto_kem_sntrup761_enc(unsigned char *cstr, unsigned char *k,
     75     const unsigned char *pk);
     76 int	crypto_kem_sntrup761_dec(unsigned char *k,
     77     const unsigned char *cstr, const unsigned char *sk);
     78 int	crypto_kem_sntrup761_keypair(unsigned char *pk, unsigned char *sk);
     79 
     80 /* ML-KEM-768 */
     81 #define crypto_kem_mlkem768_PUBLICKEYBYTES 1184
     82 #define crypto_kem_mlkem768_SECRETKEYBYTES 2400
     83 #define crypto_kem_mlkem768_CIPHERTEXTBYTES 1088
     84 #define crypto_kem_mlkem768_BYTES 32
     85 #define crypto_kem_mlkem768_ENCSEEDBYTES 32
     86 #define crypto_kem_mlkem768_KEYPAIRSEEDBYTES 64
     87 
     88 /* Aliases for MLKEM768 */
     89 #define MLKEM768_PUBLICKEYBYTES crypto_kem_mlkem768_PUBLICKEYBYTES
     90 #define MLKEM768_SECRETKEYBYTES crypto_kem_mlkem768_SECRETKEYBYTES
     91 #define MLKEM768_CIPHERTEXTBYTES crypto_kem_mlkem768_CIPHERTEXTBYTES
     92 #define MLKEM768_BYTES crypto_kem_mlkem768_BYTES
     93 
     94 int crypto_kem_mlkem768_keypair(uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES],
     95     uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES]);
     96 int crypto_kem_mlkem768_enc(uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES],
     97     uint8_t shared_secret[crypto_kem_mlkem768_BYTES],
     98     const uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES]);
     99 int crypto_kem_mlkem768_dec(uint8_t shared_secret[crypto_kem_mlkem768_BYTES],
    100     const uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES],
    101     const uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES]);
    102 int crypto_kem_mlkem768_keypair_seeded(uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES],
    103     uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES], const uint8_t seed[64]);
    104 int crypto_kem_mlkem768_enc_seeded(uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES],
    105     uint8_t shared_secret[crypto_kem_mlkem768_BYTES],
    106     const uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES],
    107     const uint8_t seed[32]);
    108 
    109 /* ML-DSA-44 */
    110 #define MLDSA44_PUBLICKEYBYTES 1312
    111 #define MLDSA44_SECRETKEYBYTES 2560
    112 #define MLDSA44_SIGBYTES 2420
    113 #define MLDSA44_SEEDBYTES 32
    114 
    115 int crypto_sign_mldsa44_keypair(uint8_t pk[MLDSA44_PUBLICKEYBYTES],
    116     uint8_t sk[MLDSA44_SECRETKEYBYTES]);
    117 int crypto_sign_mldsa44(uint8_t sig[MLDSA44_SIGBYTES],
    118     const uint8_t *msg, size_t msglen,
    119     const uint8_t *ctx, size_t ctxlen,
    120     const uint8_t sk[MLDSA44_SECRETKEYBYTES]);
    121 int crypto_sign_mldsa44_verify(const uint8_t sig[MLDSA44_SIGBYTES],
    122     const uint8_t *msg, size_t msglen,
    123     const uint8_t *ctx, size_t ctxlen,
    124     const uint8_t pk[MLDSA44_PUBLICKEYBYTES]);
    125 int crypto_sign_mldsa44_keypair_seeded(uint8_t pk[MLDSA44_PUBLICKEYBYTES],
    126     uint8_t sk[MLDSA44_SECRETKEYBYTES], const uint8_t seed[MLDSA44_SEEDBYTES]);
    127 int crypto_sign_mldsa44_seeded(uint8_t sig[MLDSA44_SIGBYTES],
    128     const uint8_t *msg, size_t msglen,
    129     const uint8_t *ctx, size_t ctxlen,
    130     const uint8_t sk[MLDSA44_SECRETKEYBYTES],
    131     const uint8_t seed[MLDSA44_SEEDBYTES]);
    132 
    133 /* ML-DSA-65 */
    134 #define MLDSA65_PUBLICKEYBYTES 1952
    135 #define MLDSA65_SECRETKEYBYTES 4032
    136 #define MLDSA65_SIGBYTES 3309
    137 #define MLDSA65_SEEDBYTES 32
    138 
    139 #if 0
    140 int crypto_sign_mldsa65_keypair(uint8_t pk[MLDSA65_PUBLICKEYBYTES],
    141     uint8_t sk[MLDSA65_SECRETKEYBYTES]);
    142 int crypto_sign_mldsa65(uint8_t sig[MLDSA65_SIGBYTES],
    143     const uint8_t *msg, size_t msglen,
    144     const uint8_t *ctx, size_t ctxlen,
    145     const uint8_t sk[MLDSA65_SECRETKEYBYTES]);
    146 int crypto_sign_mldsa65_verify(const uint8_t sig[MLDSA65_SIGBYTES],
    147     const uint8_t *msg, size_t msglen,
    148     const uint8_t *ctx, size_t ctxlen,
    149     const uint8_t pk[MLDSA65_PUBLICKEYBYTES]);
    150 int crypto_sign_mldsa65_keypair_seeded(uint8_t pk[MLDSA65_PUBLICKEYBYTES],
    151     uint8_t sk[MLDSA65_SECRETKEYBYTES], const uint8_t seed[MLDSA65_SEEDBYTES]);
    152 int crypto_sign_mldsa65_seeded(uint8_t sig[MLDSA65_SIGBYTES],
    153     const uint8_t *msg, size_t msglen,
    154     const uint8_t *ctx, size_t ctxlen,
    155     const uint8_t sk[MLDSA65_SECRETKEYBYTES],
    156     const uint8_t seed[MLDSA65_SEEDBYTES]);
    157 #endif
    158 
    159 /* ML-DSA-87 */
    160 #define MLDSA87_PUBLICKEYBYTES 2592
    161 #define MLDSA87_SECRETKEYBYTES 4896
    162 #define MLDSA87_SIGBYTES 4627
    163 #define MLDSA87_SEEDBYTES 32
    164 
    165 int crypto_sign_mldsa87_keypair(uint8_t pk[MLDSA87_PUBLICKEYBYTES],
    166     uint8_t sk[MLDSA87_SECRETKEYBYTES]);
    167 int crypto_sign_mldsa87(uint8_t sig[MLDSA87_SIGBYTES],
    168     const uint8_t *msg, size_t msglen,
    169     const uint8_t *ctx, size_t ctxlen,
    170     const uint8_t sk[MLDSA87_SECRETKEYBYTES]);
    171 int crypto_sign_mldsa87_verify(const uint8_t sig[MLDSA87_SIGBYTES],
    172     const uint8_t *msg, size_t msglen,
    173     const uint8_t *ctx, size_t ctxlen,
    174     const uint8_t pk[MLDSA87_PUBLICKEYBYTES]);
    175 int crypto_sign_mldsa87_keypair_seeded(uint8_t pk[MLDSA87_PUBLICKEYBYTES],
    176     uint8_t sk[MLDSA87_SECRETKEYBYTES], const uint8_t seed[MLDSA87_SEEDBYTES]);
    177 int crypto_sign_mldsa87_seeded(uint8_t sig[MLDSA87_SIGBYTES],
    178     const uint8_t *msg, size_t msglen,
    179     const uint8_t *ctx, size_t ctxlen,
    180     const uint8_t sk[MLDSA87_SECRETKEYBYTES],
    181     const uint8_t seed[MLDSA87_SEEDBYTES]);
    182 
    183 /* MLDSA44-Ed25519-SHA512 */
    184 #define MLDSA44_ED25519_PK_SZ (MLDSA44_PUBLICKEYBYTES + crypto_sign_ed25519_PUBLICKEYBYTES)
    185 #define MLDSA44_ED25519_SK_SZ (MLDSA44_SEEDBYTES + crypto_sign_ed25519_SEEDBYTES)
    186 #define MLDSA44_ED25519_SIG_SZ (MLDSA44_SIGBYTES + crypto_sign_ed25519_BYTES)
    187 
    188 int crypto_sign_mldsa44_ed25519_keygen(uint8_t pk[MLDSA44_ED25519_PK_SZ],
    189     uint8_t sk[MLDSA44_ED25519_SK_SZ]);
    190 int crypto_sign_mldsa44_ed25519_keygen_seeded(uint8_t pk[MLDSA44_ED25519_PK_SZ],
    191     uint8_t sk[MLDSA44_ED25519_SK_SZ],
    192     const uint8_t mldsa_seed[MLDSA44_SEEDBYTES],
    193     const uint8_t ed25519_seed[crypto_sign_ed25519_SEEDBYTES]);
    194 int crypto_sign_mldsa44_ed25519_sign(uint8_t sig[MLDSA44_ED25519_SIG_SZ],
    195     const uint8_t *msg, size_t msglen,
    196     const uint8_t *ctx, size_t ctxlen,
    197     const uint8_t sk[MLDSA44_ED25519_SK_SZ]);
    198 int crypto_sign_mldsa44_ed25519_verify(const uint8_t sig[MLDSA44_ED25519_SIG_SZ],
    199     const uint8_t *msg, size_t msglen,
    200     const uint8_t *ctx, size_t ctxlen,
    201     const uint8_t pk[MLDSA44_ED25519_PK_SZ]);
    202 
    203 /* Utility */
    204 void sha3_256(uint8_t digest[32], const uint8_t *data, size_t len);
    205 void sha3_512(uint8_t digest[64], const uint8_t *data, size_t len);
    206 
    207 #endif /* crypto_api_h */
    208