<?xml version="1.0"?>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY rfc1321 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1321.xml'>
<!ENTITY rfc2104 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2104.xml'>
<!ENTITY rfc2119 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml'>
<!ENTITY rfc3174 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3174.xml'>
<!ENTITY rfc3864 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3864.xml'>
<!ENTITY rfc4648 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml'>
<!ENTITY rfc4880 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4880.xml'>
<!ENTITY rfc5226 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5226.xml'>
<!ENTITY rfc5234 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5234.xml'>
<!ENTITY rfc5536 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5536.xml'>
<!ENTITY rfc5537 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5537.xml'>
<!ENTITY rfc6151 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6151.xml'>
<!ENTITY rfc6234 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6234.xml'>
<!--
<!ENTITY rfc7405 PUBLIC ''
   'http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7405.xml'>
-->
]>
<?rfc toc="yes" ?>
<?rfc symrefs="yes" ?>
<?rfc sortrefs="yes"?>
<?rfc strict="yes" ?>
<?rfc rfcedstyle="yes" ?>
<!-- For review comments -->
<?rfc comments="yes" ?>
<?rfc inline="yes" ?>

<rfc category="std" ipr="trust200902" updates="5537"
   docName="draft-baeuerle-netnews-cancel-lock-06">


<!-- Header -->
<front>

<title abbrev="Cancel-Locks">Cancel-Locks in Netnews articles</title>

<!-- Author of original draft
<author initials="S." surname="Lyall" fullname="Simon Lyall">
   <organization/>
   <address>
      <postal>
         <street>PO Box 6616</street>
         <code/> <city/>
         <region>Auckland</region>
         <country>New Zealand</country>
      </postal>
      <phone>+64 9 358 5067 ext 701</phone>
      <facsimile/>
      <email>simon@darkmere.gen.nz</email>
      <uri/>
   </address>
</author>
-->

<author initials="M." surname="B&#228;uerle" fullname="Michael B&#228;uerle">
   <organization>STZ Elektronik</organization>
   <address>
      <postal>
         <street>Hofener Weg 33C</street>
         <code>71686</code> <city>Remseck</city>
         <region>Baden-W&#252;rttemberg</region>
         <country>Germany</country>
      </postal>
      <phone/>
      <facsimile>+49 7146 999061</facsimile>
      <email>michael.baeuerle@stz-e.de</email>
      <uri/>
   </address>
</author>

<date month="September" year="2017"/>

<area>Applications and Real-Time</area>
<workgroup>Independent Submission</workgroup>

<keyword>Usenet</keyword>
<keyword>Netnews</keyword>
<keyword>Cancel-Lock</keyword>

<abstract>
<t>
   This document defines an extension to the Netnews Article Format that may be
   used to authenticate the cancelling and superseding of existing articles.
   If approved, this document updates RFC5537.
</t>
</abstract>

</front>


<!-- Content -->
<middle>

<section title="Introduction" anchor="intro">
<!-- Old text that implicitly states integrity checking capabilities
<t>
   The authentication system defined in this document is intended to be used as
   a simple method to verify that the author of an article which cancels
   (<xref target="RFC5537"/> Section 5.3) or supersedes (<xref target="RFC5537"/>
   Section 5.4) another one is either the poster, posting agent, moderator or
   injecting agent that processed the original article when it was in its
   proto-article form.
</t>
-->
<t>
   The authentication system defined in this document is intended to be used as
   a simple method to verify that the withdrawal of an article is valid, that is
   to say either the poster, posting agent, moderator or injecting agent that
   processed the original article has required to withdraw it via the use of a
   cancel control article (<xref target="RFC5537"/> Section 5.3) or a Supersedes
   header field (<xref target="RFC5537"/> Section 5.4).
</t>
<t>
   One property of this system is that it prevents tracking of individual users.
</t>
<t>
   There are other authentication systems available with different properties.
   When everybody should be able to verify who the originator is, e.g. for
   control articles to add or remove newsgroups (<xref target="RFC5537"/>
   Section 5.2), an OpenPGP <xref target="RFC4880"/> signature is suited.
</t>

<section title="Conventions Used in This Document" anchor="conventions">
<t>
   Any term not defined in this document has the same meaning as it
   does in <xref target="RFC5536"/> or <xref target="RFC5537"/>.
</t>

<t>
   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY",
   and "OPTIONAL" in this document are to be interpreted as described
   in <xref target="RFC2119"/>.
</t>
</section> <!-- conventions -->

<section title="Author's Note" anchor="authorsnote">
<t>
   Please write the letters "ae" in "Baeuerle" as an a-umlaut (U+00E4,
   "&amp;#228;" in XML), the first letter in "Elie" with an acute accent
   (U+00C9, "&amp;#201;" in XML), the letters "ss" in Janssen as an eszett
   (U+00DF, "&amp;#223;" in XML) and the letters "ue" in Baden-Wuerttemberg
   as an u-umlaut (U+00FC, "&amp;#252;" in XML) wherever this is possible.
</t>
</section> <!-- authorsnote -->
</section> <!-- intro -->

<section title="Header Fields" anchor="headerfields">
<t>
   This section describes the formal syntax of the new header fields using
   ABNF <xref target="RFC5234"/><!-- <xref target="RFC7405"/> -->.
   It extends the syntax in Section 3 of <xref target="RFC5536"/> and
   non-terminals not defined in this document are defined there.
   The <xref target="RFC5536"/> ABNF should be imported first before attempting
   to validate these rules.
</t>

<t>
   The new header fields Cancel-Lock and Cancel-Key are defined by this
   document, they follow the rules described in <xref target="RFC5536"/>
   Section 2.2:
</t>

<figure>
<artwork type="abnf">
   fields =/ *( cancel-lock / cancel-key )
</artwork>
</figure>

<t>
   Each of these header fields MUST NOT occur more than once in an article.
</t>

<t>
  Both new header field bodies contain lists of encoded values. Every entry is
  based on a &lt;scheme&gt;:
</t>

<figure>
<artwork type="abnf">
   scheme       = "sha256" / "sha512" / 1*scheme-char / obs-scheme
   scheme-char  = ALPHA / DIGIT / "-" / "/"
</artwork>
<!-- For case-sensitity syntax
   LOWER        = %x61-7A  ; lowercase characters [a-z]
-->
<!-- Old definition. Different syntax now defined in subsections
   code-string  = 1*base64-octet
   base64-octet = ALPHA / DIGIT / "+" / "/" / "="
-->
</figure>

<t>
  The hash algorithms for &lt;scheme&gt;  are defined in <xref target="RFC6234"/>,
  see also <xref target="RFC1321"/> and <xref target="RFC6151"/> for MD5,
  <xref target="RFC3174"/> for SHA1 and <xref target="SHA"/> for the SHA2 family.
  The Base64 encoding used is defined in Section 4 of <xref target="RFC4648"/>.
</t>

<t>
   This document defines two values for &lt;scheme&gt;: "sha256" and "sha512".
   The hash algorithm "sha256" is mandatory to implement.
