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