Commit Graph

200 Commits

Author SHA1 Message Date
Tobias Brunner 82b1a38601 tkm: Properly refer to includes now that AM_CPPFLAGS is used 2013-07-19 09:02:04 +02:00
Martin Willi 19cb07b890 automake: replace INCLUDES by AM_CPPFLAGS
INCLUDES are now deprecated and throw warnings when using automake 1.13.
We now also differentiate AM_CPPFLAGS and AM_CFLAGS, where includes and
defines are passed to AM_CPPFLAGS only.
2013-07-18 14:59:19 +02:00
Tobias Brunner a2eb581781 capabilities: Move global capabilities_t instance to libstrongswan 2013-06-25 17:16:32 +02:00
Tobias Brunner 607f8e9906 plugin-loader: Add method to print loaded plugins on a given log level 2013-06-21 15:17:53 +02:00
Martin Willi a8c9454423 kernel-interface: add an exchange initiator parameter to add_sa()
This new flag gives the kernel-interface a hint how it should priorize the
use of newly installed SAs during rekeying.

Consider the following rekey procedure in IKEv2:

Initiator  ---    Responder

I1 -------CREATE-------> R1
I2 <------CREATE--------
   -------DELETE-------> R2
I3 <------DELETE--------

SAs are always handled as pairs, the following happens at the SA level:

  * Initiator starts the exchange at I1
  * Responder installs new SA pair at R1
  * Initiator installs new SA pair at I2
  * Responder removes old SA pair at R2
  * Initiator removes old SA pair at I3

This makes sure SAs get installed/removed overlapping during rekeying. However,
to avoid any packet loss, it is crucial that the new outbound SA gets
activated at the correct position:

  * as exchange initiator, in I2
  * as exchange responder, in R2

This should guarantee that we don't use the new outbound SA before the peer
could install its corresponding inbound SA.

The new parameter allows the kernel backend to install the new SA with
appropriate priorities, i.e. it should:

  * as exchange inititator, have the new outbound SA installed with higher
    priority than the old SA
  * as exchange responder, have the new outbound SA installed with lower
    priority than the old SA

While we could split up the SA installation at the responder, this approach
has another advantage: it allows the kernel backend to switch SAs based on
other criteria, for example when receiving traffic on the new inbound SA.
2013-06-11 15:58:48 +02:00
Martin Willi 5c12700f9a kernel-interface: query SAD for last use time if SPD query didn't yield one 2013-05-06 17:01:13 +02:00
Tobias Brunner cf95d2926c Fixed some typos, courtesy of codespell 2013-03-25 10:59:37 +01:00
Adrian-Ken Rueegsegger 7cc6fa1a98 Various stylistic fixes 2013-03-19 15:24:36 +01:00
Adrian-Ken Rueegsegger c57b7a66c3 Use network byte order for ESA SPIs 2013-03-19 15:23:51 +01:00
Adrian-Ken Rueegsegger e2928a3e8c Provide MODP-2048 through TKM DH plugin 2013-03-19 15:23:51 +01:00
Adrian-Ken Rueegsegger 7f21523abd Add charon-tkm API documentation 2013-03-19 15:23:51 +01:00
Reto Buerki 0063e03325 Do not hardwire keys to KEY_RSA
Make the TKM private and public keys more easily extendable by
determining the associated key type dynamically.
2013-03-19 15:23:51 +01:00
Reto Buerki 38c1fd3cb1 Provide TKM credential encoder
The TKM credential encoder creates fingerprints of type
KEYID_PUBKEY_INFO_SHA1 and KEYID_PUBKEY_SHA1 using
CRED_PART_RSA_PUB_ASN1_DER.

This makes the pkcs1 plugin unnecessary.
2013-03-19 15:23:51 +01:00
Reto Buerki 1b22565ba5 Switch to openssl plugin 2013-03-19 15:23:51 +01:00
Reto Buerki ae6f4ee39f Don't manually register kernel_netlink_net
Load complete kernel_netlink plugin instead. Registering the TKM
specific plugins first still ensures that the correct ipsec plugin
is used.

