diff -r c2334f9532ab -r 44249bba00ec src/HOL/Auth/TLS.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Auth/TLS.thy Tue Jul 01 11:11:42 1997 +0200 @@ -0,0 +1,141 @@ +(* Title: HOL/Auth/TLS + ID: $Id$ + Author: Lawrence C Paulson, Cambridge University Computer Laboratory + Copyright 1997 University of Cambridge + +Inductive relation "tls" for the baby TLS (Transport Layer Security) protocol. + +An RSA cryptosystem is assumed, and X.509v3 certificates are abstracted down +to the trivial form {A, publicKey(A)}privateKey(Server), where Server is a +global signing authority. + +A is the client and B is the server, not to be confused with the constant +Server, who is in charge of all public keys. + +The model assumes that no fraudulent certificates are present. + +Protocol goals: +* M, serverK(NA,NB,M) and clientK(NA,NB,M) will be known only to the two + parties (though A is not necessarily authenticated). + +* B upon receiving CERTIFICATE VERIFY knows that A is present (But this + message is optional!) + +* A upon receiving SERVER FINISHED knows that B is present + +* Each party who has received a FINISHED message can trust that the other + party agrees on all message components, including XA and XB (thus foiling + rollback attacks). +*) + +TLS = Public + + +consts + (*Client, server write keys. They implicitly include the MAC secrets.*) + clientK, serverK :: "nat*nat*nat => key" + +rules + (*clientK is collision-free and makes symmetric keys*) + inj_clientK "inj clientK" + isSym_clientK "isSymKey (clientK x)" (*client write keys are symmetric*) + + inj_serverK "inj serverK" + isSym_serverK "isSymKey (serverK x)" (*server write keys are symmetric*) + + (*Spy has access to his own key for spoof messages, but Server is secure*) + Spy_in_lost "Spy: lost" + Server_not_lost "Server ~: lost" + + +consts lost :: agent set (*No need for it to be a variable*) + tls :: event list set + +inductive tls + intrs + Nil (*Initial trace is empty*) + "[]: tls" + + Fake (*The spy, an active attacker, MAY say anything he CAN say.*) + "[| evs: tls; B ~= Spy; + X: synth (analz (sees lost Spy evs)) |] + ==> Says Spy B X # evs : tls" + + ClientHello + (*XA represents CLIENT_VERSION, CIPHER_SUITES and COMPRESSION_METHODS. + It is uninterpreted but will be confirmed in the FINISHED messages. + As an initial simplification, SESSION_ID is identified with NA + and reuse of sessions is not supported.*) + "[| evs: tls; A ~= B; Nonce NA ~: used evs |] + ==> Says A B {|Agent A, Nonce NA, Agent XA|} # evs : tls" + + ServerHello + (*XB represents CLIENT_VERSION, CIPHER_SUITE and COMPRESSION_METHOD. + Na is returned in its role as SESSION_ID. A CERTIFICATE_REQUEST is + implied and a SERVER CERTIFICATE is always present.*) + "[| evs: tls; A ~= B; Nonce NB ~: used evs; + Says A' B {|Agent A, Nonce NA, Agent XA|} : set evs |] + ==> Says B A {|Nonce NA, Nonce NB, Agent XB, + Crypt (priK Server) {|Agent B, Key (pubK B)|}|} + # evs : tls" + + ClientCertKeyEx + (*CLIENT CERTIFICATE and KEY EXCHANGE. M is the pre-master-secret. + Note that A encrypts using the supplied KB, not pubK B.*) + "[| evs: tls; A ~= B; Nonce M ~: used evs; + Says B' A {|Nonce NA, Nonce NB, Agent XB, + Crypt (priK Server) {|Agent B, Key KB|}|} : set evs |] + ==> Says A B {|Crypt (priK Server) {|Agent A, Key (pubK A)|}, + Crypt KB (Nonce M)|} + # evs : tls" + + CertVerify + (*The optional CERTIFICATE VERIFY message contains the specific + components listed in the security analysis, Appendix F.1.1.2. + By checking the signature, B is assured of A's existence: + the only use of A's certificate.*) + "[| evs: tls; A ~= B; + Says B' A {|Nonce NA, Nonce NB, Agent XB, + Crypt (priK Server) {|Agent B, Key KB|}|} : set evs |] + ==> Says A B (Crypt (priK A) + (Hash{|Nonce NB, + Crypt (priK Server) {|Agent B, Key KB|}|})) + # evs : tls" + + (*Finally come the FINISHED messages, confirming XA and XB among + other things. The master-secret is the hash of NA, NB and M. + Either party may sent its message first.*) + + ClientFinished + "[| evs: tls; A ~= B; + Says A B {|Agent A, Nonce NA, Agent XA|} : set evs; + Says B' A {|Nonce NA, Nonce NB, Agent XB, + Crypt (priK Server) {|Agent B, Key KB|}|} : set evs; + Says A B {|Crypt (priK Server) {|Agent A, Key (pubK A)|}, + Crypt KB (Nonce M)|} : set evs |] + ==> Says A B (Crypt (clientK(NA,NB,M)) + (Hash{|Hash{|Nonce NA, Nonce NB, Nonce M|}, + Nonce NA, Agent XA, + Crypt (priK Server) {|Agent A, Key(pubK A)|}, + Nonce NB, Agent XB, Agent B|})) + # evs : tls" + + (*Keeping A' and A'' distinct means B cannot even check that the + two messages originate from the same source.*) + + ServerFinished + "[| evs: tls; A ~= B; + Says A' B {|Agent A, Nonce NA, Agent XA|} : set evs; + Says B A {|Nonce NA, Nonce NB, Agent XB, + Crypt (priK Server) {|Agent B, Key (pubK B)|}|} + : set evs; + Says A'' B {|CERTA, Crypt (pubK B) (Nonce M)|} : set evs |] + ==> Says B A (Crypt (serverK(NA,NB,M)) + (Hash{|Hash{|Nonce NA, Nonce NB, Nonce M|}, + Nonce NA, Agent XA, Agent A, + Nonce NB, Agent XB, + Crypt (priK Server) {|Agent B, Key(pubK B)|}|})) + # evs : tls" + + (**Oops message??**) + +end