</t>
<t>
   Because the hash algorithm for &lt;scheme&gt; cannot be negotiated,
   unnecessary proliferation of hash algorithms should be avoided.
   The hash algorithms "sha224" and "sha384" are only added to the Netnews
   Cancel-Lock hash algorithm registry (<xref target="registrationalg"/>)
   because implementations exist that supports them.
   Implementations SHOULD NOT use the hash algorithms "sha224" and "sha384"
   to generate &lt;scheme&gt;.
</t>

<!-- Eventually removed again
<t>
   Note that the obsolete syntax &lt;obs-scheme&gt; was defined case-insensitive.
   This is changed in this document and the scheme MUST now be generated with
   lowercase letters.
</t>

<t>
   The case sensitivity of &lt;scheme&gt; is defined to simplify the checks.
</t>
-->

<section title="Cancel-Lock" anchor="cancellock">
<figure>
<artwork type="abnf">
   cancel-lock     = "Cancel-Lock:" SP c-lock-list CRLF
   c-lock-list     = [CFWS] c-lock *(CFWS c-lock) [CFWS]
   c-lock          = scheme ":" c-lock-string
   c-lock-string   = *(4base64-char) [base64-terminal]
   base64-char     = ALPHA / DIGIT / "+" / "/"
   base64-terminal = 2base64-char "==" / 3base64-char "="
</artwork>
<!-- Old definition
   c-lock          = scheme ":" code-string
-->
</figure>

<t>
   Comments in CFWS can cause interoperability problems, so comments SHOULD NOT
   be generated but MUST be accepted.
</t>
<t>
   If &lt;scheme&gt; is not supported by an implementation, the corresponding
   &lt;c-lock&gt; element MUST be skipped and potential following &lt;c-lock&gt;
   elements MUST NOT be ignored.
</t>

<t>
   &lt;c-lock-string&gt; is the Base64 encoded output of a hash operation
   (defined by &lt;scheme&gt;) of the Base64 encoded key "K" that is intended to
   authenticate the person or agent that created or processed respectively the
   proto-article up to injection (inclusively):
</t>
<figure>
<artwork>
   Base64(hash(Base64(K)))
</artwork>
</figure>
<t>
   Because of the one-way nature of the hash operation the key "K" is not
   revealed.
</t>
<t>
   If multiple &lt;c-lock&gt; elements are present in a &lt;c-lock-list&gt;,
   each &lt;c-lock&gt; element MUST use a unique key K.
</t>
</section> <!-- cancellock -->

<section title="Cancel-Key" anchor="cancelkey">
<figure>
<artwork type="abnf">
   cancel-key   = "Cancel-Key:" SP c-key-list CRLF
   c-key-list   = [CFWS] c-key *(CFWS c-lock) [CFWS]
   c-key        = scheme ":" c-key-string
   c-key-string = c-lock-string / obs-c-key-string
</artwork>
<!-- Old definition
   c-key-string = 1*base64-octet
   base64-octet = ALPHA / DIGIT / "+" / "/" / "="
-->
</figure>

<t>
   Comments in CFWS can cause interoperability problems, so comments SHOULD NOT
   be generated but MUST be accepted.
</t>
<t>
   If &lt;scheme&gt; is not supported by an implementation, the corresponding
   &lt;c-key&gt; element MUST be skipped and potential following &lt;c-key&gt;
   elements MUST NOT be ignored.
</t>

<t>
   &lt;c-key-string&gt; is the Base64 encoded key "K" that was used to create
   the &lt;c-lock&gt; element in the Cancel-Lock header field body (as defined
   in <xref target="cancellock"/> of this document) of the original article:
</t>
<figure>
<artwork>
   Base64(K)
</artwork>
</figure>
<t>
   The relaxed syntax definition of &lt;c-key-string&gt; above is required for
   backward compatibility with implementations that are not compliant
   with this specification. Compliant implementations SHOULD generate
   valid Base64 (that is to say the syntax of &lt;c-lock-string&gt; as defined
   in <xref target="cancellock"/> of this document) and MUST accept strings of
   &lt;base64-octet&gt; characters (that is to say the syntax of
   &lt;obs-c-key-string&gt; as defined in <xref target="obssyntax"/> of this
   document).
</t>
</section> <!-- cancelkey -->
</section> <!-- headerfields -->

<section title="Use" anchor="use">
<t>
   The Cancel-Lock header field contains hashes of secret strings.
   This secret strings can later be used to authenticate a cancel or supersede
   request.
</t>
<t>
   Use cases:
   <list style="symbols">
   <t>
      The poster of an article wants to cancel or supersede existing articles.
   </t>
   <t>
      A moderator wants the ability to cancel articles after approving them.
   </t>
   <t>
      An injecting agent acts representitive for posting agents without
      support for the autentication system described in this document.
   </t>
   <t>
      A news administrator wants the ability to cancel articles that were
      injected by its system (because they e.g. violate its abuse policy).
   </t>
   </list>
</t>

<section title="Adding an initial Cancel-Lock header field to a proto-article"
         anchor="generatelocks">
<t>
   A Cancel-Lock header field MAY be added to a proto-article by the poster or
   posting agent which will include one or more &lt;c-lock&gt; elements.
</t>
<!-- Old text
   If the poster or posting agent doesn't add a Cancel-Lock header field to a
   proto-article, then an injecting agent (or moderator) MAY add one or more
   provided that it positively authenticates the author. The injecting agent (or
   moderator) MUST NOT add this header field to a proto-article unless it is
   able to authenticate all cancelling or superseding attempts from the poster
   and automatically add a working Cancel-Key header field or extend an existing
   one for such proto-articles.
-->
<t>
   If the poster or posting agent doesn't add a Cancel-Lock header field to a
   proto-article, then an injecting agent (or moderator) MAY add one, including
   one or more &lt;c-lock&gt; elements.
</t>
<t>
   If an injecting agent (or moderator) wants to act representitive for a
   posting agent without support for the authentication system described in this
   document, then it MUST be able to positively authenticate the poster and it
   MUST be able to automatically add a working Cancel-Key header field for all
   proto-articles with cancelling or superseding attempts from that poster.
</t>
<t>
   Other agents MUST NOT add this header field to articles or proto-articles
   that they process.
</t>
</section> <!-- generatelocks -->

<section title="Extending the Cancel-Lock header field of a proto-article"
         anchor="extendlocks">
<t>
   If a Cancel-Lock header field has already been added to a proto-article then
   any agent further processing the proto-article up to the injecting agent
   (inclusively) MAY append additional &lt;c-lock&gt; elements to those already
   in the header field body.
</t>
<!-- Old recommendation. Removed to make transition easier
<t>
   No more than one &lt;c-lock&gt; element SHOULD be added by each agent that
   processes the proto-article.
</t>
-->
<t>
   If an injecting agent (or moderator) wants to act representitive for a
   posting agent without support for the authentication system described in
   this document, then the same requirements apply as mentioned in
   <xref target="generatelocks"/>.
