Gong Mutual Authentication Protocol
Purpose
It is a mutual authentication protocol of two principals with a trusted server, and exchange of a new symmetric key. Uses one-way functions and no encryption.
f and g are one way publicly known functions. the principal A and B shares a secret Pa and Pb respectively, with the authentication server. xor is the xor function and equals is the equality function. Ha and Hb are handshake numbers
In message 3 (k,ha,hb) = f(Ns, Na, B, Pa) is calculated by the server. K is the secret to be shared between A and B. B computes f(Ns, Nb, A , Pb) to retrieve (K,Ha,Hb) from the second item of the message. It also computes g(K,Ha,Hb,Pb) to check against the third item that tampering has not taken place. A computes f(Ns,Na,B,Pa) to get (K,Ha,Hb). If the value of Hb matches the one sent by B then A replies with message 5.
Informal Specification
- A -> B : A,B,Na
- B -> S : A, B, Na, Nb
- S -> B : Ns, f(Ns,Nb,A,Pb) xor (K,Ha,Hb), g(K,Ha,Hb,Pb)
- B -> A : Ns,Hb
- A -> B : Ha
See Commonly Used Representations
MSR Specification
Click here to download
--- Author: rishav
--- Date: 28 October 2007
--- Gong Mutual Authentication Protocol
--- A -> B : A,B,Na
--- B -> S : A, B, Na, Nb
--- S -> B : Ns, f(Ns,Nb,A,Pb) xor (K,Ha,Hb), g(K,Ha,Hb,Pb)
--- B -> A : Ns,Hb
--- A -> B : Ha
(reset)
(
module GMAP
export * .
server : type. server <: princ.
key : type. key <: msg.
nonce : type. nonce <: msg.
time : type. time <: msg.
xor : msg -> msg -> msg.
f : msg -> msg -> msg -> msg -> msg.
g : msg -> msg -> msg -> msg -> msg.
m : msg -> msg -> msg -> msg.
equal : msg -> msg -> msg.
net : msg -> state.
initiator:
forall A : princ.
{
exists LA : nonce -> state.
GRule1:
empty
=> exists Na : nonce.
net(A & B & Na), LA Na.
GRule5:
forall Na : nonce.
forall Ns : nonce.
forall Pa : msg.
forall Hb : msg.
forall Ha : msg.
forall k : key.
net(Ns & Hb)
=> net(Ha) , LA Na
if (equal (f Ns Na B Pa)(k & Ha & Hb)).
}
receiver:
forall B : princ.
{
exists LB1 : nonce -> nonce -> state.
exists LB2 : msg -> state.
GRule2:
forall A : princ.
forall Na : nonce.
net(A & B & Na)
=> exists Nb : nonce.
net(Nb & A & Na & B), LB1 Na Nb.
GRule4:
forall A : princ.
forall Hb : msg.
forall Ha : msg.
forall Pb : msg.
forall M : msg.
forall N : msg.
forall Ns : nonce.
forall Na : nonce.
forall Nb : nonce.
forall k : key.
net(Ns & M & N), LB1 Na Nb
=> net(Ns & Hb), LB2 Ha
if (xor M (equal (f Ns Nb A Pb) ( k & Ha & Hb))) & (equal N (g K Ha Hb Pb)).
GRule6:
forall Ha : msg.
net(Ha), LB2 Ha
=> empty.
}
server:
forall S : server.
{
GRule3:
forall A : princ.
forall B : princ.
forall Hb : msg.
forall Ha : msg.
forall Pb : msg.
forall Na : nonce.
forall Nb : nonce.
forall k : key.
net(Nb & A & Na & B)
=> exists Ns : nonce.
net(Ns & xor (f Ns Nb A Pb) T & (g k Ha Hb Pb))
if equal (f Ns Na B Pa) T & equal T (k & Ha & Hb).
}
)
 
Findings