Lazy initialize the RNG_WEAK plugin to avoid the unsatisfiable
soft dependency on startup.
2013-03-19 15:23:50 +01:00
Reto Buerki 32b2ea9edb Move stroke plugin to the end of PLUGINS list
This fixes the problem of stroke being unable to load the ca
certificates on startup.
2013-03-19 15:23:50 +01:00
Reto Buerki 41eaaef79b Make sure IP_XFRM_POLICY is defined 2013-03-19 15:23:50 +01:00
Adrian-Ken Rueegsegger 89b1d5f32c Call isa_skip_create_first when keeping IKE SA
An ALERT_KEEP_ON_CHILD_SA_FAILURE alert is issued when child SA establishment
fails but the corresponding IKE SA is not destroyed. To allow later creation
of child SAs the ISA context must be signaled that the implicity first child SA
creation was skipped.
2013-03-19 15:23:50 +01:00
Adrian-Ken Rueegsegger 140a6b7b34 Make IKE and EES sockets configurable
The IKE and EES sockets are now read from strongswan.conf. They can be
specified like this:

charon-tkm {
	ike_socket = /tmp/tkm.rpc.ike
	ees_socket = /tmp/tkm.rpc.ees
}

The socket names given above are used by default if none are configured.
2013-03-19 15:23:50 +01:00
Reto Buerki f47ea969f8 Implement TKM-specific credential set
The TKM credential set extends the in-memory credential set. It
provides a private key enumerator which is used to instantiate private
key proxy objects on-demand. This allows the usage of private keys with
arbitrary identifiers.
2013-03-19 15:23:50 +01:00
Reto Buerki ec169572a0 Initialize libstrongswan in test_runner main() 2013-03-19 15:23:50 +01:00
Adrian-Ken Rueegsegger 9099d2ba0b Set ri_id to reqid when setting user certificate
Pass the reqid (of the first child config of an IKE SA) as remote identity id
when calling cc_set_user_certificate. May lead to the usage of the wrong id in
case an IKE SA has multiple child configurations/reqids.

This must be replaced with a proper lookup once the configuration backend is
implemented and provides remote identity ids to charon-tkm.
2013-03-19 15:23:49 +01:00
Adrian-Ken Rueegsegger 722d68803e Set sp_id to reqid when creating ESA
The reqid corresponds to the sp_id (security policy id) on the TKM side.
2013-03-19 15:23:49 +01:00
Adrian-Ken Rueegsegger 1c1400f007 Call Esa_Select after creation of child SA
This tells the TKM which child SA is the currently active SA.
2013-03-19 15:23:49 +01:00
Adrian-Ken Rueegsegger d2371b728c Check that chunk fits into sequence when converting 2013-03-19 15:23:49 +01:00
Reto Buerki 3360bad910 Remove result out parameter from EES Init
Error processing is done by the registered exception handler.
2013-03-19 15:23:49 +01:00
Adrian-Ken Rueegsegger 0f5e57fe26 Drop support for pre-shared key authentication 2013-03-19 15:23:49 +01:00
Reto Buerki c457128ab6 charon-tkm: Register TKM private key on startup 2013-03-19 15:23:49 +01:00
Reto Buerki 08d199fa3d Add TKM private key implementation
The key currently imitates the private key of alice@strongswan.org by
returning it's fingerprint in the get_fingerprint function.

This associates the private key with alice's X.509 cert and charon will
use it to create a signature over the local AUTH octets of the test
connection.