</t>
<t>
   Once an article is injected then this header field MUST NOT be altered. In
   particular, relaying agents beyond the injecting agent MUST NOT alter it.
</t>
</section> <!-- extendlocks -->

<section title="Adding a Cancel-Key header field to a proto-article"
         anchor="generatekeys">
<t>
   The Cancel-Key header field contains one or more of the secret strings that
   were used to create the Cancel-Lock header field of the original article.
   Knowledge of at least one of the secret strings is required to create a
   match for successful authentication.
</t>
<t>
   A Cancel-Key header field MAY be added to a proto-article containing a
   Control or Supersedes header field by the poster or posting agent which
   will include one or more &lt;c-key&gt; elements. They will correspond to
   some or all of the &lt;c-lock&gt; elements in the article referenced by the
   Control (with a "cancel" command as defined in <xref target="RFC5537"/>) or
   Supersedes header field.
</t>
<t>
   If, as mentioned in <xref target="generatelocks"/>, an injecting agent (or
   moderator) has added a Cancel-Lock header field to an article listed in the
   Control (with "cancel" command as defined in <xref target="RFC5537"/>) or
   Supersedes header field - representitive for the posting agent - then
   (given that it authenticates the poster as being the same as the poster of
   the original article) it MUST add the Cancel-Key header field with at least
   one &lt;c-key&gt; element that corresponds to that article.
</t>
<t>
   Other agents MUST NOT alter this header field.
</t>
</section> <!-- generatekeys -->

<section title="Extending the Cancel-Key header field of a proto-article"
         anchor="extendkeys">
<t>
   If a Cancel-Key header field has already been added to a proto-article then
   any agent further processing the proto-article up to the injecting agent
   (inclusively) MAY append additional &lt;c-key&gt; elements to those already
   in the header field body.
</t>
<t>
   If, as mentioned in <xref target="extendlocks"/> an injecting agent (or
   moderator) has extended the Cancel-Lock header field in an article listed in
   the Control (with "cancel" command as defined in <xref target="RFC5537"/>) or
   Supersedes header field - representitive for the posting agent - then
   (given that it authenticates the poster as being the same as the poster of
   the original article) it MUST extend the Cancel-Key header field body with at
   least one &lt;c-key&gt; element that corresponds to that article.
</t>
<t>
   Once an article is injected then this header field MUST NOT be altered. In
   particular, relaying agents beyond the injecting agent MUST NOT alter it.
</t>
</section> <!-- extendkeys -->

<section title="Check a Cancel-Key header field" anchor="checkkeys">
<t>
   When a serving agent receives an article that attempts to cancel or supersede
   a previous article via Control (with a "cancel" command as defined in
   <xref target="RFC5537"/>) or Supersedes header field, the system defined in
   this document can be used for authentication.
   The general handling of articles containing such attempts as defined in
   <xref target="RFC5537"/> is not changed by this document.
</t>

<t>
   To process the authentication, the received article must contain a Cancel-Key
   header field and the original article a Cancel-Lock header field. If this is
   not the case, the authentication is not possible (failed).
</t>

<t>
   For the authentication check, every supported &lt;c-key&gt; element from the
   received article is processed as follows:

   <list style="numbers">
   <t>
      The &lt;c-key-string&gt; part of the &lt;c-key&gt; element is hashed using
      the algorithm defined by its &lt;scheme&gt; part.
   </t>
   <t>
      For all &lt;c-lock&gt; elements with the same &lt;scheme&gt; in the
      original article their &lt;c-lock-string&gt; part is compared to the
      calculated hash.
   </t>
    <t>
      If one is equal, the authentication is passed and the processing of
      further elements can be aborted.
   </t>
   <t>
      If no match was found and there are no more &lt;c-key&gt; elements to
      process, the authentication failed.
    </t>
   </list>
</t>
</section> <!-- checkkeys -->
</section> <!-- use -->

<section title="Calculating the key data" anchor="keydata">
<t>
   The following algorithm is RECOMMENDED to calculate the key "K" based on
   a local secret &lt;sec&gt;.
</t>
<t>
   The result of the function:
</t>
<figure>
<artwork>
   K = HMAC(uid+mid, sec)
</artwork>
</figure>
<t>
   is the key "K" for an article with Message-ID &lt;mid&gt; that belongs
   to the User-ID &lt;uid&gt; (e.g. the login name of the user).
   HMAC is outlined in <xref target="RFC2104"/>. HMAC is computed over the data
   &lt;uid+mid&gt; (with '+' representing the concatenation operation), using
   &lt;sec&gt; as a secret key held locally that can be used for multiple
   articles.
   This method removes the need for a per-article database containing the
   keys used for every article.
   <!-- Comment for review -->
   <!--
      Commented out because of Secdir review: David Mandelberg shared my opinion
   <cref anchor="Q1">
      Security review: Some existing implementations concatenates the
      &lt;uid&gt; part with &lt;sec&gt; instead of &lt;mid&gt;. This variant
      was not used to ensure that &lt;sec&gt; is directly used as HMAC key
      (to avoid confusion with the length considerations below).
   </cref>
   -->
</t>

<t>
   A posting agent must add the Message-ID header field to the proto-article
   itself and use the content of the header field body as &lt;mid&gt; (including
   literal angle brackets).
</t>

<t>
   The User-ID &lt;uid&gt; must not contain angle brackets (to ensure that
   concatenation of different &lt;uid&gt; and &lt;mid&gt; elements cannot give
   the same results).
</t>

<t>
   A posting agent, that uses a dedicated local secret &lt;sec&gt; for every
   user, should use an empty string for the &lt;uid&gt; part.
</t>

<t>
   In general every agent must not use the same secret &lt;sec&gt; if multiple
   &lt;c-lock&gt; elements are added.
</t>

<!-- Old text (changed after Secdir review)
   The local secret &lt;sec&gt; should have a length of at least the output
   size of the hash function that is used by HMAC (256 bit / 32 octets for
   SHA256).
   If the secret is not a random value, but e.g. some sort of human readable
   password, it should be much longer.
   In any case it is important that this secret can not be guessed.
-->
<t>
   The local secret &lt;sec&gt; should have a length of at least the output
   size of the hash function that is used by HMAC (256 bit / 32 octets
   for SHA256) and must be a random value.
</t>

<t>
   Note that the hash algorithm used as base for the HMAC operation is not
   required to be the same as specified by &lt;scheme&gt;.
   An agent that verifies a Cancel-Key header field body simply checks whether
   one of its &lt;c-key&gt; elements matches one of the &lt;c-lock&gt; elements
   with the same &lt;scheme&gt; in the Cancel-Lock header field body of the
   original article.
</t>

<t>
   Common libraries like OpenSSL can be used for the cryptographic operations.
</t>
</section> <!-- keydata -->

<section title="Examples" anchor="examples">

<section title="Without UID" anchor="withoutuid">
<t>
   Example data for creation of a &lt;c-lock&gt; element with HMAC-SHA256 and
   empty string as &lt;uid&gt; (as suggested in <xref target="keydata"/> for
   posting agents):
