<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.17 -->
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ssmith-cesr-00" category="info" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.11.1 -->
  <front>
    <title abbrev="CESR">Composable Event Streaming Representation (CESR)</title>
    <seriesInfo name="Internet-Draft" value="draft-ssmith-cesr-00"/>
    <author initials="S." surname="Smith" fullname="S. Smith">
      <organization>ProSapien LLC</organization>
      <address>
        <email>sam@prosapien.com</email>
      </address>
    </author>
    <date year="2021" month="November" day="28"/>
    <area>TODO</area>
    <workgroup>TODO Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>The Composable Event Streaming Representation (CESR) is dual text-binary encoding format that has the unique property of text-binary concatenation composability. This composability property enables the round trip conversion en-masse of concatenated primitives between the text domain and binary domain while maintaining separability of individual primtives. This enables convenient usability in the text domain and compact transmission in the binary domain. CESR primitives are self-framing. CESR supports self-framing group codes that enable stream processing and pipelining in both the text and binary domains. CESR supports composable text-binary encodings for general data types as well as suites of cryptographic material. Popular cryptographic material suites have compact encodings for efficiency while less compact encodings provide sufficient extensibility to support all foreseeable types. CESR streams also support interleaved JSON, CBOR, and MGPK serializations. CESR is a universal encoding that uniquely provides dual text and binary domain representations via composable conversion.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/WebOfTrust/ietf-cesr"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>One way to better secure Internet communications is to use cryptographically verifiable primitives and data structures in communication. These provide essential building blocks for zero trust computing and networking architectures. Traditionally cryptographic primitives that include but are not limited to digests, salts, seeds (private keys), public keys, and digital signatures have been largely represented in some type of binary encoding. This limits their usability in domains or protocols that are human centric or equivalently that only support <xref target="ASCII" format="default"/> text-printable characters, <xref target="RFC20" format="default"/>. These domains include source code, <xref target="JSON" format="default"/> documents, <xref target="RFC4627" format="default"/>, system logs, audit logs, Ricardian contracts, and human readable text documents of many types.</t>
      <t>Generic binary-to-text, <xref target="Bin2Txt" format="default"/>, or simply textual encodings such as Base64, <xref target="RFC4648" format="default"/>, do not provide any information about the type or size of the underlying cryptographic primitive. Base64 only provides value information. More recently <xref target="Base58Check" format="default"/> was developed as a fit for purpose textual encoding of cryptographic primitives for shared distributed ledger applications that in addition to value may include information about the type and in some cases the size of the underlying cryptographic primitive, <xref target="WIF" format="default"/>. But each application may use a non-interoperable encoding of type and optionally size. Interestingly because a binary encoding may include as a subset some codes that are in the text-printable compatible subset of <xref target="ASCII" format="default"/> such as ISO Latin-1, <xref target="Latin1" format="default"/> or UTF-8, <xref target="UTF8" format="default"/>, one may <em>serendipitously</em> find, for a given cryptographic primitive, a text-printable type code from a binary code table such as the table <xref target="MCTable" format="default"/> from <xref target="MultiCodec" format="default"/> for <xref target="IPFS" format="default"/>. Indeed some <xref target="Base58Check" format="default"/> applications take advantage of the binary MultiCodec tables but only used <em>serendipitous</em> text compatible type codes. Serindipoudous text encodings that appear in binary code tables, do not, however, work in general for any size or type. So the serindipoudous approach is not universally applicable and is no substitute for a true textual encoding protocol for cryptographic primitives.</t>
      <t>In general there is no standard text based encoding protocol that provides universal type, size, and value encoding for cryptographic primitives. Providing this capability is the primary motivation for the encoding protocol defined herein.</t>
      <t>Importantly, a textual encoding that includes type, size, and value is self-framing. A self-framing text primitive may be parsed without needing any additional delimiting characters. Thus a stream of concatenated primitives may be individually parsed without the need to encapsulate the primitives inside textual delimiters or envelopes. Thus a textual self-framing encoding provides the core capability for a streaming text protocol like <xref target="STOMP" format="default"/> or <xref target="RAET" format="default"/>. Although a first class textual encoding of cryptographic primitives is the primary motivation for the CESR protocol defined herein, CESR is sufficiently flexible and extensible to support other useful data types, such as, integers of various sizes, floating point numbers, date-times as well as generic text. Thus this protocol is generally useful to encode in text data data structures of all types not merely those that contain cryptographic primitives.</t>
      <t>Textual encodings have numerous usability advantages over binary encodings. The one advantage, however, a binary encoding has over text is compactness. An encoding protocol that has the property we call <em>text-binary concatentation composability</em> or more succinctly <em>composability</em>, enables both the usability of text and the compactness of binary. Composability may be the most uniquely innovative and useful feature of the encoding protocol defined herein.</t>
      <section anchor="composability" numbered="true" toc="default">
        <name>Composability</name>
        <t><em>Composability</em> as defined here is short for <em>text-binary concatenation composability</em>. An encoding has <em>composability</em> when any set of self-framing concatenated primitives expressed in either the text domain or binary domain may be converted as a group to the other domain and back again without loss. Essentially <em>composability</em> provides round-trippable lossless conversion between text and binary representations of any set of concatenated primitives when converted as a set not merely individually. The property enables a stream processor to safely convert en-masse a a stream of text primitives to binary for compact transmission that the stream processor at the other end may safely convert back to text en-masse for further processing or archival storage as text. With the addition of group framing codes as composable primitives, such a composable encoding protocol enables pipelining (multi-plexing and de-multiplexing) of streams in either text or compact binary. This allows management at scale for high-bandwidth applications that benefit from core affinity off-loading of streams <xref target="Affinity" format="default"/>.</t>
      </section>
      <section anchor="abstract-domain-representations" numbered="true" toc="default">
        <name>Abstract Domain Representations</name>
        <t>The cryptographic primitives defined here (i.e. CESR) inhabit three different domains each with a different representation.  The first domain we call streamable text or <em>text</em> and is denoted as <em>T</em>. The third domain we call streamable binary or <em>binary</em> and is denoted as <em>B</em>. Composability is defined between the <em>T</em> and <em>B</em> domains. The third domain we call <em>raw</em> and is denoted as <em>R</em>. The third domain is special because primitives in this domain are represented by a pair or two tuple of values namely <em>(text code, raw binary)</em>. The <em>text code</em> element of the <em>R</em> domain pair is string of one or more text characters that provides the type and size information for the encoded primitive when in the <em>T</em> domain. Actual use of cryptographic primitives happens in the <em>R</em> domain using the <em>raw binary</em> element of the <tt>(code, raw binary)</tt> pair. Cryptographic primitive values are usually represented as strings of bytes that represent very large integers. Cryptographic libraries typically assume that the inputs and outputs of their functions will be such strings of bytes. The <em>raw binary</em> element of the <em>R</em> domain pair is such a string of bytes.</t>
        <t>A given primitive in the <em>T</em> domain is denoted with <tt>t</tt>.  A member of an indexed set of primitives in the <em>T</em> domain is denoted with <tt>t[k]</tt>. Likewise a given primitive in the <em>B</em> domain is denoted with <tt>b</tt>. A member of an indexed set of primitives in the <em>B</em> domain is denoted with <tt>b[k]</tt>. Similarly a given primitive in the <em>R</em> domain is denoted with <tt>r</tt>. A member of indexed set of primitives in the <em>R</em> domain is denoted with  <tt>r[k]</tt>.</t>
        <section anchor="transformations-between-domains" numbered="true" toc="default">
          <name>Transformations Between Domains</name>
          <t>Although, the composability property, mentioned above but described in detail below, only applies to conversions back and forth between the <em>T</em>, and <em>B</em>, domains, conversions between the <em>R</em>, and <em>T</em> domains as well as conversions between the <em>R</em> and <em>B</em> domains are also defined and supported by the protocol. As a result there is a total of six transformations, one in each direction between the three domains.</t>
          <t>Let <tt>T(B)</tt> denote the abstract transformation function from the <em>B</em> domain to the <em>T</em> domain. This is the dual of <tt>B(T)</tt> below.</t>
          <t>Let <tt>B(T)</tt> denote the abstract transformation function from the <em>T</em> domain to the <em>B</em> domain. This is the dual of <tt>T(B)</tt> above.</t>
          <t>Let <tt>T(R)</tt> denote the abstract transformation function from the <em>R</em> domain to the <em>T</em> domain. This is the dual of <tt>R(T)</tt> below.</t>
          <t>Let <tt>R(T)</tt> denote the abstract transformation function from the <em>T</em> domain to the <em>R</em> domain. This is the dual of <tt>T(R)</tt> above.</t>
          <t>Let <tt>B(R)</tt> denote the abstract transformation function from the <em>R</em> domain to the <em>B</em> domain. This is the dual of <tt>R(B)</tt> below.</t>
          <t>Let <tt>R(B)</tt> denote the abstract transformation function from the <em>B</em> domain to the <em>R</em> domain. This is the dual of <tt>B(R)</tt> above.</t>
          <t>Given these transformations we can complete of circuit of transformations that starts in any of the three domains and then crosses over the other two domains in either direction. For example starting in the <em>R</em> domain we can traverse a circuit that crosses into the <em>T</em> and <em>B</em> domains and then crosses back into the <em>R</em> domain as follows:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
R->T(R)->T->B(T)->B->R(B)->R
]]></artwork>
          <t>Likewise starting in the <em>R</em> domain we can traverse a circuit that crosses into the <em>B</em> and <em>T</em> domains and then crosses back into the <em>R</em> domain as follows:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
R->B(R)->B->T(B)->T->R(T)->R
]]></artwork>
        </section>
        <section anchor="concatenation-composability-property" numbered="true" toc="default">
          <name>Concatenation Composability Property</name>
          <t>Let <tt>+</tt> represent concatenation. Concatenation is associative and may be applied to any two primitives or any two groups or sets of concatenated primitives. For example:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
t[0] + t[1] + t[2] + t[3] = (t[0] + t[1]) + (t[2] + t[3])
]]></artwork>
          <t>If we let <tt>cat(x[k])</tt> denote the concatenation of all elements of a set of indexed primitives <tt>x[k]</tt> where each element is indexed by a unique value of <tt>k</tt> then we can denote the transformation between domains of a concatenated set of primitives as follows:</t>
          <t>Let <tt>T(cat(b[k]))</tt> denote the concrete transformation of a given concatenated set of primitives, <tt>cat(b[k])</tt> from the <em>B</em> domain to the <em>T</em> domain.</t>
          <t>Let <tt>B(cat(t[k]))</tt> denote the concrete transformation of a given concatenated set of primitives, <tt>cat(t[k])</tt> from the <em>T</em> domain to the <em>B</em> domain.</t>
          <t>The concatentation composability property between <em>T</em> and <em>B</em> is expressed as follows:</t>
          <t>Given a set of primitives <tt>b[k]</tt> and <tt>t[k]</tt> and transformations <tt>T(B)</tt> and <tt>B(T)</tt> such that <tt>t[k] = T(b[k])</tt> and <tt>b[k] = B(t[k])</tt> for all <tt>k</tt>, then <tt>T(B)</tt> and <tt>B(T)</tt> are jointly concatenation composable if and only if,</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
