xref: /dflybsd-src/crypto/openssh/sshsig.h (revision 95577b5e0147377b730485d25b052a4472277761)
1*ee116499SAntonio Huete Jimenez /* $OpenBSD: sshsig.h,v 1.11 2021/11/27 07:14:46 djm Exp $ */
20cbfa66cSDaniel Fojt /*
30cbfa66cSDaniel Fojt  * Copyright (c) 2019 Google LLC
40cbfa66cSDaniel Fojt  *
50cbfa66cSDaniel Fojt  * Permission to use, copy, modify, and distribute this software for any
60cbfa66cSDaniel Fojt  * purpose with or without fee is hereby granted, provided that the above
70cbfa66cSDaniel Fojt  * copyright notice and this permission notice appear in all copies.
80cbfa66cSDaniel Fojt  *
90cbfa66cSDaniel Fojt  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
100cbfa66cSDaniel Fojt  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
110cbfa66cSDaniel Fojt  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
120cbfa66cSDaniel Fojt  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
130cbfa66cSDaniel Fojt  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
140cbfa66cSDaniel Fojt  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
150cbfa66cSDaniel Fojt  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
160cbfa66cSDaniel Fojt  */
170cbfa66cSDaniel Fojt 
180cbfa66cSDaniel Fojt #ifndef SSHSIG_H
190cbfa66cSDaniel Fojt #define SSHSIG_H
200cbfa66cSDaniel Fojt 
210cbfa66cSDaniel Fojt struct sshbuf;
220cbfa66cSDaniel Fojt struct sshkey;
230cbfa66cSDaniel Fojt struct sshsigopt;
240cbfa66cSDaniel Fojt struct sshkey_sig_details;
250cbfa66cSDaniel Fojt 
260cbfa66cSDaniel Fojt typedef int sshsig_signer(struct sshkey *, u_char **, size_t *,
2750a69bb5SSascha Wildner     const u_char *, size_t, const char *, const char *, const char *,
2850a69bb5SSascha Wildner     u_int, void *);
290cbfa66cSDaniel Fojt 
300cbfa66cSDaniel Fojt /* Buffer-oriented API */
310cbfa66cSDaniel Fojt 
320cbfa66cSDaniel Fojt /*
330cbfa66cSDaniel Fojt  * Creates a detached SSH signature for a given buffer.
340cbfa66cSDaniel Fojt  * Returns 0 on success or a negative SSH_ERR_* error code on failure.
350cbfa66cSDaniel Fojt  * out is populated with the detached signature, or NULL on failure.
360cbfa66cSDaniel Fojt  */
370cbfa66cSDaniel Fojt int sshsig_signb(struct sshkey *key, const char *hashalg,
3850a69bb5SSascha Wildner     const char *sk_provider, const char *sk_pin, const struct sshbuf *message,
390cbfa66cSDaniel Fojt     const char *sig_namespace, struct sshbuf **out,
400cbfa66cSDaniel Fojt     sshsig_signer *signer, void *signer_ctx);
410cbfa66cSDaniel Fojt 
420cbfa66cSDaniel Fojt /*
430cbfa66cSDaniel Fojt  * Verifies that a detached signature is valid and optionally returns key
440cbfa66cSDaniel Fojt  * used to sign via argument.
450cbfa66cSDaniel Fojt  * Returns 0 on success or a negative SSH_ERR_* error code on failure.
460cbfa66cSDaniel Fojt  */
470cbfa66cSDaniel Fojt int sshsig_verifyb(struct sshbuf *signature,
480cbfa66cSDaniel Fojt     const struct sshbuf *message, const char *sig_namespace,
490cbfa66cSDaniel Fojt     struct sshkey **sign_keyp, struct sshkey_sig_details **sig_details);
500cbfa66cSDaniel Fojt 
510cbfa66cSDaniel Fojt /* File/FD-oriented API */
520cbfa66cSDaniel Fojt 
530cbfa66cSDaniel Fojt /*
540cbfa66cSDaniel Fojt  * Creates a detached SSH signature for a given file.
550cbfa66cSDaniel Fojt  * Returns 0 on success or a negative SSH_ERR_* error code on failure.
560cbfa66cSDaniel Fojt  * out is populated with the detached signature, or NULL on failure.
570cbfa66cSDaniel Fojt  */
580cbfa66cSDaniel Fojt int sshsig_sign_fd(struct sshkey *key, const char *hashalg,
5950a69bb5SSascha Wildner     const char *sk_provider, const char *sk_pin,
6050a69bb5SSascha Wildner     int fd, const char *sig_namespace,
610cbfa66cSDaniel Fojt     struct sshbuf **out, sshsig_signer *signer, void *signer_ctx);
620cbfa66cSDaniel Fojt 
630cbfa66cSDaniel Fojt /*
640cbfa66cSDaniel Fojt  * Verifies that a detached signature over a file is valid and optionally
650cbfa66cSDaniel Fojt  * returns key used to sign via argument.
660cbfa66cSDaniel Fojt  * Returns 0 on success or a negative SSH_ERR_* error code on failure.
670cbfa66cSDaniel Fojt  */
680cbfa66cSDaniel Fojt int sshsig_verify_fd(struct sshbuf *signature, int fd,
690cbfa66cSDaniel Fojt     const char *sig_namespace, struct sshkey **sign_keyp,
700cbfa66cSDaniel Fojt     struct sshkey_sig_details **sig_details);
710cbfa66cSDaniel Fojt 
720cbfa66cSDaniel Fojt /* Utility functions */
730cbfa66cSDaniel Fojt 
740cbfa66cSDaniel Fojt /*
750cbfa66cSDaniel Fojt  * Return a base64 encoded "ASCII armoured" version of a raw signature.
760cbfa66cSDaniel Fojt  */
770cbfa66cSDaniel Fojt int sshsig_armor(const struct sshbuf *blob, struct sshbuf **out);
780cbfa66cSDaniel Fojt 
790cbfa66cSDaniel Fojt /*
800cbfa66cSDaniel Fojt  * Decode a base64 encoded armoured signature to a raw signature.
810cbfa66cSDaniel Fojt  */
820cbfa66cSDaniel Fojt int sshsig_dearmor(struct sshbuf *sig, struct sshbuf **out);
830cbfa66cSDaniel Fojt 
840cbfa66cSDaniel Fojt /*
850cbfa66cSDaniel Fojt  * Checks whether a particular key/principal/namespace is permitted by
860cbfa66cSDaniel Fojt  * an allowed_keys file. Returns 0 on success.
870cbfa66cSDaniel Fojt  */
880cbfa66cSDaniel Fojt int sshsig_check_allowed_keys(const char *path, const struct sshkey *sign_key,
8950a69bb5SSascha Wildner     const char *principal, const char *ns, uint64_t verify_time);
900cbfa66cSDaniel Fojt 
910cbfa66cSDaniel Fojt /* Parse zero or more allowed_keys signature options */
920cbfa66cSDaniel Fojt struct sshsigopt *sshsigopt_parse(const char *opts,
930cbfa66cSDaniel Fojt     const char *path, u_long linenum, const char **errstrp);
940cbfa66cSDaniel Fojt 
950cbfa66cSDaniel Fojt /* Free signature options */
960cbfa66cSDaniel Fojt void sshsigopt_free(struct sshsigopt *opts);
970cbfa66cSDaniel Fojt 
980cbfa66cSDaniel Fojt /* Get public key from signature */
990cbfa66cSDaniel Fojt int sshsig_get_pubkey(struct sshbuf *signature, struct sshkey **pubkey);
1000cbfa66cSDaniel Fojt 
1010cbfa66cSDaniel Fojt /* Find principal in allowed_keys file, given a sshkey. Returns
1020cbfa66cSDaniel Fojt  * 0 on success.
1030cbfa66cSDaniel Fojt  */
1040cbfa66cSDaniel Fojt int sshsig_find_principals(const char *path, const struct sshkey *sign_key,
10550a69bb5SSascha Wildner     uint64_t verify_time, char **principal);
1060cbfa66cSDaniel Fojt 
107*ee116499SAntonio Huete Jimenez /* Find all principals in allowed_keys file matching *principal */
108*ee116499SAntonio Huete Jimenez int sshsig_match_principals(const char *path,
109*ee116499SAntonio Huete Jimenez 	const char *principal, char ***principalsp, size_t *nprincipalsp);
110*ee116499SAntonio Huete Jimenez 
1110cbfa66cSDaniel Fojt #endif /* SSHSIG_H */
112