.. _Signed Interest:

Signed Interest
===============

**Signed Interest** is a mechanism to issue an authenticated Interest.

A signed Interest is an Interest where:

* Name ends with ``ParametersSha256DigestComponent``.
* ``InterestSignature`` is present.

See :ref:`Interest Signature section <InterestSignature>` for details on ``InterestSignature``.

Construction of Signed Interest
-------------------------------

The following procedure describes the signing of an Interest:

1. Remove all ``ParametersSha256DigestComponent`` components from ``Name`` if present, regardless of the location.

2. If ``ApplicationParameters`` element is absent, append a zero-length ``ApplicationParameters`` element to the Interest.

3. Prepare an ``InterestSignatureInfo`` element and append it at the end of the Interest.

4. Compute the cryptographic signature according to :ref:`Interest Signature section <InterestSignature>`.

5. Insert the computed signature as an ``InterestSignatureValue`` element at the end of the Interest.

6. Compute the ``ParametersSha256DigestComponent`` according to :ref:`Interest Parameters Digest Component <Interest Parameters Digest Component>` section and append it at the end of ``Name``.

Signed Interest processing
--------------------------

Upon receiving an Interest, the producer, according to the Interest name prefix, should be able to tell whether the Interest is required to be signed.
If the received Interest is required to be signed, the application protocol or the producer should also explicitly define whether ``SignatureNonce``/``SignatureTime``/``SignatureSeqNum`` must be present in the ``InterestSignatureInfo`` or not.
If any of the required elements is missing, treat the Interest as invalid.
Additionally, a signed Interest must be treated as invalid if any of the following conditions is true:

1. The last name component is not ``ParametersSha256DigestComponent``, or its TLV-VALUE is incorrect according to :ref:`Interest Parameters Digest Component <Interest Parameters Digest Component>` section.

2. The ``InterestSignatureInfo`` element is missing or any mandatory sub-element is missing from the ``InterestSignatureInfo`` element.

3. The ``InterestSignatureValue`` element is missing.

4. The signature cannot be cryptographically verified.

5. The key used to create the signature is not trusted for signing the Interest.

6. If ``SignatureTime`` (`t`) is present in the ``InterestSignatureInfo``:

   Lookup the last recorded ``SignatureTime`` (`t0`) used in conjunction with the same key. Use ``CurrentTime - GracePeriod`` if no previous record exists. The recommended grace period is 60 seconds.
   If `t0` >= `t`, consider the Interest as invalid.
   Update `t0` to `t` if the signed Interest has been validated according to this and all other rules.

   .. note::
      Sharing private keys is not recommended. If private key sharing is inevitable, it is the key owner's responsibility to keep clocks synchronized.

7. If ``SignatureNonce`` is present:

   To perform this check, the recipient must remember a list of ``SignatureNonce`` carried in previously received Signed Interests used in conjunction with the specific signing key.
   Check whether the ``SignatureNonce`` carried in the current signed Interest is a repetition of a recorded ``SignatureNonce`` used with the same key.
   If it is a repetition, treat the Interest as invalid.
   Add the newly received ``SignatureNonce`` into the ``SignatureNonce`` list if the signed Interest has been validated according to this and all other rules.

   .. note::
      The size of the ``SignatureNonce`` list and the lifetime of each ``SignatureNonce`` remembered by the receiver depend on the application protocol's need.

8. If ``SignatureSeqNum`` (`s`) is present:

   Lookup the last recorded ``SignatureSeqNum`` (`s0`) used in conjunction with the same key. If `s0` >= `s`, consider the Interest as invalid.
   If no previous record exists, check `s` against the application policy.
   If `s` does not satisfy the application policy, treat the signed Interest as invalid.
   Update `s0` to `s` if the signed Interest has been validated according to this and all other rules.

   .. note::
      The first ``SignatureSeqNum`` received is considered valid only if it satisfies the application's policy. For example, application can decide the first ``SeqNum`` can only be a minimum value like 0 or 1, or a value that both sender and receiver agree on.