T(cat(b[k]))=cat(T(b[k])) and B(cat(t[k]))=cat(B(t[k])) for all k
]]></artwork>
          <t>Basically composability (over concatenation) means that the transformation of a set (as a whole) of concatenated primitives is equal to the concatentation of the set of individually transformed primitives.</t>
          <t>For example, suppose we have two primitives in the text domain, namely, <tt>t[0]</tt> and <tt>t[1]</tt> that each respectively transform to primitives in the binary domain, namely, <tt>b[0]</tt> and <tt>b[1]</tt>. The transformation duals <tt>B(T)</tt> and <tt>T(B)</tt> are composable if and only if,</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
B(t[0] + t[1]) = B(t[0]) + B(t[1]) = b[0] + b[1]
]]></artwork>
          <t>and</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
T(b[0] + b[1]) = T(b[0]) + T(b[1]) = t[0] + t[1]
]]></artwork>
          <t>The composability property allows us to create arbitrary compositions of primitives via concatenation in either the <em>T</em> or <em>B</em> domain and then convert the composition en masse to the other domain and then de-concatenate the result without loss. The self-framing property of the primitives enables de-concatenation.</t>
          <t>The composability property is an essential building block for streaming in either domain. The use of framing primitives that count other primitives enables multiplexing and demultiplexing of arbitrary groups of primitives for pipelining and/or on or off loading of streams. The text domain provides usability and the binary domain provides compactness. Composability allows efficient conversion of composed (concatenated) groups of primitives without having to individually parse each primitive.</t>
        </section>
      </section>
    </section>
    <section anchor="concrete-domain-representations" numbered="true" toc="default">
      <name>Concrete Domain Representations</name>
      <t>Text, <em>T</em>, domain representations in CESR use only the characters from the the URL and filename safe variant of the IETF RFC-4648 Base64 standard, <xref target="RFC4648" format="default"/>. Unless otherwise indicated all references to Base64 (RFC-4648) in this document imply the URL and filename safe variant. The URL and filename safe variant of Base64 uses in order the 64 characters <tt>A</tt> through <tt>Z</tt>, <tt>a</tt> through <tt>z</tt>, <tt>-</tt>, and <tt>_</tt> to encode 6 bits of information. In addition Base64 uses the <tt>=</tt> character for padding but CESR does not use the <tt>=</tt> character for any purpose.</t>
      <t>Base64, <xref target="RFC4648" format="default"/>, by itself does not satisfy the composability property. 
In CESR, both <em>T</em> and <em>B</em> domain representations include a prepended framing code prefix that is structured in such a way as to ensure composability.</t>
      <t>Suppose for example we wanted to use naive Base64 characters in the text domain and naive binary bytes in the binary domain. For the sake of the example we will call these naive text and naive binary encodings and domains. Recall that a byte encodes 8 bits of information and a Base64 character encodes 6 bits information. Furthermore suppose that we have three primitives denoted <tt>x</tt>, <tt>y</tt>, and <tt>z</tt> in the naive binary domain with lengths of 1, 2, and 3 bytes respectively.</t>
      <t>In the following diagrams we denote each byte in a naive binary primitive with zero based most significant bit first indicies.  For example, <tt>b1</tt> is bit one <tt>b0</tt> is bit zero and <tt>B0</tt> for byte zero, <tt>B1</tt> for byte 1, etc.</t>
      <t>The byte and bit level diagram for <tt>x</tt> is shown below where we use <tt>X</tt> to denote its bytes:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
|           X0          |
|b7:b6:b5:b4:b3:b2:b1:b0|
]]></artwork>
      <t>Likewise for <tt>y</tt> below:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
|           Y0          |           Y1          |
|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
]]></artwork>
      <t>And finally for <tt>z</tt> below:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
|           Z0          |           Z1          |           Z2          |
|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
]]></artwork>
      <t>When doing a naive Base64 conversion of a naive binary primitive, one Base64 character represents only six bits from a given byte. In the following diagrams each character of a Base64 conversion is denoted with zero based most significant character first indicies.</t>
      <t>Therefore to encode <tt>x</tt> in Base64, for example, requires at least two Base64 characters because the zeroth character only captures the six bits from the first byte and another character is needed to capture the other two bits. The convention in Base64 is use a Base64 character where the non-coding bits are zeros. This is diagrammed as follows:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
|           X0          |
|b7:b6:b5:b4:b3:b2:b1:b0|
|        C0       |        C1       |
]]></artwork>
      <t>Naive Base64 encoding always pads each individual conversion of a string of bytes to an even multiple of four characters. This provides something is not true composability but does ensure that multiple distinct concatentated conversions are separable. It may be described as a sort of one-way composability. So with pad characters, denoted by replacing the spaces with <tt>=</tt> characters, the Base64 conversion of <tt>x</tt> is as follows:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
|           X0          |
|b7:b6:b5:b4:b3:b2:b1:b0|
|        C0       |        C1       |========C2=======|========C3=======|

]]></artwork>
      <t>Likewise <tt>y</tt> requires at least 3 Base64 characters to capture all of its 16 bits as follows:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
|           Y0          |           Y1          |
|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
|        C0       |        C1       |        C1       |
]]></artwork>
      <t>Alignment on a 4 character boundary requires one pad character this becomes:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
|           Y0          |           Y1          |
|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
|        C0       |        C1       |        C2       |========C3=======|
]]></artwork>
      <t>Finally because <tt>z</tt>  requires exactly four Base64 characters to capture all of its 24 bits, there are no pad characters needed.</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
|           Z0          |           Z1          |           Z2          |
|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
|        C0       |        C1       |        C2       |        C3       |
]]></artwork>
      <t>Suppose we concatenate <tt>x + y</tt> into a three byte composition in the naive binary domain before Base64 encoding the concatentated whole. We have the following:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
|           X0          |           Y0          |           Y1          |
|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
|        C0       |        C1       |        C2       |        C3       |
]]></artwork>
      <t>We see that the least significant two bits of X0 are encoded into the same character, <tt>C1</tt> as the most significant four bits of <tt>Y0</tt>. Therefore, a text domain parser is unable to cleanly de-concatenate the conversion of <tt>x + y</tt> into separate text domain primitives. Thus naive binary to Base64 conversion does not satisfy the composability constraint.</t>
      <t>Suppose instead we start in the text domain with primitives <tt>u</tt> and <tt>v</tt> of lengths 1 and 3 characters respectively.
