xref: /freebsd/crypto/openssh/crypto_api.h (revision a259b98fa211ed87bfee58c575de4e2de94ee0fa)
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