Internet DRAFT - draft-sullivan-cryptography-specification

draft-sullivan-cryptography-specification







Network Working Group                                        N. Sullivan
Internet-Draft                                                C. A. Wood
Intended status: Informational                          Cloudflare, Inc.
Expires: 26 November 2023                                    25 May 2023


           Guidelines for Writing Cryptography Specifications
              draft-sullivan-cryptography-specification-00

Abstract

   This document provides guidelines and best practices for writing
   technical specifications for cryptography protocols and primitives,
   targeting the needs of implementers, researchers, and protocol
   designers.  It highlights the importance of technical specifications
   and discusses strategies for creating high-quality specifications
   that cater to the needs of each community, including guidance on
   representing mathematical operations, security definitions, and
   threat models.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/grittygrease/draft-sullivan-cryptography-
   specification.

Status of This Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at https://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on 26 November 2023.

Copyright Notice

   Copyright (c) 2023 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents (https://trustee.ietf.org/
   license-info) in effect on the date of publication of this document.
   Please review these documents carefully, as they describe your rights
   and restrictions with respect to this document.

Table of Contents

   1.  Introduction
   2.  Goals and Requirements
   3.  Guidelines for Cryptographic Specification Presentation
     3.1.  Simplicity
     3.2.  Precision
     3.3.  Consistency
       3.3.1.  Representing Mathematical Operations
   4.  Guidelines for Cryptography Specification Content
     4.1.  Reusability
       4.1.1.  Build on Existing Specifications
       4.1.2.  Modular Design
       4.1.3.  Clear Interfaces and Abstractions
       4.1.4.  Documentation and Examples
     4.2.  Defining Security Definitions and Threat Models
       4.2.1.  Defining Security Goals
       4.2.2.  Formalizing Security Definitions
       4.2.3.  Describing the Threat Model
       4.2.4.  Addressing Known Vulnerabilities and Attacks
       4.2.5.  Providing Guidance on Secure Implementation and
               Deployment
   5.  Catering to Target Audiences
     5.1.  Catering to Implementers
       5.1.1.  Test vectors
     5.2.  Catering to Researchers
     5.3.  Catering to Protocol Designers
   6.  General Recommendations
     6.1.  Encourage Open Communication and Feedback
     6.2.  Seek External Expertise
     6.3.  Recognize and Address Conflicting Interests
   7.  Examples of Well-Written Specifications
     7.1.  ChaCha20 and Poly1305 for IETF Protocols (RFC 8439)
       7.1.1.  Introduction and Overview
       7.1.2.  Algorithm Descriptions
       7.1.3.  Test Vectors
       7.1.4.  Security Considerations
       7.1.5.  IANA Considerations and References
       7.1.6.  Problematic Aspects
   8.  Examples of Specifications That Could Be Improved
     8.1.  Test Vectors
     8.2.  Unnecessary Branching
     8.3.  Compatibility and Modularity
   9.  Conclusion
   10. Security Considerations
   11. IANA Considerations
   12. References
     12.1.  Normative References
     12.2.  Informative References
   Authors' Addresses

1.  Introduction

   High-quality cryptography specifications are critical for the for
   development and deployment of secure cryptographic protocols.  This
   document provides guidelines for specification writers to follow to
   help ensure that their specifications are of high quality and are
   useful for their intended audience.  This document provides
   guidelines for writing clear, precise, and consistent specifications
   covering topics such as representing mathematical operations,
   defining security definitions, and describing threat models.
   Adhering to these guidelines helps ensure that specifications are
   easier to understand, implement, and analyze, leading to high
   assurance and interoperable systems.

   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
   BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
   capitals, as shown here.