</t>
<figure>
<artwork>
   Message-ID: &lt;12345@mid.example&gt;
</artwork>
</figure>
<figure>
<artwork>
   mid: &lt;12345@mid.example&gt;
   sec: ExampleSecret
   K  : HMAC-SHA256(mid, sec) ;mid used as data, sec as secret key
</artwork>
</figure>
<t>
   Calculation of Base64(K) using the OpenSSL command line tools in a POSIX
   shell:
</t>
<figure>
<artwork>
   $ printf "%s" "&lt;12345@mid.example&gt;" \
     | openssl dgst -sha256 -hmac "ExampleSecret" -binary \
     | openssl enc -base64
   qv1VXHYiCGjkX/N1nhfYKcAeUn8bCVhrWhoKuBSnpMA=
</artwork>
</figure>
<t>
   This can be used as &lt;c-key-string&gt; for cancelling or superseding the
   article &lt;12345@mid.example&gt;.
</t>
<t>
   Calculation of Base64(SHA256(Base64(K))) required for &lt;c-lock-string&gt;
   using the OpenSSL command line tools in a POSIX shell:
</t>
<figure>
<artwork>
   $ printf "%s" "qv1VXHYiCGjkX/N1nhfYKcAeUn8bCVhrWhoKuBSnpMA=" \
     | openssl dgst -sha256 -binary \
     | openssl enc -base64
   s/pmK/3grrz++29ce2/mQydzJuc7iqHn1nqcJiQTPMc=
</artwork>
</figure>
<t>
   Inserted into the Cancel-Lock header field body of article
   &lt;12345@mid.example&gt; it looks like this:
</t>
<figure>
<artwork>
   Cancel-Lock: sha256:s/pmK/3grrz++29ce2/mQydzJuc7iqHn1nqcJiQTPMc=
</artwork>
</figure>
<t>
   Inserted into the Cancel-Key header field body of an article that should
   cancel or supersede article &lt;12345@mid.example&gt; it looks like this:
</t>
<figure>
<artwork>
   Cancel-Key: sha256:qv1VXHYiCGjkX/N1nhfYKcAeUn8bCVhrWhoKuBSnpMA=
</artwork>
</figure>
</section> <!-- withoutuid -->

<section title="With UID" anchor="withuid">
<t>
   Example data for creation of a &lt;c-lock&gt; element with HMAC-SHA256 and
   "JaneDoe" as &lt;uid&gt; (as suggested in <xref target="keydata"/>):
</t>
<figure>
<artwork>
   Message-ID: &lt;12345@mid.example&gt;
</artwork>
</figure>
<figure>
<artwork>
   uid: JaneDoe
   mid: &lt;12345@mid.example&gt;
   sec: AnotherSecret
   K  : HMAC-SHA256(uid+mid, sec) ;uid+mid as data, sec as secret key
</artwork>
</figure>
<t>
   Calculation of Base64(K) using the OpenSSL command line tools in a POSIX
   shell:
</t>
<figure>
<artwork>
   $ printf "%s" "JaneDoe&lt;12345@mid.example&gt;" \
     | openssl dgst -sha256 -hmac "AnotherSecret" -binary \
     | openssl enc -base64
   yM0ep490Fzt83CLYYAytm3S2HasHhYG4LAeAlmuSEys=
</artwork>
</figure>
<t>
   This can be used as &lt;c-key-string&gt; for cancelling or superseding the
   article &lt;12345@mid.example&gt;.
</t>
<t>
   Calculation of Base64(SHA256(Base64(K))) required for &lt;c-lock-string&gt;
   using the OpenSSL command line tools in a POSIX shell:
</t>
<figure>
<artwork>
   $ printf "%s" "yM0ep490Fzt83CLYYAytm3S2HasHhYG4LAeAlmuSEys=" \
     | openssl dgst -sha256 -binary \
     | openssl enc -base64
   NSBTz7BfcQFTCen+U4lQ0VS8VIlZao2b8mxD/xJaaeE=
</artwork>
</figure>
<t>
   Inserted into the Cancel-Lock header field body of article
   &lt;12345@mid.example&gt; it looks like this:
</t>
<figure>
<artwork>
   Cancel-Lock: sha256:NSBTz7BfcQFTCen+U4lQ0VS8VIlZao2b8mxD/xJaaeE=
</artwork>
</figure>
<t>
   Inserted into the Cancel-Key header field body of an article that should
   cancel or supersede article &lt;12345@mid.example&gt; it looks like this:
</t>
<figure>
<artwork>
   Cancel-Key: sha256:yM0ep490Fzt83CLYYAytm3S2HasHhYG4LAeAlmuSEys=
</artwork>
</figure>
</section> <!-- withuid -->

<section title="Other examples" anchor="otherex">
<t>
   Other matching pair of Cancel-Lock and Cancel-Key header fields:
</t>
<figure>
<artwork>
   Cancel-Lock: sha256:RrKLp7YCQc9T8HmgSbxwIDlnCDWsgy1awqtiDuhedRo=
   Cancel-Key: sha256:sSkDke97Dh78/d+Diu1i3dQ2Fp/EMK3xE2GfEqZlvK8=
</artwork>
</figure>

<t>
   With obsolete syntax (uses a &lt;c-key-string&gt; with invalid/missing
   Base64 padding):
</t>
<figure>
<artwork>
   Cancel-Lock: sha1:bNXHc6ohSmeHaRHHW56BIWZJt+4=
   Cancel-Key: ShA1:aaaBBBcccDDDeeeFFF
</artwork>
</figure>

<t>
   Let's assume that all the examples above are associated to the same article
   (e.g. created by different agents):
</t>
<figure>
<artwork>
   Cancel-Lock: sha256:s/pmK/3grrz++29ce2/mQydzJuc7iqHn1nqcJiQTPMc=
                sha256:NSBTz7BfcQFTCen+U4lQ0VS8VIlZao2b8mxD/xJaaeE=
                sha256:RrKLp7YCQc9T8HmgSbxwIDlnCDWsgy1awqtiDuhedRo=
                sha1:bNXHc6ohSmeHaRHHW56BIWZJt+4=
   Cancel-Key: sha256:qv1VXHYiCGjkX/N1nhfYKcAeUn8bCVhrWhoKuBSnpMA=
               sha256:yM0ep490Fzt83CLYYAytm3S2HasHhYG4LAeAlmuSEys=
               sha256:sSkDke97Dh78/d+Diu1i3dQ2Fp/EMK3xE2GfEqZlvK8=
               ShA1:aaaBBBcccDDDeeeFFF
</artwork>
</figure>

<t>
   Remember that &lt;scheme&gt; must be parsed case insensitive.
</t>

</section> <!-- otherex -->

<section title="Manual checks" anchor="manualchecks">
<t>
   Manual checks using the OpenSSL command line tools in a POSIX shell:
</t>
<figure>
<artwork>
   $ printf "%s" "qv1VXHYiCGjkX/N1nhfYKcAeUn8bCVhrWhoKuBSnpMA=" \
     | openssl dgst -sha256 -binary \
     | openssl enc -base64
   s/pmK/3grrz++29ce2/mQydzJuc7iqHn1nqcJiQTPMc=

   $ printf "%s" "yM0ep490Fzt83CLYYAytm3S2HasHhYG4LAeAlmuSEys=" \
     | openssl dgst -sha256 -binary \
     | openssl enc -base64
   NSBTz7BfcQFTCen+U4lQ0VS8VIlZao2b8mxD/xJaaeE=

   $ printf "%s" "sSkDke97Dh78/d+Diu1i3dQ2Fp/EMK3xE2GfEqZlvK8=" \
     | openssl dgst -sha256 -binary \
     | openssl enc -base64
   RrKLp7YCQc9T8HmgSbxwIDlnCDWsgy1awqtiDuhedRo=

   $ printf "%s" "aaaBBBcccDDDeeeFFF" \
     | openssl dgst -sha1 -binary \
     | openssl enc -base64
   bNXHc6ohSmeHaRHHW56BIWZJt+4=
</artwork>
</figure>
</section> <!-- manualchecks -->
</section> <!-- examples -->

<section title="Obsolete Syntax" anchor="obssyntax">
<t>
   Implementations of earlier drafts of this specification defined a different
   value for &lt;scheme&gt; than this version.
   The following value for &lt;scheme&gt; is now deprecated and SHOULD NOT
   be generated anymore.
   Serving agents SHOULD still accept it for a transition period as long as
   the corresponding hash function is not considered unsafe (see
   <xref target="security"/> for details), or already marked as OBSOLETE in the
   Netnews Cancel-Lock hash algorithm registry
   (<xref target="registrationalg"/>).
</t>

<figure>
<artwork type="abnf">
   obs-scheme = "sha1"
</artwork>
</figure>

<t>
   It is important for backward compatibility that the deprecated value for
   &lt;scheme&gt; is not phased out too early. Security and compatibility
   concerns should be carefully weighed before choosing to remove 
   &lt;obs-scheme&gt; from existing implementations (or not implementing it
   in new ones).
</t>

<t>
   Earlier drafts of this specification allowed more liberal syntax for
   &lt;c-key-string&gt;:
</t>

<figure>
<artwork type="abnf">
   obs-c-key-string = 1*base64-octet
   base64-octet     = ALPHA / DIGIT / "+" / "/" / "="
</artwork>
</figure>

<t>
   &lt;obs-c-key-string&gt; SHOULD NOT be generated but MUST be accepted.
</t>
</section> <!-- obssyntax -->

<section title="Security Considerations" anchor="security">
<t>
   The authentication system defined in this document provides no integrity
   checking properties. Arbitrary modifications can be applied to an article
   on its way through the network, regardless of the presence of a Cancel-Key
   header field. A serving agent, who receives an article that contains a
   Cancel-Key header field with a matching &lt;c-key&gt; element, only get the
   information that the withdrawal of the target article was approved by a
   legitimate person or agent.
</t>
<t>
   Example: A valid &lt;c-key&gt; element is extracted from a cancel control
   article and inserted into a forged supersede article. All servers on the
   network that receive the forged supersede article before the cancel control
   article should accept the forged supersede.
   But because everybody can post articles with forged identity information in
   the header (same as with spam e-mail), the same result can be achieved by
   sending a forged new article using no authentication system at all.
</t>
<t>
   For originator and integrity checks a signature based authentication system
   is required (normally OpenPGP <xref target="RFC4880"/> is used for this
   purpose). Both systems can be combined.
</t>

<t>
   The important property of the hash function used for &lt;scheme&gt; is
   the preimage resistance.
   A successful preimage attack either reveals the real Cancel-Key (that was
   used to create the Cancel-Lock of the original article) or gives a different
   Cancel-Key (that matches a Cancel-Lock too).
   This would break the authentication system defined in this document.
</t>

<t>
   Collision resistance of the hash function used for &lt;scheme&gt; is less
   important. Finding two &lt;c-key&gt; elements for the Cancel-Key header
   field that match to a &lt;c-lock&gt; element of an arbitrary Cancel-Lock
   header field is not helpful to break the authentication system defined in
   this document (if a specific article is defined as target).
   Only collateral damage by arbitrary cancel or supersede is possible.
</t>

<t>
   Currently there is no known practicable preimage and second preimage attack
   against the hash function SHA1. Therefore there is no hurry to replace it.
   The reasons why this document specifies hash functions from the SHA2 family
   are:
   <list style="symbols">
   <t>
      The last draft for the authentication system defined in this document
      is nearly two decades old.
      The client side implementations are moving forward extremely slowly too
      (newsreaders from the last millennium are still in heavy use).
      What is defined today should be strong enough for at least the next
      decades.
   </t>
   <t>
      The collision resistance of SHA1 is already broken, therefore it is
      now obsolete for digital signatures as used in TLS. It is intended
      that an implementation of the authentication system defined in this
      document can share the same cryptographic library functions that are used
      for TLS.
   </t>
   <t>
      It is intended that the same hash function can be used for &lt;scheme&gt;
      and (as base) for the HMAC that is suggested in <xref target="keydata"/>.
      See notes below for HMAC-MD5 and HMAC-SHA1.
   </t>
   <t>
      The SHA2 family of hash algorithms is widely supported by cryptographic
      libraries. In contrast, SHA3 is currently not supported by e.g. OpenSSL.
   </t>
   </list>
</t>

<t>
   The operation HMAC(uid+mid, sec) as suggested in <xref target="keydata"/>
   must be able to protect the local secret &lt;sec&gt;. The Message-ID
   &lt;mid&gt; is public (in the Message-ID header field body) and &lt;uid&gt;
   is optional.
   An attacker who wants to steal/use a local secret only need to break this
   algorithm (regardless of &lt;scheme&gt;), because Cancel-Key header fields
   are explicitly published for every request to cancel or supersede existing
   articles.
</t>
<t>
   Even if HMAC-MD5 and HMAC-SHA1 are not considered broken today, it is desired
   to have some more security margin here. Breaking &lt;scheme&gt; only allows
   to authenticate a single forged cancel or supersede request. With &lt;sec&gt;
   in hand it is possible to forge such requests for all articles that contain
   Cancel-Lock header field bodies with elements that are generated with this
   &lt;sec&gt; in the past.
   Changing &lt;sec&gt; in regular intervals can be used to mitigate the
   potential damage.
</t>
<t>
   If an implementation chooses to not implement the key calculation algorithm
   recommended in <xref target="keydata"/>, or to implement it with HMAC based
   on a different hash function than &lt;scheme&gt;, the key size used should be
   at least 128 bit with "sha256" for &lt;scheme&gt; and at least 80 bit with
   "sha1" for &lt;scheme&gt;.
   <!-- Comment for review -->
   <cref anchor="Q2">
      Security review: Should these recommendations remain in the document, or
      does an RFC exist to refer to with regards to security recommendations?
   </cref>