If we concatenate these two primitives as <tt>u + v</tt> in text domain and then convert as a whole to naive binary. We have the following:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
|        U0       |        V0       |        V1       |        V2       |
|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
|           B0          |           B1          |           B2          |
]]></artwork>
      <t>We see that all six bits of information in <tt>U0</tt> is included with the least significant two bits of information in <tt>V0</tt> in <tt>B0</tt>. Therefore a binary domain parser is unable to cleanly de-concatenate the conversion of <tt>u + v</tt> into separate binary domain primitives. Thus naive Base64 to binary conversion does not satisfy the composability constraint.</t>
      <t>Indeed the composability property is only satisfied if each primitive in the <em>T</em> domain is an integer multiple of four Base64 characters and each primitive in the <em>B</em> domain is an integer multiple of three bytes. Each of Four Base64 characters and three bytes capture twenty-four bits of information. Twenty-four is the least common multiple of six and eight. Therefore primitive lengths that integer multiples of either four Base64 characters or three bytes in their respective domains capture integer multiples of twenty-four bits of information. Given that constraint, conversion of concatenated primitives in one domain never result in two adjacent primitives sharing the same byte or character in the converted domain.</t>
      <t>To elaborate, when converting streams made up of concatenated primitives back and forth between the <em>T</em> and <em>B</em> domains, the converted results will not align on byte or character boundaries at the end of each primitive unless the primitives themselves are integer multiples of twenty-four bits of information. In other words all primitives must be aligned on twenty-four bit boundaries to satisfy the composibility property. This means that the minimum length of any primitive in the B domain is three bytes and the minimum length of any primitive in the T domain is four Base64 characters.</t>
      <section anchor="stable-text-type-codes" numbered="true" toc="default">
        <name>Stable Text Type Codes</name>
        <t>There are many coding schemes that could satisfy the composability constraint of alignment on 24 bit boundaries. The main reason for using a <em>T</em> domain centric encoding is higher usability or human friendliness. Indeed a primary design goal of CESR is to select an encoding approach that provides such high usability or human friendliness in the <em>T</em> domain. This type of usability goal is simpley not realizable in the <em>B</em> domain. The B domain's purpose is merely to provide convenient compactness at scale. We believe usability in the <em>T</em> domain is maximized when the type portion of the prepended framing code is <em>stable</em> or <em>invariant</em>. Stable type coding makes it much easier to recognize primitives of a given type  when debugging source, reading messages, or documents in the <em>T</em> domain that include encoded primitives. This is true even when those primitives have different lengths or values. For primitive types that have fixed lengths, i.e. all primitives of that type have the same length, stable type coding aids not only visual type but visual size recognition.</t>
        <t>Usability of stable type coding is maximized when the type portion appears first in the framing code. Stability also requires that for a given type, the type coding portion must consume a fixed integer number of characters in the <em>T</em> domain. To clarify, as used here, stable type coding in the <em>T</em> domain never shares information bits with either length or value coding in any given framing code character and appears first in the framing code. Stable type coding in the <em>T</em> domain translates to stable type coding in the <em>B</em> domain except that the type coding portion of the framing code may not respect byte boundaries. This is an acceptable tradeoff because binary domain parsing tools easily accommodate bit fields and bit shifts while text domain parsing tools no not. By in large text domain parsing tools only process whole characters. This is another reason to impose a stability constraint on the <em>T</em> domain type coding instead of the <em>B</em> domain.</t>
      </section>
      <section anchor="code-characters-and-ante-bytes" numbered="true" toc="default">
        <name>Code Characters and Ante Bytes</name>
        <t>There are two ways to provide the required alignment on 24 bit boundaries to satisfy the composability property. One is to increase the size of text code to ensure that the <em>T</em> domain primitive has a total size (length) that is an integer multiple of 4. The other is to increase the size of the raw binary value by pre-pending pad bytes of zeros to the raw binary value before conversion to Base64 to ensure the total size of the raw binary value with pre-pended bytes is an integer multiple of 3 bytes. This ensures that size in characters of the Base64 conversion of the pre-padded raw binary is an integer multiple of 4 characters. In this case the length of the pre-pended type code <bcp14>MUST</bcp14> also therefore be an integer multiple of 4 characters so that the total length of the <em>T</em> domain primitive with code is an integer multiple of 4 characters.</t>
        <t>The first way may be more compact in some cases. The second way may be easier to compute in some cases. In order to avoid confusion with the use of the term <tt>pad character</tt>, when pre-padding with bytes we use the term <tt>ante bytes</tt>. The term pad may be confusing not merely because both ways use a type of padding but it is also true that the the number of pad characters when padding post-conversion equals the number of ante bytes when padding pre-conversion.</t>
        <t>Suppose for example the raw binary value is 32 bytes in length. The next higher integer multiple of 3 is 33 bytes. Thus 1 additional ante byte is needed to make the size (length in byte) of raw binary an integer multiple of 3. The 1 ante byte makes that combination a total of 33 bytes in length. The resultant Base64 converted value will be 44 characters in length, which is an integer multiple of 4 characters. In contrast, recall that when  we convert a 32 byte raw binary value to Base64 the converted value will have 1 pad character which may be replaced with a text code character. In both cases the resultant length in Base64 is 44 characters.</t>
        <t>Similarly, a 64 byte sized raw binary needs 2 ante bytes to make the combination 66 bytes in length where 66 is the next integer multiple of 3 greater than 64. When converted the result is 88 characters in length. The number of pad characters added on the result of the Base64 conversion of a 64 byte raw binary is also 2.</t>
        <t>In summary we can use pre-conversion ante bytes or post-conversion pad characters in our coding scheme to ensure composable 24 bit alignment.</t>
      </section>
      <section anchor="multiple-code-table-approach" numbered="true" toc="default">
        <name>Multiple Code Table Approach</name>
        <t>The design goals for CESR framing codes include minimizing the framing code size for the most frequently used (most popular) codes while also supporting a sufficiently comprehensive set of codes for all foreseeable current and future applications. This requires a high degree of both flexibility and extensibility. We believe this is best achieved with multiple code tables each with a different coding scheme that is optimized for a different set of features instead of a single one-size-fits-all scheme. A specification that supports multiple coding schemes may appear on the surface to be much more complex to implement but careful design of the coding schemes can reduce implementation complexity by using a relatively simple single integrated parse and conversion table. Parsing in any given domain given stable type codes may then be implemented with a single function that simply reads the appropriate type selector in the table to know how to parse and convert the rest of primitive.</t>
      </section>
    </section>
    <section anchor="text-coding-scheme-design" numbered="true" toc="default">
      <name>Text Coding Scheme Design</name>
      <section anchor="text-code-size" numbered="true" toc="default">
        <name>Text Code Size</name>
        <t>Recall from above, the R domain representation is a pair<tt>(text code, raw binary)</tt>. The text code is stable and begins with one or more Base64 characters that provide the primitive type may also include one or more additional characters that provide the length. The actual usable cryptographic material is provided by the <em>raw binary</em> element. The corresponding <em>T</em> domain representation of this pair is created by first converting the <em>raw binary</em> element to Base64, then stripping off any Base64 pad characters then finally prepending the text code element to the result of the conversion.</t>
        <t>When the length of a given naive binary string is not an integer multiple of three bytes, standard Base64 conversion software appends one or two pad characters to the resultant Base64 conversion.</t>
        <t>With pad characters, a set of Base64 strings resulting from the subsequent conversions of a set of binary strings could be concatenated and then converted back to binary en masse while preserving byte boundaries. In order to preserve byte boundaries the pad characters <bcp14>MUST</bcp14> be stripped in the conversion.  Because the pad characters are stripped, this approach does not provide two-way or true composability as defined above. The number of pad characters is a function of the length of the binary string. Let <em>N</em> be the length the string. When <tt>N mod 3 = 1</tt> then there are 8 bits in remainder that must be encoded into Base64. Recall the examples above, a single byte (8 bits) require two Base64 characters. The first encodes  6 bits and the second the remaining 2 bits for a total of 8 bits. The last character is selected such that its non-coding 4 bits are zero. Thus two additional pad characters are required to pad out the resulting conversion so that its length is an integer multiple of 4 Base64 characters. When <tt>N mod 3 = 2</tt> then two bytes (16 bits) require three Base64 characters. The first two encode 6 bits each (for 12 bits) and the third encodes the remaining 4 bits for a total of 16. The last character is selected such that its non-coding 2 bits are zero. Thus one additional pad character is required to pad out the resulting conversion so that is length is an integer multiple of 4 characters. When <tt>N mod 3 = 0</tt> then the binary string is aligned on a 24 bit boundary and no pad characters are required to ensure the length of the Base64 conversion is an integer multiple of 4 characters.</t>
        <t>The number of requred Base64 pad characters to ensure that a given conversion to Base64 has a length that is an integer multiple of 4 may be computed with the following formula:</t>
        <t><tt>ps = (3 - (N mod 3)) mod 3)</tt>, where <tt>ps</tt> is the pad size and <tt>N</tt> is the size in bytes of the binary string.</t>
        <t>Recall that composability is provided here by prepending text codes that are of the appropirate length to ensure 24 bit boundaries in both the <em>T</em> and the corresponding <em>B</em> domain. The advantage of this approach is that naive Base64 software tooling may be used to convert back and forth between the <em>T</em> and <em>B</em> domains, i.e. <tt>T(B)</tt> is naive Base64 encode and <tt>B(T)</tt> is naive Base64 decode. In other words CESR primitives are compatible with existing Base64 (RFC-4648) tooling. Whereas new software tooling is needed for conversions between the <em>R</em> and <em>T</em> domains, e.g. <tt>T(R)</tt> and <tt>R(T</tt> and the <em>R</em> and <em>B</em> domains, e.g. <tt>B(R)</tt> and <tt>R(B)</tt>.</t>
        <t>This pad size computation is also useful for computing the size of the text codes. Because true composability also requires that the <em>T</em> domain value <bcp14>MUST</bcp14> be an integer multiple of 4 characters in length the size of the text code <bcp14>MUST</bcp14> also be function of the pad size, <tt>ps</tt>, and hence the length of the raw binary element, <tt>N</tt>. Thus the size of the text code in Base64 characters is a function of the equivalent pad size determined by the length <tt>N mod 3</tt> of the raw binary value. If we let <em>M</em> be a non-negative integer valued variable then we have three cases:</t>
        <table align="center">
          <thead>
            <tr>
              <th align="center">Pad Size</th>
              <th align="right">Code Size</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center">0</td>
              <td align="right">4oM</td>
            </tr>
            <tr>
              <td align="center">1</td>
              <td align="right">4oM + 1</td>
            </tr>
            <tr>
              <td align="center">2</td>
              <td align="right">4oM + 2</td>
            </tr>
          </tbody>
        </table>
        <t>The minimum code sizes are 1, 2, and 4 characters for pad sizes of 1, 2, and 0 characters with <em>M</em> equal 0, 0, and 1 respectively. By increasing <em>M</em> we can have larger code sizes for a given pad size.</t>
      </section>
      <section anchor="count-group-or-framing-codes" numbered="true" toc="default">
        <name>Count, Group, or Framing Codes</name>
        <t>As mentioned above one of the primary advantages of a composable encoding is that special framing codes can be specified to support groups of primitivies. Grouping enables pipelining. Other suitable terms for these special framing codes are <em>group codes</em> or <em>count codes</em>. These are suitable because they can be used to count characters, primitives in a group, or count groups of primitives in a larger group. We can also use count codes as separators to organize a stream of primitives or to interleave non-native serializations. A count code is its own primitive. But it is a primitive that does not include a raw binary value, only the text code. Because a count code's raw binary element is empty, its pad size is always 0. Thus a count code's size is always an integer multiple of 4 characters i.e. 4, 8, etc.</t>
      </section>
      <section anchor="interleaved-non-cesr-serializations" numbered="true" toc="default">
        <name>Interleaved Non-CESR Serializations</name>
        <t>One extremely useful property of CESR is that special count codes enable CESR to be interleaved with other serializations. For example, Many applications use JSON <xref target="RFC4627" format="default">JSON</xref>, CBOR <xref target="RFC8949" format="default">CBOR</xref>, or MsgPack (MGPK) <xref target="MGPK" format="default"/> to serialize flexible self-describing data structures based on hash maps, also know as dictionaries. With respect to hash map serializations, CESR primitives may appear in two different contexts. The first context is as a delimited text primitive inside of a hash map serialization. The delimited text may be either the key or value of a (key, value) pair. The second context is as a standalone serialization that is interleaved with hash map serializations in a stream. Special CESR count codes enable support for the second context of interleaving standalone CESR with other serializations.</t>
      </section>
      <section anchor="cold-start-stream-parsing-problem" numbered="true" toc="default">
        <name>Cold Start Stream Parsing Problem</name>
        <t>After a cold start a stream processor looks for framing information to know how to parse groups of elements in the stream. If that framing information is ambiguous then the parser may become confused and require yet another cold start. While processing a given stream a parser may become confused especially if a portion of the stream is malformed in some way. This usually requires flushing the stream and forcing a cold start to resynchronize the parser to subsequent stream elements. Better yet is a re-synchronization mechanism that does not require flushing the in-transit buffers but merely skipping to the next well defined stream element boundary in order to execute  cold start. Good cold start  re-synchronization is essential to robust performant stream processing.</t>
        <t>For example, in TCP a cold start usually means closing and then reopening the TCP connection. This flushes the TCP buffers and sends a signal to the other end of the stream that may be interpreted as a restart or cold start. In UDP each packet is individually framed but a stream may be segmented into multiple packets so a cold start may require an explicit ack or nack to force a restart.</t>
        <t>Special CESR count codes support re-synchronization at each boundary between interleaved CESR and other serializations like JSON, CBOR, or MGPK</t>
        <section anchor="performant-resynchronization-with-unique-start-bits" numbered="true" toc="default">
          <name>Performant Resynchronization with Unique Start Bits</name>
          <t>Given the popularity of three specific serializations, namely, JSON, CBOR, and MGPK, more fine grained serialization boundary detection for interleaving CESR may be highly beneficial both from a performation and robustness perspective. One way to provide this is by selecting the count code start bits such that there is always a unique (mutually distinct) set of start bits at each interleaved boundary between CESR, JSON, CBOR, and MGPK.</t>
          <t>Furthermore, it may also be highly beneficial to support in-stride switching between interleaved CESR text domain streams and CESR binary domain streams. In other words the start bits for count (framing) codes in both the <em>T</em> domain (Base64) and the <em>B</em> domain should be unique. This would provide the analogous equivalent of a UTF Byte Order Mark (BOM) <xref target="BOM" format="default"/>. A BOM enables a parser of UTF encoded documents to determine if the UTF codes are big endian or little endian [[19]]. In the CESR case this feature would enable a stream parser to know if a count code along with its associated counted or framed group of primitives are expressed in the <em>T</em> or <em>B</em> domain. Toghether these impose the constraint that the boundary start bits for interleaved text CESR, binary CESR, JSON, CBOR, and MGPK be mutually distinct.</t>
          <t>Amongst the codes for map objects in the JSON, CBOR, and MGPK only the first three bits are fixed and not dependent on mapping size. In JSON a serialized mapping object always starts with <tt>{</tt>. This is encoded as <tt>0x7b</tt>. the first three bits are <tt>0b011</tt>. In CBOR the first three bits of the major type of the serialized mapping object are <tt>0b101</tt>. In MGPK (MsgPack) there are three different mapping object codes. The <em>FixMap</em> code starts with <tt>0b100</tt>. Both the <em>Map16</em> code and <em>Map32</em> code start with <tt>0b110</tt>.</t>
          <t>So we have the set of four used starting tritets (3 bits) in numeric order of <tt>0b011</tt>, <tt>0b100</tt>, <tt>0b101</tt>, and <tt>0b110</tt>. This leaves four unused tritets, namely, <tt>0b000</tt>, <tt>0b001</tt>, <tt>0b010</tt>, and <tt>0b111</tt> that may be selected as the CESR count (framing) code start bits. In Base64 there are two codes that satisfy our constraints. The first is the dash character, <tt>-</tt>, encoded as <tt>0x2d</tt>. Its first three bits are <tt>0b001</tt>. The second is the underscore character,<tt>_</tt>, encoded as <tt>0x5f</tt>. Its first three bits are <tt>0b010</tt>. Both of these are distinct from the starting tritets of any of the JSON, CBOR, and MGPK encodings above. Moreover the starting tritet of the corresponding binary encodings of <tt>-</tt> and <tt>_</tt> is <tt>0b111</tt> which is also distinct from the all the others. To elaborate, Base64 uses <tt>_</tt> in position 62 or <tt>0x3E</tt> (hex) and uses <tt>_</tt> in position 63 or <tt>0x3F</tt> (hex) both of which have starting tritet of <tt>0b111</tt></t>
          <t>This gives us two different Base64 characters, <tt>-</tt> and <tt>_</tt> we can use for the first character of any framing (count) code in the <em>T</em> domain. This also means we can have two different classes of framing (count) codes. This also provides a BOM like capability to determine if a framing code is expressed in the <em>T</em> or <em>B</em> domain. To clarify, if a stream  starts with the tritet <tt>0b111</tt> then the stream is <em>B</em> domain CESR and a stream parser would thereby know how to convert the first sextet of the stream to determine which of the two framing codes is being used, <tt>0x3E</tt> or <tt>ox3F</tt> . If on the other hand the framing code starts with either of the tritets <tt>0b001</tt> or <tt>0b010</tt> then the framing code is expressed in the <em>T</em> domain and a stream parser likewise would thereby know how to convert the first character (octet) of the framing code to determine which framing code is being used. Otherwise if a stream starts with  <tt>0b100</tt> then is JSON, with <tt>0b101</tt> then its CBOR and with either <tt>0b011</tt>,and <tt>0b110</tt> then its MGPK.</t>
          <t>This is summaraized in the following table:</t>
          <table align="center">
            <thead>
              <tr>
                <th align="center">Starting Tritet</th>
                <th align="center">Serialization</th>
                <th align="center">Character</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">0b000</td>
                <td align="center"> </td>
                <td align="center"> </td>
              </tr>
              <tr>
                <td align="center">0b001</td>
                <td align="center">CESR <em>T</em> Domain Count (Group) Code</td>
                <td align="center">
                  <tt>-</tt></td>
              </tr>
              <tr>
                <td align="center">0b010</td>
                <td align="center">CESR <em>T</em> Domain Op Code</td>
                <td align="center">
                  <tt>_</tt></td>
              </tr>
              <tr>
                <td align="center">0b011</td>
                <td align="center">JSON</td>
                <td align="center">
                  <tt>{</tt></td>
              </tr>
              <tr>
                <td align="center">0b100</td>
                <td align="center">MGPK</td>
                <td align="center"> </td>
              </tr>
              <tr>
                <td align="center">0b101</td>
                <td align="center">CBOR</td>
                <td align="center"> </td>
              </tr>
              <tr>
                <td align="center">0b110</td>
                <td align="center">MGPK</td>
                <td align="center"> </td>
              </tr>
              <tr>
                <td align="center">0b111</td>
                <td align="center">CESR <em>B</em> Domain</td>
                <td align="center"> </td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="stream-parsing-rules" numbered="true" toc="default">
          <name>Stream Parsing Rules</name>
          <t>Given this set of tritets (3 bits) we can express a requirement for well formed stream start and restart.</t>
          <t>Each stream <bcp14>MUST</bcp14> start (restart) with one of five tritets:</t>
          <t>1) A framing count (group) code in CESR <em>T</em> domain
2) A framing count (group) code in CESR <em>B</em> Domain.
3) A JSON encoded mapping.
4) A CBOR encoded Mapping.
5) A MGPK encoded mapping.</t>
          <t>A parser merely needs to examine the first tritet (3 bits) of the first byte of the stream start to determine which one of the five it is. When the first tritet is a framing code then, the remainder of framing code itself will include the additional information needed to parse the attached group. When the first tritet indicates its JSON, CBOR, or MGPK, then the mapping's first field must be a version string that provides the additional information needed to fully parse the associated encoded serialization.</t>
          <t>The stream <bcp14>MUST</bcp14> resume with a starting byte that starts with one of the 5 tritets, either another framing code expressed in the <em>T</em> or <em>B</em> domain or a new JSON, CBOR, or MGPK encoded mapping.</t>
          <t>This provides an extremely compact and elegant stream parsing formula that generalizes not only support for CESR composabilty but also support for interleaved CESR with three of the most popular hash map serializations.</t>
        </section>
      </section>
      <section anchor="compact-fixed-size-codes" numbered="true" toc="default">
        <name>Compact Fixed Size Codes</name>
        <t>As mentioned above, CESR uses a multiple code table design that enables both size optimized text codes for the most popular primitive types and extensible universal support for all other primitive types. Modern cryptographic suites support limited sets of raw binary primitives with fixed (not variable) sizes. The design aesthetic is based on the understanding that there is a minimally sufficient cryptographic strength and more cryptographic strength is just wasting computation and bandwidth. Cryptographic strength is measured in bits of entropy which also corresponds to the number trials that must be attempted to succeed in a brute force attack. The accepted minimum for cryptographic strength is 128 bits of entropy or equivalently <tt>2**128</tt> (2 raised to the 128th power) brute force trials. The size in bytes of a given raw binary primitive for a given modern cryptographic suite is usually directly related to this minimum strength of 128 bits (16 bytes). 
