| 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 |  |