- Description of protocol and authentication updated.

This commit is contained in:
Guus Sliepen 2001-01-07 17:08:03 +00:00
parent 7109526c67
commit 96b6f958bc
2 changed files with 93 additions and 105 deletions

View file

@ -1,7 +1,7 @@
This is the security documentation for tinc, a Virtual Private Network daemon.
Copyright 2000 Guus Sliepen <guus@sliepen.warande.net>,
2000 Ivo Timmmermans <itimmermans@bigfoot.com>
Copyright 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
2000,2001 Ivo Timmmermans <itimmermans@bigfoot.com>
Permission is granted to make and distribute verbatim copies of
this documentation provided the copyright notice and this
@ -12,7 +12,7 @@ This is the security documentation for tinc, a Virtual Private Network daemon.
provided that the entire resulting derived work is distributed
under the terms of a permission notice identical to this one.
$Id: SECURITY,v 1.1.2.3 2000/09/25 20:08:50 guus Exp $
$Id: SECURITY,v 1.1.2.4 2001/01/07 17:08:03 guus Exp $
1. Authentication
@ -27,10 +27,8 @@ The authentication protocol (see protocol.c for the up-to-date version) is:
send_id(u)
send_challenge(R)
send_chal_reply(H)
---------------------------------------
Any negotations about the meta protocol
encryption go here(u).
---------------------------------------
send_metakey(R)
send_metakey(R)
send_ack(u)
send_ack(u)
---------------------------------------
@ -76,49 +74,6 @@ made, both sides have to agree on a key for this block cipher. To make sure
that this key exchange is also done securely, and no man-in-the-middle attack
is possible, RSA would be the best choice for exchanging keys.
Instead of doing RSA encryption again, tinc will use a part of the random
string that was exchanged during the authentication phase as the key for the
symmetric cipher. Some symmetric ciphers require a random initialisation vector
for improved security. This vector can be taken from the random string as well.
Is this secure? I (Guus Sliepen) think at this moment that it is:
- Since the random string cannot be decrypted by anyone eavesdropping or
playing man-in-the-middle, the symmetric key cannot be known by sniffing.
- The unencrypted returned hash value is supposed to be cryptographically
secure. Furthermore, it can only at most give a way 160 bits of information
from the complete random string which is longer than the key for the
symmetric cipher, so very few bits will actualy contain information about
the symmetric cipher key alone, if any.
- If the RSA encryption is cracked, the rest of the communications can be
decrypted anyway.
- If the symmetric cipher encryption is cracked without using the information
from the encrypted random strings or the hash values, this still won't give
the full plaintext for the random string, so it won't facilitate a known-
plaintext attack on the RSA encryption.
- RSA and symmetric ciphers are fundamentally different. It is very unlikely
that the overlap of both will create any interference that will facilitate
an easier-than-brute-force attack.
Other options for key exchange could be:
* A second exchange of RSA encrypted random strings.
This is equal to the former scheme just without knowing the hash value of
the unecrypted random string. Information theory tells that two seperate
RSA messages are as secure as one if the total amount of bits sent is the
same, so enlarging the challenge will make one exchange just as secure as
two seperate exchanges.
* Diffie-Hellman with RSA signing.
This should be very secure, but there are a lot of pitfalls with using both
encryption with public keys and private keys together with the same keypair.
* Diffie-Hellman with passphrases.
This is what tinc <= 1.0pre2 used to do. Passphrases are secret, exchanging
them must be done with great care, nobody may eavesdrop. Exchanging public
keys on the other hand is much safer, everybody may eavesdrop, just as long
as you are sure that the public key itself belongs to the right owner.
3. Symmetric cipher
--------------------
@ -136,8 +91,9 @@ connections) and a client (a tinc daemon that is trying to connect to the tinc
daemon playing server).
The message strings here are kept short for clarity. The real length of the
exchanged messages is indicated. The capital words ID, CHALLENGE, CHAL_REPLY
and ACK are in reality replaced by the numbers 1, 2, 3 and 4 respectively.
exchanged messages is indicated. The capital words ID, CHALLENGE, CHAL_REPLY,
META_KEY and ACK are in reality replaced by the numbers 0, 1, 2, 3 and 4
respectively.
daemon message
--------------------------------------------------------------------------
@ -149,12 +105,8 @@ client ID client 8 0
| +---> version
+-------> name of tinc daemon
server CHALLENGE 57fb4b2ccd70d6bb35a64c142f47e61d
\________/\__/
| +----> 64 bits initial vector and
+-----------> 448 bits symmetric cipher key for meta
data sent to the server
\______________________________/
+-> 2048 bits totally random string, encrypted
+-> KEYLENGTH bits totally random string, encrypted
with client's public RSA key
client CHAL_REPLY 191e23
+-> 160 bits SHA1 value of the complete decrypted
@ -164,22 +116,36 @@ server ID server 8 0
| +---> version
+-------> name of tinc daemon
client CHALLENGE da02add1817c1920989ba6ae2a49cecb
\________/\__/
| +----> 64 bits initial vector and
+-----------> 448 bits symmetric cipher key for meta
data sent to the client
\______________________________/
+-> 2048 bits totally random string, encrypted
+-> KEYLENGTH bits totally random string, encrypted
with server's public RSA key
server CHAL_REPLY 2bdeed
+-> 160 bits SHA1 value of the complete decrypted
CHALLENGE sent by the client
client META_KEY 5f0823a93e35b69e7086ec7866ce582b
\______________________________/
+-> KEYLENGTH bits totally random string, encrypted
with server's public RSA key
server META_KEY 6ab9c1640388f8f045d1a07f8a672630
\______________________________/
+-> KEYLENGTH bits totally random string, encrypted
with client's public RSA key
client ACK
server ACK
--------------------------------------------------------------------------
When the server receives the ACK from the client, it should prepare itself
for the fact that any subsequent data will be encrypted with the key the server
sent itself in the CHALLENGE. Ofcourse, this key is taken from the decrypted
version of that CHALLENGE, so that we will know for sure only the real client
sent itself in the META_KEY. Ofcourse, this key is taken from the decrypted
version of that META_KEY, so that we will know for sure only the real client
can send us messages. The same goes for the client when it receives an ACK.
5. Encryption of VPN packets
-----------------------------
The VPN packets are also encrypted, but with a different key than the one used
for the meta connection. The reason is that VPN packets can also come from
other clients which do not have a meta connection with server. Each tinc daemon
propagates (on request) a separate key for packets that it receives. This key
is a random string, generated on the fly. Since it is exchanged using the meta
connection, this key itself will be encrypted.