For example the raw binary primitives from the well known <xref target="NaCL" format="default"/> ECC (Elliptic Curve Cryptography) library all satisfy this 128 bit strength goal. In particular the digital signing public key raw binary primitives for EdDSA are 256 bits (32 bytes) in length because well known algorithms can reduce the number of trials to brute force invert an ECC public key to get the private key by the square root of the number of scalar multiplications which is also related to the size of both the private key and public key coordinates (discrete logarithm problem <xref target="DLog" format="default"/>). Thus  256 bit (32 byte) ECC keys are needed to achieve 128 bits of cryptographic strength. In general the size of a given raw binary primitive is typically some multiple of 128 bits of cryptographic strength. This is also true for the associated EdDSA raw binary signatures which 512 bits (64 bytes) in length.</t>
        <t>Similar scale factors exist for cryptographic digests. A standard default Blake3 digest is 256 bits (32 bytes) in length in order to get 128 bits of cryptographic strength. This is also true of SHA3-256. Indeed the sweet spots for modern cryptographic raw primitive lengths are 32 bytes for many digests as well as EdDSA public keys and 64 bytes for EdDSA and ECDSA-secp256k1 signatures and 64 byte variants of the most popular digests. Therefore optimized text code tables for these two sweet spots (32 and 64 bytes) would be highly advantageous.</t>
        <t>A 32 byte raw binary value has a pad size of 1 character.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
(3 - (32 mod 3)) mod 3) = 1
]]></artwork>
        <t>Therefore the minimal text code size is 1 character for 32 byte raw binary cryptographic material and all other raw binary material values whose pad size is 1 character.</t>
        <t>A 64 byte raw binary value has a pad size of 2 characters.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
(3 - (64 mod 3)) mod 3) = 2
]]></artwork>
        <t>Therefore the minimal text code size for is 2 characters for 64 byte raw binary cryptographic material and all other raw binary material values whose pad size is 1 character. For example a 16 byte raw binary value also has a pad size of 2 characters.</t>
        <t>For all other cryptographic material values whose pad size is 0, then the minimium size text code is 4 characters. So the minimally sized texts code tables are 1, 2, and 4 characters respectively.</t>
        <t>Given that a given cryptographic primitive type has a known fixed raw binary size then we can efficiently encode that primitive type and size with just the type information. The size is given by the type.</t>
        <t>So for example an Ed25519 (EdDSA) raw public key is always 32 bytes so knowing that the type is <tt>Ed25519 public key</tt> implies the size of 32 bytes and a pad size of 1 character that therefore may be encoded with a 1 character text code. Likewise an Ed25519 (EdDSA) signature is always 64 bytes so knowing that the type is  <tt>Ed25519 signature</tt> implies the size of 64 bytes and a pad size of 2 characters that therefore may be encoded with a 2 character text code.</t>
      </section>
      <section anchor="code-table-selectors" numbered="true" toc="default">
        <name>Code Table Selectors</name>
        <t>In order to efficiently parse a stream of primitives with types from multiple text code tables the first character in the text code must be a code table selector character. Thus the 1 character text code table must do double duty. It must provide selectors for the different text code tables and also provide type codes for the most popular primitives that have a pad size of 1. There are 64 Base64 characters (64 values). We only need 12 tables to support all the codes and code formats needed for the foreseeable future. Therefore only 12 of those characters need be dedicated as code table selectors that leaves 52 characters that may be used for 1 character type codes. This gives a total of 13 type code tables consisting of the dual purpose 1 character selector table and 12 other tables.</t>
        <t>As described above the selector characters for the framing or count code tables that best support interleaved JSON, CBOR, and MGPK are <tt>-</tt> and <tt>_</tt>. We use the numerals <tt>0</tt> through <tt>9</tt> to each serve as a selector. That leaves the letters <tt>A</tt> through <tt>Z</tt> and <tt>a</tt> through <tt>z</tt> as single character selectors. This provides 52 unique type codes for fixed length primitive types with raw binary values that have a pad size of 1.</t>
        <t>To clarify, the first character of any primitive is either a selector or a 1 character code type. The characters <tt>0</tt> through <tt>9</tt>, <tt>-</tt> and <tt>_</tt> are selectors that select a given code table and indicate the number of remaining characters in the text code.</t>
      </section>
      <section anchor="small-fixed-raw-size-tables" numbered="true" toc="default">
        <name>Small Fixed Raw Size Tables</name>
        <t>There are two special tables that are dedicated to the most popular fixed size raw binary cryptographic primitive types. These are the most compact so they optimize bandwidth but only provide a small number of total types. In both of these the text code size equals the number of pad characters, i.e. the pad size.</t>
        <section anchor="one-character-fixed-raw-size-table" numbered="true" toc="default">
          <name>One Character Fixed Raw Size Table</name>
          <t>The one character type code table does not have selector character per se but uses as type codes the non-selector characters <tt>A</tt> - <tt>Z</tt> and <tt>a</tt> - <tt>z</tt>. This provides 52 unique type codes for fixed size raw binary values with pad size of 1.</t>
        </section>
        <section anchor="two-character-fixed-raw-size-table" numbered="true" toc="default">
          <name>Two Character Fixed Raw Size Table</name>
          <t>The two character type code table uses selector <tt>0</tt> as its first character. The second character is the type code. This provides 64 unique type codes for fixed size raw binary values that have a pad size of 2.</t>
        </section>
      </section>
      <section anchor="large-fixed-raw-size-tables" numbered="true" toc="default">
        <name>Large Fixed Raw Size Tables</name>
        <t>The three tables in this group are for large fixed raw size primitives. These three tables use 0, 1 or 2 ante bytes as appropriate for a pad size of 0, 1 or 2 for a given fixed raw binary value. The text code size for all three tables is 4 characters. The selector not only encodes the table but also implicitly encodes the number of ante bytes. With 3 characters for each unique type code, each table provides 262,144 unique type codes. This should be enough type codes to accommodate all fixed raw size primitive types for the foreseeable future.</t>
        <section anchor="large-fixed-raw-size-table-with-0-ante-bytes" numbered="true" toc="default">
          <name>Large Fixed Raw Size Table With 0 Ante Bytes</name>
          <t>This table uses <tt>1</tt> as its first character or selector. The remaining 3 characters provide the types codes. Only fixed size raw binaries with pad size of 0 are encoded with this table. The 3 character type code provides a total of 262,144 unique type code values (<tt>262144 = 64**3)</tt> for fixed size raw binary primitives with pad size of 0.</t>
        </section>
        <section anchor="large-fixed-raw-size-table-with-1-ante-byte" numbered="true" toc="default">
          <name>Large Fixed Raw Size Table With 1 Ante Byte</name>
          <t>This table uses <tt>2</tt> as its first character or selector. The remaining 3 characters provide the types codes. Only fixed size raw binaries with pad size of 1 are encoded with this table. The 3 character type code provides a total of 262,144 unique type code values (<tt>262144 = 64**3)</tt> . Together with the 52 values from the 1 character code table above there are 262,196 type codes for fixed size raw binary primitives with pad size of 1.</t>
        </section>
        <section anchor="large-fixed-raw-size-table-with-1-ante-byte-1" numbered="true" toc="default">
          <name>Large Fixed Raw Size Table With 1 Ante Byte</name>
          <t>This table uses <tt>3</tt> as its first character or selector. The remaining 3 characters provide the types codes. Only fixed size raw binaries with pad size of 2 are encoded with this table. The 3 character type code provides a total of 262,144 unique type code values (<tt>262144 = 64**3)</tt> . Together with the 64 values from the 2 character code table above (selector <tt>0</tt>) there are 262,208 type codes for fixed size raw binary primitives with pad size of 2.</t>
        </section>
      </section>
      <section anchor="small-variable-raw-size-tables" numbered="true" toc="default">
        <name>Small Variable Raw Size Tables</name>
        <t>Although many primitives have fixed raw binary sizes especially those for modern cryptographic suites such as keys, signatures and digests, there are other primitives that benefit from variable sizing such as encrypted material. Indeed CESR is meant to support not only cryptographic material types but other basic types such as generic text strings. These benefit from variable size codes.</t>
        <t>The three tables in this group are for small variable raw size primitives. These three tables use 0, 1 or 2 ante bytes as appropriate given the pad size of 0, 1 or 2 for a given variable size raw binary value. The text code size for all three tables is 4 characters.