2.  Goals and Requirements

   The primary goal of these guidelines is to help guide the authorship
   of cryptographic specifications so that they are as useful as
   possible when creating high-assurance cryptographic software.
   Specifications that follow these guidelines should be able to be
   easily understood, implemented, and analyzed by different audiences,
   including the engineering community, research community, and
   standardization community.  By addressing the unique needs and
   expectations of each group, these guidelines aim to:

   *  Minimize ambiguity and misinterpretations, leading to clearer
      specifications and more accurate implementations.

   *  Ensure consistent and correct implementations by providing a clear
      description of both algorithms and their underlying mathematical
      foundation.

   *  Facilitate review and analysis by the research community, allowing
      for the verification of security properties and the identification
      of potential vulnerabilities.

   *  Enable interoperability of implementations of these
      specifications, promoting collaboration and compatibility between
      various systems and protocols.

   Each of these stakeholder groups contributes something different to
   the overall process of deploying software:

   1.  Engineering community: This community identifies technical
       problems to be solved and have the skills and resources necessary
       to build solutions using computing tools.  Engineers focus on why
       certain problems should be addressed, producing requirements that
       define the problem and solutions that meet those requirements.
       Their ultimate goal is to implement and ship software or hardware
       that effectively tackles these challenges.

   2.  Research community: Researchers are experts who explore the
       design space of different subject areas and evaluate potential
       solutions to problems with the goal of better understanding a
       topic.  This group develops methods for designing tools and
       performing experiments to validate hypotheses.  The research
       community concentrates on how problems should be solved, creating
       artifacts that help describe solutions.  These may include
       academic, peer-reviewed papers or software that studies or
       supports the shipping of software.

   3.  Standardization community: This group is responsible for
       developing technical specifications of protocols that others can
       implement, analyze, and verify.  The standardization community
       produces technical specifications that capture the details of a
       solution.  These specifications serve as a foundation for
       creating interoperable systems and ensuring the correct
       implementation of cryptographic algorithms and protocols.

   By following these guidelines and addressing the distinct needs of
   each stakeholder group, specification authors can create well-
   structured, informative specfications documents that facilitate the
   development, analysis, and implementation of high assurance
   cryptographic solutions.

3.  Guidelines for Cryptographic Specification Presentation

   Technical specifications do not stand on their own.  Their value is
   derived from their usefulness to the various communities that rely on
   them.  A specification can have amazing content but without the
   appropriate presentation, it may not be as useful as intended.  The
   guidelines in this section are a baseline set of recommendations for
   authors to consider when writing a cryptographic specification and
   are applicable beyond just cryptographic standards and are general
   good practices for specification writers.

3.1.  Simplicity

   Complexity is one of the main causes of software bugs.  The opposite
   of complexity is simplicity, which is a key aspect of creating
   effective cryptography specifications.  By striving for simplicity in
   problem statements, technical content, and presentation,
   specification authors can make their documents more accessible to a
   wider audience, including implementers, researchers, and protocol
   designers.  Simplicity reduces the cognitive load required to
   understand the specification and minimizes the risk of
   misinterpretation, which can lead to incorrect implementations and
   security vulnerabilities.

   To achieve simplicity, specification authors should focus on:

   *  Clearly defining the problem: Start by presenting a concise and
      easily comprehensible description of the problem that the
      specification aims to solve.  Avoid unnecessary jargon and strive
      to make the problem statement accessible to readers with varying
      levels of expertise in the field.  Ideally, each specification
      addresses precisely one clearly defined problem.

   *  Reducing complex concepts to component parts: When explaing with
      multi-step cryptographic algorithms or concepts, break them down
      into smaller, more manageable components.  This will make it
      easier for readers to understand the individual parts and their
      relationships to one another.

   *  Using straightforward language and terminology: Write the
      specification using clear, concise language, and consistent and
      broadly understood terminology.

   *  Avoid overly technical jargon, and define any terms that may be
      unfamiliar to some readers.  Limiting scope: Keep the
      specification focused on the primary problem or use case, i.e.,
      avoid feature creep.  Avoid introducing unrelated or peripheral
      topics, as this can create confusion and detract from the primary
      focus.

   *  Providing clear examples and diagrams: Include examples and visual
      aids, such as diagrams or visualizations, to help illustrate
      complex concepts or processes.  These tools can greatly improve
      the readability and understanding of the specification.

   By focusing on simplicity in document structure and prose in the
   specification writing process, authors can create documents that are
   more accessible and easier to understand, ultimately resulting in
   more reliable and secure implementations of cryptographic algorithms
   and protocols.  Focusing on simplicity in writing does not imply
   imprecision or brevity.  Even long documents can embody simplicity
   with the right attention to detail and structuring of prose.

