Home | History | Annotate | Line # | Download | only in dist
util.h revision 1.1.1.2
      1 /*
      2  * Copyright (C) 2014-2019 Yubico AB - See COPYING
      3  */
      4 
      5 #ifndef UTIL_H
      6 #define UTIL_H
      7 
      8 #include <stdio.h>
      9 #include <security/pam_appl.h>
     10 
     11 #define BUFSIZE 1024
     12 #define MAX_DEVS 24
     13 #define PK_LEN 130 // Public key
     14 #define KH_LEN 86  // Key handle
     15 #define RD_LEN 40  // Rounding
     16 #define DEVSIZE (((PK_LEN) + (KH_LEN) + (RD_LEN)))
     17 #define DEFAULT_AUTHFILE_DIR_VAR "XDG_CONFIG_HOME"
     18 #define DEFAULT_AUTHFILE "/Yubico/u2f_keys"
     19 #define DEFAULT_AUTHFILE_SSH "/id_ecdsa_sk"
     20 #define DEFAULT_AUTHFILE_DIR "/.config"
     21 #define DEFAULT_AUTHFILE_DIR_SSH "/.ssh"
     22 #define DEFAULT_AUTHPENDING_FILE_PATH "/var/run/user/%d/pam-u2f-authpending"
     23 #define DEFAULT_PROMPT "Insert your U2F device, then press ENTER."
     24 #define DEFAULT_CUE "Please touch the device."
     25 #define DEFAULT_ORIGIN_PREFIX "pam://"
     26 #define SSH_ORIGIN "ssh:"
     27 #define DEBUG_STR "debug(pam_u2f): %s:%d (%s): "
     28 
     29 #if defined(DEBUG_PAM)
     30 #define D(file, ...) _debug(file, __FILE__, __LINE__, __func__, __VA_ARGS__)
     31 #else
     32 #define D(file, ...) ((void) 0)
     33 #endif /* DEBUG_PAM */
     34 
     35 typedef struct {
     36   unsigned max_devs;
     37   int manual;
     38   int debug;
     39   int nouserok;
     40   int openasuser;
     41   int alwaysok;
     42   int interactive;
     43   int cue;
     44   int nodetect;
     45   int userpresence;
     46   int userverification;
     47   int pinverification;
     48   int sshformat;
     49   const char *auth_file;
     50   const char *authpending_file;
     51   const char *origin;
     52   const char *appid;
     53   const char *prompt;
     54   const char *cue_prompt;
     55   FILE *debug_file;
     56   int is_custom_debug_file;
     57 } cfg_t;
     58 
     59 typedef struct {
     60   char *publicKey;
     61   char *keyHandle;
     62   char *coseType;
     63   char *attributes;
     64   int old_format;
     65 } device_t;
     66 
     67 int get_devices_from_authfile(const cfg_t *cfg, const char *username,
     68                               device_t *devices, unsigned *n_devs);
     69 void free_devices(device_t *devices, const unsigned n_devs);
     70 
     71 int do_authentication(const cfg_t *cfg, const device_t *devices,
     72                       const unsigned n_devs, pam_handle_t *pamh);
     73 int do_manual_authentication(const cfg_t *cfg, const device_t *devices,
     74                              const unsigned n_devs, pam_handle_t *pamh);
     75 char *converse(pam_handle_t *pamh, int echocode, const char *prompt);
     76 int random_bytes(void *, size_t);
     77 int cose_type(const char *, int *);
     78 const char *cose_string(int);
     79 
     80 #ifdef __GNUC__
     81 void _debug(FILE *, const char *, int, const char *, const char *, ...)
     82   __attribute__((__format__(printf, 5, 6)));
     83 #else
     84 void _debug(FILE *, const char *, int, const char *, const char *, ...);
     85 #endif /* __GNUC__ */
     86 
     87 #if !defined(HAVE_EXPLICIT_BZERO)
     88 void explicit_bzero(void *, size_t);
     89 #endif
     90 
     91 #endif /* UTIL_H */
     92