The private key serves as a proxy to the TKM ike_isa_sign operation and
extracts the required information from the auth octets chunk passed on
by the keymat.
2013-03-19 15:23:49 +01:00
Reto Buerki fe504b745d keymat: Store signature info in auth octets
Store the ISA context id and the initial message in the auth octets
chunk using the sign_info_t struct. Charon will pass on this information
to the TKM private key sign operation where it is extracted.
2013-03-19 15:23:49 +01:00
Reto Buerki a2f97ff860 Add AUTH signature info data structure
The sign_info_t type is used to transfer an ISA context id and the
initial message from the keymat to the TKM private key sign operation.
2013-03-19 15:23:49 +01:00
Adrian-Ken Rueegsegger ac90fcee2f charon-tkm: Register TKM public key on startup 2013-03-19 15:23:49 +01:00
Adrian-Ken Rueegsegger 9a5c51c44f Add TKM public key implementation
The key unconditionally returns TRUE for the verify operation if it is called
with a supported signature algorithm. All such verification operations are
performed by the TKM (e.g. trustchain or auth octets verification) anyway, so
this is safe.
2013-03-19 15:23:49 +01:00
Adrian-Ken Rueegsegger 832488b14a Authenticate ISA using certificates
The authentication of the ISA is now done using the certificate provided
by the peer.
2013-03-19 15:23:49 +01:00
Adrian-Ken Rueegsegger 49b1fdb24a Store peer IKE init message
The IKE init message sent to us by the peer is needed for authentication
in the authorization hook. Store the message as chunk in the keymat and
provide a getter to make it available.
2013-03-19 15:23:49 +01:00
Adrian-Ken Rueegsegger 351bd59de2 Build cc context in tkm listener authorize hook
Extract peer certificate information and build a TKM certificate chain
context in the authorize hook of the tkm_listener_t. The cc context will
be used for ISA authentication using certificates.
2013-03-19 15:23:49 +01:00
Adrian-Ken Rueegsegger 464eb54ba4 Add TKM_CTX_CC (Certificate chain context id) 2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger 0f0165c81f Add typelen parameter to chunk_to_sequence function
The parameter is used to initialize the given sequence to zero.
2013-03-19 15:23:48 +01:00
Reto Buerki 270b321e97 Implement Ada exception processing
Register a global exception action with the Ada runtime to log uncaught
exceptions to the daemon log and terminate.
2013-03-19 15:23:48 +01:00
Reto Buerki e0cb01f44d Implement Esa Event Service (EES)
The Esa Event Service can be used to trigger ESP SA (ESA) events such as
acquire or expire. The incoming events are forwarded to the hydra kernel
interface for processing.
2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger d9c6480688 Conditionally reset AE context in keymat destroy
The responsibility to reset an authenticated endpoint context is passed
from a parent IKE SA keymat to the new keymat by including it in the ISA
info data contained in the skd chunk. The last IKE SA to be destroyed
will also reset the associated AE context.
2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger 62b625430e Let tkm_keymat_t extend keymat_v2_t 2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger 2ac988bf4b Implement IKE SA rekeying
Use the TKM ike_isa_create_child exchange to rekey an IKE SA. The isa context id
is passed on (ab)using the rekey_skd chunk.
2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger e472129aa3 Add test for keymat derive_child_keys operation 2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger 4a1529203b Implement ESA rekeying with and without PFS
A child SA is being rekeyed if the esa information passed to the add_sa
function contains nonces. If it also contains a valid Diffie-Hellman
context id PFS is used.

The fact that the encr_r encryption key is passed to add_sa in the
inbound case can be used to determine if we are initiator or not by
inspecting the is_encr_r flag of the esa information struct.
2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger d303221c0b Extend esa_info_t struct
Add additional fields to the esa_info_t struct so the necessary data can
be passed from the keymat to the kernel ipsec interface, where ESA
creation and key generation using the TKM takes place.

The information is used during the inbound add_sa call to create an ESP
SA. This makes the hack of storing the local SPI in a kernel interface
variable between subsequent add_sa calls unnecessary.
2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger de20230111 Use SAD to manage TKM ESA context information
An SAD entry is added after successfull creation of a TKM ESA context
in the add_sa() function. The corresponding entry is removed in
del_sa() using the SAD, src, dst, spi and protocol parameters.
2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger 1e13904f45 Implement TKM kernel SA database (SAD)
The TKM kernel SAD (security association database) stores information
about CHILD SAs.
2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger d1c0822759 Add TKM_CTX_ESA (ESP SA context id) 2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger d0ab667c99 Use rng to generate local ESP SPIs 2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger 6ed5c3bb1e charon-tkm: Register kernel_netlink_net
Explicitly register kernel netlink net implementation and avoid loading
the whole kernel-netlink plugin since the kernel netlink ipsec part is
unwanted.
2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger db97fd74d3 Do not return shared secret in TKM Diffie-Hellman
Since the TKM handles all relevant key material, charon-tkm must not
have access to it anymore. Thus the ike_dh_get_shared_secret operation
is not available anymore.
2013-03-19 15:23:48 +01:00
Adrian-Ken Rueegsegger a61ae27d16 Remove keymat proxy from TKM keymat
Since the TKM completely handles key derivation and installation there
is no need for the keymat proxy anymore.
2013-03-19 15:23:47 +01:00
Reto Buerki 6c237edb9a Remove netlink proxy from TKM kernel interface
The TKM is now able to manage simple child SAs, so there is no need for
the netlink proxy anymore.
2013-03-19 15:23:47 +01:00
Reto Buerki a642e3ba27 Avoid proxy for bypass_socket, enable_udp_decap
This is in preparation for the removal of the netlink kernel proxy. The
code is copied as-is from the kernel_netlink_ipsec plugin.
2013-03-19 15:23:47 +01:00
Adrian-Ken Rueegsegger b94a0befaf Implement CHILD SA key derivation using TKM
ESP SAs are created when adding CHILD SAs via the kernel ipsec
interface.