3.2.  Precision

   Precision is a crucial aspect of writing high-quality specifications,
   particularly for cryptography, where small deviations or ambiguities
   can lead to severe security vulnerabilities.  A precise specification
   ensures that resulting implementations are consistent and correct,
   and that any analysis done matches the specification.

   To achieve precision in your specifications, consider the following
   recommendations:

   1.  Use clear and concise language: Write your specification using
       straightforward and unambiguous language.  Avoid jargon or
       colloquialisms that may lead to misinterpretation.  When
       introducing technical terms or concepts, provide clear
       definitions or explanations to ensure that all readers are on the
       same page.

   2.  Provide explicit instructions and avoid undefined behavior: When
       describing algorithms, protocols, or procedures, provide step-by-
       step instructions that can be easily followed by implementers
       with minimal or zero risk of misinterpretation.  This will help
       ensure that all implementations are consistent with the intended
       design and minimize the risk of errors or vulnerabilities.

   3.  Provide test vectors.  Test vectors help check for correctness of
       all behavior in the specification, especially those near edge
       cases.  For example, if a specification involves a branch or
       condition, then test cases should ideally be written to exercise
       both paths of the branch.  Sometimes this is infeasible, e.g., if
       probability of a particular branch happening is negligible,
       though more often than not branches can be adequately covered.

   4.  Employ formal notation or pseudocode: Using formal notation or
       pseudocode can help provide a precise description of algorithms,
       data structures, and protocols.  This will ensure that
       implementers, researchers, and protocol designers can accurately
       understand the intended behavior and interactions of the
       components within the specification.

   5.  Specify data formats and encodings: Clearly define data formats,
       encoding schemes, and serialization methods for all data types
       used in the specification.  This will help ensure that different
       implementations can interoperate seamlessly and reduce the
       likelihood of incompatibilities or communication errors.

   6.  Document assumptions and dependencies: Clearly state any
       assumptions or dependencies on external components, including
       other specifications or protocol descriptions.  This includes
       common dependencies like that of a random number generator.  This
       will help implementers and researchers understand the context in
       which your specification operates and any potential limitations
       or risks.

   Precise specifications minimize ambiguity and reduce the likelihood
   of implementation errors or inconsistencies.

3.3.  Consistency

   When a document is self-consistent and consistent with the
   expectations of documents of its type, it helps reduce ambiguity and
   is easier to consume.  Ensuring consistency across concepts,
   vocabulary, language, and presentation helps lower the cognitive load
   necessary for readers to understand and work with the specification.
   To achieve consistency in your specifications, consider the following
   recommendations:

   1.  Establish a consistent terminology: Develop a clear and
       consistent set of terms and definitions that will be used
       throughout the document.  Avoid using synonyms or multiple terms
       for the same concept, as this can lead to confusion.  When using
       acronyms, always provide their full meaning upon first usage and
       use the acronym consistently afterward.

   2.  Maintain a uniform style and tone: Write the specification using
       a consistent style and tone to ensure that readers can easily
       follow the content.  This includes consistent use of grammatical
       structures, punctuation, and capitalization.  If your
       organization has a style guide, adhere to it when writing the
       specification.

   3.  Use a logical structure: Organize your specification in a logical
       manner, starting with an overview and then progressing through
       the various components, algorithms, and protocols.  Make use of
       sections, subsections, and other structural elements to break up
       the content and make it easier to navigate and comprehend.  Use
       forward or backward references to make navigation of the document
       simpler.

   4.  Provide consistent formatting: Ensure that all elements within
       the specification, such as tables, figures, pseudocode and
       equations, are formatted consistently.  This will help readers
       quickly identify and understand these elements as they progress
       through the document.

   5.  Be consistent with conventions and notations: When using
       mathematical notation, programming languages, or other
       conventions, apply them consistently throughout the document.
       This will help prevent confusion and allow readers to focus on
       the content rather than deciphering different notations.

   6.  Reference external documents consistently: When referring to
       external documents or resources, such as other RFCs, standards,
       or research papers, provide consistent and accurate citations.
       This will enable readers to locate and review these resources as
       needed.

   7.  Keep the broader context in mind: Try to adopt the same
       terminology and conventions as other related documents the reader
       may be familiar with, especially for specifications that are
       developed based on peer-reviewed, published work.  Consistency
       across audiences is important to help lower the bar to successful
       collaboration and effective communication.  If the specification
       is intended to be part of the RFC series, reuse conventions from
       other documents in the series.

   By focusing on consistency in your cryptography specification, you
   will make it more accessible and easier to understand for
   implementers, researchers, and protocol designers.  This, in turn,
   will facilitate the development of correct, secure, and interoperable
   cryptographic systems based on your specification.

   Cryptography specifications are often unique in their use of
   mathematical objects to define protocols.  As such, presenting this
   content requires special guidance.

3.3.1.  Representing Mathematical Operations

   Mathematical operations are fundamental to cryptographic algorithms
   and protocols, and their clear and precise representation in
   specifications is crucial for correct implementation and analysis.
   This section provides guidelines for representing mathematical
   operations in cryptography specifications in a way that is both
   comprehensible and unambiguous to the target audiences, including
   implementers, researchers, and protocol designers.

3.3.1.1.  Notation Consistency

   Consistency in the notation used to represent mathematical operations
   is essential for avoiding confusion and ensuring that the
   specification is easy to understand.  Specification authors should
   establish a clear notation system from the beginning and use it
   consistently throughout the document.  This notation should be
   introduced with a comprehensive description or a reference to a well-
   known notation system to ensure that readers can easily follow the
   mathematical expressions.  For example, exponentiation can be
   represented by superscript or by a carat, but not by both.

