Annotation of embedaddon/strongswan/src/conftest/README, revision 1.1
1.1 ! misho 1:
! 2:
! 3: conftest - an IKEv2 conformance testing framework
! 4: =================================================
! 5:
! 6:
! 7: 1. Introduction
! 8: ---------------
! 9:
! 10: conftest is a conformance testing framework for IKEv2 and related protocols,
! 11: based on the strongSwan IKEv2 daemon charon. It uses a specialized configuration
! 12: and control front-end, but links against the mainstream strongSwan IKEv2 stack.
! 13:
! 14: The conftest framework can test other implementations of IKEv2 and related
! 15: standards. It can inject or mangle packets to test the behavior of other
! 16: implementations under certain conditions.
! 17:
! 18: 2. Test suites
! 19: --------------
! 20:
! 21: The framework can use different sets of conformance tests, called test suites.
! 22: Each test suite contains a global suite configuration file, usually named
! 23: suite.conf. It contains the global settings for all tests in this suite, mostly
! 24: credentials and connection definitions.
! 25:
! 26: A test suite consists of several test cases. Each test has its own configuration
! 27: file, often called test.conf. The test configuration file may contain test
! 28: specific credentials and connection definitions, but primarily defines actions
! 29: and hooks. Actions trigger certain protocol specific operations, such as
! 30: initiating or terminating a tunnel. Hooks are used to change the behavior of
! 31: the IKE stack, most likely to stress some factors of the IKE protocol and
! 32: provoke unintended behavior in the tested platform.
! 33:
! 34: 3. Configuration syntax
! 35: -----------------------
! 36:
! 37: Both the suite and the test specific configuration file use the same syntax.
! 38: It is the same as used by the strongswan.conf file used to configure the
! 39: strongSwan software suite.
! 40:
! 41: The syntax is as follows:
! 42:
! 43: settings := (section|keyvalue)*
! 44: section := name { settings }
! 45: keyvalue := key = value\n
! 46:
! 47: Settings contain zero or more sub-sections or key/value pairs. A section
! 48: consists of a name, followed by curly open and close brackets. The value in the
! 49: key/value pair starts after the equal sign and is terminated by the end of the
! 50: line.
! 51:
! 52: The test specific configuration is merged to the suite configuration, resulting
! 53: in a unified configuration. Sections are merged, keys in the test configuration
! 54: overwrite existing identical keys in the suite configuration.
! 55:
! 56: 4. Logging
! 57: ----------
! 58:
! 59: Logging verbosity can be controlled in the log section of a suite/test
! 60: configuration. The stdout subsection takes logging facility/verbosity key
! 61: value pairs, the different facility types are defined in debug_lower_names at
! 62: src/libstrongswan/debug.c.
! 63: Any other sub-section in the log section is considered as a file name to log
! 64: to. Each section takes the same facility/verbosity keys as the special stdout
! 65: section.
! 66:
! 67: 5. Connections
! 68: --------------
! 69:
! 70: Both the suite and test configuration may contain connection definitions under
! 71: the configs section. Each IKE_SA configuration has a sub-section. Each IKE_SA
! 72: sub-section contains one or more CHILD_SA configuration sub-sections:
! 73:
! 74: configs {
! 75: ike-a {
! 76: # ... ike options
! 77: child-a1 {
! 78: # ... child options
! 79: }
! 80: child-a2 {
! 81: # ...
! 82: }
! 83: }
! 84: }
! 85:
! 86: Configuration names can be chosen arbitrary, but should be unique within the
! 87: same file.
! 88:
! 89: The IKE_SA configuration uses the following options (as key/value pairs):
! 90:
! 91: lhost: Address (IP or Hostname) of this host
! 92: rhost: Address (IP or Hostname) of tested host
! 93: lid: IKEv2 identifier of this host
! 94: rid: IKEv2 identifier of tested host
! 95: proposal: IKE_SA proposal list, comma separated, e.g.:
! 96: aes128-sha1-modp2048,3des-md5-sha1-modp1024-modp1536
! 97: Supported algorithm names are defined under
! 98: src/libstrongswan/crypt/proposal/proposal_keywords.txt
! 99: fake_nat: Fake the NAT_DETECTION_*_IP payloads to simulate a NAT
! 100: scenario
! 101: rsa_strength: Connection requires a trustchain with RSA keys of given bits
! 102: ecdsa_strength: Connection requires a trustchain with ECDSA keys of given bits
! 103: cert_policy: Connection requires a certificate with the given OID policy
! 104: named_pool: Name of an IP pool defined e.g. in a database backend
! 105:
! 106: The following CHILD_SA specific configuration options are supported:
! 107:
! 108: lts: Local side traffic selectors, comma separated CIDR subnets
! 109: rts: Remote side traffic selectors, comma separated CIDR subnets
! 110: transport: Propose IPsec transport mode instead of tunnel mode
! 111: tfc_padding: Inject Traffic Flow Confidentiality bytes to align packets to the
! 112: given length
! 113: proposal: CHILD_SA proposal list, same syntax as IKE_SA proposal list
! 114:
! 115: 6. Credentials
! 116: --------------
! 117:
! 118: Credentials may be defined globally in the suite or locally in the test specific
! 119: configuration file. Certificates files are defined in the certs section, either
! 120: in the trusted or in the untrusted section. Trusted certificates are trust
! 121: anchors, usually root CA certificates. Untrusted certificates do not build a
! 122: trust anchor and usually contain intermediate or end entity certificates.
! 123:
! 124: Certificates files are loaded relative to the configuration file path and may
! 125: be encoded either in plain ASN.1 DER or in PEM format. The prefix of the
! 126: key/value pair is used to specify the type of the certificate, usually x509 or
! 127: crl.
! 128:
! 129: Private keys can be defined in the suite or test config file under the keys
! 130: section. The prefix of the key/value pair must be either rsa or ecdsa, the
! 131: specified file may be encoded in ASN.1 DER or unencrypted PEM.
! 132:
! 133: certs {
! 134: trusted {
! 135: x509-a-ca = ca.pem
! 136: }
! 137: untrusted {
! 138: x509-me = /path/to/cert.pem
! 139: crl-from-ca = /path/to/crl.pem
! 140: }
! 141: }
! 142: keys {
! 143: ecdsa-me = /path/to/key.pem
! 144: }
! 145:
! 146: 7. Actions
! 147: ----------
! 148:
! 149: The actions section in the test specific configuration file defines
! 150: the IKEv2 protocol actions to trigger. Currently, the following actions
! 151: are supported and take these arguments (as key/value pairs):
! 152:
! 153: initiate: Initiate an IKE- and CHILD_SA
! 154: config: name of the CHILD_SA configuration to initiate
! 155: delay: Delay to trigger action after startup
! 156: rekey_ike: Rekey an IKE_SA
! 157: config: name of originating IKE_SA configuration
! 158: delay: Delay to trigger action after startup
! 159: rekey_child: Rekey an CHILD_SA
! 160: config: name of originating CHILD_SA configuration
! 161: delay: Delay to trigger action after startup
! 162: liveness: Do a liveness check (DPD) on the IKE_SA
! 163: config: name of originating IKE_SA configuration
! 164: delay: Delay to trigger action after startup
! 165: close_ike: Close an IKE_SA
! 166: config: name of originating IKE_SA configuration
! 167: delay: Delay to trigger action after startup
! 168: close_child: Close a CHILD_SA
! 169: config: name of originating IKE_SA configuration
! 170: delay: Delay to trigger action after startup
! 171:
! 172: To trigger the same action multiple times, the action sections must be named
! 173: uniquely. Append an arbitrary string to the action name. The following example
! 174: initiates a connection and rekeys it twice:
! 175:
! 176: actions {
! 177: initiate {
! 178: config = child-a1
! 179: }
! 180: rekey_ike-1 {
! 181: config = ike-a
! 182: delay = 3
! 183: }
! 184: rekey_ike-2 {
! 185: config = ike-a
! 186: delay = 6
! 187: }
! 188: }
! 189:
! 190: 8. Hooks
! 191: --------
! 192:
! 193: The hooks section section in the test configuration defines different hooks
! 194: to use to mangle packets or trigger other protocol modifications. These
! 195: hook functions are implemented in the hooks folder of conftest.
! 196:
! 197: Currently, the following hooks are defined with the following options:
! 198:
! 199: add_notify: Add a notify to a message
! 200: request: yes to include in request, no in response
! 201: id: IKEv2 message identifier of message to add notify
! 202: type: notify type to add, names defined in notify_type_names
! 203: under src/libcharon/encoding/payloads/notify_payload.c
! 204: data: notification data to add, prepend 0x to interpret the
! 205: string as hex string
! 206: spi: SPI to use in notify
! 207: esp: yes to send an ESP protocol notify, no for IKE
! 208: add_payload: Add an arbitrary payload to a message
! 209: request: yes to include in request, no in response
! 210: id: IKEv2 message identifier of message to add payload
! 211: type: type of the payload to add, names defined in
! 212: payload_type_short_names in payload.c
! 213: data: data to append after generic payload header, use 0x
! 214: prefix for hex encoded data
! 215: critical: yes to set payload critical bit
! 216: replace: yes to replace an existing payload of the same type
! 217: custom_proposal: set a custom proposal value in the SA payload
! 218: request: yes to include in request, no in response
! 219: id: IKEv2 message identifier of message to add notify
! 220: The hook takes subsections with numerical names, each
! 221: defining a proposal substructure. The substructure
! 222: takes key/value pairs, where key defines the type, value
! 223: the specific algorithm.
! 224: force_cookie: Reject IKE_SA_INIT requests with a COOKIE
! 225: ignore_message: Ignore a specific message, simulating packet loss
! 226: inbound: yes to ignore incoming, no for outgoing messages
! 227: request: yes to ignore requests, no for responses
! 228: id: IKEv2 message identifier of message to ignore
! 229: ike_auth_fill: Fill up IKE_AUTH message to a given size using a CERT
! 230: payload.
! 231: request: yes to fill requests messages, no for responses
! 232: id: IKEv2 message identifier of message to fill up
! 233: bytes: number of bytes the final IKE_AUTH message should have
! 234: log_id: Comfortably log received ID payload contents
! 235: log_ke: Comfortably log received KE payload DH groups
! 236: log_proposal: Comfortably log all proposals received in SA payloads
! 237: log_ts: Comfortably log all received TS payloads
! 238: pretend_auth: magically reconstruct IKE_AUTH response even if
! 239: AUTHENTICATION_FAILED received
! 240: rebuild_auth: rebuild AUTH payload, i.e. if ID payload changed
! 241: reset_seq: Reset sequence numbers of an ESP SA
! 242: delay: Seconds to delay reset after SA established
! 243: oseq: Sequence number to set, default is 0
! 244: set_critical: Set critical bit on existing payloads:
! 245: request: yes to set in request, no in response
! 246: id: IKEv2 message identifier of message to mangle payloads
! 247: payloads: space separated payload list to set critical bit on
! 248: set_ike_initiator: toggle IKE initiator flag in IKE header
! 249: request: yes to set in request, no in response
! 250: id: IKEv2 message identifier of message to mangle
! 251: set_ike_request: toggle IKE request flag in IKE header
! 252: request: yes to set in request, no in response
! 253: id: IKEv2 message identifier of message to mangle
! 254: set_ike_spi: set the IKE SPIs in IKE header
! 255: request: yes to set in request, no in response
! 256: id: IKEv2 message identifier of message to mangle
! 257: spii: initiator SPI to set (as decimal integer)
! 258: spir: responder SPI to set
! 259: set_ike_version: set version fields in IKE header
! 260: request: yes to set in request, no in response
! 261: id: IKEv2 message identifier of message to mangle
! 262: major: major version to set
! 263: minor: minor version to set
! 264: higher: yes to set Higher Version Supported flag
! 265: set_length: set the length in a payload header
! 266: request: yes to set in request, no in response
! 267: id: IKEv2 message identifier of message to mangle
! 268: type: payload type to mangle
! 269: diff: difference to add/remove from real length (+1,-3 etc.)
! 270: set_proposal_number:Change the number of a proposal in a SA payload
! 271: request: yes to set in request, no in response
! 272: id: IKEv2 message identifier of message to mangle
! 273: from: proposal number to mangle
! 274: to: new proposal number to set instead of from
! 275: set_reserved: set arbitrary reserved bits/bytes in payloads
! 276: request: yes to set in request, no in response
! 277: id: IKEv2 message identifier of message to mangle
! 278: The hook takes a list of subsection, each named as payload
! 279: type. Each section takes a bits and a bytes key, the
! 280: value is a comma separated list of decimal numbers of
! 281: bits/bytes to mangle (1 is the first reserved bit/byte
! 282: in the payload). The byteval key defines to which value
! 283: set mangled bytes in the byte list.
! 284: unencrypted_notify: Send an unencrypted message with a notify after
! 285: establishing an IKE_SA
! 286: id: IKEv2 message identifier of message to send
! 287: type: notify type to add, names defined in notify_type_names
! 288: under src/libcharon/encoding/payloads/notify_payload.c
! 289: data: notification data to add, prepend 0x to interpret the
! 290: string as hex string
! 291: spi: SPI to use in notify
! 292: esp: yes to send an ESP protocol notify, no for IKE
! 293: unsort_message: reorder the payloads in a message
! 294: request: yes to reorder requests messages, no for responses
! 295: id: IKEv2 message identifier of message to reorder
! 296: order: payload order, space separated payload names as defined
! 297: in payload_type_short_names under
! 298: src/libcharon/encoding/payloads/payload.c
! 299:
! 300: 9. Invoking
! 301: -----------
! 302:
! 303: Compile time options required depend on the test suite. A minimalistic
! 304: strongSwan build with the OpenSSL crypto backend can be configured with:
! 305:
! 306: ./configure --sysconfdir=/etc --disable-pluto --disable-scripts \
! 307: --disable-scepclient --disable-aes --disable-des --disable-md5 \
! 308: --disable-sha1 --disable-sha2 --disable-fips-prf --disable-gmp \
! 309: --disable-pubkey --disable-pgp --disable-dnskey --disable-updown \
! 310: --disable-attr --disable-resolve --enable-openssl --enable-conftest \
! 311: --enable-gcm --enable-ccm --enable-ctr
! 312:
! 313: The conftest utility is installed by default under /usr/local/libexec/ipsec/,
! 314: but can be invoked with the ipsec helper script. It takes a suite specific
! 315: configuration file after the --suite option and a test specific file with
! 316: the --test option:
! 317:
! 318: ipsec conftest --suite suite.conf --test 1.1.1/test.conf
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>