| .TH FACTOTUM 4 |
| .SH NAME |
| factotum \- authentication agent |
| .SH SYNOPSIS |
| .B factotum |
| [ |
| .B -DdkSun |
| ] [ |
| .B -a authaddr |
| ] [ |
| .B -s |
| .I srvname |
| ] |
| .\" [ |
| .\" .B -m |
| .\" .I mtpt |
| .\" ] |
| .PP |
| .B factotum |
| .B -g |
| .IB attribute = value |
| .B ... |
| .IB attribute ? |
| .B ... |
| .\" .PP |
| .\" .B auth/fgui |
| .SH DESCRIPTION |
| .I Factotum |
| is a user-level file system that |
| acts as the authentication agent for a user. |
| It does so by managing a set of |
| .IR keys . |
| A key is a collection of information used to authenticate a particular action. |
| Stored as a list of |
| .IB attribute = value |
| pairs, a key typically contains a user, an authentication domain, a protocol, and |
| some secret data. |
| .PP |
| .I Factotum |
| presents the following files: |
| .TF needkey |
| .TP |
| .B rpc |
| each open represents a new private channel to |
| .I factotum |
| .TP |
| .B proto |
| when read lists the protocols available |
| .TP |
| .B confirm |
| for confiming the use of key |
| .TP |
| .B needkey |
| allows external programs to control the addition of new keys |
| .TP |
| .B log |
| a log of actions |
| .TP |
| .B ctl |
| for maintaining keys; when read, it returns a list of keys. |
| For secret attributes, only the attribute name follow by a |
| .L ? |
| is returned. |
| .PD |
| .PP |
| In any authentication, the caller typically acts as a client |
| and the callee as a server. The server determines |
| the authentication domain, sometimes after a negotiation with |
| the client. Authentication always requires the client to |
| prove its identity to the server. Under some protocols, the |
| authentication is mutual. |
| Proof is accomplished using secret information kept by factotum |
| in conjunction with a cryptographic protocol. |
| .PP |
| .I Factotum |
| can act in the role of client for any process possessing the |
| same user id as it. For select protocols such as |
| .B p9sk1 |
| it can also act as a client for other processes provided |
| its user id may speak for the other process' user id (see |
| Plan 9's |
| \fIauthsrv\fR(6)). |
| .I Factotum |
| can act in the role of server for any process. |
| .PP |
| .IR Factotum 's |
| structure is independent of |
| any particular authentication protocol. |
| .I Factotum |
| supports the following protocols: |
| .TF mschap |
| .TP |
| .B p9any |
| a metaprotocol used to negotiate which actual protocol to use. |
| .TP |
| .B p9sk1 |
| a Plan 9 shared key protocol. |
| .TP |
| .B p9sk2 |
| a variant of |
| .B p9sk1. |
| .TP |
| .B p9cr |
| a Plan 9 protocol that can use either |
| .B p9sk1 |
| keys or SecureID tokens. |
| .TP |
| .B apop |
| the challenge/response protocol used by POP3 mail servers. |
| .TP |
| .B cram |
| the challenge/response protocol also used by POP3 mail servers. |
| .TP |
| .B chap |
| the challenge/response protocols used by PPP and PPTP. |
| .TP |
| .B dsa |
| DSA signatures, used by SSH |
| .TP |
| .B mschap |
| a proprietary Microsoft protocol also used by PPP and PPTP. |
| .TP |
| .B rsa |
| RSA encryption and signatures, used by SSH and TLS. |
| .TP |
| .B pass |
| passwords in the clear. |
| .TP |
| .B vnc |
| .IR vnc (1)'s |
| challenge/response. |
| .TP |
| .B wep |
| WEP passwords for wireless ethernet cards. |
| .PD |
| The ``Protocols'' section below describes these protocols in more detail. |
| .PP |
| The options to |
| .I factotum |
| are: |
| .TP |
| .B \-a |
| supplies the address of the authentication server to use. |
| Without this option, it will attempt to find an authentication server by |
| querying the connection server, the file |
| .BR <mtpt>/ndb , |
| and finally the network database in |
| .BR /lib/ndb . |
| .TP |
| .B \-m |
| specifies the mount point to use, by default |
| .BR /mnt . |
| .TP |
| .B \-s |
| specifies the service name to use. |
| Without this option, |
| .I factotum |
| does not create a service file in |
| .BR /srv . |
| .TP |
| .B \-D |
| turns on 9P tracing, written to standard error. |
| .TP |
| .B \-d |
| turns on debugging, written to standard error. |
| .TP |
| .B \-g |
| causes the agent to prompt for the key, write it |
| to the |
| .B ctl |
| file, and exit. |
| The agent will prompt for values for any of the |
| attributes ending with a question mark |
| .RB ( ? ) |
| and will append all the supplied |
| .I attribute = value |
| pairs. See the section on key templates below. |
| .TP |
| .B \-n |
| don't look for a secstore. |
| .TP |
| .B \-S |
| indicates that the agent is running on a |
| cpu server. On starting, it will attempt to get a |
| .B 9psk1 |
| key from NVRAM using |
| .B readnvram |
| (see |
| .IR authsrv (3)), |
| prompting for anything it needs. |
| It will never subsequently prompt for a |
| key that it doesn't have. |
| This option is typically used by |
| the kernel at boot time. |
| .TP |
| .B \-k |
| causes the NVRAM to be written. |
| It is only valid with the |
| .B \-S |
| option. |
| This option is typically used by |
| the kernel at boot time. |
| .TP |
| .B \-u |
| causes the agent to prompt for user |
| id and writes it to |
| .BR /dev/hostowner . |
| It is mutually exclusive with |
| .B \-k |
| and |
| .BR \-S . |
| This option is typically used by |
| the kernel at boot time. |
| .PD |
| .\" .PP |
| .\" .I Fgui |
| .\" is a graphic user interface for confirming key usage and |
| .\" entering new keys. It hides the window in which it starts |
| .\" and waits reading requests from |
| .\" .B confirm |
| .\" and |
| .\" .BR needkey . |
| .\" For each requests, it unhides itself and waits for |
| .\" user input. |
| .\" See the sections on key confirmation and key prompting below. |
| .SS "Key Tuples |
| .PP |
| A |
| .I "key tuple |
| is a space delimited list of |
| .IB attribute = value |
| pairs. An attribute whose name begins with an exclamation point |
| .RB ( ! ) |
| does not appear when reading the |
| .B ctl |
| file. |
| Here are some examples: |
| .EX |
| proto=p9sk1 dom=avayalabs.com user=presotto !password=lucent |
| proto=apop server=mit.edu user=rsc !password=nerdsRus |
| proto=pass user=tb service=ssh !password=does.it.matter |
| .EE |
| The ``Protocols'' section below describes the attributes |
| specific to each supported protocol. |
| .PP |
| All keys can have additional attibutes that act either as comments |
| or as selectors to distinguish them in the |
| .IR auth (3) |
| library calls. |
| .PP |
| The factotum owner can use any key stored by factotum. |
| Any key may have one or more |
| .B owner |
| attributes listing the users who can use the key |
| as though they were the owner. |
| For example, the TLS and SSH host keys on a server |
| often have an attribute |
| .B owner=* |
| to allow any user (and in particular, |
| .L none ) |
| to run the TLS or SSH server-side protocol. |
| .PP |
| Any key may have a |
| .B role |
| attribute for restricting how it can be used. |
| If this attribute is missing, the key can be used in any role. |
| Common values are: |
| .TP |
| .B client |
| for authenticating outbound calls |
| .TP |
| .B server |
| for authenticating inbound calls |
| .TP |
| .B speaksfor |
| for authenticating processes whose |
| user id does not match |
| .IR factotum 's. |
| .TP |
| .B encrypt |
| for encrypting data |
| .TP |
| .B decrypt |
| for decrypting data |
| .TP |
| .B sign |
| for cryptographically signing data |
| .TP |
| .B verify |
| for verifying cryptographic signatures |
| .PD |
| .PP |
| Whenever |
| .I factotum |
| runs as a server, it must have a |
| .B p9sk1 |
| key in order to communicate with the authentication |
| server for validating passwords and challenge/responses of |
| other users. |
| .SS "Key Templates |
| Key templates are used by routines that interface to |
| .I factotum |
| such as |
| .B auth_proxy |
| and |
| .B auth_challenge |
| (see |
| .IR auth (3)) |
| to specify which key and protocol to use for an authentication. |
| Like a key tuple, a key template is also a list of |
| .IB attribute = value |
| pairs. |
| It must specify at least the protocol and enough |
| other attributes to uniquely identify a key, or set of keys, to use. |
| The keys chosen are those that match all the attributes specified |
| in the template. The possible attribute/value formats are: |
| .TP 1i |
| .IB attr = val |
| The attribute |
| .I attr |
| must exist in the key and its value must exactly |
| match |
| .I val |
| .TP 1i |
| .IB attr ? |
| The attribute |
| .I attr |
| must exist in the key but its value doesn't matter. |
| .TP 1i |
| .I attr |
| The attribute |
| .I attr |
| must exist in the key with a null value |
| .PD |
| .PP |
| Key templates are also used by factotum to request a key either via |
| an RPC error or via the |
| .B needkey |
| interface. |
| The possible attribute/value formats are: |
| .TP 1i |
| .IB attr = val |
| This pair must remain unchanged |
| .TP 1i |
| .IB attr ? |
| This attribute needs a value |
| .TP 1i |
| .I attr |
| The pair must remain unchanged |
| .PD |
| .SS "Control and Key Management |
| .PP |
| A number of messages can be written to the control file. |
| The mesages are: |
| .TP |
| .B "key \fIattribute-value-list\fP |
| add a new key. This will replace any old key whose |
| public, i.e. non ! attributes, match. |
| .TP |
| .B "delkey \fIattribute-value-list\fP |
| delete a key whose attributes match those given. |
| .TP |
| .B debug |
| toggle debugging on and off, i.e., the debugging also |
| turned on by the |
| .B \-d |
| option. |
| .PP |
| By default when factotum starts it looks for a |
| .IR secstore (1) |
| account on $auth for the user and, if one exists, |
| prompts for a secstore password in order to fetch |
| the file |
| .IR factotum , |
| which should contain control file commands. |
| An example would be |
| .EX |
| key dom=x.com proto=p9sk1 user=boyd !hex=26E522ADE2BBB2A229 |
| key proto=rsa service=ssh size=1024 ek=3B !dk=... |
| .EE |
| where the first line sets a password for |
| challenge/response authentication, strong against dictionary |
| attack by being a long random string, and the second line |
| sets a public/private keypair for ssh authentication, |
| generated by |
| .B ssh_genkey |
| (see |
| .IR ssh (1)). |
| .PD |
| .SS "Confirming key use |
| .PP |
| The |
| .B confirm |
| file provides a connection from |
| .I factotum |
| to a confirmation server, normally the program |
| .IR auth/fgui . |
| Whenever a key with the |
| .B confirm |
| attribute is used, |
| .I factotum |
| requires confirmation of its use. If no process has |
| .B confirm |
| opened, use of the key will be denied. |
| However, if the file is opened a request can be read from it |
| with the following format: |
| .PP |
| .B confirm |
| .BI tag= tagno |
| .I "<key template> |
| .PP |
| The reply, written back to |
| .BR confirm , |
| consists of string: |
| .PP |
| .BI tag= tagno |
| .BI answer= xxx |
| .PP |
| If |
| .I xxx |
| is the string |
| .B yes |
| then the use is confirmed and the authentication will proceed. |
| Otherwise, it fails. |
| .PP |
| .B Confirm |
| is exclusive open and can only be opened by a process with |
| the same user id as |
| .IR factotum . |
| .SS "Prompting for keys |
| .PP |
| The |
| .B needkey |
| file provides a connection from |
| .I factotum |
| to a key server, normally the program |
| .IR auth/fgui . |
| Whenever |
| .I factotum |
| needs a new key, it first checks to see if |
| .B needkey |
| is opened. If it isn't, it returns a error to its client. |
| If the file is opened a request can be read from it |
| with the following format: |
| .PP |
| .B needkey |
| .BI tag= tagno |
| .I "<key template> |
| .PP |
| It is up to the reader to then query the user for any missing fields, |
| write the key tuple into the |
| .B ctl |
| file, and then reply by writing into the |
| .B needkey |
| file the string: |
| .PP |
| .BI tag= tagno |
| .PP |
| .B Needkey |
| is exclusive open and can only be opened by a process with |
| the same user id as |
| .IR factotum . |
| .SS "The RPC Protocol |
| Authentication is performed by |
| .IP 1) |
| opening |
| .BR rpc |
| .IP 2) |
| setting up the protocol and key to be used (see the |
| .B start |
| RPC below), |
| .IP 3) |
| shuttling messages back and forth between |
| .IR factotum |
| and the other party (see the |
| .B read |
| and |
| .B write |
| RPC's) until done |
| .IP 4) |
| if successful, reading back an |
| .I AuthInfo |
| structure (see |
| .IR authsrv (3)). |
| .PP |
| The RPC protocol is normally embodied by one of the |
| routines in |
| .IR auth (3). |
| We describe it here should anyone want to extend |
| the library. |
| .PP |
| An RPC consists of writing a request message to |
| .B rpc |
| followed by reading a reply message back. |
| RPC's are strictly ordered; requests and replies of |
| different RPC's cannot be interleaved. |
| Messages consist of a verb, a single space, and data. |
| The data format depends on the verb. The request verbs are: |
| .TP |
| .B "start \fIattribute-value-list\fP |
| start a new authentication. |
| .I Attribute-value-pair-list |
| must include a |
| .B proto |
| attribute, a |
| .B role |
| attribute with value |
| .B client |
| or |
| .BR server , |
| and enough other attibutes to uniquely identify a key to use. |
| A |
| .B start |
| RPC is required before any others. The possible replies are: |
| .RS |
| .TP |
| .B ok |
| start succeeded. |
| .TP |
| .B "error \fIstring\fP |
| where |
| .I string |
| is the reason. |
| .RE |
| .PD |
| .TP |
| .B read |
| get data from |
| .I factotum |
| to send to the other party. The possible replies are: |
| .RS |
| .TP |
| .B ok |
| read succeeded, this is zero length message. |
| .TP |
| .B "ok \fIdata\fP |
| read succeeded, the data follows the space and is |
| unformatted. |
| .TP |
| .B "done |
| authentication has succeeded, no further RPC's are |
| necessary |
| .TP |
| .B "done haveai |
| authentication has succeeded, an |
| .B AuthInfo |
| structure (see |
| .IR auth (3)) |
| can be retrieved with an |
| .B authinfo |
| RPC |
| .TP |
| .B "phase \fIstring\fP |
| its not your turn to read, get some data from |
| the other party and return it with a write RPC. |
| .TP |
| .B "error \fIstring\fP |
| authentication failed, |
| .I string |
| is the reason. |
| .TP |
| .B "protocol not started |
| a |
| .B start |
| RPC needs to precede reads and writes |
| .TP |
| .B "needkey \fIattribute-value-list\fP |
| a key matching the argument is needed. This argument |
| may be passed as an argument to |
| .I factotum |
| .B -g |
| in order to prompt for a key. After that, the |
| authentication may proceed, i.e., the read restarted. |
| .PD |
| .RE |
| .TP |
| .B "write \fIdata\fP |
| send data from the other party to |
| .IR factotum . |
| The possible replies are: |
| .RS |
| .TP |
| .B "ok |
| the write succeeded |
| .TP |
| .B "needkey \fIattribute-value-list\fP |
| see above |
| .TP |
| .B "toosmall \fIn\fP |
| the write is too short, get more data from the |
| other party and retry the write. |
| .I n |
| specifies the maximun total number of bytes. |
| .TP |
| .B "phase \fIstring\fP |
| its not your turn to write, get some data from |
| .I factotum |
| first. |
| .TP |
| .B "done |
| see above |
| .TP |
| .B "done haveai |
| see above |
| .RE |
| .TP |
| .B readhex\fR, \fPwritehex |
| like |
| .B read |
| and |
| .BR write , |
| except that an |
| .B ok |
| response to |
| .B readhex |
| returns the data encoded as |
| a long hexadecimal string, |
| and the argument to |
| .B writehex |
| is expected to be a long hexadecimal string. |
| These are useful for manually debugging of binary protocols. |
| .TP |
| .B authinfo |
| retrieve the AuthInfo structure. |
| The possible replies are: |
| .RS |
| .TP |
| .B "ok \fIdata\fP |
| .I data |
| is a marshaled form of the AuthInfo structure. |
| .TP |
| .B "error \fIstring\fP |
| where |
| .I string |
| is the reason for the error. |
| .PD |
| .RE |
| .TP |
| .B attr |
| retrieve the attributes used in the |
| .B start |
| RPC. |
| The possible replies are: |
| .RS |
| .TP |
| .B "ok \fIattribute-value-list\fP |
| .TP |
| .B "error \fIstring\fP |
| where |
| .I string |
| is the reason for the error. |
| .PD |
| .RE |
| .SS Protocols |
| Factotum supports many authentication types, each |
| with its own roles and required key attributes. |
| .PP |
| .IR P9any , |
| .IR p9sk1 , |
| .IR p9sk2 , |
| and |
| .I p9cr |
| are used to authenticate to Plan 9 systems; |
| valid |
| .BR role s |
| are |
| .B client |
| and |
| .BR server . |
| All require |
| .B proto=p9sk1 |
| keys with |
| .BR user , |
| .B dom |
| (authentication domain), |
| and |
| .B !password |
| attributes. |
| .PP |
| .I P9sk1 |
| and |
| .I p9sk2 |
| are the Plan 9 shared-key authentication protocols. |
| .I P9sk2 |
| is a deprecated form of |
| .I p9sk1 |
| that neglects to authenticate the server. |
| .PP |
| .I P9any |
| is a meta-protocol that negotiates a protocol |
| .RB ( p9sk1 |
| or |
| .BR p9sk2 ) |
| and an authentication domain and then invokes the |
| given protocol with a |
| .B dom= |
| attribute. |
| .PP |
| .IR P9any , |
| .IR p9sk1 , |
| and |
| .I p9sk2 |
| are intended to be proxied via |
| .I auth_proxy |
| (see |
| .IR auth (3)). |
| .\" The protocols follow |
| .\" .IR p9any (7) |
| .\" and |
| .\" .IR p9sk1 (7). |
| .\" XXX - write about how server keys are selected and used |
| .\" XXX - write about protocol itself |
| .\" XXX - write about server ai |
| .PP |
| .I P9cr |
| is a textual challenge-response protocol; |
| roles are |
| .B client |
| and |
| .BR server . |
| It uses |
| .I p9sk1 |
| keys as described above. |
| The protocol with |
| .I factotum |
| is textual: |
| client writes a user name, |
| server responds with a challenge, |
| client writes a response, |
| server responds with |
| .B ok |
| or |
| .BR bad . |
| Typically this information is wrapped in other protocols |
| before being sent over the network. |
| .PP |
| .I Vnc |
| is the challenge-response protocol used by |
| .IR vnc (1); |
| valid roles are |
| .B client |
| and |
| .BR server . |
| The client protocol requires a |
| .B proto=vnc |
| key with attribute |
| .BR !password . |
| Conventionally, client keys also have |
| .B user |
| and |
| .B server |
| attributes. |
| The server protocol requires a |
| .I p9sk1 |
| key as described above. |
| The protocol with |
| .I factotum |
| is the same as |
| .IR p9cr , |
| except that the challenge and response are not textual. |
| .PP |
| .I Apop |
| and |
| .I cram |
| are challenge-response protocols typically |
| used to authenticate |
| to mail servers. |
| The client protocols require |
| .B proto=apop |
| or |
| .B proto=cram |
| keys with |
| .B user |
| and |
| .B !password |
| attributes. |
| Conventionally, client keys also have |
| .B server |
| attributes. |
| The server protocol requires a |
| .I p9sk1 |
| key as described above. |
| The protocol with |
| .I factotum |
| is textual: |
| server writes a challenge of the form |
| .IB random @ domain \fR, |
| client responds with user name |
| and then a hexadecimal response |
| (two separate writes), |
| and then the server responds with |
| .B ok |
| or |
| .BR bad . |
| .PP |
| .I Chap |
| and |
| .I mschap |
| are challenge-response protocols used in PPP sessions; |
| valid roles are |
| .B client |
| and |
| .BR server . |
| The client protocols require |
| .B proto=chap |
| or |
| .B proto=mschap |
| keys with |
| .B user |
| and |
| .B !password |
| attributes. |
| Conventionally, client keys also have |
| .B server |
| attributes. |
| The server protocol requires a |
| .I p9sk1 |
| key as described above. |
| The protocol with factotum is: |
| server writes an 8-byte binary challenge, |
| client responds with user name |
| and then a |
| .B Chapreply |
| or |
| .B MSchapreply |
| structure (defined in |
| .B <auth.h> ). |
| .PP |
| .I Pass |
| is a client-only protocol that hands out passwords |
| from |
| .B proto=pass |
| keys with |
| .B user |
| and |
| .B !password |
| attributes. |
| The protocol is a single read that returns |
| a string: a space-separated quoted user name and password |
| that can be parsed with |
| .I tokenize |
| (see |
| .IR getfields (3)). |
| Conventionally, client keys have distinguishing attributes |
| like |
| .B service |
| and |
| .B server |
| that can be specified in the |
| .B start |
| message to select a key. |
| .PP |
| .I Wep |
| is a client-only pseudo-protocol that initializes the encryption |
| key on a wireless ethernet device. |
| It uses |
| .B proto=wep |
| keys with |
| .BR !key1 , |
| .BR !key2 , |
| or |
| .B !key3 |
| attributes. |
| The protocol with |
| .I factotum |
| is: |
| the client writes a device name |
| that must begin with |
| .LR #l . |
| In response, |
| .I factotum |
| opens the device's control file, sets the wireless secret using the key, |
| and turns on encryption. |
| If the key has an |
| .B essid |
| attribute, |
| .I factotum |
| uses it to set the wireless station ID. |
| .PP |
| .I Rsa |
| is an implementation of the RSA protocol. |
| Valid roles are |
| .BR decrypt , |
| .BR encrypt , |
| .BR sign , |
| and |
| .BR verify . |
| .I Rsa |
| uses |
| .B proto=rsa |
| keys with |
| .B ek |
| and |
| .B n |
| attributes, large integers specifying the public half |
| of the key. |
| If a key is to be used for decryption or signing, |
| then it must also have attributes |
| .BR !p , |
| .BR !q , |
| .BR !kp , |
| .BR !kq , |
| .BR !c2 , |
| and |
| .BR !dk |
| specifying the private half of the key; |
| see |
| .IR rsa (3). |
| Conventionally, |
| .I rsa |
| keys also have |
| .B service |
| attributes specifying the context in which the key is used: |
| .B ssh |
| (SSH version 1), |
| .B ssh-rsa |
| (SSH version 2), |
| or |
| .B tls |
| (SSL and TLS). |
| If an SSH key has a |
| .B comment |
| attribute, that comment is presented to remote SSH servers |
| during key negotiation. |
| The protocol for |
| encryption (decryption) is: |
| write the message, then read back the encrypted (decrypted) form. |
| The protocol for signing is: |
| write a hash of the actual message, |
| then read back the signature. |
| The protocol for verifying a signature is: |
| write the message hash, |
| write the purported signature, |
| then read back |
| .B ok |
| or |
| .B bad |
| telling whether the signature could be verified. |
| The hash defaults to SHA1 but can be specified by a |
| .B hash |
| attribute on the key. |
| Valid hash functions are |
| .B md5 |
| and |
| .BR sha1 . |
| The hash function must be known to |
| .I factotum |
| because the signature encodes the type of hash used. |
| The |
| .B encrypt |
| and |
| .B verify |
| operations are included as a convenience; |
| .I factotum |
| is not using any private information to perform them. |
| .PP |
| .I Dsa |
| is an implementation of the NIST digital signature algorithm. |
| Valid roles are |
| .B sign |
| and |
| .BR verify . |
| It uses |
| .B proto=dsa |
| keys with |
| .BR p , |
| .BR q , |
| .BR alpha , |
| and |
| .B key |
| attributes. |
| If the key is to be used for signing, it must also have a |
| .B !secret |
| attribute; see |
| .IR dsa (3). |
| Conventionally, |
| .I dsa |
| keys |
| also have |
| .B service |
| attributes specifying the context in which the key is used: |
| .B ssh-dss |
| (SSH version 2) |
| is the only one. |
| If an SSH key has a |
| .B comment |
| attribute, that comment is presented to SSH servers during |
| key negotiation. |
| The protocol for signing and verifying |
| is the same as the RSA protocol. |
| Unlike |
| .IR rsa , |
| the |
| .I dsa |
| protocol ignores the |
| .B hash |
| attribute; it always uses SHA1. |
| .PP |
| .I Httpdigest |
| is a client-only MD5-based challenge-response protocol used in HTTP; see RFC 2617. |
| It uses |
| .B proto=httpdigest |
| keys with |
| .BR user , |
| .BR realm , |
| and |
| .BR !password |
| attributes. |
| The protocol with factotum is textual: |
| write the challenge, read the response. |
| The challenge is a string with three space-separated fields |
| .IR nonce , |
| .IR method , |
| and |
| .IR uri , |
| parseable with |
| .IR tokenize . |
| The response is a hexadecimal string of length 32. |
| .SH SOURCE |
| .B \*9/src/cmd/auth/factotum |
| .SH SEE ALSO |
| .IR ssh-agent (1) |