3.3.1.2.  Use of Standard Mathematical Symbols

   Specification authors should use standard mathematical symbols to
   represent mathematical operations whenever possible.  This approach
   promotes clarity and reduces the risk of misinterpretation.  It is
   important to remember that some symbols may have different meanings
   in different contexts or disciplines.  In such cases, specification
   authors should clarify the intended meaning of a symbol within the
   context of the specification.  For example, when describing group
   operations using multiplicative notation, the multiplication symbol *
   should be used instead of the x symbol.

3.3.1.3.  Explicitly Defining Custom Operations

   When a specification requires custom mathematical operations or
   notation, these should be explicitly defined and accompanied by clear
   explanations and examples.  Specification authors should take care to
   minimize the use of custom operations to avoid creating unnecessary
   complexity and potential confusion.  When using custom operations, it
   is essential to ensure their definitions are unambiguous and easily
   understandable to the target audiences.  A glossary of terms MAY be
   useful when there are multiple custom or uncommon operations
   introduced in the specification.

3.3.1.4.  Pseudocode and Algorithmic Descriptions

   Providing algorithmic descriptions or pseudocode alongside
   mathematical expressions can greatly improve the clarity of a
   specification, particularly for implementers.  Pseudocode should be
   clear, concise, and closely resemble the structure of actual
   programming languages.  Including comments and explanations within
   the pseudocode can further enhance its readability and ease of
   understanding.  Consistent notation for describing loops or if/then
   statements should be used throughout the document.

3.3.1.5.  Visual Representations

   Visual representations, such as diagrams, tables or visualizations,
   can be a valuable tool for conveying complex mathematical concepts or
   relationships in a more digestible form.  When including visual
   representations, specification authors should ensure they are clear,
   accurately labeled, and consistent with the overall notation system.

4.  Guidelines for Cryptography Specification Content

   In addition to cryptographic specification clarity and accessibility
   through presentation format, the content of a specification also
   influences the overall value of the specification.  The syntax of
   cryptographic objects introduced and their interfaces, as well as the
   way in which the object is structured for use in applications, is
   important for reliable and secure implementations of cryptographic
   algorithms and protocols.  In this section, we discuss factors that
   relate to the content of the specifications and their impact on
   overall quality.

4.1.  Reusability

   Cryptography specifications that rely on bespoke sub-algorithms or
   lower-level components tend to be brittle and invite implementation
   issues.  To create efficient, interoperable, and widely adopted
   cryptographic systems, it is preferable to reuse existing components
   or primitives.  Reusability allows developers to build on existing
   work, reducing the time and effort required to create new
   implementations while leveraging established security properties and
   analyses.  This section discusses the importance of reusability in
   cryptography specifications and offers guidance for incorporating
   reusability principles into the specification development process.

4.1.1.  Build on Existing Specifications

   When developing a cryptography specification, it is advantageous to
   build upon existing, well-established specifications, protocols, and
   primitives where possible.  By doing so, specification authors can
   capitalize on the collective expertise of the community, as well as
   existing security analyses, implementation experiences, and best
   practices.  This approach reduces the potential for introducing new
   vulnerabilities and inconsistencies while promoting interoperability
   between different systems.

4.1.2.  Modular Design

   Emphasizing modularity in the design of cryptography specifications
   allows for greater flexibility and reusability.  By breaking down
   complex algorithms into smaller, self-contained components or
   modules, specification authors facilitate the reuse of these
   components in different contexts or applications.  A modular design
   also simplifies the process of updating or replacing specific
   components without affecting the overall system, making it easier to
   incorporate new research findings or technological advancements.  An
   example of a modular design is the prime-order group abstraction.
   Algorithms that use this abstraction admit a modular design where the
   group implementation is described in a separate document dedicated to
   the details of the implementation of the group.

4.1.3.  Clear Interfaces and Abstractions

   To promote misuse resistance and elegant higher-level designs,
   cryptography specifications should provide clear interfaces and
   abstractions for the components and primitives they describe.  Well-
   defined interfaces enable developers to understand and interact with
   a component without needing to know the details of its internal
   implementation.  This approach allows for the replacement or
   modification of components with minimal impact on the overall system
   and encourages the development of interchangeable components that can
   be reused across different applications and within protocols.
   Cryptographic objects typically have a set of functions associated
   with them that make up the interface.  Structuring the functions to
   fit well-understood and existing abstractions help make the job of
   using the object in higher-level algorithms easier and less prone to
   code duplication.

