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
crypto_hash_sha512(unsigned char * out,const unsigned char * in,unsigned long long inlen)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
crypto_hash_sha512(unsigned char * out,const unsigned char * in,unsigned long long inlen)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