The first character is the selector, the second character is the type, and the last two characters provide the size of the value as a Base64 encoded integer. The number of unique type codes is 64. A given type code is repeated in each table for the same type. What is different for each table is the number of ante bytes. The selector not only encodes the table but also implicitly encodes the number of ante bytes. The variable size is measured in quadlets of 4 characters each in the <em>T</em> domain and equivalently in triplets of 3 bytes each in the <em>B</em> domain. Thus computing the number of characters when parsing or off-loading in the <em>T</em> domain means multiplying the variable size by 4. Computing the number of bytes when parsing or off-loading in the <em>B</em> domain means multiplying the variable size by 3. The two Base64 size characters provide value lengths in quadlets/triplets from 0 to 4095 (<tt>64**2 -1</tt>). This corresponds to value lengths of up to 16,380 characters (<tt>4095 o 4</tt>) or 12,285 bytes (<tt>4095 o 3</tt>).</t>
        <section anchor="small-variable-raw-size-table-with-0-ante-bytes" numbered="true" toc="default">
          <name>Small Variable Raw Size Table With 0 Ante Bytes</name>
          <t>This table uses <tt>4</tt> as its first character or selector. The second character provides the type. The final two characters provide the size of the value in quadlets/triplets as a Base64 encoded integer. Only raw binaries with pad size of 0 are encoded with this table. The 1 character type code provides a total of 64 unique type code values. The maximum length of the value provided by the 2 size characters is 4095 quadlets of characters in the <em>T</em> domain and triplets of bytes in the <em>B</em> domain. All are raw binary primitives with pad size of 0 that each include 0 ante bytes.</t>
        </section>
        <section anchor="small-variable-raw-size-table-with-1-ante-byte" numbered="true" toc="default">
          <name>Small Variable Raw Size Table With 1 Ante Byte</name>
          <t>This table uses <tt>5</tt> as its first character or selector. The second character provides the type. The final two characters provide the size of the value in quadlets/triplets as a Base64 encoded integer. Only raw binaries with pad size of 1 are encoded with this table. The 1 character type code provides a total of 64 unique type code values. The maximum length of the value provided by the 2 size characters is 4095 quadlets of characters in the <em>T</em> domain and triplets of bytes in the <em>B</em> domain. All are raw binary primitives with pad size of 1 that each include 1 ante byte.</t>
        </section>
        <section anchor="small-variable-raw-size-table-with-2-ante-bytes" numbered="true" toc="default">
          <name>Small Variable Raw Size Table With 2 Ante Bytes</name>
          <t>This table uses <tt>6</tt> as its first character or selector. The second character provides the type. The final two characters provide the size of the value in quadlets/triplets as a Base64 encoded integer. Only raw binaries with pad size of 0 are encoded with this table. The 1 character type code provides a total of 64 unique type code values. The maximum length of the value provided by the 2 size characters is 4095 quadlets of characters in the <em>T</em> domain and triplets of bytes int the <em>B</em> domain. All are raw binary primitives with pad size of 2 that each include 2 ante bytes.</t>
        </section>
      </section>
      <section anchor="large-variable-raw-size-tables" numbered="true" toc="default">
        <name>Large Variable Raw Size Tables</name>
        <t>Many legacy cryptographic libraries such as OpenSSL and GPG support any sized  variable sized primitive for keys, signatures and digests. Although this approach is often criticized for providing too much flexibility, many legacy applications depend on this degree of flexibility. Consequently these large variable raw size tables provide a sufficiently expansive set of tables with enough types and sizes to accommodate all the legacy cryptographic libraries as well as all the variable sized raw primitives for the foreseeable future.</t>
        <t>The three tables in this group are for large variable raw size primitives. These three tables use 0, 1 or 2 ante bytes as appropriate for the associated pad size of 0, 1 or 2 for a given variable sized raw binary value. The text code size for all three tables is 8 characters.