4.1.4.  Documentation and Examples

   Thorough documentation and illustrative examples play a crucial role
   in promoting reusability.  By providing comprehensive explanations of
   the specification's components, interfaces, and intended use cases,
   specification authors make it easier for developers to understand and
   implement the specification correctly.  Including examples of how
   components can be combined or applied in various scenarios further
   clarifies their usage and encourages their reuse in different
   contexts.

   By focusing on reusability in cryptography specifications, authors
   can help create secure, efficient, and adaptable cryptographic
   systems that can be more easily integrated, maintained, and updated,
   resulting in more robust and widely adopted solutions.

4.2.  Defining Security Definitions and Threat Models

   Cryptographic protocols are always used within a context of a broader
   system whose security relies on an understanding capabilities of
   potential attackers.  An incorrect definition or assumption about the
   threat models to a protocol can make a protocol that is safe in one
   context unsafe in a different context.  Precise definitions help
   researchers assess the security of the proposed algorithms and
   protocols, while comprehensible threat models enable implementers and
   protocol designers to understand the potential risks and limitations
   of the specification.  This section provides guidelines for defining
   security definitions and threat models in a way that caters to the
   needs of all target audiences.

4.2.1.  Defining Security Goals

   Specification authors should explicitly state the security goals that
   the proposed algorithms or protocols aim to achieve.  These goals
   should be comprehensive, covering all relevant aspects, such as
   confidentiality, integrity, authentication, non-repudiation, and
   availability as well as resistance to implementation flaws such as
   side-channels.  Furthermore, authors should clarify any trade-offs or
   limitations associated with the security goals, ensuring that the
   target audiences understand the intended balance between security and
   other factors, such as performance or ease of implementation.

4.2.2.  Formalizing Security Definitions

   Formalizing security definitions is essential for researchers to
   rigorously analyze the algorithms and protocols described in the
   specification.  Specification authors should strive to express
   security definitions in a formal language, using consistent notation
   and terminology.  The formal definitions should be accompanied by
   clear explanations and examples to make them more accessible to
   implementers and protocol designers who may not be familiar with
   formal methods.

4.2.3.  Describing the Threat Model

   A well-defined threat model provides an overview of the potential
   adversaries and the risks they pose to the security of the algorithms
   or protocols.  Specification authors should describe the threat model
   in detail, including the capabilities, resources, and motivations of
   adversaries.  Additionally, authors should identify any assumptions
   made about the adversarial model and explicitly state them to help
   the target audiences understand the intended scope and limitations of
   the specification's security guarantees.

4.2.4.  Addressing Known Vulnerabilities and Attacks

   Specification authors should discuss known vulnerabilities and
   attacks relevant to the proposed algorithms or protocols.  This
   discussion should include an explanation of how the specification
   addresses or mitigates these issues, as well as any residual risks
   that remain.  This information is valuable for implementers and
   protocol designers to understand the potential threats and for
   researchers to assess the robustness of the specification's security
   claims.

4.2.5.  Providing Guidance on Secure Implementation and Deployment

   To help ensure that the security definitions and threat models are
   effectively realized in practice, specification authors should
   provide guidance on secure implementation and deployment of the
   proposed algorithms and protocols.  This guidance may include best
   practices for avoiding common pitfalls, recommendations for
   cryptographic parameter selection, or considerations for securely
   integrating the specification into existing systems.

   By clearly defining security definitions and threat models in
   cryptography specifications, authors can facilitate a better
   understanding of the security properties and limitations of the
   proposed algorithms and protocols among implementers, researchers,
   and protocol designers.  Following these guidelines and the
   recommendations from [RFC3552] help make for a robust security
   considerations section for the specification.  Having a complete
   discussion of the threat model and security definitions helps prevent
   the use of cryptographic algorithms in insecure contexts.

5.  Catering to Target Audiences

   When writing a specification, it is important to consider the needs
   of the three primary audiences: implementers, researchers, and
   protocol designers.  Each group has unique requirements and goals,
   and the specification should be written in a way that addresses their
   specific concerns.

5.1.  Catering to Implementers

   Implementers require a clear, concise, and unambiguous specification
   to develop production-grade software.  To cater to implementers:

   *  Provide step-by-step instructions for implementing algorithms or
      processes, ensuring that all required inputs, outputs, and
      intermediate steps are defined.  Where exceptional cases occur,
      those should be noted and recommended error-handling steps should
      be given.  Include test vectors to help implementers verify the
      correctness of their implementations.

   *  Describe best practices for representing components of the
      specification in code, addressing exceptional cases and
      recommended error handling procedures, as well as aspects of the
      specification that are difficult to implement correctly (e.g.,
      where side-channel attacks might be possible).

   *  Clearly indicate any optional features, variations, or extensions,
      specifying their impact on interoperability and security.

