Annotation of embedaddon/strongswan/src/conftest/README, revision 1.1.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>