1 | /* $NetBSD: sshkey.h,v 1.9 2019/04/20 17:16:40 christos Exp $ */ |
2 | /* $OpenBSD: sshkey.h,v 1.31 2019/01/20 22:51:37 djm Exp $ */ |
3 | |
4 | /* |
5 | * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. |
6 | * |
7 | * Redistribution and use in source and binary forms, with or without |
8 | * modification, are permitted provided that the following conditions |
9 | * are met: |
10 | * 1. Redistributions of source code must retain the above copyright |
11 | * notice, this list of conditions and the following disclaimer. |
12 | * 2. Redistributions in binary form must reproduce the above copyright |
13 | * notice, this list of conditions and the following disclaimer in the |
14 | * documentation and/or other materials provided with the distribution. |
15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
17 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
18 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
19 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
20 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
21 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
22 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
23 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
25 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ |
27 | #ifndef SSHKEY_H |
28 | #define SSHKEY_H |
29 | |
30 | #include "includes.h" |
31 | #include <sys/types.h> |
32 | |
33 | #ifdef WITH_OPENSSL |
34 | #include <openssl/rsa.h> |
35 | #include <openssl/dsa.h> |
36 | #include <openssl/ec.h> |
37 | #include <openssl/ecdsa.h> |
38 | #else /* OPENSSL */ |
39 | #define BIGNUM void |
40 | #define RSA void |
41 | #define DSA void |
42 | #define EC_KEY void |
43 | #define EC_GROUP void |
44 | #define EC_POINT void |
45 | #endif /* WITH_OPENSSL */ |
46 | |
47 | #define SSH_RSA_MINIMUM_MODULUS_SIZE 1024 |
48 | #define SSH_KEY_MAX_SIGN_DATA_SIZE (1 << 20) |
49 | |
50 | struct sshbuf; |
51 | |
52 | /* Key types */ |
53 | enum sshkey_types { |
54 | KEY_RSA, |
55 | KEY_DSA, |
56 | KEY_ECDSA, |
57 | KEY_ED25519, |
58 | KEY_RSA_CERT, |
59 | KEY_DSA_CERT, |
60 | KEY_ECDSA_CERT, |
61 | KEY_ED25519_CERT, |
62 | KEY_XMSS, |
63 | KEY_XMSS_CERT, |
64 | KEY_UNSPEC |
65 | }; |
66 | |
67 | /* Default fingerprint hash */ |
68 | #define SSH_FP_HASH_DEFAULT SSH_DIGEST_SHA256 |
69 | |
70 | /* Fingerprint representation formats */ |
71 | enum sshkey_fp_rep { |
72 | SSH_FP_DEFAULT = 0, |
73 | SSH_FP_HEX, |
74 | SSH_FP_BASE64, |
75 | SSH_FP_BUBBLEBABBLE, |
76 | SSH_FP_RANDOMART |
77 | }; |
78 | |
79 | /* Private key serialisation formats, used on the wire */ |
80 | enum sshkey_serialize_rep { |
81 | SSHKEY_SERIALIZE_DEFAULT = 0, |
82 | SSHKEY_SERIALIZE_STATE = 1, |
83 | SSHKEY_SERIALIZE_FULL = 2, |
84 | SSHKEY_SERIALIZE_INFO = 254, |
85 | }; |
86 | |
87 | /* key is stored in external hardware */ |
88 | #define SSHKEY_FLAG_EXT 0x0001 |
89 | |
90 | #define SSHKEY_CERT_MAX_PRINCIPALS 256 |
91 | /* XXX opaquify? */ |
92 | struct sshkey_cert { |
93 | struct sshbuf *certblob; /* Kept around for use on wire */ |
94 | u_int type; /* SSH2_CERT_TYPE_USER or SSH2_CERT_TYPE_HOST */ |
95 | u_int64_t serial; |
96 | char *key_id; |
97 | u_int nprincipals; |
98 | char **principals; |
99 | u_int64_t valid_after, valid_before; |
100 | struct sshbuf *critical; |
101 | struct sshbuf *extensions; |
102 | struct sshkey *signature_key; |
103 | char *signature_type; |
104 | }; |
105 | |
106 | /* XXX opaquify? */ |
107 | struct sshkey { |
108 | int type; |
109 | int flags; |
110 | RSA *rsa; |
111 | DSA *dsa; |
112 | int ecdsa_nid; /* NID of curve */ |
113 | EC_KEY *ecdsa; |
114 | u_char *ed25519_sk; |
115 | u_char *ed25519_pk; |
116 | char *xmss_name; |
117 | char *xmss_filename; /* for state file updates */ |
118 | void *xmss_state; /* depends on xmss_name, opaque */ |
119 | u_char *xmss_sk; |
120 | u_char *xmss_pk; |
121 | struct sshkey_cert *cert; |
122 | }; |
123 | |
124 | #define ED25519_SK_SZ crypto_sign_ed25519_SECRETKEYBYTES |
125 | #define ED25519_PK_SZ crypto_sign_ed25519_PUBLICKEYBYTES |
126 | |
127 | struct sshkey *sshkey_new(int); |
128 | void sshkey_free(struct sshkey *); |
129 | int sshkey_equal_public(const struct sshkey *, |
130 | const struct sshkey *); |
131 | int sshkey_equal(const struct sshkey *, const struct sshkey *); |
132 | char *sshkey_fingerprint(const struct sshkey *, |
133 | int, enum sshkey_fp_rep); |
134 | int sshkey_fingerprint_raw(const struct sshkey *k, |
135 | int, u_char **retp, size_t *lenp); |
136 | const char *sshkey_type(const struct sshkey *); |
137 | const char *sshkey_cert_type(const struct sshkey *); |
138 | int sshkey_format_text(const struct sshkey *, struct sshbuf *); |
139 | int sshkey_write(const struct sshkey *, FILE *); |
140 | int sshkey_read(struct sshkey *, char **); |
141 | u_int sshkey_size(const struct sshkey *); |
142 | |
143 | int sshkey_generate(int type, u_int bits, struct sshkey **keyp); |
144 | int sshkey_from_private(const struct sshkey *, struct sshkey **); |
145 | int sshkey_type_from_name(const char *); |
146 | int sshkey_is_cert(const struct sshkey *); |
147 | int sshkey_type_is_cert(int); |
148 | int sshkey_type_plain(int); |
149 | int sshkey_to_certified(struct sshkey *); |
150 | int sshkey_drop_cert(struct sshkey *); |
151 | int sshkey_cert_copy(const struct sshkey *, struct sshkey *); |
152 | int sshkey_cert_check_authority(const struct sshkey *, int, int, |
153 | const char *, const char **); |
154 | size_t sshkey_format_cert_validity(const struct sshkey_cert *, |
155 | char *, size_t) __attribute__((__bounded__(__string__, 2, 3))); |
156 | int sshkey_check_cert_sigtype(const struct sshkey *, const char *); |
157 | |
158 | int sshkey_certify(struct sshkey *, struct sshkey *, const char *); |
159 | /* Variant allowing use of a custom signature function (e.g. for ssh-agent) */ |
160 | typedef int sshkey_certify_signer(const struct sshkey *, u_char **, size_t *, |
161 | const u_char *, size_t, const char *, u_int, void *); |
162 | int sshkey_certify_custom(struct sshkey *, struct sshkey *, const char *, |
163 | sshkey_certify_signer *, void *); |
164 | |
165 | int sshkey_ecdsa_nid_from_name(const char *); |
166 | int sshkey_curve_name_to_nid(const char *); |
167 | const char * sshkey_curve_nid_to_name(int); |
168 | u_int sshkey_curve_nid_to_bits(int); |
169 | int sshkey_ecdsa_bits_to_nid(int); |
170 | int sshkey_ecdsa_key_to_nid(EC_KEY *); |
171 | int sshkey_ec_nid_to_hash_alg(int nid); |
172 | int sshkey_ec_validate_public(const EC_GROUP *, const EC_POINT *); |
173 | int sshkey_ec_validate_private(const EC_KEY *); |
174 | const char *sshkey_ssh_name(const struct sshkey *); |
175 | const char *sshkey_ssh_name_plain(const struct sshkey *); |
176 | int sshkey_names_valid2(const char *, int); |
177 | char *sshkey_alg_list(int, int, int, char); |
178 | |
179 | int sshkey_from_blob(const u_char *, size_t, struct sshkey **); |
180 | int sshkey_fromb(struct sshbuf *, struct sshkey **); |
181 | int sshkey_froms(struct sshbuf *, struct sshkey **); |
182 | int sshkey_to_blob(const struct sshkey *, u_char **, size_t *); |
183 | int sshkey_to_base64(const struct sshkey *, char **); |
184 | int sshkey_putb(const struct sshkey *, struct sshbuf *); |
185 | int sshkey_puts(const struct sshkey *, struct sshbuf *); |
186 | int sshkey_puts_opts(const struct sshkey *, struct sshbuf *, |
187 | enum sshkey_serialize_rep); |
188 | int sshkey_plain_to_blob(const struct sshkey *, u_char **, size_t *); |
189 | int sshkey_putb_plain(const struct sshkey *, struct sshbuf *); |
190 | |
191 | int sshkey_sign(const struct sshkey *, u_char **, size_t *, |
192 | const u_char *, size_t, const char *, u_int); |
193 | int sshkey_verify(const struct sshkey *, const u_char *, size_t, |
194 | const u_char *, size_t, const char *, u_int); |
195 | int sshkey_check_sigtype(const u_char *, size_t, const char *); |
196 | const char *sshkey_sigalg_by_name(const char *); |
197 | |
198 | /* for debug */ |
199 | void sshkey_dump_ec_point(const EC_GROUP *, const EC_POINT *); |
200 | void sshkey_dump_ec_key(const EC_KEY *); |
201 | |
202 | /* private key parsing and serialisation */ |
203 | int sshkey_private_serialize(const struct sshkey *key, struct sshbuf *buf); |
204 | int sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *buf, |
205 | enum sshkey_serialize_rep); |
206 | int sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **keyp); |
207 | |
208 | /* private key file format parsing and serialisation */ |
209 | int sshkey_private_to_fileblob(struct sshkey *key, struct sshbuf *blob, |
210 | const char *passphrase, const char *, |
211 | int force_new_format, const char *new_format_cipher, int new_format_rounds); |
212 | int sshkey_parse_private_fileblob(struct sshbuf *buffer, |
213 | const char *passphrase, struct sshkey **keyp, char **); |
214 | int sshkey_parse_private_fileblob_type(struct sshbuf *blob, int type, |
215 | const char *passphrase, struct sshkey **keyp, char **); |
216 | |
217 | /* XXX should be internal, but used by ssh-keygen */ |
218 | int ssh_rsa_complete_crt_parameters(struct sshkey *, const BIGNUM *); |
219 | |
220 | /* stateful keys (e.g. XMSS) */ |
221 | typedef void sshkey_printfn(const char *, ...) __attribute__((format(printf, 1, 2))); |
222 | int sshkey_set_filename(struct sshkey *, const char *); |
223 | int sshkey_enable_maxsign(struct sshkey *, u_int32_t); |
224 | u_int32_t sshkey_signatures_left(const struct sshkey *); |
225 | int sshkey_forward_state(const struct sshkey *, u_int32_t, sshkey_printfn *); |
226 | int sshkey_private_serialize_maxsign(const struct sshkey *key, struct sshbuf *buf, |
227 | u_int32_t maxsign, sshkey_printfn *pr); |
228 | |
229 | #ifdef SSHKEY_INTERNAL |
230 | int ssh_rsa_sign(const struct sshkey *key, |
231 | u_char **sigp, size_t *lenp, const u_char *data, size_t datalen, |
232 | const char *ident); |
233 | int ssh_rsa_verify(const struct sshkey *key, |
234 | const u_char *sig, size_t siglen, const u_char *data, size_t datalen, |
235 | const char *alg); |
236 | int ssh_dss_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, |
237 | const u_char *data, size_t datalen, u_int compat); |
238 | int ssh_dss_verify(const struct sshkey *key, |
239 | const u_char *signature, size_t signaturelen, |
240 | const u_char *data, size_t datalen, u_int compat); |
241 | int ssh_ecdsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, |
242 | const u_char *data, size_t datalen, u_int compat); |
243 | int ssh_ecdsa_verify(const struct sshkey *key, |
244 | const u_char *signature, size_t signaturelen, |
245 | const u_char *data, size_t datalen, u_int compat); |
246 | int ssh_ed25519_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, |
247 | const u_char *data, size_t datalen, u_int compat); |
248 | int ssh_ed25519_verify(const struct sshkey *key, |
249 | const u_char *signature, size_t signaturelen, |
250 | const u_char *data, size_t datalen, u_int compat); |
251 | int ssh_xmss_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, |
252 | const u_char *data, size_t datalen, u_int compat); |
253 | int ssh_xmss_verify(const struct sshkey *key, |
254 | const u_char *signature, size_t signaturelen, |
255 | const u_char *data, size_t datalen, u_int compat); |
256 | #endif |
257 | |
258 | #ifndef WITH_OPENSSL |
259 | #undef RSA |
260 | #undef DSA |
261 | #undef EC_KEY |
262 | #undef EC_GROUP |
263 | #undef EC_POINT |
264 | #endif /* WITH_OPENSSL */ |
265 | |
266 | #endif /* SSHKEY_H */ |
267 | |