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