.BR suid )
.TP
.I YAc
-client \(-> AS DH public key
+client → AS DH public key
.TP
.I YBc
-AS \(-> client DH public key
+AS → client DH public key
.TP
.I YAs
-server \(-> AS DH public key
+server → AS DH public key
.TP
.I YBs
-AS \(-> server DH public key
+AS → server DH public key
.TP
.I RNc
client's 32-byte random string
.PP
The protocol to obtain a ticket pair is:
.TP
-.IR C \(-> A
+.I C→A:
.IR AuthTreq ,
.IR IDs ,
.IR DN ,
.IR IDc ,
.IR IDr
.TP
-.IR A \(-> C
+.I A→C:
.IR AuthOK ,
.IR Kc { AuthTc ,
.IR CHs ,
allows a client and server to authenticate each other.
The protocol is:
.TP
-.IR C \(-> S
+.I C→S:
.I CHc
.br
The client starts by sending a random challenge to the server.
.TP
-.IR S \(-> C
+.I S→C:
.IR AuthTreq ,
.IR IDs ,
.IR DN ,
id and authentication domain along with its own
random challenge.
.TP
-.IR C \(-> S
+.I C→S:
.IR Ks { AuthTs ,
.IR CHs ,
.IR IDc ,
.IR CHs
in the authenticator avoids replay attacks.)
.TP
-.IR S \(-> C
+.I S→C:
.IR Kn { AuthAs ,
.IR CHc }
.br
.I Kn
and therefore
.I Ks .
+.PP
+The 64-bit shared secret
+.I Kn
+is used as the session secret.
.SS "Password authenticated key exchange"
Initially, the server and client keys
.I Ks
.I Kc
where equivalent to the password derived 56-bit DES keys, which
made the encrypted tickets subject to offline dictionary attacks
-and provides a too small key space against brute force attacks
+and provided too small a key space against brute force attacks
on current hardware.
.PP
The
.I IDc
is:
.TP
-.IR C \(-> A
+.I C→A:
.IR AuthPAK ,
.IR IDs ,
.IR DN ,
.IR YAs ,
.I YAc
.TP
-.IR A \(-> C
+.I A→C:
.IR AuthOK ,
.IR YBs ,
.I YBc
for
.IR IDs :
.TP
-.IR C \(-> A
+.I C→A:
.IR AuthPAK ,
.IR \- ,
.IR DN ,
.IR IDc ,
.I YAs
.TP
-.IR A \(-> C
+.I A→C:
.IR AuthOK ,
.I YBs
.PP
for
.IR IDc :
.TP
-.IR C \(-> A
+.I C→A:
.IR AuthPAK ,
.IR \- ,
.IR \- ,
.IR IDc ,
.I YAc
.TP
-.IR A \(-> C
+.I A→C:
.IR AuthOK ,
.I YBc
.SS "Dp9ik"
and
.IR Kc :
.TP
-.IR C \(-> S
+.I C→S:
.I CHc
.br
The client starts by sending a random challenge to the server.
.TP
-.IR S \(-> C
+.I S→C:
.IR AuthPAK ,
.IR IDs ,
.IR DN ,
and its public key
.IR YAs .
.TP
-.IR C \(-> S
+.I C→S:
.IR YBs ,
.IR Ks { AuthTs ,
.IR CHs ,
.I RNc
is used in the derivation of the session secret.
.TP
-.IR S \(-> C
+.I S→C:
.IR Kn { AuthAs ,
.IR CHc ,
.IR RNs }
.IR RNs
for the session secret.
.PP
-The 2048-bit session secret is derived with a PRF hashing the
+The 2048-bit session secret is derived with HKDF-SHA256 hashing the
concatenated random strings
.IR RNc | RNs
with the the shared secret key
.PP
The negotiation protocol is:
.TP
-.IR S \(-> C
+.I S→C:
.B v.2
.IB proto@authdom
.IB proto@authdom
.I ...
.TP
-.IR C \(-> S
+.I C→S:
.I proto
.I dom
.TP
-.IR S \(-> C
+.I S→C:
.B OK
.PP
Each message is a NUL-terminated UTF string.
and
.IR attach (5)).
Other services, such as
-.IR cpu (1)
+.IR cpu (1),
+.IR exportfs (4)
and
-.IR exportfs (4),
+.IR tlssrv (8)
run
.I p9any
-over the network and then
-use
-.I Kn
-to derive an
+over the network and then use the session secret to derive an
.IR ssl (3)
+or
+.IR tls (3)
key to encrypt the rest of their communications.
.SS "Password Change
Users connect directly to the AS
to change their passwords.
The protocol is:
.TP
-.IR C \(-> A
+.I C→A:
.IR AuthPass ,
.IR \- ,
.IR \- ,
.br
The client sends a password change ticket request.
.TP
-.IR A \(-> C
+.I A→C:
.IR Kc { AuthTp ,
.IR CHc ,
.IR IDc ,
encrypted with the client's key
.IR Kc
.TP
-.IR C \(-> A
+.I C→A:
.IR Kn { AuthPass ,
.IR old ,
.IR new ,
.IR secret ,
the password used for non-Plan 9 authentications.
.TP
-.IR A \(-> C
+.I A→C:
.I AuthOK
or
.IR AuthErr ,
message may be substituted.
.de Ok
.TP
-.IR A \(-> S
+.I A→S:
.IR AuthOK ,
.IR Ks { AuthTs ,
.IR CHs ,
..
.PP
.TP
-.IR S \(-> A
+.I S→A:
.IR AuthChal ,
.IR \- ,
.IR DN ,
.IR IDs ,
.IR IDc
.TP
-.IR A \(-> S
+.I A→S:
.IR AuthOK ,
.IR challenge
.TP
-.IR S \(-> A
+.I S→A:
.IR response
.Ok
.IP
handheld authenticators such as SecureNet
keys and SecureID tokens
in programs such as
-.IR ssh (1)
+.I telnetd
and
.I ftpd
(see
Users not listed are assumed to have the
same id in both places.
.TP
-.IR S \(-> A
+.I S→A:
.IR AuthApop ,
.IR \- ,
.IR DN ,
.IR IDs ,
.IR \-
.TP
-.IR A \(-> S
+.I A→S:
.IR AuthOKvar ,
.IR challenge
.TP
-.IR S \(-> A
+.I S→A:
.IR AuthApop ,
.IR \- ,
.IR DN ,
in
.IR sechash (2)).
.TP
-.IR S \(-> A
+.I S→A:
.IR AuthChap ,
.IR \- ,
.IR DN ,
.IR IDs ,
.IR \-
.TP
-.IR A \(-> S
+.I A→S:
.I challenge
.TP
-.IR S \(-> A
+.I S→A:
.IR pktid ,
.IR IDc ,
.IR response
in
.BR <authsrv.h> .
.TP
-.IR S \(-> A
+.I S→A:
.IR AuthMSchap ,
.IR \- ,
.IR DN ,
.IR IDs ,
.IR \-
.TP
-.IR A \(-> S
+.I A→S:
.I challenge
.TP
-.IR S \(-> A
+.I S→A:
.IR IDc ,
.IR lm-response ,
.IR nt-response
in
.BR <authsrv.h> .
.TP
-.IR S \(-> A
+.I S→A:
.IR AuthVNC ,
.IR \- ,
.IR DN ,
.IR IDs ,
.IR IDc
.TP
-.IR A \(-> S
+.I A→S:
.IR AuthOKvar ,
.I challenge
.TP
-.IR S \(-> A
+.I S→A:
.I response
.Ok
.IP