The first character is the selector, the next three characters provide the type, and the last four characters provide the size of the value as a Base64 encoded integer. With 3 characters for each unique type code, each table provides 262,144 unique type codes. This should be enough type codes to accommodate all fixed raw size primitive types for the foreseeable future.  A given type code is repeated in each table for the same type. What is different for each table is the number of ante bytes. The selector not only encodes the table but also implicitly encodes the number of ante bytes. The variable size is measured in quadlets of 4 characters each in the <em>T</em> domain and equivalently in triplets of 3 bytes each in the <em>B</em> domain. Thus computing the number of characters when parsing or off-loading in the <em>T</em> domain means multiplying the variable size by 4. Likewise computing the number of bytes when parsing or off-loading in the <em>B</em> domain means multiplying the variable size by 3. The four Base64 size characters provide value lengths in quadlets/triplets from 0 to 16,777,215 (<tt>64**4 -1</tt>). This corresponds to value lengths of up to 67,108,860 characters (<tt>16777215 o 4</tt>) or 50,331,645 bytes (<tt>16777215 o 3</tt>).</t>
        <section anchor="large-variable-raw-size-table-with-0-ante-bytes" numbered="true" toc="default">
          <name>Large Variable Raw Size Table With 0 Ante Bytes</name>
          <t>This table uses <tt>7</tt> as its first character or selector. The next three characters provide the type. The final four characters provide the size of the value in quadlets/triplets as a Base64 encoded integer. Only raw binaries with pad size of 0 are encoded with this table. The 3 character type code provides a total of 262,144 unique type code values. The maximum length of the value provided by the 4 size characters is 16,777,215 quadlets of characters in the <em>T</em> domain and triplets of bytes in the <em>B</em> domain. All are raw binary primitives with pad size of 0 that each include 0 ante bytes.</t>
        </section>
        <section anchor="large-variable-raw-size-table-with-1-ante-byte" numbered="true" toc="default">
          <name>Large Variable Raw Size Table With 1 Ante Byte</name>
          <t>This table uses <tt>8</tt> as its first character or selector. The next three characters provide the type. The final four characters provide the size of the value in quadlets/triplets as a Base64 encoded integer. Only raw binaries with pad size of 1 are encoded with this table. The 3 character type code provides a total of 262,144 unique type code values. The maximum length of the value provided by the 4 size characters is 16,777,215 quadlets of characters in the <em>T</em> domain and triplets of bytes in the <em>B</em> domain. All are raw binary primitives with pad size of 1 that each include 1 ante bytes.</t>
        </section>
        <section anchor="large-variable-raw-size-table-with-2-ante-bytes" numbered="true" toc="default">
          <name>Large Variable Raw Size Table With 2 Ante Bytes</name>
          <t>This table uses <tt>9</tt> as its first character or selector. The next three characters provide the type. The final four characters provide the size of the value in quadlets/triplets as a Base64 encoded integer. Only raw binaries with pad size of 2 are encoded with this table. The 3 character type code provides a total of 262,144 unique type code values. The maximum length of the value provided by the 4 size characters is 16,777,215 quadlets of characters in the <em>T</em> domain and triplets of bytes in the <em>B</em> domain. All are raw binary primitives with pad size of 2 that each include 2 ante bytes.</t>
        </section>
      </section>
      <section anchor="count-framing-code-tables" numbered="true" toc="default">
        <name>Count (Framing) Code Tables</name>
        <t>There may be as many at 13 count code tables, but only two are currently specified. These two are the small count, four character table and the large count, eight character table. Because count codes only count quadlets/triplets, primitives or groups of primitives, count codes have no value component, but only type and size components. Because primitives are already guaranteed to be composable count codes do not need to account for pad size as long as the count code itself is aligned on a 24 bit boundary. The count code type indicates the type of primitive being counted and the size indicates how many of that type. Both count code tables use the first two characters as a nested set of selectors. The first selector uses<tt>-</tt> as the initial selector for count codes. The next character is either a selector for another count code table or is the type for the small count code table. When the  second character is numeral <tt>0</tt> - <tt>9</tt> or the letters <tt>-</tt> or <tt>_</tt> then it is a secondary cound code table selector. When the second character is a letter in the range <tt>A</tt> - <tt>Z</tt> or <tt>a</tt> - <tt>z</tt> then it is a unique count code type. This given a total of 52 single character count code types.</t>
        <section anchor="small-count-code-table" numbered="true" toc="default">
          <name>Small Count Code Table</name>
          <t>Codes in the small count code table are each four characters long. The first character is the selector <tt>-</tt>. The second character is the count code type. the last two characters are the count size as a Base64 encoded integer. The count code type <bcp14>MUST</bcp14> be a letter <tt>A</tt> - <tt>Z</tt> or <tt>a</tt> - <tt>z</tt>. If the second character is not a letter but is a numeral <tt>0</tt> - <tt>9</tt> or <tt>-</tt> or <tt>_</tt> then it is a selector for a different count code table. The set of letters provide 52 unique count codes. A two character size provides counts from 0 to 4095 (<tt>64**2 - 1</tt>).</t>
        </section>
        <section anchor="large-count-code-table" numbered="true" toc="default">
          <name>Large Count Code Table</name>
          <t>Codes in the large count code table are each 8 characters long. The first two characters are the selectors <tt>-</tt>0. The next two characters are the count code type. the last four characters are the count size as a Base64 encoded integer. With two characters for type, there are 4096 unique large count code types. A four character size provides counts from 0 to 16,777,215 (<tt>64**4 - 1</tt>).</t>
        </section>
      </section>
      <section anchor="op-code-tables" numbered="true" toc="default">
        <name>Op Code Tables</name>
        <t>The <tt>_</tt> selector is reserved for the yet to be defined op code table or tables. Op codes are meant to provide stream processing instructions that are more general and flexible than simply concatenated primitives or groups of primitives.</t>
      </section>
      <section anchor="selector-codes-and-encoding-schemes" numbered="true" toc="default">
        <name>Selector Codes and Encoding Schemes</name>
        <t>The following table summarizes the <em>T</em> domain coding schemes for the 13 code tables defined above.</t>
        <table align="center">
          <thead>
            <tr>
              <th align="center">Selector</th>
              <th align="center">Selector</th>
              <th align="center">Type Chars</th>
              <th align="center">Value Size Chars</th>
              <th align="center">Code Size</th>
              <th align="center">Ante Bytes</th>
              <th align="center">Pad Size</th>
              <th align="right">Format</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="right"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>[A-Z,a-z]</tt></td>
              <td align="center"> </td>
              <td align="center">1*</td>
              <td align="center">0</td>
              <td align="center">1</td>
              <td align="center">0</td>
              <td align="center">1</td>
              <td align="right">
                <tt>$&amp;&amp;&amp;</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>0</tt></td>
              <td align="center"> </td>
              <td align="center">1</td>
              <td align="center">0</td>
              <td align="center">2</td>
              <td align="center">0</td>
              <td align="center">2</td>
              <td align="right">
                <tt>0$&amp;&amp;</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>1</tt></td>
              <td align="center"> </td>
              <td align="center">3</td>
              <td align="center">0</td>
              <td align="center">4</td>
              <td align="center">0</td>
              <td align="center">0</td>
              <td align="right">
                <tt>1$$$&amp;&amp;&amp;&amp;</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>2</tt></td>
              <td align="center"> </td>
              <td align="center">3</td>
              <td align="center">0</td>
              <td align="center">4</td>
              <td align="center">1</td>
              <td align="center">1</td>
              <td align="right">
                <tt>2$$$&amp;&amp;&amp;&amp;</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>3 </tt></td>
              <td align="center"> </td>
              <td align="center">3</td>
              <td align="center">0</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">2</td>
              <td align="right">
                <tt>3$$$&amp;&amp;&amp;&amp;</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>4</tt></td>
              <td align="center"> </td>
              <td align="center">1</td>
              <td align="center">2</td>
              <td align="center">4</td>
              <td align="center">0</td>
              <td align="center">0</td>
              <td align="right">
                <tt>4$##&amp;&amp;&amp;&amp;</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>5</tt></td>
              <td align="center"> </td>
              <td align="center">1</td>
              <td align="center">2</td>
              <td align="center">4</td>
              <td align="center">1</td>
              <td align="center">1</td>
              <td align="right">
                <tt>5$##&amp;&amp;&amp;&amp;</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>6</tt></td>
              <td align="center"> </td>
              <td align="center">1</td>
              <td align="center">2</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">2</td>
              <td align="right">
                <tt>6$##&amp;&amp;&amp;&amp;</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>7</tt></td>
              <td align="center"> </td>
              <td align="center">3</td>
              <td align="center">4</td>
              <td align="center">8</td>
              <td align="center">0</td>
              <td align="center">0</td>
              <td align="right">
                <tt>7$$$####&amp;&amp;&amp;&amp;</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>8</tt></td>
              <td align="center"> </td>
              <td align="center">3</td>
              <td align="center">4</td>
              <td align="center">8</td>
              <td align="center">1</td>
              <td align="center">1</td>
              <td align="right">
                <tt>8$$$####&amp;&amp;&amp;&amp;</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>9</tt></td>
              <td align="center"> </td>
              <td align="center">3</td>
              <td align="center">4</td>
              <td align="center">8</td>
              <td align="center">2</td>
              <td align="center">2</td>
              <td align="right">
                <tt>9$$$####&amp;&amp;&amp;&amp;</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>-</tt></td>
              <td align="center">
                <tt>[A-Z,a-z]</tt></td>
              <td align="center">1*</td>
              <td align="center">0</td>
              <td align="center">4</td>
              <td align="center">0</td>
              <td align="center">0</td>
              <td align="right">
                <tt>-$##</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>-</tt></td>
              <td align="center">
                <tt>0</tt></td>
              <td align="center">2</td>
              <td align="center">0</td>
              <td align="center">8</td>
              <td align="center">0</td>
              <td align="center">0</td>
              <td align="right">
                <tt>-0$$####</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>_</tt></td>
              <td align="center"> </td>
              <td align="center">TBD</td>
              <td align="center">TBD</td>
              <td align="center">TBD</td>
              <td align="center">TBD</td>
              <td align="center">TBD</td>
              <td align="right">
                <tt>_</tt></td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="right"> </td>
            </tr>
          </tbody>
        </table>
        <t><tt>*</tt> selector character is also type character</t>
        <t>Character format symbol definitions:<br/>
          <tt>$</tt> means type code character from  subset of Base64  [A-Z,a-z,0-9,-,_]. <br/>
          <tt>#</tt> means a Base64 digit as part of a base 64 integer that determines the number of following quadlets or triplets in the primitive or when part of a count code, the count of following primitives or groups of primitives.<br/>
          <tt>&amp;</tt> represents one or more Base64 value characters representing the converted raw binary value included ante bytes when applicable. The actual number of chars is determined by the prep-ended text code.<br/>
          <tt>TBD</tt> means to be determined</t>
      </section>
      <section anchor="parse-size-table" numbered="true" toc="default">
        <name>Parse Size Table</name>
        <t>Text domain parsing can be simplified by using a parse size table. A text domain parser uses the first character selector code to look up the hard size (stable) portion of the text code. The parse then extracts hard size characters from the text stream. These characters form an index in to the parse size table which includes a set of sizes for the remainder of the primitive. Using these sizes for a given code allows a parser to extract and convert a given primitive. In the binary domian the same text parse table may be used but each size value represents a multiple of a sextet of bits instead of Base64 characters. Example entries from that table are provided below. Two of the rows may always be calculated given the other 4 rows so the table need only have 4 entries in each row. Thus all basic primitives may be parsed with one parse size table.</t>
        <table align="center">
          <thead>
            <tr>
              <th align="center">selector</th>
              <th align="center">hs</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>B</tt></td>
              <td align="center">1</td>
            </tr>
            <tr>
              <td align="center">
                <tt>0</tt></td>
              <td align="center">2</td>
            </tr>
            <tr>
              <td align="center">
                <tt>5</tt></td>
              <td align="center">2</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
          </tbody>
        </table>
        <table align="center">
          <thead>
            <tr>
              <th align="center">hard sized index</th>
              <th align="center">hs</th>
              <th align="center">ss</th>
              <th align="center">vs</th>
              <th align="center">fs</th>
              <th align="center">as</th>
              <th align="center">ps</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>B</tt></td>
              <td align="center">1</td>
              <td align="center">0</td>
              <td align="center">43*</td>
              <td align="center">44</td>
              <td align="center">0</td>
              <td align="center">1</td>
            </tr>
            <tr>
              <td align="center">
                <tt>0B</tt></td>
              <td align="center">2</td>
              <td align="center">0</td>
              <td align="center">86*</td>
              <td align="center">88</td>
              <td align="center">0</td>
              <td align="center">2*</td>
            </tr>
            <tr>
              <td align="center">
                <tt>5A</tt></td>
              <td align="center">2</td>
              <td align="center">2</td>
              <td align="center">#</td>
              <td align="center">#</td>
              <td align="center">1</td>
              <td align="center">1*</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
          </tbody>
        </table>
        <t><tt>*</tt> size may be calculated from other sizes.<br/>
          <tt>#</tt> size may be calculated from extracted code characters given by other sizes.</t>
        <t><em>hs</em> means hard size in chars.<br/>
          <em>ss</em> means soft size in chars.<br/>
          <em>cs</em> means code size where <em>cs = hs + ss</em>.<br/>
          <em>vs</em> means value size in chars.<br/>
          <em>fs</em> means full size in chars where <em>fs = hs + ss + vs</em>.<br/>
          <em>as</em> means ante size in bytes.<br/>
          <em>ps</em> means pad size in chars. <br/>
          <em>rs</em> means raw size in bytes of binary value.<br/>
          <em>as</em> means ante size in bytes.<br/>
          <em>bs</em> means binary size in bytes where <em>bs = as + rs</em>.</t>
      </section>
      <section anchor="special-context-specific-code-tables" numbered="true" toc="default">
        <name>Special Context Specific Code Tables</name>
        <t>The table above that provides the encoding schemes each with an associated code table that provides the type codes or  set of codes for each associated primitive type. These coding schemes constitute the basic set of code tables. This basic set may be extended with context specific code tables. The context in which a primitive occurs may provide an additional implicit selector that is not part of the actual explicit text code. This allows context specific coding schemes that would otherwise conflict with the basic code tables. Currently there is only one context specific coding scheme, that is, for indexed signatures. A common use case are thresholded multi-signature schemes. A threshold satisficing subset of signatures belonging to an ordered  or list of public keys may be provided as part of stream of primitives. One way to compactly associated each signature with its public key is to include in the text code for that signature the index into the ordered set of public keys. The typical raw binary size for signatures is 64 bytes which has a pad size of 2. This gives two code characters for a compact text code. The first character is the selector and type code. The second character is Base64 encoded integer index.  By using a similar dual selector type code character scheme as above, where the selectors are the numbers <tt>0</tt> -<tt>9</tt> and <tt>-</tt> and <tt>_</tt>. Then there are 52 type codes given by the letters <tt>A</tt> - <tt>Z</tt> and <tt>a</tt> - <tt>z</tt>. The index has 64 values which supports up to 64 members in the public key list. A selector can be used to select a large text code with more characters dedicated to larger indicies. Current only a small table is defined.</t>
        <t>A new signature scheme based on Ed448 with 114 byte signatures signatures is also supported. These signatures have a pad size of zero so require a four charactor text code. The first characters is the selector <tt>0</tt>, the second characters is the type with 64 values, the last two characters provide the index as a Base64 encoded integer with 4096 different values.</t>
        <t>The associate indexed schemes are provided in the following table.</t>
        <table align="center">
          <thead>
            <tr>
              <th align="center">Selector</th>
              <th align="center">Selector</th>
              <th align="center">Type Chars</th>
              <th align="center">Index Chars</th>
              <th align="center">Code Size</th>
              <th align="center">Ante Bytes</th>
              <th align="center">Pad Size</th>
              <th align="right">Format</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="right"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>[A-Z,a-z]</tt></td>
              <td align="center"> </td>
              <td align="center">1*</td>
              <td align="center">1</td>
              <td align="center">2</td>
              <td align="center">0</td>
              <td align="center">2</td>
              <td align="right">
                <tt>$#&amp;&amp;</tt></td>
            </tr>
            <tr>
              <td align="center">
                <tt>0</tt></td>
              <td align="center"> </td>
              <td align="center">1</td>
              <td align="center">2</td>
              <td align="center">4</td>
              <td align="center">0</td>
              <td align="center">0</td>
              <td align="right">` 0$##&amp;&amp;&amp;&amp;`</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="right"> </td>
            </tr>
          </tbody>
        </table>
        <t><tt>*</tt> selector character is also type character</t>
        <t>Character format symbol definitions:<br/>
          <tt>$</tt> means type code character from  subset of Base64  [A-Z,a-z,0-9,-,_]. <br/>
          <tt>#</tt> means a Base64 digit as part of a base 64 integer that determines the index.<br/>
          <tt>&amp;</tt> represents one or more Base64 value characters representing the converted raw binary value included ante bytes when applicable. The actual number of chars is determined by the prep-ended text code.<br/>
          <tt>TBD</tt> means to be determined</t>
      </section>
    </section>
    <section anchor="master-code-table" numbered="true" toc="default">
      <name>Master Code Table</name>
      <section anchor="filling-code-table" numbered="true" toc="default">
        <name>Filling Code Table</name>
        <t>The approach to filling the tables is a first needed first served basis. In addition the requirement that all cryptographic operations maintain at least 128 bits of cryptographic strength precludes the entry of many weak cryptographic suites into the compact tables. CESR's compact code table includes only best-of-class cryptographic operations. In 2022 it is expected that NIST will approve standardized post-quantum resistant cryptographic signatures at which time codes for  the most appropriate post quantume signature suites will be added. Falcon appears to be the leader with open source code already available.</t>
      </section>
      <section anchor="description" numbered="true" toc="default">
        <name>Description</name>
        <t>This master table includes all three types of codes separated by headers. The table has 5 columns. These are as follows:</t>
        <t>1) The Base64 stable (hard) text code itself. 
