[BACK]Return to hostfile.h CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Annotation of src/usr.bin/ssh/hostfile.h, Revision 1.29

1.29    ! djm         1: /* $OpenBSD: hostfile.h,v 1.28 2020/12/20 23:36:51 djm Exp $ */
1.6       niklas      2:
1.3       deraadt     3: /*
1.4       markus      4:  * Author: Tatu Ylonen <ylo@cs.hut.fi>
                      5:  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
                      6:  *                    All rights reserved
1.3       deraadt     7:  *
1.4       markus      8:  * As far as I am concerned, the code I have written for this software
                      9:  * can be used freely for any purpose.  Any derived versions of this
                     10:  * software must be clearly marked as such, and if the derived work is
                     11:  * incompatible with the protocol description in the RFC file, it must be
                     12:  * called by a name other than "ssh" or "Secure Shell".
1.3       deraadt    13:  */
1.1       markus     14: #ifndef HOSTFILE_H
                     15: #define HOSTFILE_H
1.7       itojun     16:
1.1       markus     17: typedef enum {
1.18      djm        18:        HOST_OK, HOST_NEW, HOST_CHANGED, HOST_REVOKED, HOST_FOUND
1.1       markus     19: }       HostStatus;
1.5       markus     20:
1.19      djm        21: typedef enum {
                     22:        MRK_ERROR, MRK_NONE, MRK_REVOKE, MRK_CA
                     23: }      HostkeyMarker;
                     24:
                     25: struct hostkey_entry {
                     26:        char *host;
                     27:        char *file;
                     28:        u_long line;
1.21      djm        29:        struct sshkey *key;
1.19      djm        30:        HostkeyMarker marker;
1.28      djm        31:        u_int note; /* caller-specific note/flag */
1.19      djm        32: };
1.29    ! djm        33: struct hostkeys {
        !            34:        struct hostkey_entry *entries;
        !            35:        u_int num_entries;
        !            36: };
1.19      djm        37:
                     38: struct hostkeys *init_hostkeys(void);
1.28      djm        39: void    load_hostkeys(struct hostkeys *, const char *,
                     40:     const char *, u_int);
                     41: void    load_hostkeys_file(struct hostkeys *, const char *,
                     42:     const char *, FILE *, u_int note);
1.19      djm        43: void    free_hostkeys(struct hostkeys *);
                     44:
1.21      djm        45: HostStatus check_key_in_hostkeys(struct hostkeys *, struct sshkey *,
1.19      djm        46:     const struct hostkey_entry **);
1.27      djm        47: int     lookup_key_in_hostkeys_by_type(struct hostkeys *, int, int,
1.19      djm        48:     const struct hostkey_entry **);
1.25      djm        49: int     lookup_marker_in_hostkeys(struct hostkeys *, int);
1.19      djm        50:
1.21      djm        51: int     hostfile_read_key(char **, u_int *, struct sshkey *);
                     52: int     add_host_to_hostfile(const char *, const char *,
                     53:     const struct sshkey *, int);
1.23      djm        54:
1.24      djm        55: int     hostfile_replace_entries(const char *filename,
                     56:     const char *host, const char *ip, struct sshkey **keys, size_t nkeys,
                     57:     int store_hash, int quiet, int hash_alg);
1.15      djm        58:
                     59: #define HASH_MAGIC     "|1|"
                     60: #define HASH_DELIM     '|'
1.17      djm        61:
                     62: #define CA_MARKER      "@cert-authority"
1.18      djm        63: #define REVOKE_MARKER  "@revoked"
1.15      djm        64:
                     65: char   *host_hash(const char *, const char *, u_int);
1.22      djm        66:
                     67: /*
                     68:  * Iterate through a hostkeys file, optionally parsing keys and matching
                     69:  * hostnames. Allows access to the raw keyfile lines to allow
                     70:  * streaming edits to the file to take place.
                     71:  */
1.24      djm        72: #define HKF_WANT_MATCH         (1)     /* return only matching hosts/addrs */
1.22      djm        73: #define HKF_WANT_PARSE_KEY     (1<<1)  /* need key parsed */
                     74:
1.24      djm        75: #define HKF_STATUS_OK          0       /* Line parsed, didn't match host */
                     76: #define HKF_STATUS_INVALID     1       /* line had parse error */
                     77: #define HKF_STATUS_COMMENT     2       /* valid line contained no key */
                     78: #define HKF_STATUS_MATCHED     3       /* hostname or IP matched */
                     79:
                     80: #define HKF_MATCH_HOST         (1)     /* hostname matched */
                     81: #define HKF_MATCH_IP           (1<<1)  /* address matched */
                     82: #define HKF_MATCH_HOST_HASHED  (1<<2)  /* hostname was hashed */
                     83: #define HKF_MATCH_IP_HASHED    (1<<3)  /* address was hashed */
                     84: /* XXX HKF_MATCH_KEY_TYPE? */
1.22      djm        85:
                     86: /*
                     87:  * The callback function receives this as an argument for each matching
                     88:  * hostkey line. The callback may "steal" the 'key' field by setting it to NULL.
                     89:  * If a parse error occurred, then "hosts" and subsequent options may be NULL.
                     90:  */
                     91: struct hostkey_foreach_line {
                     92:        const char *path; /* Path of file */
                     93:        u_long linenum; /* Line number */
1.24      djm        94:        u_int status;   /* One of HKF_STATUS_* */
                     95:        u_int match;    /* Zero or more of HKF_MATCH_* OR'd together */
1.22      djm        96:        char *line;     /* Entire key line; mutable by callback */
                     97:        int marker;     /* CA/revocation markers; indicated by MRK_* value */
                     98:        const char *hosts; /* Raw hosts text, may be hashed or list multiple */
                     99:        const char *rawkey; /* Text of key and any comment following it */
1.24      djm       100:        int keytype;    /* Type of key; KEY_UNSPEC for invalid/comment lines */
1.22      djm       101:        struct sshkey *key; /* Key, if parsed ok and HKF_WANT_MATCH_HOST set */
                    102:        const char *comment; /* Any comment following the key */
1.28      djm       103:        u_int note;     /* caller-specified note copied from arguments */
1.22      djm       104: };
                    105:
                    106: /*
                    107:  * Callback fires for each line (or matching line if a HKF_WANT_* option
                    108:  * is set). The foreach loop will terminate if the callback returns a non-
                    109:  * zero exit status.
                    110:  */
                    111: typedef int hostkeys_foreach_fn(struct hostkey_foreach_line *l, void *ctx);
                    112:
1.24      djm       113: /* Iterate over a hostkeys file */
1.28      djm       114: int hostkeys_foreach(const char *path,
                    115:     hostkeys_foreach_fn *callback, void *ctx,
                    116:     const char *host, const char *ip, u_int options, u_int note);
                    117: int hostkeys_foreach_file(const char *path, FILE *f,
                    118:     hostkeys_foreach_fn *callback, void *ctx,
                    119:     const char *host, const char *ip, u_int options, u_int note);
1.26      dtucker   120:
                    121: void hostfile_create_user_ssh_dir(const char *, int);
1.1       markus    122:
                    123: #endif