</t>
</section> <!-- security -->

<section title="IANA Considerations" anchor="iana">
<t>
   IANA has registered the following header fields in the Permanent
   Message Header Field Repository, in accordance with the procedures
   set out in <xref target="RFC3864"/>:
</t>
<figure>
<artwork>
   Header field name: Cancel-Lock
   Applicable protocol: netnews
   Status: standard
   Author/change controller: IETF
   Specification document(s): This document
</artwork>
</figure>

<figure>
<artwork>
   Header field name: Cancel-Key
   Applicable protocol: netnews
   Status: standard
   Author/change controller: IETF
   Specification document(s): This document
</artwork>
</figure>

<t>
   The Netnews Cancel-Lock hash algorithm registry will be maintained by IANA.
</t>
<t>
   The registry will be available at
   &lt;https://www.iana.org/assignments/netnews-parameters/
               netnews-parameters.xhtml#cancel-lock-hash-algorithms&gt;.
</t>

<section title="Algorithm Name Registration Procedure" anchor="regproc">
<t>
   IANA will register new Cancel-Lock hash algorithm names on a First
   Come First Served basis, as defined in BCP 26 <xref target="RFC5226"/>.
   IANA has the right to reject obviously bogus registration requests, but will
   perform no review of claims made in the registration form.
</t>
<t>
   Registration of a Netnews Cancel-Lock hash algorithm is requested by
   filling in the following template and sending it via electronic mail
   to IANA at &lt;iana@iana.org&gt;:
</t>
<figure>
<artwork>
   Subject: Registration of Netnews Cancel-Lock hash algorithm X
   Netnews Cancel-Lock hash algorithm name:
   Security considerations:
   Published specification (recommended):
   Contact for further information:
   Intended usage: (One of COMMON, LIMITED USE, or OBSOLETE)
   Owner/Change controller:
   Note: (Any other information that the author deems relevant may be
         added here.)
</artwork>
</figure>
<t>
   Any name that conforms to the syntax of a Netnews Cancel-Lock hash algorithm
   (see definition of &lt;scheme&gt; in <xref target="headerfields"/>) can be
   used.
   Especially, Netnews Cancel-Lock algorithms are named by strings consisting of
   letters, digits, hyphens and/or slashes.
</t>
<t>
   Authors may seek community review by posting a specification of their
   proposed algorithm as an Internet-Draft. Netnews Cancel-Lock hash algorithms
   intended for widespread use should be standardized through the normal IETF
   process, when appropriate.
</t>
<t>
   The IESG is considered to be the owner of all Netnews Cancel-Lock hash
   algorithms that are on the IETF Standards Track.
</t>
</section> <!-- regproc -->

<section title="Change control" anchor="changectrl">
<t>
   Once a Netnews Cancel-Lock hash algorithm registration has been published by
   IANA, the owner may request a change to its definition. The change request
   follows the same procedure as the initial registration request.
</t>
<t>
   The owner of a Netnews Cancel-Lock hash algorithm may pass responsibility
   for the algorithm to another person or agency by informing IANA; this can be
   done without discussion or review.
</t>
<t>
   The IESG may reassign responsibility for a Netnews Cancel-Lock hash
   algorithm. The most common case of this will be to enable changes to
   be made to algorithms where the owner of the registration has died,
   has moved out of contact, or is otherwise unable to make changes that
   are important to the community.
</t>
<t>
   Netnews Cancel-Lock hash algorithm registrations MUST NOT be deleted;
   algorithms that are no longer believed appropriate for use can be
   declared OBSOLETE by a change to their "intended usage" field; such
   algorithms will be clearly marked in the registry published by IANA.
</t>
<t>
   The IESG is considered to be the owner of all Netnews Cancel-Lock hash
   algorithms that are on the IETF Standards Track.
</t>
</section> <!-- changectrl -->


<section title="Registration of the Netnews Cancel-Lock hash algorithms"
         anchor="registrationalg">
<t>
   This section gives a formal definition of the Netnews Cancel-Lock hash
   algorithms as required by <xref target="regproc"/> for the IANA
   registry.
</t>
<figure>
<artwork>
   Netnews Cancel-Lock hash algorithm name: md5
   Security considerations: See corresponding section of this document
   Published specification: This document
   Contact for further information: Author of this document
   Intended usage: OBSOLETE
   Owner/Change controller: IESG &lt;iesg@ietf.org&gt;
   Note: Do not use this algorithm anymore
</artwork>
</figure>

<figure>
<artwork>
   Netnews Cancel-Lock hash algorithm name: sha1
   Security considerations: See corresponding section of this document
   Published specification: This document
   Contact for further information: Author of this document
   Intended usage: LIMITED USE
   Owner/Change controller: IESG &lt;iesg@ietf.org&gt;
   Note: This algorithm is intended for backward compatibility
</artwork>
</figure>

<figure>
<artwork>
   Netnews Cancel-Lock hash algorithm name: sha224
   Security considerations: See corresponding section of this document
   Published specification: This document
   Contact for further information: Author of this document
   Intended usage: LIMITED USE
   Owner/Change controller: IESG &lt;iesg@ietf.org&gt;
   Note: sha256 should be used instead, this is a truncated variant of it
</artwork>
</figure>

<figure>
<artwork>
   Netnews Cancel-Lock hash algorithm name: sha256
   Security considerations: See corresponding section of this document
   Published specification: This document
   Contact for further information: Author of this document
   Intended usage: COMMON
   Owner/Change controller: IESG &lt;iesg@ietf.org&gt;
   Note: This algorithm is mandatory to implement
</artwork>
</figure>

<figure>
<artwork>
   Netnews Cancel-Lock hash algorithm name: sha384
   Security considerations: See corresponding section of this document
   Published specification: This document
   Contact for further information: Author of this document
   Intended usage: LIMITED USE
   Owner/Change controller: IESG &lt;iesg@ietf.org&gt;
   Note: sha512 should be used instead, this is a truncated variant of it
</artwork>
</figure>

<figure>
<artwork>
   Netnews Cancel-Lock hash algorithm name: sha512
   Security considerations: See corresponding section of this document
   Published specification: This document
   Contact for further information: Author of this document
   Intended usage: COMMON
   Owner/Change controller: IESG &lt;iesg@ietf.org&gt;
   Note: This algorithm is optional
</artwork>
</figure>
</section> <!-- registrationalg -->
</section> <!-- iana -->


</middle>


<!-- References and appendices -->
<back>

<references title="Normative References">
&rfc2119;
&rfc3864;
&rfc4648;
&rfc5226;
&rfc5234;
&rfc5536;
&rfc5537;
&rfc6234;
<!-- &rfc7405; -->
</references> <!-- normative -->