2) A description of what is encoded or appended to the code.
3) The length in characters of the code.
4) the length in characters of the index or count portion of the code 
5) The length in characters of the fully qualified primitive including code and append material or number of elements in group.</t>
        <table align="center">
          <thead>
            <tr>
              <th align="center">Code</th>
              <th align="left">Description</th>
              <th align="center">Code Length</th>
              <th align="center">Count or Index Length</th>
              <th align="center">Total Length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center"> </td>
              <td align="left">
                <strong>Basic One Character Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">A</td>
              <td align="left">Random seed of Ed25519 private key of length 256 bits</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">B</td>
              <td align="left">Ed25519 non-transferable prefix public signing verification key. Basic derivation.</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">C</td>
              <td align="left">X25519 public encryption key. May be converted from Ed25519 public signing verification key.</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">D</td>
              <td align="left">Ed25519 public signing verification key. Basic derivation.</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">E</td>
              <td align="left">Blake3-256 Digest. Self-addressing derivation.</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">F</td>
              <td align="left">Blake2b-256 Digest. Self-addressing derivation.</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">G</td>
              <td align="left">Blake2s-256 Digest. Self-addressing derivation.</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">H</td>
              <td align="left">SHA3-256 Digest. Self-addressing derivation.</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">I</td>
              <td align="left">SHA2-256 Digest. Self-addressing derivation.</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">J</td>
              <td align="left">Random seed of ECDSA secp256k1 private key of length 256 bits</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">K</td>
              <td align="left">Random seed of Ed448 private key of length 448 bits</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">76</td>
            </tr>
            <tr>
              <td align="center">L</td>
              <td align="left">X448 public encryption key. May be converted from Ed448 public signing verification key.</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">76</td>
            </tr>
            <tr>
              <td align="center">M</td>
              <td align="left">Short value of length 16 bits</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="left">
                <strong>Basic Two Character Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">0A</td>
              <td align="left">Random salt, seed, private key, or sequence number of length 128 bits</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">24</td>
            </tr>
            <tr>
              <td align="center">0B</td>
              <td align="left">Ed25519 signature. Self-signing derivation.</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">0C</td>
              <td align="left">ECDSA secp256k1 signature. Self-signing derivation.</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">0D</td>
              <td align="left">Blake3-512 Digest. Self-addressing derivation.</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">0E</td>
              <td align="left">Blake2b-512 Digest. Self-addressing derivation.</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">0F</td>
              <td align="left">SHA3-512 Digest. Self-addressing derivation.</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">0G</td>
              <td align="left">SHA2-512 Digest. Self-addressing derivation.</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">0H</td>
              <td align="left">Long value of length 32 bits</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">8</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="left">
                <strong>Basic Four Character Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">1AAA</td>
              <td align="left">ECDSA secp256k1 non-transferable prefix public signing verification key. Basic derivation.</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">48</td>
            </tr>
            <tr>
              <td align="center">1AAB</td>
              <td align="left">ECDSA secp256k1 public signing verification or encryption key. Basic derivation.</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">48</td>
            </tr>
            <tr>
              <td align="center">1AAC</td>
              <td align="left">Ed448 non-transferable prefix public signing verification key. Basic derivation.</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">80</td>
            </tr>
            <tr>
              <td align="center">1AAD</td>
              <td align="left">Ed448 public signing verification key. Basic derivation.</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">80</td>
            </tr>
            <tr>
              <td align="center">1AAE</td>
              <td align="left">Ed448 signature. Self-signing derivation.</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">156</td>
            </tr>
            <tr>
              <td align="center">1AAF</td>
              <td align="left">Tag Base64 4 chars or 3 byte number</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">8</td>
            </tr>
            <tr>
              <td align="center">1AAG</td>
              <td align="left">DateTime Base64 custom encoded 32 char ISO-8601 DateTime</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">36</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="left">
                <strong>Indexed Two Character Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">A#</td>
              <td align="left">Ed25519 indexed signature</td>
              <td align="center">2</td>
              <td align="center">1</td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">B#</td>
              <td align="left">ECDSA secp256k1 indexed signature</td>
              <td align="center">2</td>
              <td align="center">1</td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="left">
                <strong>Indexed Four Character Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">0A##</td>
              <td align="left">Ed448 indexed signature</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">156</td>
            </tr>
            <tr>
              <td align="center">0B##</td>
              <td align="left">Label Base64 chars of variable length L=N*4 where N is value of index  total = L+4</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">Variable</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="left">
                <strong>Counter Four Character Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">-A##</td>
              <td align="left">Count of attached qualified Base64 indexed controller signatures</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-B##</td>
              <td align="left">Count of attached qualified Base64 indexed witness signatures</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-C##</td>
              <td align="left">Count of attached qualified Base64 nontransferable identifier receipt couples  pre+sig</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-D##</td>
              <td align="left">Count of attached qualified Base64 transferable identifier receipt quadruples  pre+snu+dig+sig</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-E##</td>
              <td align="left">Count of attached qualified Base64 first seen replay couples fn+dt</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-F##</td>
              <td align="left">Count of attached qualified Base64 transferable indexed sig groups pre+snu+dig + idx sig group</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="left"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">-U##</td>
              <td align="left">Count of qualified Base64 groups or primitives in message data</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-V##</td>
              <td align="left">Count of total attached grouped material qualified Base64 4 char quadlets</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-W##</td>
              <td align="left">Count of total message data grouped material qualified Base64 4 char quadlets</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-X##</td>
              <td align="left">Count of total group message data plus attachments qualified Base64 4 char quadlets</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-Y##</td>
              <td align="left">Count of qualified Base64 groups or primitives in group. (context dependent)</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-Z##</td>
              <td align="left">Count of grouped material qualified Base64 4 char quadlets (context dependent)</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="left"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">-a##</td>
              <td align="left">Count of anchor seal groups in list  (anchor seal list) (a)</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-c##</td>
              <td align="left">Count of config traits (each trait is 4 char quadlet   (configuration trait list) (c)</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-d##</td>
              <td align="left">Count of digest seal Base64 4 char quadlets in digest  (digest seal  (d)</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-e##</td>
              <td align="left">Count of event seal Base64 4 char quadlets in seal triple of (event seal) (i, s, d)</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-k##</td>
              <td align="left">Count of keys in list  (key list) (k)</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-l##</td>
              <td align="left">Count of locations seal Base64 4 char quadlets in seal quadruple of (location seal) (i, s, t, p)</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-r##</td>
              <td align="left">Count of root digest seal Base64 4 char quadlets in root digest  (root digest) (rd)</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">-w##</td>
              <td align="left">Count of witnesses in list  (witness list or witness remove list or witness add list) (w, wr, wa)</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="left">
                <strong>Counter Eight Character Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">-0U#####</td>
              <td align="left">Count of qualified Base64 groups or primitives in message data</td>
              <td align="center">8</td>
              <td align="center">5</td>
              <td align="center">8</td>
            </tr>
            <tr>
              <td align="center">-0V#####</td>
              <td align="left">Count of total attached grouped material qualified Base64 4 char quadlets</td>
              <td align="center">8</td>
              <td align="center">5</td>
              <td align="center">8</td>
            </tr>
            <tr>
              <td align="center">-0W#####</td>
              <td align="left">Count of total message data grouped material qualified Base64 4 char quadlets</td>
              <td align="center">8</td>
              <td align="center">5</td>
              <td align="center">8</td>
            </tr>
            <tr>
              <td align="center">-0X#####</td>
              <td align="left">Count of total group message data plus attachments qualified Base64 4 char quadlets</td>
              <td align="center">8</td>
              <td align="center">5</td>
              <td align="center">8</td>
            </tr>
            <tr>
              <td align="center">-0Y#####</td>
              <td align="left">Count of qualified Base64 groups or primitives in group (context dependent)</td>
              <td align="center">8</td>
              <td align="center">5</td>
              <td align="center">8</td>
            </tr>
            <tr>
              <td align="center">-0Z#####</td>
              <td align="left">Count of grouped  material qualified Base64 4 char quadlets (context dependent)</td>
              <td align="center">8</td>
              <td align="center">5</td>
              <td align="center">8</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="left"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">-0a#####</td>
              <td align="left">Count of anchor seals  (seal groups in list)</td>
              <td align="center">8</td>
              <td align="center">5</td>
              <td align="center">8</td>
            </tr>
          </tbody>
        </table>
        <t>The table includes complex groups that are composed of other groups. For example consider the counter attachment group 
with code<tt>-F##</tt> where <tt>##</tt> is replaced by the two character Base64 count of the number of complex groups.<br/>
This is known as the TransIndexedSigGroups counter.  Within the complex group are one more more attached
groups where each group consists of a triple pre+snu+dig
followed by a ControllerIdxSigs group that in turn consists of a counter code <tt>-A##</tt> followed by one or more
indexed signature primitives. The following example details how this complex group may appear.</t>
        <t>The example has only one group. The example is annotated with comments, spaces and line feeds for clarity.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
-FAB     # Trans Indexed Sig Groups counter code 1 following group
E_T2_p83_gRSuAYvGhqV3S0JzYEF2dIa-OCPLbIhBO7Y    # trans prefix of signer for sigs
-EAB0AAAAAAAAAAAAAAAAAAAAAAB    # sequence number of est event of signer's public keys for sigs
EwmQtlcszNoEIDfqD-Zih3N6o5B3humRKvBBln2juTEM      # digest of est event of signer's public keys for sigs
-AAD     # Controller Indexed Sigs counter code 3 following sigs
AA5267UlFg1jHee4Dauht77SzGl8WUC_0oimYG5If3SdIOSzWM8Qs9SFajAilQcozXJVnbkY5stG_K4NbKdNB4AQ         # sig 0
ABBgeqntZW3Gu4HL0h3odYz6LaZ_SMfmITL-Btoq_7OZFe3L16jmOe49Ur108wH7mnBaq2E_0U0N0c5vgrJtDpAQ    # sig 1
ACTD7NDX93ZGTkZBBuSeSGsAQ7u0hngpNTZTK_Um7rUZGnLRNJvo5oOnnC1J2iBQHuxoq8PyjdT3BHS2LiPrs2Cg  # sig 2

]]></artwork>
      </section>
    </section>
    <section anchor="conventions-and-definitions" numbered="true" toc="default">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/> when, and only when, they