5.1.1.  Test vectors

   Test vectors ideally cover all branches of the specification, with
   reasonable exceptions, such as branches that occur with negligible
   probability and as such are computationally infeasible to reproduce.
   To facilitate writing tests, where possible, all functions should be
   written with determinism in mind.  In particular, this means that
   functions that produce random outputs, such as a function that
   produces random elements in a prime-order group, should accept
   randomness as input and test vectors should specify this randomness
   as an input to the function.  Specifications should minimize internal
   calls to PRNGs or similar and emphasize determinism.

   Finally, specifications should make the connection between
   specification and test vectors clear by including explicit
   reproducibility steps that describe how test vectors were derived for
   parts of the specification.  This might mean pointing to a reference
   implementation with instructions for how to run it, where the
   reference implementation is written in a way that is clearly
   consistent with the specification.

   It's possible to include too many test vectors in a specification,
   which increases document length and decreases readability.  Authors
   should provide test vectors that cover:

   *  Typical test cases that exercise all logical pathways within an
      algorithm

   *  All valid but degenerate cases that result in error or early exit
      of an algorithm

   *  Exceptions that can be reached by attacker-controlled inputs

   It is NOT necessary to include test vectors for cases that are
   statistically improbable to be triggered, even by attacker-controlled
   input, based on the underlying cryptographic assumptions.  For
   example, if an error case is only reachable when an intermediate data
   point matches the pre-image of a hash value that was randomly
   generated, finding a test vector to trigger that case would require
   the ability to compute a hash pre-image, which is deemed unfeasible
   for sufficiently strong hash functions.  Exceptional cases that don't
   have test vectors should be explicitly noted in the algorithm
   description.

   Lastly, specifications should provide references to machine-readable
   test vectors (e.g., in JSON format) that persist alongside the
   specification.  This helps avoid possibly error-prone parsing in
   translating test vectors from a textual specification to test code
   inputs.

5.2.  Catering to Researchers

   Researchers need to understand the syntax and functionality of the
   cryptographic protocol or primitive to ensure its correctness and
   analyze its security properties.  To cater to researchers:

   *  Clearly define the underlying mathematical concepts and notations
      used in the specification, ensuring that all symbols, functions,
      and variables are consistently and accurately represented as
      explained in the section Representing Mathematical Operations.

   *  Provide detailed security definitions, goals, and threat models,
      including the capabilities and limitations of adversaries and
      their impact on parameter selection.  In general, authors should
      make input requirements that are important for the security of the
      protocol or construction maximally clear.  See: Defining Security
      Definitions and Threat Models.

   *  Describe any assumptions made about the underlying primitives or
      protocols and the justifications for these assumptions.  Such
      assumptions should include references to external documents that
      describe these underlying primitives or protocols where
      appropriate, unless there are gaps between how the underlying
      primitive or protocol is used and how it is described externally.

   *  Clearly present any security proofs, analysis, or references to
      existing literature that support the security claims of the
      specification.  If there are gaps between the specification and
      formal security analysis, these gaps should be noted, along with
      rationale that justifies the gaps.

5.3.  Catering to Protocol Designers

   Protocol designers in the standards community use specifications to
   understand how to safely use the cryptographic protocol or primitive
   when designing a higher-level protocol that depends on it.  To cater
   to protocol designers:

   *  Clearly define the interfaces, APIs, or functions exposed by the
      protocol or primitive, indicating how they should be used and any
      potential risks associated with their misuse.  For example, for
      each input to the protocol, it should be made clear whether or not
      these are attacker controlled and, if so, describe what steps must
      be taken to validate that input.

   *  Describe any corner cases or situations that may impact security,
      providing guidance on how to avoid or mitigate potential risks.
      This includes explicitly stating the probability of an algorithm
      failing due to invalid operations occurring (such as divide-by-
      zero) both in the typical case and under attacker-controlled
      inputs.

   *  Explain any dependencies or interactions with other protocols,
      primitives, or system components, highlighting potential
      compatibility or interoperability issues.

   *  Provide guidance on configuration, parameter selection, or
      deployment considerations that may affect the security or
      performance of the protocol in real-world scenarios.  This
      includes the impact of new discoveries that weaken the security
      assumptions of a primitive.

   By addressing the specific needs of implementers, researchers, and
   protocol designers, a specification can be more effectively
   understood, implemented, and analyzed, leading to more secure and
   interoperable systems.