<references title="Informative References">
&rfc1321;
&rfc2104;
&rfc3174;
&rfc4880;
&rfc6151;
<reference anchor="SHA" target="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf">
<front>
   <title>
      Secure Hash Standard (SHS)
   </title>
   <author>
      <organization abbrev="NIST">
         National Institute of Standards and Technology
      </organization>
   </author>
   <date month="August" year="2015"/>
</front>
<seriesInfo name="FIPS" value="180-4, DOI 10.6028/FIPS.180-4"/>
<format type="PDF"
        target="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf"/>
</reference>
<reference anchor="USEFOR-CANCEL-LOCK">
<front>
   <title>Cancel-Locks in Usenet articles.</title>
   <author initials="S." surname="Lyall" fullname="Simon Lyall" />
   <date month="Work in Progress, November" year="1998" />
</front>
<format type="HTML"
        target="https://tools.ietf.org/html/draft-ietf-usefor-cancel-lock-01" />
</reference>
</references> <!-- informative -->

<section title="Acknowledgements" anchor="acknowledgements">
<t>
   The author acknowledges the original author of the Cancel-Lock authentication
   system as documented in draft-ietf-usefor-cancel-lock: Simon Lyall.
   He has written the original draft and former version
   <xref target="USEFOR-CANCEL-LOCK" />
   and approved the usage of his work for this document.
   This document is mostly based on his work and was originally intended as
   revision 02. It must be renamed because the USEFOR IETF WG is now closed.
</t>
<t>
   The author would like to thank the following individuals for contributing
   their ideas and reviewing this specification:
   Russ Allbery, Urs Jan&#223;en, Richard Kettlewell,
   Marcel Logen, Holger Marzen, Dennis Preiser, Emil Schuster.
   And Peter Faust and Alfred Peters for providing statistic data about the
   algorithms currently in use.
</t>
<t>
   Special thanks to the Document Shepherd, Julien &#201;lie and to the
   Responsible Area Director, Alexey Melnikov.
</t>
</section> <!-- acknowledgements -->

<section title="Document History (to be removed by RFC Editor before
                publication)" anchor="history">

