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