<?xml version='1.0'?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbookid/id/g/4.5/docbookx.dtd">

<refentry id="module.auth"
          xmlns:serdoc="http://sip-router.org/xml/serdoc">
  <refmeta>
    <refentrytitle>auth</refentrytitle>
    <manvolnum>7</manvolnum>
  </refmeta>
  <refnamediv>
    <refname>auth</refname>
    <refpurpose>Basic Functionality for Digest Authentication</refpurpose>
  </refnamediv>

  <refsect1>
    <title>Description</title>
    <para>
      The <command>auth</command> SER module provides basic functionality
      for digest authentication. However, it does not provide access to
      the user information and therefore relies on another module. These
      modules are <serdoc:module>auth_db</serdoc:module>,
      <serdoc:module>auth_diameter</serdoc:module>,
      <serdoc:module>auth_identity</serdoc:module>, and
      <serdoc:module>auth_radius</serdoc:module>.
    </para>
  </refsect1>

  <refsect1>
    <title>Functions</title>

    <refsect2 xml:id="function.consume_credentials">
      <title>
        <function>consume_credentials</function> ()
      </title>
      <para>
        Allowed in request processing only.
      </para>
      <para>
        The <function>consume_credentials()</function> function
        removes previously authorized credentials from the request.
        This means that forwarded or relayed requests
        will not contain credentials that were checked by this server
        and ensures that the proxy will not reveal information about
        credentials used to downstream elements. In addition, the
        message will be shorter.
      </para>
      <para>
        The function must be called after a call to an authorization
        function such as
        <serdoc:func>www_authenticate</serdoc:func>.
      </para>
    </refsect2>

  </refsect1>

  <refsect1>
    <title>Module Parameters</title>

    <refsect2 xml:id="module.auth.auth_checks_in_dlg">
      <title><parameter>auth_checks_in_dlg</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>integer</serdoc:paramtype>
        <serdoc:paramdefault>0</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>auth_checks_in_dlg</parameter> parameter controls
        which integrity checks are performed on requests within a dialog,
        ie., requests that carry a To tag. The default value of
        <literal>0</literal> turns off any checks. Otherwise, the value
        indicates which checks are run.
      </para>
      <para>
        See <serdoc:link linkend="module.auth.integrity_checks">Additional
        Integrity Checks</serdoc:link> below for more details.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.auth_checks_no_dlg">
      <title><parameter>auth_checks_no_dlg</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>integer</serdoc:paramtype>
        <serdoc:paramdefault>0</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>auth_checks_no_dlg</parameter> parameter controls
        which integrity checks are performed on out-of-dialog requests,
        ie., requests that do not carry a To tag. The default value of
        <literal>0</literal> turns off any checks. Otherwise, the value
        indicates which checks are run.
      </para>
      <para>
        See <serdoc:link linkend="module.auth.integrity_checks">Additional
          Integrity Checks</serdoc:link> below for more details.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.auth_checks_register">
      <title><parameter>auth_checks_register</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>integer</serdoc:paramtype>
        <serdoc:paramdefault>0</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>auth_checks_register</parameter> parameter
        controls which integrity checks are performed on a REGISTER
        message. If the parameter is changed from its default value
        of <literal>0</literal>, it activates those checks and defines,
        which checks are run.
      </para>
      <para>
        See <serdoc:link linkend="module.auth.integrity_checks">Additional
          Integrity Checks</serdoc:link> below for more details.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.challenge_attr">
      <title><parameter>challenge_attr</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>attriubte name</serdoc:paramtype>
        <serdoc:paramdefault>$digest_challenge</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>challenge_attr</parameter> parameter names the
        attribute which will contain the complete header field with the
        authentication challenge. The content if this attribute has to
        be added to the response in order to transmit the challenge
        to the client.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.nc_array_order">
      <title><parameter>nc_array_order</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>integer</serdoc:paramtype>
        <serdoc:paramdefault>20</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>nc_array_order</parameter> parameter is an
        alternative way to set the maximum number of nonces for the nonce
        check enabled by the
        <serdoc:modparam module="auth">nonce_count</serdoc:modparam>
        parameter. Its meaning is identical to that of the
        <serdoc:modparam module="auth">nc_array_size</serdoc:modparam>
        parameter but the size is given by stating the power of 2.
        See <serdoc:modparam module="auth">nc_array_size</serdoc:modparam>
        and <serdoc:modparam module="auth">nonce_count</serdoc:modparam>
        for more details.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.nc_array_size">
      <title><parameter>nc_array_size</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>integer</serdoc:paramtype>
        <serdoc:paramdefault>1048576</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>nc_array_size</parameter> parameter sets the
        maximum number of in-flight nonces for the nonce
        count check enabled by the
        <serdoc:modparam module="auth">nonce_count</serdoc:modparam>
        parameter. It represents the maximum number of nonces for which
        state will be kept. When this number is exceeded, state for older
        nonces will be discarded to make space for new ones. See
        <serdoc:modparam module="auth">nonce_count</serdoc:modparam> for
        more details.
      </para>
      <para>
        The value should be a power of 2. If it is not, it will be rounded
        down to such a number. For example a value of 1000000 will be
        rounded down to 524288. The
        <serdoc:modparam module="auth">nc_array_order</serdoc:modparam>
        parameter can be used to directly specify the power of 2. For
        instance, a value for 
        <serdoc:modparam module="auth">nc_array_order</serdoc:modparam>
        of 20 is equivalent to a <parameter>nc_array_size</parameter>
        of 1048576.
      </para>
      <para>
        The memory used to keep the nonce state will be
        equal to the value of <parameter>nc_array_size</parameter> in
        bytes.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.nid_pool_no">
      <title><parameter>nid_pool_no</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>integer</serdoc:paramtype>
        <serdoc:paramdefault>1</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>nid_pool_no</parameter> parameter controls the number
        of partitions for the
        <serdoc:modparam module="auth">nonce_count</serdoc:modparam> and
        <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam>
        arrays. It is common to both of them to reduce the nonce size.
      </para>
      <para>
        Instead of using single arrays for keeping nonce state, these arrays
        can be divided into several partitions. Each SER process is assigned
        to one of these partitions, allowing for higher concurrency on
        multi-CPU machines. Besides increasing performance, increasing
        <parameter>nid_pool_no</parameter> has also a negative effect: it
        could decrease the maximum supported in-flight nonces in certain
        conditions.  In the worst case, when only one SER process receives
        most of the traffic (e.g. very busy TCP connection between two
        proxies), the in-flight nonces could be limited to the array size
        (<serdoc:modparam module="auth">nc_array_size</serdoc:modparam>
        for <serdoc:modparam module="auth">nonce_count</serdoc:modparam>
        and <serdoc:modparam module="auth">otn_in_flight_no</serdoc:modparam>
        for <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam>)
        divided by the partitions number
        (<parameter>nid_pool_no</parameter>). However for normal traffic,
        where
        the process receiving a message is either random or chosen in a
        round-robin fashion, the maximum number of in-flight nonces will be
        influenced to a very small degree by
        <parameter>nid_pool_no</parameter>, since the messages
        will be close to equally distributed to processes using different
        partitions.
      </para>
      <para>
        The <parameter>nid_pool_no</parameter> value should be one of:
        1, 2, 4, 8, 16, 32 or 64 (the maximum value is 64 and all values
        should be a power of 2 or else they will be rounded down to such
        a value).
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.nonce_auth_max_drift">
      <title><parameter>nonce_auth_max_drift</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>integer</serdoc:paramtype>
        <serdoc:paramdefault>3</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>nonce_auth_max_drift</parameter> parameter
        specifies the maximum difference in seconds between a nonce
        creation time and the current time, if the nonce creation time
        appears to be in the future.
      </para>
      <para>
        In some cases, like shortly after a system time backward
        adjustment or when the current proxy is part of a cluster which is
        not time-synchronized, it's possible to receive a nonce with
        a creation time in the future. In this case if the difference is
        greater then the value of <parameter>nonce_auth_max_drift</parameter>
        in seconds, the nonce is  considered stale and the request
        re-challenged. If this were not done, a dramatic time change
        backwards may lead to nonces having been generated before the
        cange being valid for too long.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.nonce_count">
      <title><parameter>nonce_count</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>boolean</serdoc:paramtype>
        <serdoc:paramdefault>no</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>nonce_count</parameter> parameter controls, whether
        tracking of nounce count is enabled. If it is set to
        <literal>yes</literal>, the received <parameter>nc</parameter> value
        is remembered and checked against the value used in the previous
        digest response. For a successful authentication the received
        <parameter>nc</parameter> must be greater then the previously
        received one (See RFC 2617 for more details). This will	provide
        protection against replay attacks while still allowing credentials
        caching at the UA side.
      </para>
      <para>
        In order for this to work, the
        <serdoc:modparam module="auth">qop</serdoc:modparam> parameter
        must not be set to an empty string. It it is, the challenges won’t
        include the <parameter>qop</parameter> parameter and the user agent
        will probably not include the <parameter>qop</parameter> or
        <parameter>nc</parameter> parameters in its response.
      </para>
      <para>
        If a response doesn’t include <parameter>qop</parameter> or
        <parameter>nc</parameter> (for example obsolete UAs that don't
        support them) the response will be checked according to the other
        enabled nonce checks, in this order:
        <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam> and
        the applicable of the additional integrity checks. If a response
        includes <parameter>nc</parameter> only the normal
        <serdoc:modparam module="auth">nonce_expire</serdoc:modparam>
        checks and the
        <serdoc:modparam module="auth">nonce_count</serdoc:modparam> checks
        will be performed, all the other checks will be ignored.
      </para>
      <para>
        The <parameter>nonce_count</parameter> checks work by tracking a
        limited number of nonces. The maximum number of tracked nonces is
        set using the
        <serdoc:modparam module="auth">nc_array_size</serdoc:modparam> or
        <serdoc:modparam module="auth">nc_array_order</serdoc:modparam>
        parameters. If this number is exceeded, older entries will be
        overwritten. As long as the maximum rate of challengeable messages
        per average response time is lower then
        <serdoc:modparam module="auth">nc_array_size</serdoc:modparam>,
        the nonce count check should work flawlessly. For optimal
        performance (maximum reuse of cache credentials)
        <serdoc:modparam module="auth">nc_array_size</serdoc:modparam>
        divided by
        <serdoc:modparam module="auth">nid_pool_no</serdoc:modparam>
        should be lower then the message rate multiplied by the desired
        <serdoc:modparam module="auth">nonce_expire</serdoc:modparam>.
        <!-- XXX: Give an example with default nonce_expire and typical
                  RTT. -->
      </para>
      <para>
        The maximum accepted <parameter>nc</parameter> value is 255. If
        <parameter>nc</parameter> becomes greater then this, the nonce will
        be considered stale and the UA will be re-challenged.
      </para>
      <para>
        <emphasis>Note:</emphasis> If the <parameter>nonce_count</parameter>
        parameter is enabled, all challenges should be done in stateful
        mode, ie., a transaction should be created prior to the
        authentication check, for instance by using the function
        <serdoc:func>t_newtran</serdoc:func>, to absorb possible
        retransmissions. All the replies need to be sent statefuly,
        using <serdoc:func>t_reply()</serdoc:func>). Otherwise,
        all retransmissions will be challenged which may cause the user
        agent to believe the password supplied by the user to be wrong.
      </para>
      <para>
        For more information on stateful processing, see
        <serdoc:module>tm</serdoc:module>. An example on how to implement
        a stateful registrar can be found in
        <serdoc:module>registrar</serdoc:module>.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.nonce_expire">
      <title><parameter>nonce_expire</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>integer</serdoc:paramtype>
        <serdoc:paramdefault>300</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>nonce_exipre</parameter> parameter determines the
        time in seconds before a nonce is considered stale.
      </para>
      <para>
        Nonces have a limited lifetime after which they 
        will be considered stale.
        This is to protect replay attacks. Credentials containing a stale
        nonce will be not authorized. The user agent will be challenged
        again instead. This new challenge will not only contain a newly
        generated nonce, but also the <parameter>stale</parameter>
        parameter which indicates to the client the failure was not due
        to a wrong username or password and it doesn't need to disturb
        the user asking for them. It can simply recalculate its answer 
	using existing username and password.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.one_time_nonce">
      <title><parameter>one_time_nonce</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>boolean</serdoc:paramtype>
        <serdoc:paramdefault>no</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>one_time_nonce</parameter> controls whether digist
        responses with a reused nonce will be rejected. If it is set to
        <literal>yes</literal>, nonces cannot be reused by user agents.
      </para>
      <para>
        This results in each request being challenged. To avoid retransmits
        being challenged, it should only be used in stateful mode, ie., by
        creating a transaction before authentication, for instance trough
        a call to the <serdoc:func>t_newtran</serdoc:func> function. For
        more information on stateful mode see
        <serdoc:module>tm</serdoc:module>. An example on how to implement
        a stateful registrar can be found in
        <serdoc:module>registrar</serdoc:module>.
      </para>
      <para>
        The one time nonce provides enhanced replay protections at the cost
        of invalidating UA side credentials
        caching and causing extra round trips. Therefore, the nonce chount
        check enabled through the
        <serdoc:modparam module="auth">nonce_count</serdoc:modparam>
        parameter should be preferred.
      </para>
      <para>
        The one time nonce provides the same protection as the nonce count
        check but requiring more messages. The advantages are that it uses
        less memory for the same supported number of maximum in-flight
        nonces (by a factor of 8) and that it works
        with user agents that do not support <parameter>qop</parameter>
        and <parameter>nc</parameter>. It shoud thus be used if such
        user agents are in use and the checks described in section
        <serdoc:link linkend="module.auth.integrity_checks">Additional
          Integrity Checks</serdoc:link> are not deemed sufficient.
      </para>
      <para>
        Like the nonce count check, one time nonces works by tracking a
        limited number of nonces. The maximum number of tracked nonces is
        set using the
        <serdoc:modparam module="auth">otn_in_flight_no</serdoc:modparam>
        or
        <serdoc:modparam module="auth">otn_in_flight_order</serdoc:modparam>
        parameters. If this number is exceeded, older entries will be
        overwritten. As long as the maximum rate of challengeable messages
        per average response time is lower then
        <serdoc:modparam module="auth">otn_in_flight_no</serdoc:modparam>,
        the one time nonce check should work flawlessly.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.otn_in_flight_no">
      <title><parameter>otn_in_flight_no</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>integer</serdoc:paramtype>
        <serdoc:paramdefault>1048576</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>otn_in_flight_no</parameter> parameter specifies
        the maximum number of in-flight nonces for the one time nonce
        check enabled by the
        <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam>
        parameter. It represents the maximum number of nonces remembered
        for the one time nonce check. When this number is exceeded,
        information about older nonces will be discarded and overwritten
        with information about newly generated nonces. See
        <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam>
        for more details.
      </para>
      <para>
        The value should be a power of 2. If it is not, it will be rounded
        down to such a value. The
        <serdoc:modparam module="auth">otn_in_flight_order</serdoc:modparam>
        parameter can be used to directly specify the power of 2.
      </para>
      <para>
        The memory used to keep the nonce information will be identical to
        the value of <parameter>otn_in_flight_no</parameter> divided by 8
        since only 1 bit of state is kept per nonce.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.otn_in_flight_order">
      <title><parameter>otn_in_flight_order</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>integer</serdoc:paramtype>
        <serdoc:paramdefault>20</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>otn_in_flight_order</parameter> parameter is an
        alternative way to set the maximum number of nonces for the
        one time nonce check enabled by the
        <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam>
        parameter. Its meaning is identical to that of the
        <serdoc:modparam module="auth">otn_in_flight_no</serdoc:modparam>
        parameter but the size is given by stating the power of 2.
        See <serdoc:modparam module="auth">otn_in_flight_no</serdoc:modparam>
        and <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam>
        for more details.
      </para>
    </refsect2>


    <refsect2 xml:id="module.auth.protect_contacts">
      <title><parameter>protect_contacts</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>boolean</serdoc:paramtype>
        <serdoc:paramdefault>no</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        If the <parameter>protect_contacts</parameter> parameter is set
        to <literal>yes</literal>, the contacts are included when creating
        a nonce.
      </para>
      <!-- XXX What does this exactly mean? -->
    </refsect2>


    <refsect2 xml:id="module.auth.proxy_challenge_header">
      <title><parameter>proxy_challenge_header</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>string</serdoc:paramtype>
        <serdoc:paramdefault>"Proxy-Authenticate"</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>proxy_challenge_header</parameter> parameter
        contains the name of the header field that should be used to
        include the proxy-to-user challenge.
      </para>
    </refsect2> 

    <refsect2 xml:id="module.auth.qop">
      <title><parameter>qop</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>string</serdoc:paramtype>
        <serdoc:paramdefault>"auth"</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>qop</parameter> parameter determines, which value
        for the <parameter>qop</parameter> parameter should be included
        in a challenge. The parameter was optional in the SIP revision
        described by RFC 2543. The current version from RFC 3261 states,
        however, that the parameter must be included in all challenges.
      </para>
      <para>
        In digest authentication, the <parameter>qop</parameter>
        parameter, short for ‘quality of protection’, indicates which
        parts of a request should be used for the calculation of the
        digest response. If the value is <literal>auth</literal>,
        only authentication should be done and the response is solely
        calculated using information from the challenge plus the user’s
        password. A value of <literal>auth-int</literal> indicates that
        in addition the integrity of the request body is to be verified.
        For this purpose, a hash over the body is additionally included
        in the calculation.
      </para>
      <para>
        In a challenge the parameter indicates, which of these methods
        the server supports. This can either be one of them or both,
        separated by a comma. For challenges generated by SER, this
        is given by the <parameter>qop</parameter> module. It may also
        be an empty string, in which case no <parameter>qop</parameter>
        parameter will be present in challenges created by SER. This may
        be necessary for compatibility with some old clients but will
        make your SER not comply with RFC 3261.
      </para>
      <para>
        Protection against nonce replay attacks can be achieved by
        additionally enabling the
        <serdoc:modparam module="auth">nonce_count</serdoc:modparam>
        parameter. See there for more information.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.secret">
      <title><parameter>secret</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>string</serdoc:paramtype>
        <serdoc:paramdefault>random value</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>secret</parameter> parameter
        sets the secret used for the calculation of the nonce and for
        message integrity checks. If not set, a random secret will be
        chosen upon start.
      </para>
    </refsect2>

    <refsect2 xml:id="module.auth.www_challenge_header">
      <title><parameter>www_challenge_header</parameter></title>
      <serdoc:paraminfo>
        <serdoc:paramtype>string</serdoc:paramtype>
        <serdoc:paramdefault>"WWW-Authenticate</serdoc:paramdefault>
      </serdoc:paraminfo>
      <para>
        The <parameter>www_challenge_header</parameter> parameter
        contains the name of the header field that should be used to
        transmit a user-to-user challenge for authentication.
      </para>
    </refsect2>

  </refsect1>

  <refsect1 id="module.auth.integrity_checks">
    <title>Additional Integrity Checks</title>
    <para>
      The auth module can perform additional integrity checks on the
      authentication response inclued in a request by the client.
    </para>
    <para>
      Without the extra checks, the nonce value will be used only to
      store the expire time (see <parameter>nonce_expire</parameter>),
      plus an MD5 hash over it and some secret to prevent tampering
      with the expire time. With this arrangement, some replay attacks
      are still possible in the expire "window".
    </para>
    <para>
      A
      possible workaround is to always force qop authentification and
      always check the URI from the authorization header, but this does not
      work if an upstream proxy rewrites the URI and it will also not work
      with a lot of UA implementations.
    </para>
    <para>
      When the extra checks are enabled, the nonce will include and extra
      MD5 hash over some selected parts of the message and another secret.
      This will be used to check if these parts of the message are the same
      when a UA retries the request with the authentication response, thus 
      protecting from replay attacks or at least severly limiting their
      possibility.
    </para>
    <para>
      Three module parameters control which parts of the message will be
      included for different types of requests. The parameter
      <parameter>auth_checks_register</parameter> sets them for REGISTER
      requests. The parameter <parameter>auth_checks_no_dlg</parameter> 
      does the same for requests that to not have a
      <parameter>tag</parameter> parameter in the To header field or have
      no To header field altogether (in other words requests sent outside
      of an existing dialog). And, finally, the parameter
      <parameter>auth_checks_in_dlg</parameter> controls the checks for
      SIP requests sent within dialogs, such as BYEs or re-INVITEs.
    </para>
    <para>
      The default value for all three parameters is 0, in which case no
      extra checks are performed and the module behaves as it did before
      their introduction. Otherwise the parameter is a bit field. The
      message parts to be included in the check can be determined by adding
      any of the following values together:
    </para>
    <variablelist>
      <varlistentry>
        <term><literal>1</literal></term>
        <listitem>
          <para>
            check the full Request-URI,
          </para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term><literal>2</literal></term>
        <listitem>
          <para>
            check the Call-ID,
          </para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term><literal>4</literal></term>
        <listitem>
          <para>
            check the <parameter>tag</parameter> parameter of the From
            header field,
          </para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term><literal>9</literal></term>
        <listitem>
          <para>
            check the source IP address the request was received from.
          </para>
        </listitem>
      </varlistentry>
    </variablelist>
    <para> 
      For example, setting <parameter>auth_checks_register</parameter> to
      <literal>6</literal> would check if the Call-ID or the From tag
      have changed from the REGISTER message for which the nonce was
      generated. This allows nonce reuse only within the same UA and
      for the expire time.  Note that enabling the extra checks will
      limit nonce caching by UAs, requiring extra challenges and
      round trips, but will provide much better protection.
    </para>
    <para>
      When the <parameter>secret</parameter> parameter is set and the
      extra checks are enabled, the first half of the secret will be used
      for the expire time hash and the other half for the hash on the
      extra checks, so make sure you have a long secret. At least 32 
      characterss are recommended.
    </para>
  </refsect1> 

  <refsect1>
    <title>See Also</title>
    <simplelist type="inline">
      <member><serdoc:sbin>ser</serdoc:sbin></member>
      <member><serdoc:file>ser.cfg</serdoc:file></member>
      <member><serdoc:module>auth_db</serdoc:module></member>
      <member><serdoc:module>auth_diameter</serdoc:module></member>
      <member><serdoc:module>auth_identity</serdoc:module></member>
      <member><serdoc:module>auth_radius</serdoc:module></member>
    </simplelist>
  </refsect1>

</refentry>

<!-- vim:sw=2 sta et sts=2 ai tw=76
  -->