appear in all capitals, as shown here.</t>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC4648" target="https://datatracker.ietf.org/doc/rfc4648/">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author initials="S." surname="Josefsson" fullname="Simon Josefsson">
              <organization/>
            </author>
            <date year="2020" month="January" day="21"/>
          </front>
        </reference>
        <reference anchor="RFC20" target="https://datatracker.ietf.org/doc/rfc20/">
          <front>
            <title>ASCII format for network interchange</title>
            <author>
              <organization/>
            </author>
            <date year="2020" month="July" day="29"/>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="KERI" target="https://arxiv.org/abs/1907.02143">
          <front>
            <title>Key Event Receipt Infrastructure (KERI)</title>
            <author initials="S." surname="Smith" fullname="Samuel M. Smith">
              <organization>ProSapien LLC</organization>
            </author>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="JSON" target="https://www.json.org/json-en.html">
          <front>
            <title>JavaScript Object Notation Delimeters</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC4627" target="https://datatracker.ietf.org/doc/rfc4627/">
          <front>
            <title>The application/json Media Type for JavaScript Object Notation (JSON)</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="CBOR" target="https://en.wikipedia.org/wiki/CBOR">
          <front>
            <title>CBOR Mapping Object Codes</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC8949" target="https://datatracker.ietf.org/doc/rfc8949/">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author initials="C." surname="Bormann" fullname="Carsten Bormann">
              <organization/>
            </author>
            <author initials="P." surname="Hoffman" fullname="Paul Hoffman">
              <organization/>
            </author>
            <date year="2020" month="December" day="04"/>
          </front>
        </reference>
        <reference anchor="MGPK" target="https://github.com/msgpack/msgpack/blob/master/spec.md">
          <front>
            <title>Msgpack Mapping Object Codes</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="BOM" target="https://en.wikipedia.org/wiki/Byte_order_mark">
          <front>
            <title>UTF Byte Order Mark</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="DLog" target="https://en.wikipedia.org/wiki/Discrete_logarithm">
          <front>
            <title>Discrete Logarithm Problem</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="NaCL" target="https://nacl.cr.yp.to">
          <front>
            <title>NaCl Networking and Cryptography library</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="MultiCodec" target="https://github.com/multiformats/multicodec">
          <front>
            <title>MultiCodec Multiformats Codecs</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="MCTable" target="https://github.com/multiformats/multicodec/blob/master/table.csv">
          <front>
            <title>MultiCodec Table</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="IPFS" target="https://richardschneider.github.io/net-ipfs-core/api/Ipfs.Registry.HashingAlgorithm.html">
          <front>
            <title>IPFS MultiFormats</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Base58Check" target="https://en.bitcoin.it/wiki/Base58Check_encoding">
          <front>
            <title>Base58Check Encoding</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="WIF" target="https://en.bitcoin.it/wiki/Wallet_import_format">
          <front>
            <title>Wallet Import Format ECDSA Base58Check</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Bin2Txt" target="https://en.wikipedia.org/wiki/Binary-to-text_encoding">
          <front>
            <title>Binary to Text Encoding</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ASCII" target="https://en.wikipedia.org/wiki/ASCII">
          <front>
            <title>Text Printable ASCII Characters</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="UTF8" target="https://en.wikipedia.org/wiki/UTF-8">
          <front>
            <title>UTF-8 Unicode</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Latin1" target="https://en.wikipedia.org/wiki/ISO/IEC_8859-1">
          <front>
            <title>Latin-1 ISO 8859-1</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="STOMP" target="https://stomp.github.io">
          <front>
            <title>Simple Text Oriented Messaging Protocol</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RAET" target="https://github.com/RaetProtocol/raet">
          <front>
            <title>Reliable Asynchronous Event Transport</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Affinity" target="https://crd.lbl.gov/assets/Uploads/Nathan-NDM14.pdf">
          <front>
            <title>Analysis of the Effect of Core Affinity on High-Throughput Flows</title>
            <author>
              <organization/>
            </author>
            <date year="2014" month="November" day="16"/>
          </front>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments" toc="default">
      <name>Acknowledgments</name>
      <t>The keripy development team, the KERI community and the ToIP ACDC working group.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
JikLutg0VlJfKcn+8+iv/0QOhP9Rsv+FlGwbm7YIhi+vbetbzz+Lug0K8+PH
j5vdjlG6t++udO88bnbau83dnZLi3dmBrrFnpXw/aje3tjrNnW2ngHvNtBK+
VDxYRQl/vLpYuhpP1KLp3Rjif5ds+tncEHcXUKsUiqHLjt7+27WjVZXyFehw
qVK++09Ohv9Il+c/IRneoqTfhQyXa+lP/snp8B/plf0npMPblfbAVcMP1p6a
SlgumD2XAEcJJw5z1nSh085WNQS36eIL6UalzF6IiUkgpsi91dCkCdET2asG
XJXfJzwVy8mqC+4ZaRnF48ui3NQVTdc1R9kXSw8qdOqVp0+z2mL0Ta+3S64W
L4RB+foJXT/hEOAljNgW6kaOUsXAcIKXM94E4znMBpaIg0X73k2rGoRhSgpC
Epn0S/5S37qA60W1DKXsma5gz/Ur4uXXFZkLBN06c6qLKUlh2IaHKimkY2ol
2ku+OEvavIr1fKa2YhgmXxD7odpj1dhuE5TtrrHStyflVM4hl7x9SqbVYdOu
ypIoVsg8KaiYZxAnMVUYtt+70ptWBxUG6unh1ShnUuttwWp/EkHqx1Ra3dGR
vmqtyoHUuqQlOp3COlt0EEh3NuC8xTWa3tmiQlxWgDujAGNc5LrkAjV23dCh
jGEYFFAr7EgXKIujmjhZf2zhvCV6UkkI3n3cj7rVcPjSq/mmNnczG3PMq3GY
Dh0frcczHzDIIMvHHW4crxT+IhMMonp5DG1lwtYGU6ZkYYf8gtnCy+MGyrvT
3tZjlql+ZaRsez3QdBWmeZ/usKctVkdzi+lM7wnvmoEypTPqaN8a6jWyhour
9vbjfin0Waw8cuZT08Ue6AC1YS2ALacbdeDU0s3uMqJZsL4ugwHQ19YC2jJ6
qCOgMtXelYJIyCyNOpLapjp6ClC4Y5aiihFOFtgvn9y3LEudpcIujqkLpqO/
kcjcNcWUJIo5OC7xCsvi86Fp6tOnsxILNvlHpzOTzIXijYneshls5bryeMEF
XddBVn2b2EFFV0wpA6r3b278oOvj5dZl7yrV20UNCbIzEz20OWfH5lYhvk6Z
00/KheCkVhyb9n05c+DfdW2wRqKcO2v9i025rJwFxv/7AhkOJirk8OEHkoW4
eJA8ogWkJ5+UHgMf7H1VnzDbeQrY9OrQ7VX/5l91/7Za5Qp1gfup+fvT0n91
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
KKesIw2OG+f5hpRmzQbGk+EHgM3cO8IJsQDTHK8h9fo0qKaQ6h5aNXuB7lSl
pDSqhuvShSUqV8us6zAqwnjChVILLt2vcUJlMSh8X3LDzHsYLG8TfkXl1N9j
5keSAA8uXPL0lPgtyGQzIAGuNTeJ4fVRFA056WAwCTO8qqbR+Pvf/95oPSWf
LRZEoEUNjIMAUBf468r46agJEkyN43cX3Xez3a1347Pz+f7PV88uf/th67z9
3cefj592hydh6/Tw1fP+yeXB6eOfeSSyfRmPq6QLcxYT/pk3Wsf7B+392p8D
7qEmugiFQJbubY9/zr3UYtv/8fX0r8VkkH98mR6fHI1+O2r9El9uvdxJHx1s
Xc6nZ99fHRxMku6v84vjF4FgR8TMuw3UYr8uvu/oUqO4hNwthVzqYH//UXfn
8evJ03Hn12+jaPsonF8Wjx+ff3w22f3x9eG7dhpPf3726GS0dT48OT3/+OOL
3b/mT86fhr/ux5O/DtKPP333Q9J///OjvHj27vvtl/3vhy8Ptvf/arneAzIr
thv7Bwfj6Lek+OXHrWfz7W+fty+30uHPH3eeh7+8O38xmp5cPG8dFOlv7x6f
/vI02nre2fl1ehptP3mdddq7198+niYH4W/d43ft1+2X7cGjq3H2XXE044F4
jE5j//Di6PHLo5+ebP3y7OL9LwcH8/Po/Fm+/9fH8/ZlMp69vPjl4vt3r6eP
s9e/PEuen7387ip9lJ4myWHnu2588Ndv5x/S33Zf3fw6vNg6+Pa8+zx+leXd
w7EZocskbZKsDjGqMGE9B/fBkUuL432GStl1msG++ApLrX7V5N/By1P6++z4
r69Pzo6P8O/zb/efP7d/NKTF+benr58fub/cm4enL14cvzzil+Fp4D1qfPVi
/+ev+BKfr05fXZycvtx//pW9KGmYDubE8CnRmRJ6MJMugw1DZZjzBue69DlB
9ODw1f/7v53t4G9/+19nTw+7nc6Tf/93+bDbebwNHzDfjUcjdsIfgTnfNJjv
YC+U/xXOYpDogH2EdFEPMHzkxsAqNt4gZt7uBf+7P5h1tv8iD3DC3kODM+8h
4az6pPIyI7HmUc0wFpve8xKmfXj3f/Y+G7yrh0Q259FgjgySrvLC4zg0JHN6
dGq/paYn+y/3q828JUQenqTcMuSao5hq1Wq1gn44eI+97A/wbJ1EwzHx7sbf
9pipRcNvvhrBakRf/buhVzj8buA4uYom6YxT96JwyjnL3x+fnRD/nycIvKnV
fZGevAr2D48OkdLfW6a92fj/Ou1ZPqo7AQA=

-->

</rfc>
