vici: flush-certs command flushes certificate cache
[strongswan.git] / src / libcharon / plugins / vici / README.md
1 # The Versatile IKE Control Interface (VICI) protocol #
2
3 The vici plugin implements the server side of an IPC protocol to configure,
4 monitor and control the IKE daemon charon. It uses request/response and event
5 messages to communicate over a reliable stream based transport.
6
7 ## Transport protocol ##
8
9 To provide the service, the plugin opens a listening socket using a reliable,
10 stream based transport. charon relies on the different stream service
11 abstractions provided by libstrongswan, such as TCP and UNIX sockets.
12
13 A client connects to this service to access functionality. It may send an
14 arbitrary number of packets over the connection before closing it.
15
16 To exchange data, the transport protocol is segmented into byte sequences.
17 Each byte sequence is prefixed by a 32-bit length header in network order,
18 followed by the data. The maximum segment length is currently limited to 512KB
19 of data, and the length field contains the length of the data only, not
20 including the length field itself.
21
22 The order of byte sequences must be strict, byte sequences must arrive in the
23 same order as sent.
24
25 ## Packet layer ##
26
27 Within the byte sequences defined by the transport layer, both the client
28 and the server can exchange packets. The type of packet defines its structure
29 and purpose. The packet type is a 8-bit identifier, and is the first byte
30 in a transport layer byte sequence. The length of the packet is given by the
31 transport layer.
32
33 While a packet type may define the format of the wrapped data freely, currently
34 all types either contain a name, a message or both. The following packet types
35 are currently defined:
36
37 * _CMD_REQUEST = 0_: A named request message
38 * _CMD_RESPONSE = 1_: An unnamed response message for a request
39 * _CMD_UNKNOWN = 2_: An unnamed response if requested command is unknown
40 * _EVENT_REGISTER = 3_: A named event registration request
41 * _EVENT_UNREGISTER = 4_: A named event deregistration request
42 * _EVENT_CONFIRM = 5_: An unnamed response for successful event (de-)registration
43 * _EVENT_UNKNOWN = 6_: A unnamed response if event (de-)registration failed
44 * _EVENT = 7_: A named event message
45
46 For packets having a named type, after the packet type an 8-bit length header
47 of the name follows, indicating the string length in bytes of the name tag, not
48 including the length field itself. The name is an ASCII string that is not
49 null-terminated.
50
51 The rest of the packet forms the exchanged message, the length is determined
52 by the transport byte sequence length, subtracting the packet type and
53 the optional name tag in some messages.
54
55 ### Commands ###
56
57 Commands are currently always requested by the client. The server replies with
58 a response, or with a CMD_UNKNOWN failure message to let the client know
59 that it does not have a handler for such a command. There is no sequence number
60 to associate responses to requests, so only one command can be active at
61 a time on a single connection.
62
63 ### Events ###
64
65 To receive event messages, the client explicitly registers for events by name,
66 and also unregisters if it does not want to receive events of the named kind
67 anymore. The server confirms event registration using EVENT_CONFIRM, or
68 indicates that there is no such event source with EVENT_UNKNOWN.
69
70 Events may get raised at any time while registered, even during an active
71 request command. This mechanism is used to feed continuous data during a request,
72 for example.
73
74 ## Message format ##
75
76 The defined packet types optionally wrap a message with additional data.
77 Messages are currently used in CMD_REQUEST/CMD_RESPONSE, and in EVENT packets.
78 A message uses a hierarchial tree of sections. Each section (or the implicit
79 root section) contains an arbitrary set of key/value pairs, lists and
80 sub-sections. The length of a message is not part of the message itself, but
81 the wrapping layer, usually calculated from the transport byte sequence length.
82
83 The message encoding consists of a sequence of elements. Each element starts
84 with the element type, optionally followed by an element name and/or an element
85 value. Currently the following message element types are defined:
86
87 * _SECTION_START = 1_: Begin a new section having a name
88 * _SECTION_END = 2_: End a previously started section
89 * _KEY_VALUE = 3_: Define a value for a named key in the current section
90 * _LIST_START = 4_: Begin a named list for list items
91 * _LIST_ITEM = 5_: Define an unnamed item value in the current list
92 * _LIST_END = 6_: End a previously started list
93
94 Types are encoded as 8-bit values. Types having a name (SECTION_START,
95 KEY_VALUE and LIST_START) have an ASCII string following the type, which itself
96 uses an 8-bit length header. The string must not be null-terminated, the string
97 length does not include the length field itself.
98
99 Types having a value (KEY_VALUE and LIST_ITEM) have a raw blob sequence,
100 prefixed with a 16-bit network order length. The blob follows the type or the
101 name tag if available, the length defined by the length field does not include
102 the length field itself.
103
104 The interpretation of any value is not defined by the message format; it can
105 take arbitrary blobs. The application may specify types for specific keys, such
106 as strings or integer representations. The vici plugin currently uses
107 non-null terminated strings as values only; numbers get encoded as strings.
108
109 ### Sections ###
110
111 Sections may be opened in the implicit root section, or any previously section.
112 They can be nested to arbitrary levels. A SECTION_END marker always closes
113 the last opened section; SECTION_START and SECTION_END items must be balanced
114 in a valid message.
115
116 ### Key/Values ###
117
118 Key/Value pair elements may appear in the implicit root section or any explicit
119 sub-section at any level. Key names must be unique in the current section, use
120 lists to define multiple values for a key. Key/values may not appear in lists,
121 use a sub-section instead.
122
123 ### Lists ###
124
125 Lists may appear at the same locations as Key/Values, and may not be nested.
126 Only a single list may be opened at the same time, and all lists must be closed
127 in valid messages. After opening a list, only list items may appear before the
128 list closing element. Empty lists are allowed, list items may appear within
129 lists only.
130
131 ### Encoding example ###
132
133 Consider the following structure using pseudo-markup for this example:
134
135         key1 = value1
136         section1 = {
137                 sub-section = {
138                         key2 = value2
139                 }
140                 list1 = [ item1, item2 ]
141         }
142
143 The example above reprensents a valid tree structure, that gets encoded as
144 the following C array:
145
146         char msg[] = {
147                 /* key1 = value1 */
148                 3, 4,'k','e','y','1', 0,6,'v','a','l','u','e','1',
149                 /* section1 */
150                 1, 8,'s','e','c','t','i','o','n','1',
151                 /* sub-section */
152                 1, 11,'s','u','b','-','s','e','c','t','i','o','n',
153                 /* key2 = value2 */
154                 3, 4,'k','e','y','2', 0,6,'v','a','l','u','e','2',
155                 /* sub-section end */
156                 2,
157                 /* list1 */
158                 4, 5, 'l','i','s','t','1',
159                 /* item1 */
160                 5, 0,5,'i','t','e','m','1',
161                 /* item2 */
162                 5, 0,5,'i','t','e','m','2',
163                 /* list1 end */
164                 6,
165                 /* section1 end */
166                 2,
167         };
168
169 ## Client-initiated commands ##
170
171 Based on the packet layer, VICI implements commands requested by the client
172 and responded to by the server using named _CMD_REQUEST_ and _CMD_RESPONSE_
173 packets wrapping messages. The request message may contain command arguments,
174 the response message the reply.
175
176 Some commands use response streaming, that is, a request triggers a series of
177 events to consecutively stream data to the client before the response message
178 completes the stream. A client must register for the appropriate event to
179 receive the stream, and unregister after the response has been received.
180
181 The following client issued commands with the appropriate command input and
182 output messages are currently defined:
183
184 ### version() ###
185
186 Returns daemon and system specific version information.
187
188         {} => {
189                 daemon = <IKE daemon name>
190                 version = <strongSwan version>
191                 sysname = <operating system name>
192                 release = <operating system release>
193                 machine = <hardware identifier>
194         }
195
196 ### stats() ###
197
198 Returns IKE daemon statistics and load information.
199
200         {} => {
201                 uptime = {
202                         running = <relative uptime in human-readable form>
203                         since = <absolute startup time>
204                 }
205                 workers = {
206                         total = <total number of worker threads>
207                         idle = <worker threads currently idle>
208                         active = {
209                                 critical = <threads processing "critical" priority jobs>
210                                 high = <threads processing "high" priority jobs>
211                                 medium = <threads processing "medium" priority jobs>
212                                 low = <threads processing "low" priority jobs>
213                         }
214                 }
215                 queues = {
216                         critical = <jobs queued with "critical" priority>
217                         high = <jobs queued with "high" priority>
218                         medium = <jobs queued with "medium" priority>
219                         low = <jobs queued with "low" priority>
220                 }
221                 scheduled = <number of jobs scheduled for timed execution>
222                 ikesas = {
223                         total = <total number of IKE_SAs active>
224                         half-open = <number of IKE_SAs in half-open state>
225                 }
226                 plugins = [
227                         <names of loaded plugins>
228                 ]
229                 mem = { # available if built with leak-detective or on Windows
230                         total = <total heap memory usage in bytes>
231                         allocs = <total heap allocation blocks>
232                         <heap-name>* = { # on Windows only
233                                 total = <heap memory usage in bytes by this heap>
234                                 allocs = <allocated blocks for this heap>
235                         }
236                 }
237                 mallinfo = { # available with mallinfo() support
238                         sbrk = <non-mmaped space available>
239                         mmap = <mmaped space available>
240                         used = <total number of bytes used>
241                         free = <available but unused bytes>
242                 }
243         }
244
245 ### reload-settings() ###
246
247 Reloads _strongswan.conf_ settings and all plugins supporting configuration
248 reload.
249
250         {} => {
251                 success = <yes or no>
252                 errmsg = <error string on failure>
253         }
254
255 ### initiate() ###
256
257 Initiates an SA while streaming _control-log_ events.
258
259         {
260                 child = <CHILD_SA configuration name to initiate>
261                 ike = <optional IKE_SA configuraiton name to find child under>
262                 timeout = <timeout in ms before returning>
263                 init-limits = <whether limits may prevent initiating the CHILD_SA>
264                 loglevel = <loglevel to issue "control-log" events for>
265         } => {
266                 success = <yes or no>
267                 errmsg = <error string on failure or timeout>
268         }
269
270 The default timeout of 0 waits indefinitely for a result, and a timeout value
271 of -1 returns a result immediately.
272
273 ### terminate() ###
274
275 Terminates an SA while streaming _control-log_ events.
276
277         {
278                 child = <terminate a CHILD_SA by configuration name>
279                 ike = <terminate an IKE_SA by configuration name>
280                 child-id = <terminate a CHILD_SA by its reqid>
281                 ike-id = <terminate an IKE_SA by its unique id>
282                 timeout = <timeout in ms before returning>
283                 loglevel = <loglevel to issue "control-log" events for>
284         } => {
285                 success = <yes or no>
286                 errmsg = <error string on failure or timeout>
287         }
288
289 The default timeout of 0 waits indefinitely for a result, and a timeout value
290 of -1 returns a result immediately.
291
292 ### redirect() ###
293
294 Redirect a client-initiated IKE_SA to another gateway.  Only for IKEv2 and if
295 supported by the peer.
296
297         {
298                 ike = <redirect an IKE_SA by configuration name>
299                 ike-id = <redirect an IKE_SA by its unique id>
300                 peer-ip = <redirect an IKE_SA with matching peer IP, may also be a
301                                    subnet in CIDR notation or an IP range>
302                 peer-id = <redirect an IKE_SA with matching peer identity, may contain
303                                    wildcards>
304         } => {
305                 success = <yes or no>
306                 errmsg = <error string on failure>
307         }
308
309 ### install() ###
310
311 Install a trap, drop or bypass policy defined by a CHILD_SA config.
312
313         {
314                 child = <CHILD_SA configuration name to install>
315                 ike = <optional IKE_SA configuraiton name to find child under>
316         } => {
317                 success = <yes or no>
318                 errmsg = <error string on failure>
319         }
320
321 ### uninstall() ###
322
323 Uninstall a trap, drop or bypass policy defined by a CHILD_SA config.
324
325         {
326                 child = <CHILD_SA configuration name to install>
327         } => {
328                 success = <yes or no>
329                 errmsg = <error string on failure>
330         }
331
332 ### list-sas() ###
333
334 Lists currently active IKE_SAs and associated CHILD_SAs by streaming _list-sa_
335 events.
336
337         {
338                 noblock = <use non-blocking mode if key is set>
339                 ike = <filter listed IKE_SAs by its name>
340                 ike-id = <filter listed IKE_SA by its unique id>
341         } => {
342                 # completes after streaming list-sa events
343         }
344
345 ### list-policies() ###
346
347 List currently installed trap, drop and bypass policies by streaming
348 _list-policy_ events.
349
350         {
351                 drop = <set to yes to list drop policies>
352                 pass = <set to yes to list bypass policies>
353                 trap = <set to yes to list trap policies>
354                 child = <filter by CHILD_SA configuration name>
355         } => {
356                 # completes after streaming list-sa events
357         }
358
359 ### list-conns() ###
360
361 List currently loaded connections by streaming _list-conn_ events. This
362 call includes all connections known by the daemon, not only those loaded
363 over vici.
364
365         {
366                 ike = <list connections matching a given configuration name only>
367         } => {
368                 # completes after streaming list-conn events
369         }
370
371 ### get-conns() ###
372
373 Return a list of connection names loaded exclusively over vici, not including
374 connections found in other backends.
375
376         {} => {
377                 conns = [
378                         <list of connection names>
379                 ]
380         }
381
382 ### list-certs() ###
383
384 List currently loaded certificates by streaming _list-cert_ events. This
385 call includes all certificates known by the daemon, not only those loaded
386 over vici.
387
388         {
389                 type = <certificate type to filter for, X509|X509_AC|X509_CRL|
390                                                                                                 OCSP_RESPONSE|PUBKEY  or ANY>
391                 flag = <X.509 certificate flag to filter for, NONE|CA|AA|OCSP or ANY>
392                 subject = <set to list only certificates having subject>
393         } => {
394                 # completes after streaming list-cert events
395         }
396
397 ### list-authorities() ###
398
399 List currently loaded certification authority information by streaming
400 _list-authority_ events.
401
402         {
403                 name = <list certification authority of a given name>
404         } => {
405                 # completes after streaming list-authority events
406         }
407
408 ### get-authorities() ###
409
410 Return a list of currently loaded certification authority names.
411
412         {} => {
413                 authorities = [
414                         <list of certification authority names>
415                 ]
416         }
417
418 ### load-conn() ###
419
420 Load a single connection definition into the daemon. An existing connection
421 with the same name gets updated or replaced.
422
423         {
424                 <IKE_SA config name> = {
425                         # IKE configuration parameters with authentication and CHILD_SA
426                         # subsections. Refer to swanctl.conf(5) for details.
427                 } => {
428                         success = <yes or no>
429                         errmsg = <error string on failure>
430                 }
431         }
432
433 ### unload-conn() ###
434
435 Unload a previously loaded connection definition by name.
436
437         {
438                 name = <IKE_SA config name>
439         } => {
440                 success = <yes or no>
441                 errmsg = <error string on failure>
442         }
443
444 ### load-cert() ###
445
446 Load a certificate into the daemon.
447
448         {
449                 type = <certificate type, X509|X509_AC|X509_CRL>
450                 flag = <X.509 certificate flag, NONE|CA|AA|OCSP>
451                 data = <PEM or DER encoded certificate data>
452         } => {
453                 success = <yes or no>
454                 errmsg = <error string on failure>
455         }
456
457 ### load-key() ###
458
459 Load a private key into the daemon.
460
461         {
462                 type = <private key type, RSA|ECDSA>
463                 data = <PEM or DER encoded key data>
464         } => {
465                 success = <yes or no>
466                 errmsg = <error string on failure>
467         }
468
469 ### load-shared() ###
470
471 Load a shared IKE PSK, EAP or XAuth secret into the daemon.
472
473         {
474                 type = <private key type, IKE|EAP|XAUTH>
475                 data = <raw shared key data>
476                 owners = [
477                         <list of shared key owner identities>
478                 ]
479         } => {
480                 success = <yes or no>
481                 errmsg = <error string on failure>
482         }
483
484 ### flush-certs() ###
485
486 Flushes the certificate cache. The optional type argument allows to flush
487 only certificates of a given type, e.g. all cached CRLs.
488
489         {
490                 type = <certificate type to filter for, X509|X509_AC|X509_CRL|
491                                                                                                 OCSP_RESPONSE|PUBKEY or ANY>
492         } => {
493                 success = <yes or no>
494                 errmsg = <error string on failure>
495         }
496
497 ### clear-creds() ###
498
499 Clear all loaded certificate, private key and shared key credentials. This
500 affects only credentials loaded over vici, but additionally flushes the
501 credential cache.
502
503         {} => {
504                 success = <yes or no>
505                 errmsg = <error string on failure>
506         }
507
508 ### load-authority() ###
509
510 Load a single certification authority definition into the daemon. An existing
511 authority with the same name gets replaced.
512
513         {
514                 <certification authority name> = {
515                         # certification authority parameters
516                         # refer to swanctl.conf(5) for details.
517                 } => {
518                         success = <yes or no>
519                         errmsg = <error string on failure>
520                 }
521         }
522
523 ### unload-authority() ###
524
525 Unload a previously loaded certification authority definition by name.
526
527         {
528                 name = <certification authority name>
529         } => {
530                 success = <yes or no>
531                 errmsg = <error string on failure>
532         }
533
534 ### load-pool() ###
535
536 Load an in-memory virtual IP and configuration attribute pool. Existing
537 pools with the same name get updated, if possible.
538
539         {
540                 <pool name> = {
541                         addrs = <subnet of virtual IP pool addresses>
542                         <attribute type>* = [
543                                 # attribute type is one of address, dns, nbns, dhcp, netmask,
544                                 # server, subnet, split_include, split_exclude or a numerical
545                                 # attribute type identifier.
546                                 <list of attributes for type>
547                         ]
548                 }
549         } => {
550                 success = <yes or no>
551                 errmsg = <error string on failure>
552         }
553
554 ### unload-pool() ###
555
556 Unload a previously loaded virtual IP and configuration attribute pool.
557 Unloading fails for pools with leases currently online.
558
559         {
560                 name = <virtual IP address pool to delete>
561         } => {
562                 success = <yes or no>
563                 errmsg = <error string on failure>
564         }
565
566 ### get-pools() ###
567
568 List the currently loaded pools.
569
570         {
571                 leases = <set to yes to include leases>
572         } => {
573                 <pool name>* = {
574                         base = <virtual IP pool base address>
575                         size = <total number of addresses in the pool>
576                         online = <number of leases online>
577                         offline = <number of leases offline>
578                         leases = {
579                                 <zero-based index>* = {
580                                         address = <IP address>
581                                         identity = <assigned identity>
582                                         status = <online|offline>
583                                 }
584                         }
585                 }
586         }
587
588 ### get-algorithms() ###
589
590 List currently loaded algorithms and their implementation.
591
592         {} => {
593                 <algorithm type> = {
594                         <algorithm> = <plugin providing the implementation>
595                 }
596         }
597
598 ## Server-issued events ##
599
600 Based on the packet layer, the vici plugin raises event messages using named
601 EVENT packets wrapping messages. The message contains event details.
602
603 ### log ###
604
605 The _log_ event is issued to registered clients for each debug log message.
606 This event is not associated with a command.
607
608         {
609                 group = <subsystem identifier for debug message>
610                 level = <log level, 0-4>
611                 thread = <numerical thread identifier issuing the log message>
612                 ikesa-name = <name of IKE_SA, if log is associated with any>
613                 ikesa-uniqued = <unique identifier of IKE_A, if log associated with any>
614                 msg = <log message text>
615         }
616
617 ### control-log ###
618
619 The _control-log_ event is issued for log events during active _initiate_ or
620 _terminate_ commands. It is issued only to clients currently having such
621 a command active.
622
623         {
624                 group = <subsystem identifier for debug message>
625                 level = <log level, 0-4>
626                 ikesa-name = <name of IKE_SA, if log associated with any>
627                 ikesa-uniqued = <unique identifier of IKE_A, if log associated with any>
628                 msg = <log message text>
629         }
630
631 ### list-sa ###
632
633 The _list-sa_ event is issued to stream IKE_SAs during an active _list-sas_
634 command.
635
636         {
637                 <IKE_SA config name> = {
638                         uniqueid = <IKE_SA unique identifier>
639                         version = <IKE version, 1 or 2>
640                         state = <IKE_SA state name>
641                         local-host = <local IKE endpoint address>
642                         local-port = <local IKE endpoint port>
643                         local-id = <local IKE identity>
644                         remote-host = <remote IKE endpoint address>
645                         remote-port = <remote IKE endpoint port>
646                         remote-id = <remote IKE identity>
647                         remote-xauth-id = <remote XAuth identity, if XAuth-authenticated>
648                         remote-eap-id = <remote EAP identity, if EAP-authenticated>
649                         initiator = <yes, if initiator of IKE_SA>
650                         initiator-spi = <hex encoded initiator SPI / cookie>
651                         responder-spi = <hex encoded responder SPI / cookie>
652                         nat-local = <yes, if local endpoint is behind a NAT>
653                         nat-remote = <yes, if remote endpoint is behind a NAT>
654                         nat-fake = <yes, if NAT situation has been faked as responder>
655                         nat-any = <yes, if any endpoint is behind a NAT (also if faked)>
656                         encr-alg = <IKE encryption algorithm string>
657                         encr-keysize = <key size for encr-alg, if applicable>
658                         integ-alg = <IKE integrity algorithm string>
659                         integ-keysize = <key size for encr-alg, if applicable>
660                         prf-alg = <IKE pseudo random function string>
661                         dh-group = <IKE Diffie-Hellman group string>
662                         established = <seconds the IKE_SA has been established>
663                         rekey-time = <seconds before IKE_SA gets rekeyed>
664                         reauth-time = <seconds before IKE_SA gets re-authenticated>
665                         local-vips = [
666                                 <list of virtual IPs assigned by the remote peer, installed locally>
667                         ]
668                         remote-vips = [
669                                 <list of virtual IPs assigned to the remote peer>
670                         ]
671                         tasks-queued = [
672                                 <list of currently queued tasks for execution>
673                         ]
674                         tasks-active = [
675                                 <list of tasks currently initiating actively>
676                         ]
677                         tasks-passive = [
678                                 <list of tasks currently handling passively>
679                         ]
680                         child-sas = {
681                                 <child-sa-name>* = {
682                                         uniqueid = <unique CHILD_SA identifier>
683                                         reqid = <reqid of CHILD_SA>
684                                         state = <state string of CHILD_SA>
685                                         mode = <IPsec mode, tunnel|transport|beet>
686                                         protocol = <IPsec protocol AH|ESP>
687                                         encap = <yes if using UDP encapsulation>
688                                         spi-in = <hex encoded inbound SPI>
689                                         spi-out = <hex encoded outbound SPI>
690                                         cpi-in = <hex encoded inbound CPI, if using compression>
691                                         cpi-out = <hex encoded outbound CPI, if using compression>
692                                         encr-alg = <ESP encryption algorithm name, if any>
693                                         encr-keysize = <ESP encryption key size, if applicable>
694                                         integ-alg = <ESP or AH integrity algorithm name, if any>
695                                         integ-keysize = <ESP or AH integrity key size, if applicable>
696                                         prf-alg = <CHILD_SA pseudo random function name>
697                                         dh-group = <CHILD_SA PFS rekeying DH group name, if any>
698                                         esn = <1 if using extended sequence numbers>
699                                         bytes-in = <number of input bytes processed>
700                                         packets-in = <number of input packets processed>
701                                         use-in = <seconds since last inbound packet, if any>
702                                         bytes-out = <number of output bytes processed>
703                                         packets-out = <number of output packets processed>
704                                         use-out = <seconds since last outbound packet, if any>
705                                         rekey-time = <seconds before CHILD_SA gets rekeyed>
706                                         life-time = <seconds before CHILD_SA expires>
707                                         install-time = <seconds the CHILD_SA has been installed>
708                                         local-ts = [
709                                                 <list of local traffic selectors>
710                                         ]
711                                         remote-ts = [
712                                                 <list of remote traffic selectors>
713                                         ]
714                                 }
715                         }
716                 }
717         }
718
719 ### list-policy ###
720
721 The _list-policy_ event is issued to stream installed policies during an active
722 _list-policies_ command.
723
724         {
725                 <child-sa-config-name> = {
726                         mode = <policy mode, tunnel|transport|pass|drop>
727                         local-ts = [
728                                 <list of local traffic selectors>
729                         ]
730                         remote-ts = [
731                                 <list of remote traffic selectors>
732                         ]
733                 }
734         }
735
736 ### list-conn ###
737
738 The _list-conn_ event is issued to stream loaded connection during an active
739 _list-conns_ command.
740
741         {
742                 <IKE_SA connection name> = {
743                         local_addrs = [
744                                 <list of valid local IKE endpoint addresses>
745                         ]
746                         remote_addrs = [
747                                 <list of valid remote IKE endpoint addresses>
748                         ]
749                         version = <IKE version as string, IKEv1|IKEv2 or 0 for any>
750                         reauth_time = <IKE_SA reauthentication interval in seconds>
751                         rekey_time = <IKE_SA rekeying interval in seconds>
752
753                         local*, remote* = { # multiple local and remote auth sections
754                                 class = <authentication type>
755                                 eap-type = <EAP type to authenticate if when using EAP>
756                                 eap-vendor = <EAP vendor for type, if any>
757                                 xauth = <xauth backend name>
758                                 revocation = <revocation policy>
759                                 id = <IKE identity>
760                                 aaa_id = <AAA authentication backend identity>
761                                 eap_id = <EAP identity for authentication>
762                                 xauth_id = <XAuth username for authentication>
763                                 groups = [
764                                         <group membership required to use connection>
765                                 ]
766                                 certs = [
767                                         <certificates allowed for authentication>
768                                 ]
769                                 cacerts = [
770                                         <CA certificates allowed for authentication>
771                                 ]
772                         }
773                         children = {
774                                 <CHILD_SA config name>* = {
775                                         mode = <IPsec mode>
776                                         rekey_time = <CHILD_SA rekeying interval in seconds>
777                                         rekey_bytes = <CHILD_SA rekeying interval in bytes>
778                                         rekey_packets = <CHILD_SA rekeying interval in packets>
779                                         local-ts = [
780                                                 <list of local traffic selectors>
781                                         ]
782                                         remote-ts = [
783                                                 <list of remote traffic selectors>
784                                         ]
785                                 }
786                         }
787                 }
788         }
789
790 ### list-cert ###
791
792 The _list-cert_ event is issued to stream loaded certificates during an active
793 _list-certs_ command.
794
795         {
796                 type = <certificate type, X509|X509_AC|X509_CRL|OCSP_RESPONSE|PUBKEY>
797                 flag = <X.509 certificate flag, NONE|CA|AA|OCSP>
798                 has_privkey = <set if a private key for the certificate is available>
799                 data = <ASN1 encoded certificate data>
800                 subject = <subject string if defined and certificate type is PUBKEY>
801                 not-before = <time string if defined and certificate type is PUBKEY>
802                 not-after  = <time string if defined and certificate type is PUBKEY>
803         }
804
805 ### list-authority ###
806
807 The _list-authority_ event is issued to stream loaded certification authority
808 information during an active_list-authorities_ command.
809
810         {
811                 <certification authority name> = {
812                         cacert = <subject distinguished name of CA certificate>
813                         crl_uris = [
814                                 <CRL URI (http, ldap or file)>
815                         ]
816                         ocsp_uris = [
817                                 <OCSP URI (http)>
818                         ]
819                         cert_uri_base = <base URI for download of hash-and-URL certificates>
820                 }
821         }
822
823 ### ike-updown ###
824
825 The _ike-updown_ event is issued when an IKE_SA is established or terminated.
826
827         {
828                 up = <set if up event>
829                 <IKE_SA config name> = {
830                         <same data as in the list-sas event, but without child-sas section>
831                 }
832         }
833
834 ### ike-rekey ###
835
836 The _ike-rekey_ event is issued when an IKE_SA is rekeyed.
837
838         {
839                 <IKE_SA config name> = {
840                         old = {
841                                 <same data as in the list-sas event, but without child-sas section>
842                         }
843                         new = {
844                                 <same data as in the list-sas event, but without child-sas section>
845                         }
846                 }
847         }
848
849 ### child-updown ###
850
851 The _child-updown_ event is issued when a CHILD_SA is established or terminated.
852
853         {
854                 up = <set if up event>
855                 <IKE_SA config name> = {
856                         <same data as in the list-sas event, but with only the affected
857                          CHILD_SA in the child-sas section>
858                 }
859         }
860
861 ### child-rekey ###
862
863 The _child-rekey_ event is issued when a CHILD_SA is rekeyed.
864
865         {
866                 <IKE_SA config name> = {
867                         <same data as in the list-sas event, but with the child-sas section
868                          as follows>
869                         child-sas = {
870                                 <child-sa-name> = {
871                                         old = {
872                                                 <same data as in the list-sas event>
873                                         }
874                                         new = {
875                                                 <same data as in the list-sas event>
876                                         }
877                                 }
878                         }
879                 }
880         }
881
882 # libvici C client library #
883
884 libvici is the reference implementation of a C client library implementing
885 the vici protocol. It builds upon libstrongswan, but provides a stable API
886 to implement client applications in the C programming language. libvici uses
887 the libstrongswan thread pool to deliver event messages asynchronously.
888
889 ## Connecting to the daemon ##
890
891 This example shows how to connect to the daemon using the default URI, and
892 then perform proper cleanup:
893
894         #include <stdio.h>
895         #include <errno.h>
896         #include <string.h>
897
898         #include <libvici.h>
899
900         int main(int argc, char *argv[])
901         {
902                 vici_conn_t *conn;
903                 int ret = 0;
904
905                 vici_init();
906                 conn = vici_connect(NULL);
907                 if (conn)
908                 {
909                         /* do stuff */
910                         vici_disconnect(conn);
911                 }
912                 else
913                 {
914                         ret = errno;
915                         fprintf(stderr, "connecting failed: %s\n", strerror(errno));
916                 }
917                 vici_deinit();
918                 return ret;
919         }
920
921 ## A simple client request ##
922
923 In the following example, a simple _version_ request is issued to the daemon
924 and the result is printed:
925
926         int get_version(vici_conn_t *conn)
927         {
928                 vici_req_t *req;
929                 vici_res_t *res;
930                 int ret = 0;
931
932                 req = vici_begin("version");
933                 res = vici_submit(req, conn);
934                 if (res)
935                 {
936                         printf("%s %s (%s, %s, %s)\n",
937                                 vici_find_str(res, "", "daemon"),
938                                 vici_find_str(res, "", "version"),
939                                 vici_find_str(res, "", "sysname"),
940                                 vici_find_str(res, "", "release"),
941                                 vici_find_str(res, "", "machine"));
942                         vici_free_res(res);
943                 }
944                 else
945                 {
946                         ret = errno;
947                         fprintf(stderr, "version request failed: %s\n", strerror(errno));
948                 }
949                 return ret;
950         }
951
952 ## A request with event streaming and callback parsing ##
953
954 In this more advanced example, the _list-conns_ command is used to stream
955 loaded connections with the _list-conn_ event. The event message is parsed
956 with a simple callback to print the connection name:
957
958         int conn_cb(void *null, vici_res_t *res, char *name)
959         {
960                 printf("%s\n", name);
961                 return 0;
962         }
963
964         void list_cb(void *null, char *name, vici_res_t *res)
965         {
966                 if (vici_parse_cb(res, conn_cb, NULL, NULL, NULL) != 0)
967                 {
968                         fprintf(stderr, "parsing failed: %s\n", strerror(errno));
969                 }
970         }
971
972         int list_conns(vici_conn_t *conn)
973         {
974                 vici_req_t *req;
975                 vici_res_t *res;
976                 int ret = 0;
977
978                 if (vici_register(conn, "list-conn", list_cb, NULL) == 0)
979                 {
980                         req = vici_begin("list-conns");
981                         res = vici_submit(req, conn);
982                         if (res)
983                         {
984                                 vici_free_res(res);
985                         }
986                         else
987                         {
988                                 ret = errno;
989                                 fprintf(stderr, "request failed: %s\n", strerror(errno));
990                         }
991                         vici_register(conn, "list-conn", NULL, NULL);
992                 }
993                 else
994                 {
995                         ret = errno;
996                         fprintf(stderr, "registration failed: %s\n", strerror(errno));
997                 }
998                 return ret;
999         }
1000
1001 ## API documentation ##
1002
1003 More information about the libvici API is available in the _libvici.h_ header
1004 file or the generated Doxygen documentation.
1005
1006 # vici ruby gem #
1007
1008 The _vici ruby gem_ is a pure ruby implementation of the VICI protocol to
1009 implement client applications. It is provided in the _ruby_ subdirectory, and
1010 gets built and installed if strongSwan has been _./configure_'d with
1011 _--enable-vici_ and _--enable-ruby-gems_.
1012
1013 The _Connection_ class from the _Vici_ module provides the high level interface,
1014 the underlying classes are usually not required to build ruby applications
1015 using VICI. The _Connection_ class provides methods for the supported VICI
1016 commands and an event listening mechanism.
1017
1018 To represent the VICI message data tree, the gem converts the binary encoding
1019 to ruby data types. The _Connection_ class takes and returns ruby objects for
1020 the exchanged message data:
1021  * Sections get encoded as Hash, containing other sections as Hash, or
1022  * Key/Values, where the values are Strings as Hash values
1023  * Lists get encoded as Arrays with String values
1024 Non-String values that are not a Hash nor an Array get converted with .to_s
1025 during encoding.
1026
1027 ## Connecting to the daemon ##
1028
1029 To create a connection to the daemon, a socket can be passed to the
1030 _Connection_ constructor. If none is passed, a default Unix socket at
1031 _/var/run/charon.vici_ is used:
1032
1033         require "vici"
1034         require "socket"
1035
1036         v = Vici::Connection.new(UNIXSocket.new("/var/run/charon.vici"))
1037
1038 ## A simple client request ##
1039
1040 An example to print the daemon version information is as simple as:
1041
1042         x = v.version
1043         puts "%s %s (%s, %s, %s)" % [
1044                 x["daemon"], x["version"], x["sysname"], x["release"], x["machine"]
1045         ]
1046
1047 ## A request with closure invocation ##
1048
1049 The _Connection_ class takes care of event streaming by invoking a closure
1050 for each event. The following example lists all loaded connections using the
1051 _list-conns_ command and implicitly the _list-conn_ event:
1052
1053         v.list_conns { |conn|
1054                 conn.each { |key, value|
1055                         puts key
1056                 }
1057         }
1058
1059 ## API documentation ##
1060
1061 For more details about the ruby gem refer to the comments in the gem source
1062 code or the generated documentation.
1063
1064 # vici Python egg #
1065
1066 The _vici Python egg_ is a pure Python implementation of the VICI protocol to
1067 implement client applications. It is provided in the _python_ subdirectory, and
1068 gets built and installed if strongSwan has been _./configure_'d with
1069 _--enable-vici_ and _--enable-python-eggs_.
1070
1071 The _vici_ module provides a _Session()_ constructor for a high level interface,
1072 the underlying classes are usually not required to build Python applications
1073 using VICI. The _Session_ class provides methods for the supported VICI
1074 commands.
1075
1076 To represent the VICI message data tree, the library converts the binary
1077 encoding to Python data types. The _Session_ class takes and returns Python
1078 objects for the exchanged message data:
1079  * Sections get encoded as OrderedDict, containing other sections, or
1080  * Key/Values, where the values are strings as dictionary values
1081  * Lists get encoded as Python Lists with string values
1082 Values that do not conform to Python dict or list get converted to strings using
1083 str().
1084
1085 ## Connecting to the daemon ##
1086
1087 To create a connection to the daemon, a socket can be passed to the _Session_
1088 constructor. If none is passed, a default Unix socket at _/var/run/charon.vici_
1089 is used:
1090
1091         import vici
1092         import socket
1093
1094         s = socket.socket(socket.AF_UNIX)
1095         s.connect("/var/run/charon.vici")
1096         v = vici.Session(s)
1097
1098 ## A simple client request ##
1099
1100 An example to print the daemon version information is as simple as:
1101
1102         ver = v.version()
1103
1104         print "{daemon} {version} ({sysname}, {release}, {machine})".format(**ver)
1105
1106 ## A request with response iteration ##
1107
1108 The _Session_ class returns an iterable Python generator for streamed events to
1109 continuously stream objects to the caller. The following example lists all
1110 loaded connections using the _list-conns_ command and implicitly the _list-conn_
1111 event:
1112
1113         for conn in v.list_conns():
1114                 for key in conn:
1115                         print key
1116
1117 Please note that if the returned generator is not iterated completely, it must
1118 be closed using _close()_. This is implicitly done when breaking from a loop,
1119 but an explicit call may be required when directly iterating the generator with
1120 _next()_.
1121
1122 ## Sorting in dictionaries ##
1123
1124 In VICI, in some message trees the order of objects in dictionary matters. In
1125 contrast to ruby Hashes, Python dictionaries do not preserve order of added
1126 objects. It is therefore recommended to use OrderedDicts instead of the default
1127 dictionaries. Objects returned by the library use OrderedDicts.
1128
1129 ## API documentation ##
1130
1131 For more details about the Python egg refer to the comments in the Python source
1132 code.
1133
1134 # Vici::Session Perl CPAN module #
1135
1136 The _Vici::Session Perl CPAN module_ is a pure Perl implementation of the VICI
1137 protocol to implement client applications. It is provided in the _perl_
1138 subdirectory, and gets built and installed if strongSwan has been
1139  _./configure_'d with_--enable-vici_ and _--enable-perl-cpan_.
1140
1141 The _Vici::Session_ module provides a _new()_ constructor for a high level
1142 interface, the underlying _Vici::Packet_ and _Vici::Transport_ classes are
1143 usually not required to build Perl applications using VICI. The _Vici::Session_
1144 class provides methods for the supported VICI commands. The auxiliare
1145  _Vici::Message_ class is used to encode configuration parameters sent to
1146 the daemon and decode data returned by the daemon.
1147
1148 ## Connecting to the daemon ##
1149
1150         use IO::Socket::UNIX;
1151         use Vici::Session;
1152         use Vici::Message;
1153
1154         my $socket = IO::Socket::UNIX->new(
1155                         Type => SOCK_STREAM,
1156                         Peer => '/var/run/charon.vici',
1157         ) or die "Vici socket: $!";
1158
1159         my $session = Vici::Session->new($socket);
1160
1161 ## A simple client request ##
1162
1163 An example to print the daemon version information is as simple as:
1164
1165         my $version = $session->version()->hash();
1166
1167         foreach my $key ('daemon', 'version', 'sysname', 'release', 'machine' ) {
1168                 print $version->{$key}, " ";
1169         }
1170
1171 The _Vici::Session_ methods are explained in the perl/Vici-Session/README.pod
1172 document.