6.  General Recommendations

   Developing effective cryptography specifications often requires
   collaboration between multiple stakeholders in the target audience,
   including engineers, researchers, and standardization organizations.
   Engaging in a collaborative process helps ensure that diverse
   perspectives and expertise are considered, resulting in more robust
   and widely applicable specifications.  This section discusses the
   importance of collaboration and compromise in specification
   development and offers recommendations for fostering a collaborative
   environment.

6.1.  Encourage Open Communication and Feedback

   Effective collaboration relies on open communication and an ongoing
   exchange of ideas and feedback.  By creating channels for
   communication, such as mailing lists, pull request threads (as
   described in [RFC8874]), or regular meetings, specification authors
   can facilitate discussions, address concerns, and gather valuable
   input from various stakeholders.  Encouraging an environment where
   feedback is welcomed and valued helps ensure that the specification
   benefits from diverse expertise and experiences.

6.2.  Seek External Expertise

   Involving external experts, such as researchers or engineers from
   different organizations, can help identify potential issues, uncover
   new insights, and provide a broader perspective on the specification.
   Engaging with experts such as those in the IRTF Crypto Review Panel
   who have different backgrounds or areas of expertise can also help
   identify potential gaps in the specification or highlight areas where
   further research or clarification is needed.

6.3.  Recognize and Address Conflicting Interests

   Collaboration often involves addressing conflicting interests or
   opinions among stakeholders.  It is essential to acknowledge these
   differences and work towards finding mutually agreeable solutions.
   This may require making compromises or revisiting previous decisions
   to ensure that the specification meets the needs of all involved
   parties.  By maintaining a flexible and open-minded approach,
   specification authors can build consensus and develop a more robust
   specification.

7.  Examples of Well-Written Specifications

   To provide a better understanding of how to write high-quality
   cryptography specifications, we will analyze specific sections from a
   well-written example: ChaCha20 and Poly1305 for IETF Protocols
   ([RFC8439]).

7.1.  ChaCha20 and Poly1305 for IETF Protocols (RFC 8439)

   [RFC8439] is a specification that describes the use of the ChaCha20
   stream cipher and the Poly1305 message authentication code for IETF
   protocols.  It demonstrates how to write a clear, comprehensive, and
   precise specification while catering to different audiences.

7.1.1.  Introduction and Overview

   The introduction in [RFC8439] clearly defines the purpose and
   motivation for the specification.  It provides context on the origins
   of ChaCha20 and Poly1305, and how they are used together to provide
   confidentiality and data integrity.  By presenting a concise and
   informative introduction, the specification sets the stage for the
   detailed technical descriptions that follow.

7.1.2.  Algorithm Descriptions

   The specification provides detailed and precise descriptions of the
   ChaCha20 and Poly1305 algorithms, including pseudocode, constants,
   and mathematical operations.  This section caters to implementers,
   ensuring that they have all the necessary information to create
   consistent and correct implementations.  The mathematical operations
   are expressed in a clear and unambiguous manner, which helps both
   implementers and researchers understand the algorithms better.

7.1.3.  Test Vectors

   [RFC8439] includes test vectors for both ChaCha20 and Poly1305,
   providing concrete examples of inputs and expected outputs for the
   algorithms.  This section is invaluable for implementers, allowing
   them to verify that their implementations are correct and compatible
   with others.

7.1.4.  Security Considerations

   The specification dedicates an entire section to security
   considerations, catering to researchers and protocol designers.  It
   discusses potential attacks and their mitigations, recommendations
   for nonce usage, and the security properties of the algorithms.  This
   section also provides references to academic papers and other
   resources for further reading, enabling researchers to delve deeper
   into the security aspects of the specified algorithms.

7.1.5.  IANA Considerations and References

   [RFC8439] concludes with IANA considerations and a list of
   references, ensuring that the specification is well-integrated with
   existing IETF processes and standards.  The IANA considerations
   section is essential for protocol designers who need to register new
   values or coordinate with existing registries.

7.1.6.  Problematic Aspects

   A criticism of this document is that it does not cater enough to
   protocol designers in that it does not explicitly define a decryption
   algorithm.  Researchers familiar with the concept of a stream cipher
   understand that decryption and encryption are identical in stream
   cipher constructions, but this may not be clear to implementers.

   In summary, [RFC8439] serves as an excellent example of a well-
   written cryptography specification, providing clear, precise, and
   comprehensive information for implementers, researchers, and protocol
   designers alike.  By studying and emulating the structure and content
   of specifications like [RFC8439], authors can create high-quality
   specifications that cater to the diverse needs of their target
   audiences.

8.  Examples of Specifications That Could Be Improved

   [RFC8032] is a specification that describes the Edwards-curve Digital
   Signature Algorithm (EdDSA).  This specification had several errata
   filed against it for corrections and has had documented criticisms
   published online.

