aboutsummaryrefslogtreecommitdiffstats
path: root/Source/doc
diff options
context:
space:
mode:
Diffstat (limited to 'Source/doc')
-rw-r--r--Source/doc/Architecture.txt128
-rw-r--r--Source/doc/Known-bugs.txt5
-rw-r--r--Source/doc/Todo-list.txt44
3 files changed, 177 insertions, 0 deletions
diff --git a/Source/doc/Architecture.txt b/Source/doc/Architecture.txt
new file mode 100644
index 000000000..3e8855fa9
--- /dev/null
+++ b/Source/doc/Architecture.txt
@@ -0,0 +1,128 @@
+ strongSwans overall design
+============================
+
+IKEv1 and IKEv2 is handled in different keying daemons. The ole IKEv1 stuff is
+completely handled in pluto, as it was all the times. IKEv2 is handled in the
+new keying daemon, which is called charon.
+Daemon control is done over unix sockets. Pluto uses whack, as it did for years.
+Charon uses another socket interface, called stroke. Stroke uses another
+format as whack and therefore is not compatible to whack. The starter utility,
+wich does fast configuration parsing, speaks both the protocols, whack and
+stroke. It also handles daemon startup and termination.
+Pluto uses starter for some commands, for other it uses the whack utility. To be
+as close to pluto as possible, charon has the same split up of commands to
+starter and stroke. All commands are wrapped together in the ipsec script, which
+allows transparent control of both daemons.
+
+ +-----------------------------------------+
+ | ipsec |
+ +-----+--------------+---------------+----+
+ | | |
+ | | |
+ | +-----+-----+ |
+ +-----+----+ | | +-----+----+
+ | | | starter | | |
+ | stroke | | | | whack |
+ | | +---+--+----+ | |
+ +------+---+ | | +--+-------+
+ | | | |
+ +---+------+ | | +------+--+
+ | | | | | |
+ | charon +----+ +----+ pluto |
+ | | | |
+ +-----+----+ +----+----+
+ | |
+ +-----+----+ |
+ | LSF | |
+ +-----+----+ |
+ | |
+ +-----+----+ +----+----+
+ | RAW Sock | | UDP/500 |
+ +----------+ +---------+
+
+Since IKEv2 uses the same port as IKEv1, both daemons must listen to UDP port
+500. Under Linux, there is no clean way to set up two sockets at the same port.
+To reslove this problem, charon uses a RAW socket, as they are used in network
+sniffers. An installed Linux Socket Filter (LSF) filters out all none-IKEv2
+traffic. Pluto receives any IKE message, independant of charons behavior.
+Therefore plutos behavior is changed to discard any IKEv2 traffic silently.
+
+
+ IKEv2 keying daemon: charon
+=============================
+
+ Threading modell
+------------------
+
+All IKEv2 stuff is handled in charon. It uses a newer and more flexible
+architecture than pluto. Charon uses a thread-pool, which allows parallel
+execution SA-management. Beside the thread-pool, there are some special purpose
+threads which do their job for the common health of the daemon.
+
+ +------+
+ | E Q |
+ | v u |---+ +------+ +------+
+ | e e | | | | | IKE- |
+ | n u | +-----------+ | |--| SA |
+ | t e | | | | I M | +------+
+ +------------+ | - | | Scheduler | | K a |
+ | receiver | +------+ | | | E n | +------+
+ +----+-------+ +-----------+ | - a | | IKE- |
+ | | +------+ | | S g |--| SA |
+ +-------+--+ +-----| J Q |---+ +------------+ | A e | +------+
+ -| socket | | o u | | | | - r |
+ +-------+--+ | b e | | Thread- | | |
+ | | - u | | Pool | | |
+ +----+-------+ | e |------| |---| |
+ | sender | +------+ +------------+ +------+
+ +----+-------+
+ | +------+
+ | | S Q |
+ | | e u |
+ | | n e |
+ +------------| d u |
+ | - e |
+ +--+---+
+
+The thread-pool is the heart of the architecture. It processes jobs from a
+(fully synchronized) job-queue. Mostly, a job is associated with a specific
+IKE SA. These IKE SAs are synchronized, only one thread can work one an IKE SA.
+This makes it unnecesary to use further synchronisation methods once a IKE SA
+is checked out. The (rather complex) synchronization of IKE SAs is completely
+done in the IKE SA manager.
+The sceduler is responsible for event firing. It waits until a event in the
+(fully synchronized) event-queue is ready for processing and pushes the event
+down to the job-queue. A thread form the pool will pick it up as quick as
+possible. Every thread can queue events or jobs. Furter, an event can place a
+packet in the send-queue. The sender thread waits for those packets and sends
+them over the wire, via the socket. The receiver does exactly the opposite of
+the sender. It waits on the socket, reads in packets an places them on the
+job-queue for further processing by a thread from the pool.
+There are even more threads, not drawn in the upper scheme. The stroke thread
+is responsible for reading and processessing commands from another process. The
+kernel interface thread handles communication from and to the kernel via a
+netlink socket. It waits for kernel events and processes them appropriately.
+
+
+ configuration backends
+------------------------
+
+The configuration architecture for charon is complex, but is flexible and
+extensible. All configuration stuff is split up in multiple parts:
+
+connection Defines a connection between two hosts. Proposals define with
+ wich algorithms a IKE SA should be set up.
+policy Defines the rules to apply ontop of a connection. A policy is
+ defined between two IDs. Proposals and traffic selectors allow
+ fine grained configuration of the CHILD SAs (AH and ESP) to set
+ up.
+credential A credential is something used for authentication, such as a
+ preshared key, a RSA private or public key, certificate, ...
+configuration The configuration itself handles daemon related configuration
+ stuff, such as interface binding or logging settings.
+
+These configuration types are defined as interfaces, and are currently
+implemented only in the stroke class. Through the modular design, parts could be
+replaced with more powerful backends, such as a RADIUS server for the
+credentials, a SQL database for the connections, policy definitions on an LDAP
+server, and so on...
diff --git a/Source/doc/Known-bugs.txt b/Source/doc/Known-bugs.txt
new file mode 100644
index 000000000..079d4d0f9
--- /dev/null
+++ b/Source/doc/Known-bugs.txt
@@ -0,0 +1,5 @@
+ Known bugs in charon
+======================
+
+- intiating the same connection twice makes trouble.
+-
diff --git a/Source/doc/Todo-list.txt b/Source/doc/Todo-list.txt
new file mode 100644
index 000000000..4915ea7c7
--- /dev/null
+++ b/Source/doc/Todo-list.txt
@@ -0,0 +1,44 @@
+ TODO-List for charon
+======================
+
++ = done, - = todo, ordered by priority
+
++ private key loading: der, without passphrase
++ load all private keys from ipsec.d/private/ in stroke.c
++ handle leftcert and rightcert in starterstroke.c/stroke.c
++ load specified certs in stroke.c
++ extract public keys from certs
++ public key authentication
++ release for Andreas
+
++ stroke loglevels
++ stroke up
++ ike_sa_manager checkout_by_hosts
++ stroke down
++ stroke output redirection
++ stroke status
+
+- libx509
+ + new charon build - libstrong?
+ + transforms
+ + utils (plus host)
+ - doxygen fixes (two doxyfiles?)
+ - allocator cleanup (used in lib, charon and pluto(!))
+ - logger reimplementation? (one logger for lib, charon, pluto)
+ - integrate asn1 parser/oid (asn1/oid)
+ - integrate PEM loading (pem)
+ - ... (more to come, for sure)
+
+- ipsec.secrets parsing
+
+- certificate DN parsing
+- certificate subjectAltName parsing
+- certificate lookup via ID
+- certificate validation/chaining
+- certificate exchange
+
+- trapping
+
+- delete notify, when to send?
+- notifys on connection setup failure
+- create child sa message