The encr_i key is used to transfer the context id of the parent IKE SA
from the keymat to the TKM kernel ipsec interface.
2013-03-19 15:23:47 +01:00
Adrian-Ken Rueegsegger cc169cb16e Register TKM kernel ipsec interface in charon-tkm 2013-03-19 15:23:47 +01:00
Adrian-Ken Rueegsegger 8a780242e2 Add TKM kernel ipsec skeleton
The existing kernel netlink ipsec interface is currently used as proxy
to perform the actual work. It will be gradually removed as the TKM
implements the needed features.
2013-03-19 15:23:47 +01:00
Reto Buerki 8f1dfb3d9e chunk_map: Store key, value pair in entry_t struct
To make the chunk map more robust it now stores a clone of the data
chunk given on insertion. The entry struct is needed to properly free
the allocated chunk after use.
2013-03-19 15:23:47 +01:00
Reto Buerki 3972769690 Call ike_isa_auth_psk in listener authorize hook
This exchange initiates the AUTH verification in the TKM.
2013-03-19 15:23:47 +01:00
Reto Buerki 9df5645623 listener: Register message hook
Use the message hook to save the AUTHENTICATION payload of an incoming
IKE_AUTH message.

The AUTH payload will be passed on to the TKM ike_isa_auth operation in
the authorize hook.
2013-03-19 15:23:47 +01:00
Reto Buerki 071e792a85 keymat: Add AUTH payload setter/getter functions
These functions are used in the TKM specific bus listener to
store/retrieve the AUTH payload chunk in the message/authorize hooks.
2013-03-19 15:23:47 +01:00
Reto Buerki d0ce4116b0 Register TKM bus listener in charon-tkm 2013-03-19 15:23:47 +01:00
Reto Buerki c6c8d74026 Add TKM specific bus listener skeleton
This listener gets informed about IKE authorization rounds and will be
used to call ike_isa_auth on a given ISA.
2013-03-19 15:23:47 +01:00
Reto Buerki d91acfdb5d Add ISA context id getter to TKM keymat 2013-03-19 15:23:47 +01:00
Reto Buerki cdd4d73ff5 keymat: Acquire AE context ID on initialization 2013-03-19 15:23:47 +01:00
Reto Buerki c755645032 Add TKM_CTX_AE (Authenticated Endpoint context) 2013-03-19 15:23:47 +01:00
Reto Buerki bf1034a776 keymat: Acquire ISA context ID on initialization 2013-03-19 15:23:47 +01:00
Reto Buerki 7fb3e5ed10 Add TKM_CTX_ISA (IKE SA context) 2013-03-19 15:23:46 +01:00
Reto Buerki fa22fc2419 Use remote PSK signature computed by TKM 2013-03-19 15:23:46 +01:00
Reto Buerki e7a497c307 keymat: Check for aes256-sha512 in derive_ike_keys
Return FALSE if peers try to use other algorithm combinations.
2013-03-19 15:23:46 +01:00
Adrian-Ken Rueegsegger 51fdbd0429 keymat: Call ike_isa_sign_psk in get_psk_sig
Get PSK signed AUTH octets from TKM in initiator case.
2013-03-19 15:23:46 +01:00
Reto Buerki e285544be2 Factor out AEAD transform creation
Introduce static aead_create_from_keys function to initialize AEAD
transforms from key chunks.
2013-03-19 15:23:46 +01:00
Reto Buerki 4be8471fab Add keymat IKE key derivation test case 2013-03-19 15:23:46 +01:00
Reto Buerki 3290b9995c keymat: Create inbound and outbound AEAD transforms
Create and initialize AEAD transforms with keys derived by the TKM.
Return these transforms in the get_aead function.