<section title="Changes since -05">
<t>
   <list style="symbols">
   <t>
      Modified text in <xref target="generatelocks"/> and
      <xref target="extendlocks"/> to make it clear that an injecting agent
      only must be able to authenticate the poster if it wants to act
      representitive for him.
   </t>
   <t>
      Added/moved general description text to <xref target="use"/> to make
      things easier to understand (suggested by GEN-Art Last Call review).
   </t>
   <t>
      Removed text for importance of second preimage resistance
      in <xref target="security"/> (suggested by Secdir review).
   </t>
   <t>
      Added note that local secret must be random in
      <xref target="keydata"/> (suggested by Secdir review).
   </t>
   <t>
      Added note that &lt;uid&gt; is not allowed to contain angle brackets in
      <xref target="keydata"/> (suggested by Secdir review).
   </t>
   <t>
      Changed copyright notice (because Simon Lyall has licensed his work to the
      IETF Trust in the meantime).
   </t>
   <t>
      Fixed spelling in <xref target="generatekeys"/>,
      <xref target="extendkeys"/>, <xref target="security"/> and
      <xref target="regproc"/> (reported by Julien &#201;lie).
   </t>
   <t>
      Changed proposed location of IANA registry in <xref target="iana"/>.
      Should be more consistent with existing registries now
      (suggested by Julien &#201;lie)
   </t>
   <t>
      Added note to not use the same secret if multiple &lt;c-lock&gt;
      elements are added in <xref target="cancellock"/> and
      <xref target="keydata"/> (suggested by Secdir review).
   </t>
   <t>
      Unified the term "cancel control article".
   </t>
   <t>
      Added notes for impersonation and content forging attacks in
      <xref target="security"/>.
   </t>
   <t>
      Description text modified in <xref target="intro"/>.
   </t>
   </list>
</t>
</section>

<section title="Changes since -04">
<t>
   <list style="symbols">
   <t>
      Added note that the IESG is the owner of all Netnews Cancel-Lock hash
      algorithms that are on the IETF Standards Track in
      <xref target="regproc"/>.
   </t>
   <t>
      Changed the algorithm from informative to RECOMMENDED in
      <xref target="keydata"/>.
   </t>
   <t>
      Replaced "code-string" with "c-lock-string" for Step 2 in
      <xref target="checkkeys"/>.
   </t>
   <t>
      Replaced "code-string" with "c-key-string" for Step 1 in
      <xref target="checkkeys"/>.
   </t>
   <t>
      Added a short explanation in <xref target="generatekeys"/>.
   </t>
   <t>
      Added a short explanation in <xref target="generatelocks"/>.
   </t>
   <t>
      Replaced link to RFC2045 with link to RFC4648 in
      <xref target="headerfields"/>.
   </t>
   <t>
      Replaced normative reference RFC2045 (for Base64 algorithm) with RFC4648.
   </t>
   <t>
      Added case insensitivity note in <xref target="otherex"/>.
   </t>
   <t>
      RFC6234 (listed in the downref registry) is now a normative reference
      (formerly informative) as recommended by Shepherd Write-Up.
   </t>
   <t>
      NIST SHS standard is now an informative reference (formerly normative)
      as recommended by Shepherd Write-Up.
   </t>
   <t>
      Added "sha224" and "sha384" schemes in <xref target="registrationalg"/>
      (because implementations exists that supports them).
   </t>
   <t>
      Refer to <xref target="registrationalg"/> instead of
      <xref target="regproc"/> for hash algorithm registry.
   </t>
   <t>
      Fixed some typos.
   </t>
   <t>
      Fixed line length in <xref target="withoutuid"/>.
   </t>
   </list>
</t>
</section>

<section title="Changes since -03">
<t>
   <list style="symbols">
   <t>
      Added note for change interval of &lt;sec&gt; in
      <xref target="security"/>.
   </t>
   <t>
      Changed wording in <xref target="security"/>.
   </t>
   <t>
      Splitted <xref target="examples"/> into multiple subsections.
   </t>
   <t>
      Added example with UID in <xref target="examples"/>.
   </t>
   <t>
      Changed "SHOULD NOT" to uppercase in <xref target="obssyntax"/>.
   </t>
   <t>
      Reformatted <xref target="iana"/>, <xref target="regproc"/> and
      <xref target="registrationalg"/>.
   </t>
   <t>
      Fixed spelling in <xref target="keydata"/>.
   </t>
   </list>
</t>
</section>

<section title="Changes since -02">
<t>
   <list style="symbols">
   <t>
      Added <xref target="changectrl"/>.
   </t>
   <t>
      Added note about algorithm names in <xref target="regproc"/>.
   </t>
   <t>
      Added "/" to scheme-char in <xref target="headerfields"/>.
   </t>
   <t>
      Removed case sensitivity of scheme and normative reference to RFC7405
      in <xref target="headerfields"/> again.
   </t>
   <t>
      Added "sha512" scheme in <xref target="headerfields"/>.
   </t>
   <t>
      Changed wording in <xref target="registrationalg"/>.
   </t>
   <t>
      Fixed typo "canceling" in <xref target="examples"/>.
   </t>
   <t>
      Changed calculation formulas to use "Base64" in
      <xref target="cancellock"/> and <xref target="cancelkey"/>.
   </t>
   <t>
      Added obsolete algorithm "md5" in <xref target="registrationalg"/>.
   </t>
   <t>
      Added note that posting agents should add the Message-ID header field to
      proto-articles and use its content for &lt;mid&gt; in
      <xref target="keydata"/>.
   </t>
   <t>
      Added &lt;uid&gt; part to key calculation in <xref target="keydata"/>.
   </t>
   <t>
      Added note to generate CFWS without comments in
      <xref target="cancellock"/> and <xref target="cancelkey"/>.
   </t>
   <t>
      Changed ABNF to allow CFWS at the beginning of header fields in
      <xref target="cancellock"/> and <xref target="cancelkey"/>.
   </t>
   <t>
      Changed wording for "header"/"header field"/"header field body".
   </t>
   <t>
      Added <xref target="extendkeys"/>.
   </t>
   <t>
      Changed wording in <xref target="generatelocks"/>.
   </t>
   <t>
      Allowed additional whitespace at the beginning of header fields in
      <xref target="cancellock"/> and <xref target="cancelkey"/>.
   </t>
   <t>
      Changed definition of "c-key-string" in <xref target="cancelkey"/>.
   </t>
   <t>
      Added "obs-c-key-string" to <xref target="obssyntax"/>.
   </t>
   <t>
      Fixed typo in <xref target="cancelkey"/> ("c-lock" replaced by "c-key").
   </t>
   <t>
      Added key length recommendation in <xref target="security"/>.
   </t>
   <t>
      Renamed "sha-256" scheme to "sha256".
   </t>
   <t>
      Modified header and abstract section to list RFC5537 as updated by this
      document again.
   </t>
   <t>
      Added "USEFOR-CANCEL-LOCK" as informative reference.
   </t>
   <t>
      Changed wording in <xref target="keydata"/>.
   </t>
   </list>
</t>
</section>

<section title="Changes since -01">
<t>
   <list style="symbols">
   <t>
      Changed wording in <xref target="security"/>.
   </t>
   <t>
      Added example for HMAC calculation in <xref target="examples"/>.
   </t>
   <t>
      Changed wording in <xref target="keydata"/>.
   </t>
   <t>
      Added use cases to <xref target="extendlocks"/>.
   </t>
   <t>
      Replaced wording "injecting-agent" by "injecting agent".
   </t>
   <t>
      Added Definition for "LOWER" in <xref target="headerfields"/>.
   </t>
   <t>
      Added <xref target="registrationalg"/>.
   </t>
   <t>
      Added <xref target="regproc"/>.
   </t>
   <t>
      Added new entries for header field registry in <xref target="iana"/>.
   </t>
   <t>
      Removed recommendation that moderators and injecting agents should add
      only one Cancel-Lock or Cancel-Key resprectively to the list in
      <xref target="generatelocks"/>, <xref target="extendlocks"/> and
      <xref target="generatekeys"/>.
   </t>
   <t>
      Added missing headerfield termination to <xref target="cancellock"/>
      and <xref target="cancelkey"/>.
   </t>
   <t>
      Removed definition for "code-string" from <xref target="headerfields"/>.
      Added stricter definition "c-lock-string" to <xref target="cancellock"/>.
      Added backward compatible definition "c-key-string" to
      <xref target="cancelkey"/>.
   </t>
   <t>
      Use different wording in <xref target="cancelkey"/>.
   </t>
   <t>
      Changed wording to reflect that an injecting agent is allowed to create
      Cancel-Lock headerfields in <xref target="cancellock"/>.
   </t>
   <t>
      Fixed wording and typo in <xref target="headerfields"/>.
   </t>
   <t>
      Added normative reference to RFC7405 because case-sensitivity is used in
      ABNF.
   </t>
   <t>
      Added reference to RFC5536 (Section 2.2) in <xref target="headerfields"/>.
   </t>
   <t>
      Added references to RFC4880 and RFC5537 in <xref target="intro"/>.
   </t>
   <t>
      Replaced the wordings "remove" by "cancel" and "replace" by "supersede".
   </t>
   <t>
      Modified header and abstract section to no longer list RFC5536 and RFC5537
      as updated by this document.
   </t>
   </list>
</t>
</section>

<section title="Changes since -00">
<t>
   <list style="symbols">
   <t>
      Added additional note that deprecated "scheme" values should be preserved
      for backward compatibility as long as reasonable.
   </t>
   <t>
      Removed deprectated scheme "md5" (not in use anymore).
   </t>
   <t>
      Added descriptions how to generate "code-string" to
      <xref target="cancellock"/> and <xref target="cancelkey"/>.
   </t>
   <t>
      Removed length limitiation in ABNF of "scheme".
   </t>
   <t>
      Changed copyright notice to use text from TLP section 6.c.iii.
   </t>
   <t>
      Removed references from "abstract" section.
   </t>
   <t>
      Changed "SHOULD NOT" to uppercase in <xref target="obssyntax"/>.
   </t>
   <t>
      Added line wraps to CLI commands in <xref target="examples"/>.
   </t>
   </list>
</t>
</section>

<section title="Changes since draft-ietf-usefor-cancel-lock-01">
<t>
   <list style="symbols">
   <t>
      Renamed document because the USEFOR IETF WG is now closed.
   </t>
   <t>
      Added more details how to check Cancel-Key header fields in
      <xref target="checkkeys"/>.
   </t>
   <t>
      Added more details to <xref target="security"/>.
   </t>
   <t>
      Added updated ABNF for Cancel-Lock and Cancel-Key header fields.
   </t>
   <t>
      Deprecated "md5" and "sha1" schemes.
   </t>
   <t>
      Added "sha-256" scheme.
   </t>
   <t>
      Reworded the abstract section and added references.
   </t>
   <t>
      Added note to other authentication systems to <xref target="intro"/>.
   </t>
   <t>
      Added command line check examples to <xref target="examples"/>.
   </t>
   </list>
</t>
</section>

<section title="Changes since draft-ietf-usefor-cancel-lock-00">
<t>
   <list style="symbols">
   <t>
      References to SHA-160 changed to SHA1
   </t>
   <t>
      "scheme" is now a case insensitive token and the number "1" has been
      changed to "sha1".
   </t>
   <t>
      Added some examples and fixed the section numbering.
   </t>
   <t>
      Updated 2nd paragraph on section 2.2 to make clear what exactly is
      being hashed and how.
   </t>
   <t>
      Changed paragraph 2 of 3.1 to discourage injection agents from adding
      the header.
   </t>
   <t>
      Removed the Clue-string as this complicated the scheme without adding
      realistic functionality
   </t>
   <t>
      Moderators can now add these headers under the same conditions as
      injection agents.
   </t>
   </list>
</t>
</section>
</section> <!-- history -->

</back>


</rfc>
<!-- EOF -->