8.1.  Test Vectors

   The test vectors included in this document were not comprehensive and
   did not cover all the cases described in the algorithm, resulting in
   multiple incompatible implementations.  There were also issues with a
   "greater than" comparison which should have been a "greater than or
   equal to" which were not explicitly covered by the test vectors.

8.2.  Unnecessary Branching

   Some components of the cryptographic algorithms in EdDSA had branches
   that sometimes led to different implementation behavior.  In
   particular, in the verification step for Ed25519, the following text
   exists: "Check the group equation [8][S]B = [8]R + [8][k]A'.  It's
   sufficient, but not required, to instead check [S]B = R + [k]A'."
   This alternative branch has led to disagreement between what
   signatures are valid or not, which has a profound effect on
   applications.  Minimizing and removing similar branches - especially
   those that exist in the name of performance - should be a goal of all
   cryptographic specifications.

8.3.  Compatibility and Modularity

   EdDSA is a variant of the Schnorr signature scheme, but with some
   small variations that make it incompatible with other related Schnorr
   signature schemes.  This includes a "clamping" operation that makes
   EdDSA keys and operations incompatible with x25519 ([RFC7748]).  Many
   of the issues in the specification derive from the fact that the
   specification was written to match an existing implementation rather
   than define an algorithm.  This limited the authors from focusing on
   compatibility with other related standards and primitives, resulting
   in numerous issues.

9.  Conclusion

   This document provides guidelines for writing effective cryptography
   specifications, emphasizing the importance of catering to different
   audiences, such as implementers, researchers, and protocol designers,
   with the end goal of enabling high-assurance cryptographic software.
   By focusing on simplicity, precision, consistency, reusability,
   collaboration, and compromise, specification authors can create
   documents that are easier to understand, implement, and analyze.

   We have also discussed the representation of mathematical operations
   and the importance of clearly defining security definitions and
   threat models.  These elements are critical in ensuring that
   specifications are not only technically accurate but also convey the
   necessary information to properly assess the security properties of
   cryptographic algorithms and protocols.

   Finally, we have examined a well-written example, [RFC8439], to
   demonstrate how these guidelines can be applied in practice.  By
   highlighting specific sections of this specification, we have shown
   how authors can create high-quality specifications that cater to the
   diverse needs of their target audiences.

   In conclusion, the process of writing cryptography specifications is
   both an art and a science.  The guidelines presented in this document
   should serve as a foundation for authors, but it is essential to
   remain open to feedback and collaboration with the broader community.
   By doing so, we can continue to develop and refine the specifications
   that underpin the secure and reliable communication systems of today
   and the future.

10.  Security Considerations

   This document discusses best practices for writing and editing
   cryptography specifications.  It does not provide any guidance for
   the semantic contents of those specifications.

11.  IANA Considerations

   This document has no IANA actions.

12.  References

12.1.  Normative References

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <https://www.rfc-editor.org/rfc/rfc2119>.

   [RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
              2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
              May 2017, <https://www.rfc-editor.org/rfc/rfc8174>.

12.2.  Informative References

   [RFC3552]  Rescorla, E. and B. Korver, "Guidelines for Writing RFC
              Text on Security Considerations", BCP 72, RFC 3552,
              DOI 10.17487/RFC3552, July 2003,
              <https://www.rfc-editor.org/rfc/rfc3552>.

   [RFC7748]  Langley, A., Hamburg, M., and S. Turner, "Elliptic Curves
              for Security", RFC 7748, DOI 10.17487/RFC7748, January
              2016, <https://www.rfc-editor.org/rfc/rfc7748>.

   [RFC8032]  Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital
              Signature Algorithm (EdDSA)", RFC 8032,
              DOI 10.17487/RFC8032, January 2017,
              <https://www.rfc-editor.org/rfc/rfc8032>.

   [RFC8439]  Nir, Y. and A. Langley, "ChaCha20 and Poly1305 for IETF
              Protocols", RFC 8439, DOI 10.17487/RFC8439, June 2018,
              <https://www.rfc-editor.org/rfc/rfc8439>.

   [RFC8874]  Thomson, M. and B. Stark, "Working Group GitHub Usage
              Guidance", RFC 8874, DOI 10.17487/RFC8874, August 2020,
              <https://www.rfc-editor.org/rfc/rfc8874>.

Authors' Addresses

   Nick Sullivan
   Cloudflare, Inc.
   101 Townsend St
   San Francisco,
   United States of America
   Email: nick@cloudflare.com


   Christopher A. Wood
   Cloudflare, Inc.
   101 Townsend St
   San Francisco,
   United States of America
   Email: caw@heapingbits.net