IKE keys used by charon are derived by TKM now.
2013-03-19 15:23:46 +01:00
Reto Buerki 4c38878db5 keymat: Extract enc,inc algorithms from proposal
Extract encryption and integrity algorithms from proposal and check them
before deriving IKE keys.
2013-03-19 15:23:46 +01:00
Reto Buerki fc828aaac6 keymat: Call TKM Isa_Create procedure 2013-03-19 15:23:46 +01:00
Reto Buerki 0327fac6b6 Implement chunk_to_sequence function
This function converts a given chunk to a variable-length byte sequence.
2013-03-19 15:23:46 +01:00
Reto Buerki 53232d5883 Implement sequence_to_chunk function
This function converts a given TKM variable-length byte sequence to
chunk.
2013-03-19 15:23:46 +01:00
Adrian-Ken Rueegsegger d61cea7524 keymat: Log nonce and DH context ids 2013-03-19 15:23:46 +01:00
Adrian-Ken Rueegsegger 528fc21ffe Add context id getter to TKM DH implementation 2013-03-19 15:23:46 +01:00
Adrian-Ken Rueegsegger ba0d7d9a76 keymat: Get context id of local nonce
To derive IKE keys using TKM the nonce context id of the local nonce is needed.
Get the id for a given chunk using the chunk map.
2013-03-19 15:23:46 +01:00
Adrian-Ken Rueegsegger 624178fece nonceg: Insert id mapping when allocating nonce 2013-03-19 15:23:46 +01:00
Adrian-Ken Rueegsegger 3242a178b3 Add chunk map
This data structure allows to store mappings of chunks to ids. This will
be used to map nonces to their corresponding nonce context ids.
2013-03-19 15:23:46 +01:00
Adrian-Ken Rueegsegger 601de9f36f Add context id getter to TKM nonce generator 2013-03-19 15:23:46 +01:00
Reto Buerki ebe592a393 id_manager: Use calloc instead of malloc
This way we don't need to manually initialize the slot status; free
slots are now indicated by 0 though.
2013-03-19 15:23:46 +01:00
Reto Buerki 1ee792f9ea Use ikev2 keymat proxy
Forward incoming calls to default ikev2 keymat instance. This is needed
to make a stepwise migration to TKM keymat possible. It will be removed
once the corresponding parts are implemented in the TKM.
2013-03-19 15:23:45 +01:00
Reto Buerki 5b3bcdfada Add skeleton for TKM keymat variant 2013-03-19 15:23:45 +01:00
Reto Buerki 84967b4439 id_manager: Use limits given by TKM 2013-03-19 15:23:45 +01:00
Reto Buerki 50e35e66d2 Pass context limits on to id manager 2013-03-19 15:23:45 +01:00
Reto Buerki ef5372395a Request limits from TKM on init 2013-03-19 15:23:45 +01:00
Reto Buerki 7aa573a50e id_manager: Use array of bool instead of list
Instead of storing the acquired context ids in a linked list, use an
array of booleans for the job. A boolean value of true in the array
designates an available context id.
2013-03-19 15:23:45 +01:00
Reto Buerki 49c513c1d9 Use id manager to acquire DH context id 2013-03-19 15:23:45 +01:00
Reto Buerki 65a777f7fb Add TKM_CTX_DH (Diffie-Hellman context) to id manager 2013-03-19 15:23:45 +01:00
Reto Buerki c38459d77d Use id manager to acquire nonce context id 2013-03-19 15:23:45 +01:00
Reto Buerki f3cd7f50de Add initial TKM Diffie-Hellman implementation
The tkm_diffie_hellman_t plugin acquires a DH context from the Trusted
Key Manager and uses it to get a DH public value and the calculated
shared secret. Proper context handling is still missing though, the
plugin currently uses context ID 1.

The get_shared_secret function will be removed as soon as the TKM
specific keymat is ready.
2013-03-19 15:23:45 +01:00
Reto Buerki d51305aa3f charon-tkm: Register tkm nonce generator 2013-03-19 15:23:45 +01:00
Reto Buerki 8e95bf455d tkm_nonceg: Return nonce generated by TKM 2013-03-19 15:23:45 +01:00
Reto Buerki 3d2746309e Initialize TKM client library in tkm.c 2013-03-19 15:23:45 +01:00
Reto Buerki 559fe48c50 Introduce TKM specific charon daemon (charon-tkm)
Analogous to charon-nm the charon-tkm daemon is a specialized charon
instance used in combination with the trusted key manager (TKM) written
in Ada.

The charon-tkm is basically a copy of the charon-nm code which will
register it's own TKM specific plugins.

The daemon binary is built using the gprbuild utility. This is needed
because it uses the tkm-rpc Ada library and consequently the Ada
runtime. gprbuild takes care of the complete binding and linker steps
required to properly initialize the Ada runtime.
2013-03-19 15:23:45 +01:00