<?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-rfc version 1.6.39 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ssmith-cesr-03" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="CESR">Composable Event Streaming Representation (CESR)</title>
    <seriesInfo name="Internet-Draft" value="draft-ssmith-cesr-03"/>
    <author initials="S." surname="Smith" fullname="S. Smith">
      <organization>ProSapien LLC</organization>
      <address>
        <email>sam@prosapien.com</email>
      </address>
    </author>
    <date year="2023" month="July" day="28"/>
    <area>TODO</area>
    <workgroup>TODO Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 122?>
<t>The Composable Event Streaming Representation (CESR) is a 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 the separability of individual primitives. 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. The CESR protocol is used by other protocols such as KERI <xref target="KERI"/>.</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/trustoverip/tswg-cesr-specification"/>.</t>
    </note>
  </front>
  <middle>
    <?line 126?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>One way to better secure Internet communications is to use cryptographically verifiable primitives and data structures both inside messages and in support of messaging protocols. Cryptographically verifiable primitives provide essential building blocks for zero-trust computing and networking architectures. Traditionally cryptographic primitives including but 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"/> text-printable characters, <xref target="RFC20"/>. These domains include source code,  documents, system logs, audit logs, Ricardian contracts, and human-readable text documents of many types <xref target="JSON"/><xref target="RFC4627"/>.</t>
      <t>Generic binary-to-text, <xref target="Bin2Txt"/>, or simply textual encodings such as Base64 <xref target="RFC4648"/>, 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"/> 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"/>. 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"/> such as ISO Latin-1, <xref target="Latin1"/> or UTF-8, <xref target="UTF8"/>, 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"/> from <xref target="MultiCodec"/> for <xref target="IPFS"/>. Indeed some <xref target="Base58Check"/> applications take advantage of the binary MultiCodec tables but only used <em>serendipitous</em> text-compatible type codes. <em>Serendipitous</em> text encodings that appear in binary code tables, do not, however, work in general for any size or type. So the <em>Serendipitous</em> 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"/> or <xref target="RAET"/>. 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 data structures of all types into text not merely those that contain cryptographic primitives.</t>
      <t>Textual encodings have numerous usability advantages over binary encodings. The one advantage, however, that a binary encoding has over text is compactness. An encoding protocol that has the property we call <em>text-binary concatenation composability</em> or more succinctly <strong><em>composability</em></strong> enables both the usability of text and the compactness of binary. <strong><em>Composability</em></strong> may be the most uniquely innovative and useful feature of the encoding protocol defined herein.</t>
      <section anchor="composability">
        <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 stream of text primitives to binary for compact transmission that may be safely converted back to text en-masse by a stream processor at the other end for further processing or archival storage. The addition of group framing codes as independently composable primitives enables hierarchical compositions. Such a hierarchically composable encoding protocol enables pipelining (multiplexing and de-multiplexing) of complex 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"/>.</t>
      </section>
      <section anchor="abstract-domain-representations">
        <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 <strong><em>T</em></strong>. The second domain we call streamable binary or <em>binary</em> and is denoted as <strong><em>B</em></strong>. 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 <strong><em>R</em></strong>. 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> or <tt>(code, raw)</tt> for short. The <em>text code</em> element of the <em>R</em> domain pair is a 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. The raw binary element is composed of bytes. The actual use of cryptographic primitives happens in the <em>R</em> domain using the <em>raw binary</em> element of the <tt>(code, raw)</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. The CESR protocol, however, is not limited to merely encoding cryptographic primitives but any primary data type (numbers, text, datetimes, lists, maps) may be encoded in a composable way.</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 an indexed set of primitives in the <em>R</em> domain is denoted with  <tt>r[k]</tt>.</t>
        <section anchor="transformations-between-domains">
          <name>Transformations Between Domains</name>
          <t>Although the composability property mentioned in the previous section 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 described in detail in this section. 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 a 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>
          <sourcecode type="text"><![CDATA[
R->T(R)->T->B(T)->B->R(B)->R
]]></sourcecode>
          <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>
          <sourcecode type="text"><![CDATA[
R->B(R)->B->T(B)->T->R(T)->R
]]></sourcecode>
        </section>
        <section anchor="concatenation-composability-property">
          <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>
          <sourcecode type="text"><![CDATA[
t[0] + t[1] + t[2] + t[3] = (t[0] + t[1]) + (t[2] + t[3])
]]></sourcecode>
          <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>. Given the indexed representation, we can express 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 <em>concatenation composability property</em> or <em>composability</em> for short, 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>
          <sourcecode type="text"><![CDATA[
T(cat(b[k]))=cat(T(b[k])) and B(cat(t[k]))=cat(B(t[k])) for all k.
]]></sourcecode>
          <t>Basically, <em>composability</em> (over concatenation) means that the transformation of a set (as a whole) of concatenated primitives is equal to the concatenation 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 transforms, respectively, 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>
          <sourcecode type="text"><![CDATA[
B(t[0] + t[1]) = B(t[0]) + B(t[1]) = b[0] + b[1]
]]></sourcecode>
          <t>and</t>
          <sourcecode type="text"><![CDATA[
T(b[0] + b[1]) = T(b[0]) + T(b[1]) = t[0] + t[1].
]]></sourcecode>
          <t>The <em>composability</em> property defined above 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 <em>composability</em> property is an essential building block for streaming in either domain. The use of framing primitives that count or group other primitives enables multiplexing and demultiplexing of arbitrary groups of primitives for pipelining and/or on or offloading of streams. The text domain representation of a stream enables better usability (readability), and the binary domain representation of a stream enables better compactness. In addition, pipelined hierarchical composition codes allow efficient conversion or off-loading for concurrent processing of composed (concatenated) groups of primitives in a stream without having to individually parse each primitive before off-loading.</t>
        </section>
      </section>
    </section>
    <section anchor="concrete-domain-representations">
      <name>Concrete Domain Representations</name>
      <t>Text, <em>T</em>, domain representations in CESR use only the characters from the URL and filename safe variant of the IETF RFC-4648 Base64 standard <xref target="RFC4648"/>. Unless otherwise indicated, all references to Base64 <xref target="RFC4648"/> 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 to Z</tt>, <tt>a to z</tt>, <tt>0 to 9</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 because all CESR-encoded primitives are composable.</t>
      <t>Notable is the fact that Base64 <xref target="RFC4648"/> by itself does not satisfy the composability property and must employ pad characters to ensure one-way convertibility between binary and text.</t>
      <t>In CESR, however, 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 wish to use Base64 characters in the text domain and binary bytes in the binary domain. For the sake of example, we will call these, respectively, naive text and naive binary encodings and domains. Recall that a byte encodes 8 bits of information and a Base64 character encodes 6 bits of information. Furthermore, suppose that we have three primitives denoted <tt>a</tt>, <tt>b</tt>, and <tt>c</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 indices.  For example, <tt>a1</tt> is bit one from <tt>a</tt>, <tt>a0</tt> is bit zero, and <tt>A0</tt> for byte zero, <tt>A1</tt> for byte 1, etc.</t>
      <t>The byte and bit-level diagrams for <tt>a</tt> are shown below, where we use <tt>A</tt> to denote its bytes:</t>
      <sourcecode type="text"><![CDATA[
|           A0          |
|a7:a6:a5:a4:a3:a2:a1:a0|
]]></sourcecode>
      <t>Likewise for <tt>b</tt> below:</t>
      <sourcecode type="text"><![CDATA[
|           B1          |           B0          |
|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
]]></sourcecode>
      <t>And finally, for <tt>c</tt> below:</t>
      <sourcecode type="text"><![CDATA[
|           C2          |           C1          |           C0          |
|c7:c6:c5:c4:c3:c2:c1:c0|c7:c6:c5:c4:c3:c2:c1:c0|c7:c6:c5:c4:c3:c2:c1:c0|
]]></sourcecode>
      <section anchor="conversions">
        <name>Conversions</name>
        <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 using zero-based indices, with the most significant character first.</t>
        <t>Therefore encoding <tt>a</tt> in Base64 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 uses a Base64 character where the non-coding bits are zeros. This is diagrammed as follows:</t>
        <sourcecode type="text"><![CDATA[
|           A0          |
|a7:a6:a5:a4:a3:a2:a1:a0|z3:z2:z1:z0|
|        T1       |        T0       |
]]></sourcecode>
        <t>where <tt>aX</tt> represents a bit from <tt>A0</tt> and <tt>zX</tt> represents a zeroed pad bit, and <tt>TX</tt> represents a non-pad character from the converted Base64 text representing one hextet of information from the converted binary string.</t>
        <t>Naive Base64 encoding always pads each individual conversion of a string of bytes to an even multiple of four characters. This provides a property that is not true composability but does ensure that multiple distinct concatenated conversions from binary to Base64 text 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>a</tt> is as follows:</t>
        <sourcecode type="text"><![CDATA[
|           A0          |
|a7:a6:a5:a4:a3:a2:a1:a0|z3:z2:z1:z0|
|        T3       |        T2       |========P1=======|========P0=======|
]]></sourcecode>
        <t>where <tt>aX</tt> represents a bit from <tt>a</tt>, <tt>AX</tt> represents a byte from <tt>a</tt>,  <tt>zX</tt> represents a zeroed pad bit, <tt>PX</tt> represents a trailing pad character, and <tt>TX</tt> represents a non-pad character from the converted Base64 text representing one hextet of information from the converted binary string. We see that Base64 conversion effectively left shifts <tt>a</tt> by four bits plus two pad characters. In other words, the Base64 conversion of <tt>a</tt> is no longer right-aligned with respect to the trailing Base64 character.</t>
        <t>Likewise, <tt>b</tt> requires at least three Base64 characters to capture all of its sixteen bits of information as follows:</t>
        <sourcecode type="text"><![CDATA[
|           B1          |           B0          |
|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|z1:z0|
|        T2       |        T1       |        T0       |
]]></sourcecode>
        <t>where <tt>bX</tt> represents a bit from <tt>b</tt>, <tt>BX</tt> represents a byte from <tt>b</tt>, <tt>zX</tt> represents a zeroed pad bit,  and <tt>TX</tt> represents a non-pad character from the converted Base64 text representing one hextet of information from the converted binary string.
Alignment on a four-character (24-bit) boundary requires one pad character this becomes:</t>
        <sourcecode type="text"><![CDATA[
|           B1          |           B0          |
|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|z1:z0|
|        T2       |        T1       |        T0       |========P0=======|

]]></sourcecode>
        <t>where <tt>bX</tt> represents a bit from <tt>b</tt>, <tt>BX</tt> represents a byte from <tt>b</tt>, <tt>zX</tt> represents a zeroed pad bit, <tt>PX</tt> represents a trailing pad character,  and <tt>TX</tt> represents a non-pad character from the converted Base64 text representing one hextet of information from the converted binary string. We see that Base64 conversion effectively left shifts <tt>a</tt> by four bits plus two pad characters.  We see that Base64 conversion effectively left shifts <tt>b</tt> by four bits plus one pad character. In other words, the Base64 conversion of <tt>b</tt> is no longer right-aligned with respect to the trailing Base64 character.</t>
        <t>Finally, <tt>c</tt>  requires exactly four Base64 characters to capture all of its twenty-four bits of information. There are no pad characters required.</t>
        <sourcecode type="text"><![CDATA[
|           C2          |           C1          |           C2          |
|c7:c6:c5:c4:c3:c2:c1:c0|c7:c6:c5:c4:c3:c2:c1:c0|c7:c6:c5:c4:c3:c2:c1:c0|
|        T3       |        T2       |        T1       |        T0       |
]]></sourcecode>
        <t>where <tt>cX</tt> represents a bit from <tt>c</tt>, <tt>CX</tt> represents a byte from <tt>c</tt>,  and <tt>TX</tt> represents a non-pad character from the converted Base64 text representing one hextet of information from the converted binary string. There are no bit shifts because there are no pad bits nor pad characters needed, and the resulting Base64 conversion is right aligned with respect to the trailing Base64 character.</t>
        <t>Suppose now we concatenate <tt>a + b</tt> into a three-byte composition in the naive binary domain before Base64 encoding the concatenated whole. We have the following:</t>
        <sourcecode type="text"><![CDATA[
|           A0          |           B1          |           B0          |
|a7:a6:a5:a4:a3:a2:a1:a0|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
|        T3       |        T2       |        T1       |        T0       |
]]></sourcecode>
        <t>We see that the least significant two bits of <tt>A0</tt> are encoded into the same character, <tt>T2</tt> as the four most significant four bits of <tt>B1</tt>. Therefore, a text-domain parser would be unable to cleanly de-concatenate on a character-by-character basis the conversion of <tt>a + b</tt> into separate text-domain primitives. Therefore, standard (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 the text domain and then convert them as a whole to naive binary. We have the following:</t>
        <sourcecode type="text"><![CDATA[
|        U0       |        V2       |        V1       |        V0       |
|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
|           B2          |           B1          |           B0          |
]]></sourcecode>
        <t>We see that all six bits of information in <tt>U0</tt> is included in <tt>B2</tt> along with the least significant two bits of information in <tt>V2</tt>. Therefore a binary domain parser is unable to cleanly de-concatenate on a byte-by-byte basis the conversion of <tt>u + v</tt> into separate binary domain primitives. Therefore, standard (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 (24 bits) and each primitive in the <em>B</em> domain is an integer multiple of three bytes (24 bits). Each of either four Base64 text characters or three binary bytes captures twenty-four bits of information. Twenty-four is the least common multiple of six and eight. Therefore in order to cleanly capture integer multiples of twenty-four bits of information, primitive lengths <bcp14>MUST</bcp14> be integer multiples of either four Base64 text characters or three binary bytes in their respective domains. Given the constraint of alignment on 24-bit boundaries in either text or binary domains is satisfied, the conversion of concatenated primitives in one domain never results in the same byte or character in the converted domain sharing bits from two adjacent primitives. This constraint of 24-bit alignment, therefore, satisfies the <em>composability</em> property.</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 composability property. This means that the length of any primitive in the <em>B</em> domain <bcp14>MUST</bcp14> be an integer multiple of three binary bytes with a minimum length of three binary bytes. Likewise, this means that the length of any primitive in the <em>T</em> domain <bcp14>MUST</bcp14> be an integer multiple of 4 Base64 characters with a minimum length of four Base64 characters.</t>
      </section>
      <section anchor="stable-text-type-codes">
        <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, readability, or human friendliness. Indeed a primary design goal of CESR is to select an encoding approach that provides high usability, readability, or human friendliness in the <em>T</em> domain. This type of usability goal is simply 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>The 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 do not. Generally, 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="stable-value-encoding">
        <name>Stable Value Encoding</name>
        <t>A secondary usability constraint is recognizable or readable stable value coding in the text, <em>T</em>, domain. Not all primitives benefit from stable value coding. Any representation of a value that is a long random string of characters is essentially unreadable or recognizable versus some other representation. Bit shifts of the value, as long as they are static, do not change the readability. This is not true, however of values that are small numbers. Base64 encodings of small numbers are readable. for example, the numerical sequence of decimal numbers, <tt>0, 1, 2</tt>, is recognizable as the sequence of Base64 characters, <tt>A, B, C</tt>. Thus, all else equal, readable stable value encodings also contribute to usability, at least in some cases.</t>
      </section>
      <section anchor="code-characters-and-lead-bytes">
        <name>Code Characters and Lead Bytes</name>
        <t>There are two ways to provide the required alignment on 24-bit boundaries to satisfy the composability property. One is to post-pad, with trailing pad characters, <tt>=</tt>, the text domain encoding to ensure that the <em>T</em> domain primitive has a total size (length) that is an integer multiple of 4. This is what naive Base64 encoding does. The other way is to pre-pad leading bytes of zeros to the raw binary value before conversion to Base64 to ensure the total size of the raw binary value with pre-pad bytes is an integer multiple of 3 bytes. This ensures that the size in characters of the Base64 conversion of the pre-padded raw binary is an integer multiple of 4 characters.</t>
        <t>Given the second way, there is one of two options that depend on the specific code. In the first option, an appropriate number of text characters that result from the conversion of a porting of the leading pre-pad zero bytes are replaced with the appropriate number of code characters. In the second option, the code characters are pre-pended to the conversion with leading zeros intact. In the second option, the length of the pre-pended type code <bcp14>MUST</bcp14> also, thereby, be an integer multiple of 4 characters. In either option, 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 than the second. The second way may be easier to compute in some cases. The most significant advantage of the second way is that the value portion of is stable and more readable both in the text, <em>T</em>, domain and in the, <em>B</em>, binary domain because the value portion is not shifted by the Base64 conversion as it is with the first way.</t>
        <t>In order to avoid confusion with the use of the term <tt>pad character</tt>, when pre-padding with bytes that are not replaced later, we use the term <tt>lead 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 number of pad characters when padding post-conversion equals the number of lead 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 leading pad byte is needed to make the size (length in byte) of raw binary an integer multiple of 3. The 1 lead 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 trailing pad character. In both cases, the resultant length in Base64 is 44 characters.</t>
        <t>Similarly, a 64-byte raw binary value needs 2 lead 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, there are two possibilities for CESR's coding scheme to ensure a composable 24-bit alignment. The first is to add trailing pad characters post-conversion. The second is to add leading pad bytes pre-conversion. Because of the greater readability of the value portion of both the fully qualified text, <em>T</em>, or fully qualified binary, <em>B</em>, domain representations, the second approach was chosen for CESR.</t>
      </section>
      <section anchor="multiple-code-table-approach">
        <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 the primitive.</t>
      </section>
    </section>
    <section anchor="text-coding-scheme-design">
      <name>Text Coding Scheme Design</name>
      <section anchor="text-code-size">
        <name>Text Code Size</name>
        <t>Recall from above, that 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 and 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.</t>
        <t>The corresponding <em>T</em> domain representation of this pair is created by first prepending leading pad bytes of zeros to the <em>raw binary</em> element. This result is then converted to Base64. Depending on the code, either the frontmost characters that result from the Base64 conversion of leading pad bytes of zeros are replaced with the text code element of appropriate size in characters, or an appropriately sized text code element is prepended to the conversion without replacing any characters.</t>
        <t>Recall that 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 standard Base64 conversion that employs pad characters, the text domain representation that results from the individual conversion of a set of binary strings when concatenated in the text domain after conversion and stripping off pad characters is not necessarily equivalent to the text domain representation that results from converting en masse to text the concatenation of the same set of binary strings and then stripping off pad characters. In the latter case, knowledge of the set of binary strings is lost because the resultant conversion may have bits from two binary bytes concatenated in one text character. Restated, the problem with standard Base64 is that it does not preserve byte boundaries after the en-masse conversion of concatenated binary strings. Consequently, standard (naive) Base64 does not provide two-way or true composability as defined above.</t>
        <t>To elaborate, the number of pad characters appended with standard Base64 encoding is a function of the length of the binary string. Let <em>N</em> be the length in bytes of the binary string. When <tt>N mod 3 = 1</tt>, then there are 8 bits in the remainder that must be encoded into Base64. Recall from the examples above that a single byte (8 bits) requires 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. Furthermore when
<tt>N mod 3 = 1</tt>, then the addition of 2 more zeroed bytes to the length of the binary string such that <tt>M = N + 2</tt> would result in <tt>M mod 3 = 0</tt> or equivalently <tt>N + 2 mod 3 = 0</tt>.</t>
        <t>Similarly, when <tt>N mod 3 = 2</tt>, then there are two bytes (16 bits) in the remainder that must be encoded into Base64. Recall from the examples above that 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 trailing pad character is required to pad out the resulting conversion so that its length is an integer multiple of 4 characters. Furthermore when
<tt>N mod 3 = 2</tt>, then the addition of 1 more byte of zeros added to the length of the binary string such that <tt>M = N + 1</tt> would result in <tt>M mod 3 = 0</tt> or equivalently <tt>N + 2 mod 3 = 0</tt>. Thus the number of leading pre-pad zeroed bytes needed to align the binary string on a 24-bit boundary is the same as the number of trailing pad characters needed to align the converted Base64 text string on a 24-bit boundary.</t>
        <t>Finally, when <tt>N mod 3 = 0</tt> then the binary string is aligned on a 24-bit boundary and no trailing pad characters are required to ensure the length of the Base64 conversion is an integer multiple of 4 characters. Likewise, no leading pad bytes are required to ensure the length of the binary string is an integer multiple of 3 bytes.</t>
        <t>Thus, in all three cases, the number of trailing post-pad characters, if any, needed to align the converted Base64 text string on a 24-bit boundary is the same as the number of leading pre-pad bytes, if any, needed to align the binary string on a 24-bit boundary.</t>
        <t>The number of required trailing Base64 post-pad characters or equivalently the number of leading pre-pad zeroed bytes to ensure 24 bit alignment 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 (pre-pad bytes or post-pad characters) 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 appropriate 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>The 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 a 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>
          <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> equaling 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="pre-padding-before-conversion">
        <name>Pre-Padding Before Conversion.</name>
        <t>Returning to the examples above, let's observe what happens when we pre-pad the binary strings with zeroed leading pad bytes of the appropriate length given by <tt>ps = (3 - (N mod 3)) mod 3)</tt> where <tt>ps</tt> is the number of leading pad bytes and <tt>N</tt> is the length of the raw binary string before padding is prepended.</t>
        <section anchor="one-byte">
          <name>One Byte</name>
          <t>For the one byte raw binary string <tt>a</tt>, <tt>ps</tt> is two. The pre-padded conversion results in the following:</t>
          <sourcecode type="text"><![CDATA[
|           Z1          |           Z0          |           A0          |
|z7:z6:z5:z4:z3:z2:z1:z0|z7:z6:z5:z4:z3:z2:z1:z0|a7:a6:a5:a4:a3:a2:a1:a0|
|        T3       |        T2       |        T1       |        T0       |
]]></sourcecode>
          <t>where  <tt>ZX</tt> represents a zeroed pre-pad byte, <tt>zX</tt> represents a zeroed pre-pad bit, <tt>AX</tt> represents a byte from <tt>a</tt>, <tt>aX</tt> represents a bit from <tt>a</tt>, and <tt>TX</tt> represents a Base64 character that results from the Base64 conversion of the pre-padded <tt>a</tt>.</t>
          <t>Noteworthy is that the first two (i.e. <tt>ps</tt>) characters of the conversion, namely, <tt>T3T2</tt> does not include any bits of information from <tt>a</tt>. This also means that <tt>T3T2</tt> can be modified after conversion without impacting the appearance or value of the converted <tt>a</tt> that appears solely in <tt>T1T0</tt>, i.e. there is no overlap. Moreover, the resulting Base64 conversion of <tt>a</tt> is right aligned with respect to the trailing Base64 character. This means that one can "read" and understand the numerical values for <tt>a</tt> from such an unshifted Base64 conversion.  This also means that a text-based parser on a character-by-character basis can cleanly process <tt>T3T2</tt> separate from the Base64 encoding of <tt>a</tt> that appears in <tt>T1T0</tt>. Given this separation we could replace <tt>T3T2</tt> with  two character Base64 textual type code <tt>C1C0</tt> as follows:</t>
          <sourcecode type="text"><![CDATA[
|           Z1          |           Z0          |           A0          |
|z7:z6:z5:z4:z3:z2:z1:z0|z7:z6:z5:z4:z3:z2:z1:z0|a7:a6:a5:a4:a3:a2:a1:a0|
|        S1       |        S0       |        T1       |        T0       |
|s5:s4:s3:s2:s1:s0|s5:s4|s3:s2:s1:s0|z3:z2:z1:z0|a7:a6:a5:a4:a3:a2:a1:a0|
]]></sourcecode>
          <t>where  <tt>ZX</tt> represents a zeroed pre-pad byte, <tt>zX</tt> represents a zeroed pre-pad bit, <tt>AX</tt> represents a byte from <tt>a</tt>, <tt>aX</tt> represents a bit from <tt>a</tt>,  <tt>TX</tt> represents a Base64 character that results from the Base64 conversion of the pre-padded <tt>a</tt>, <tt>SX</tt> represents a Base64 code character replacing one of the <tt>TX</tt>, and <tt>sX</tt> is a code bit. The resultant four-character Base64 encoded primitive would be <tt>C1C0T1T0</tt>.</t>
          <t>When <tt>C1C0T1T0</tt> is converted back to binary from Base64, the result would be as follows:</t>
          <sourcecode type="text"><![CDATA[
|        S1       |        S0       |        T1       |        T0       |
|s5:s4:s3:s2:s1:s0|s5:s4|s3:s2:s1:s0|z3:z2:z1:z0|a7:a6:a5:a4:a3:a2:a1:a0|
|           U1          |        U0             |           A0          |
]]></sourcecode>
          <t>where  <tt>CX</tt> represents a Base64 code character replacing one of the <tt>TX</tt>, <tt>cX</tt> is a code bit, <tt>UX</tt> represents a byte from the converted code char, which may include zeroed bits, <tt>zX</tt> represents a zeroed pre-pad bit, <tt>AX</tt> represents a byte from <tt>a</tt>, <tt>aX</tt> represents a bit from <tt>a</tt>, and <tt>TX</tt> represents a Base64 character that results from the Base64 conversion of the pre-padded <tt>a</tt>.</t>
          <t>Stripping off <tt>U1U0</tt> leaves <tt>a</tt> in its original state. Noteworthy is that the code characters (only) are effectively left shifted 4 bits after conversion. The code characters <tt>S1S0</tt> can be recovered as the first two characters that are obtained from simply converting <tt>U1O0</tt> only back to Base64.</t>
        </section>
      </section>
      <section anchor="two-byte">
        <name>Two Byte</name>
        <t>For the two-byte raw binary string <tt>b</tt>, <tt>ps</tt> is one. The pre-padded conversion results in the following:</t>
        <sourcecode type="text"><![CDATA[
|           Z0          |           B1          |           B0          |
|z7:z6:z5:z4:z3:z2:z1:z0|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
|        T3       |        T2       |        T1       |        T0       |
]]></sourcecode>
        <t>where  <tt>ZX</tt> represents a zeroed pre-pad byte, <tt>zX</tt> represents a zeroed pre-pad bit, <tt>BX</tt> represents a byte from <tt>b</tt>, <tt>bX</tt> represents a bit from <tt>b</tt>, and <tt>TX</tt> represents a Base64 character that results from the Base64 conversion of the pre-padded <tt>b</tt>.</t>
        <t>Noteworthy is that the first one (i.e., <tt>ps</tt>) character of the conversion, namely, <tt>T3</tt>, does not include any bits of information from <tt>b</tt>. This also means that <tt>T3</tt> can be modified after conversion without impacting the appearance or value of the converted <tt>b</tt> that appears solely in <tt>T2T1T0</tt>, i.e., there is no overlap. Moreover, the resulting Base64 conversion of <tt>b</tt> is right aligned with respect to the trailing Base64 character. This means that one can "read" and understand the numerical values for <tt>b</tt> from such an unshifted Base64 conversion.  This also means that a text-based parser on a character-by-character basis can cleanly process <tt>T3</tt> separate from the Base64 encoding of <tt>b</tt> that appears in <tt>T2T1T0</tt>. Given this separation, we could replace <tt>T3</tt> with one character Base64 textual type code <tt>C0</tt> as follows:</t>
        <sourcecode type="text"><![CDATA[
|           Z1          |           B1          |           B0          |
|z7:z6:z5:z4:z3:z2:z1:z0|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
|        S0       |        T2       |        T1       |        T0       |
|s5:s4:s3:s2:s1:s0|z1:z0|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
]]></sourcecode>
        <t>where  <tt>ZX</tt> represents a zeroed pre-pad byte, <tt>zX</tt> represents a zeroed pre-pad bit, <tt>BX</tt> represents a byte from <tt>b</tt>, <tt>bX</tt> represents a bit from <tt>b</tt>,  <tt>TX</tt> represents a Base64 character that results from the Base64 conversion of the pre-padded <tt>b</tt>, <tt>SX</tt> represents a Base64 code character replacing one of the <tt>TX</tt>, and <tt>sX</tt> is a code bit,. The resultant four-character Base64 encoded primitive would be <tt>S0T2T1T0</tt>.</t>
        <t>When <tt>S0T2T1T0</tt> is converted back to binary from Base64, the result would be as follows:</t>
        <sourcecode type="text"><![CDATA[
|        S0       |        T2       |        T1       |        T0       |
|s5:s4:s3:c2:cs:s0|z1:z0|b7:b6:b5:b4:b3:b2:b1:b0|b7:b6:b5:b4:b3:b2:b1:b0|
|           U0          |           U1          |           A0          |
]]></sourcecode>
        <t>where  <tt>SX</tt> represents a Base64 code character replacing one of the <tt>TX</tt>, <tt>sX</tt> is a code bit, <tt>UX</tt> represents byte from converted code char which may include zeroed bits, <tt>zX</tt> represents a zeroed pre-pad bit, <tt>BX</tt> represents a byte from <tt>b</tt>, <tt>bX</tt> represents a bit from <tt>b</tt>, and <tt>TX</tt> represents a Base64 character that results from the Base64 conversion of the pre-padded <tt>b</tt>.</t>
        <t>Stripping off <tt>U0</tt> leaves <tt>b</tt> in its original state. Noteworthy is that the code character (only) is effectively left shifted 4 bits after conversion. The code character <tt>S0</tt> can be recovered as the first character obtained from simply converting <tt>U0</tt> only to Base64.</t>
        <section anchor="three-byte">
          <name>Three Byte</name>
          <t>For the three-byte raw binary string <tt>c</tt>, <tt>ps</tt> is zero. So pre-padding is not needed.
~~~text
|           C2          |           C1          |           C2          |
|c7:c6:c5:c4:c3:c2:c1:c0|c7:c6:c5:c4:c3:c2:c1:c0|c7:c6:c5:c4:c3:c2:c1:c0|
|        T3       |        T2       |        T1       |        T0       |
~~~
where <tt>cX</tt> represents a bit from <tt>c</tt>, <tt>CX</tt> represents a byte from <tt>c</tt>,  and <tt>TX</tt> represents a non-pad character from the converted Base64 text representing one hextet of information from the converted binary string. There are no bit shifts because there are no pad bits nor pad characters needed, and the resulting Base64 conversion is right aligned with respect to the trailing Base64 character.</t>
          <t>Without pad characters, however, there is no room to hold a type code. Consequently, any text type code is just prepended to the conversion. The prepended type code <bcp14>MUST</bcp14> be an integer multiple of four Base64 characters. Let <tt>S3S2S1S0</tt> be the type code, then the full primitive with code and converted raw binary is given by the eight-character Base64 string <tt>S3S2S1S0T3T2T1T0</tt>.</t>
          <t>When <tt>S3S2S1S0T3T2T1T0</tt> is converted back to binary, there is no overlap or bit shifting because both the code and raw binary <tt>c</tt> are each separately aligned on twenty-four-bit boundaries.</t>
        </section>
        <section anchor="examples">
          <name>Examples</name>
          <t>Suppose, for example, that we wish to encode two-byte raw binary numbers into CESR using the pre-pad approach described above. In order to achieve twenty-four-bit alignment, the pre-pad size for two-byte numbers is 1 byte. As described above, this means the minimally sized text code is 1 Base64 character. Suppose that the text code is <tt>M</tt> (Base64).  The following table provides examples of encoding the different two-byte raw binary values in the three domains: raw, text, and binary. Recall that the raw-domain is expressed by a tuple of (code, raw) where the code is Base64 text and the raw is the raw binary value without code. For readability, raw binary values are represented in hexadecimal notation.</t>
          <table>
            <thead>
              <tr>
                <th align="right">Raw</th>
                <th align="right">Text</th>
                <th align="right">Binary</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="right">("M", 0x0000)</td>
                <td align="right">"MAAA"</td>
                <td align="right">0x300000</td>
              </tr>
              <tr>
                <td align="right">("M", 0x0001)</td>
                <td align="right">"MAAB"</td>
                <td align="right">0x300001</td>
              </tr>
              <tr>
                <td align="right">("M", 0xffff)</td>
                <td align="right">"MP__"</td>
                <td align="right">0x30ffff</td>
              </tr>
            </tbody>
          </table>
          <t>With this approach, both the binary-domain and text-domain representations are as compact as possible for a fully qualified primitive that satisfies the composability property. The text domain representation has a stable readable code and a stable readable value. The binary domain is value right aligned. The text domain representation consists of 4 text printable characters from the Base64 set of characters, and the binary domain representation consists of 3 bytes. Both are parsable in each domain along character/byte boundaries respectively. A parser reads the first character/byte. It then processes that value to get an index into a lookup table that it uses to find how many remaining characters/bytes to extract from the stream. This makes the primitive self-framing.</t>
        </section>
      </section>
      <section anchor="count-group-or-framing-codes">
        <name>Count, Group, or Framing Codes</name>
        <t>As mentioned above, one of the primary advantages of composable encoding is that special framing codes can be specified to support groups of primitives. Grouping enables pipelining. Other suitable terms for these special <em>framing codes</em> are <em>group codes</em> or <em>count codes</em> for short. These are suitable terms because these framing codes can be used to count characters, primitives in a group, or groups of primitives in a larger group when parsing and offloading a stream of CESR primitives.</t>
        <t>A count code is it's own composable primitive, and its length, therefore, <bcp14>MUST</bcp14> be an integer multiple of four characters in the text domain or equivalently an integer multiple of three bytes in the binary domain. To clarify, a count code is primitive that does not include a raw binary value, only its text code. Because a count code's raw binary element value is empty and its length is an integer multiple of four characters (three bytes), its pad size is always 0.</t>
        <t>To elaborate, we can use count codes as separators to better organize a stream of primitives or to interleave non-native (non-CESR) serializations. Count codes enable the grouping together of any combination of primitives, groups of primitives, or non-native serializations to optimize pipelining and offloading.</t>
      </section>
      <section anchor="interleaved-non-cesr-serializations">
        <name>Interleaved Non-CESR Serializations</name>
        <t>As mentioned above, 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="JSON"/><xref target="RFC4627"/>, CBOR <xref target="CBOR"/><xref target="RFC8949"/>, or MsgPack (MGPK) <xref target="MGPK"/> to serialize flexible self-describing data structures based on field maps, also known as dictionaries or hash tables. With respect to field map serializations, CESR primitives may appear in two different contexts. The first context is as a delimited text primitive inside of a field 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 field 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">
        <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 a 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">
          <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 for both performance and robustness reasons. 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"/>. Recall that a BOM enables a parser of UTF-encoded documents to determine if the UTF codes are big-endian or little-endian <xref target="BOM"/>. In the CESR case, an analogous feature would enable a stream parser to know if a count code, along with its associated counted or framed group of primitives, is expressed in the <em>T</em> or <em>B</em> domain. Together 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 its 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 are potential candidates for 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 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>, that can be used 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. Using framing codes in this way also provides a BOM-like capability that enables a parser to determine if the framing code itself is expressed in either the <em>T</em> or <em>B</em> domain. To clarify, if a stream frame (group) starts with the tritet <tt>0b111</tt>, then the stream frame is <em>B</em> domain CESR, and a stream parser would thereby know how to convert the first sextet of the stream frame to determine which of the two framing codes is being used, <tt>0x3E</tt> or <tt>0x3F</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 for that frame. Otherwise, if a stream starts with  <tt>0b011</tt>, then it's JSON, with either <tt>0b100</tt> or <tt>0b110</tt>, then it's MGPK, and with <tt>0b101</tt>, then it's CBOR.</t>
          <t>This is summarized in the following table:</t>
          <table>
            <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">Unused</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 Count Code or Op Code</td>
                <td align="center"> </td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="stream-parsing-rules">
          <name>Stream Parsing Rules</name>
          <t>Given this set of tritets (3 bits), we can express a requirement for a 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 the framing code itself will include the additional information needed to parse the attached group (frame). 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 field map serialization.</t>
          <t>The stream <bcp14>MUST</bcp14> resume with a frame starting byte that begins 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 composability but also support for interleaved CESR with three of the most popular hash map serializations.</t>
        </section>
      </section>
      <section anchor="compact-fixed-size-codes">
        <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 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 of 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"/> 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"/>). Therefore 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 are 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 and private keys as well as ECDSA private keys. Likewise, 64 bytes is the sweet spot 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>
        <sourcecode type="text"><![CDATA[
(3 - (32 mod 3)) mod 3) = 1
]]></sourcecode>
        <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>
        <sourcecode type="text"><![CDATA[
(3 - (64 mod 3)) mod 3) = 2
]]></sourcecode>
        <t>Therefore the minimal text code size 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, such as the 33-byte ECDSA public keys then, the minimum size text code is 4 characters. So the minimally sized text 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">
        <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 determine which code table to use, either a default code table or a code table selector character when not the default code table. 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 that appears as the default code table. 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 to be dedicated as code table selectors, which leaves 52 characters that may be used for the 1 character type codes in the default table. This gives a total of 13 type code tables consisting of the dual purpose 1 character type or selector code 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 for the other tables. That leaves the letters <tt>A</tt> to <tt>Z</tt> and <tt>a</tt> to <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">
        <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">
          <name>One Character Fixed Raw Size Table</name>
          <t>The one character type code table does not have a 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 a pad size of 1.</t>
        </section>
        <section anchor="two-character-fixed-raw-size-table">
          <name>Two-Character Fixed Raw Size Table</name>
          <t>The two-character type code table uses the 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">
        <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 lead 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 character not only encodes the table but also implicitly encodes the number of lead bytes. The 3 remaining characters is each type code in each table, providing 262,144 unique types. This should provide 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-lead-bytes">
          <name>Large Fixed Raw Size Table With 0 Lead Bytes</name>
          <t>This table uses <tt>1</tt> as its first character or selector. The remaining 3 characters provide the type of each code. Only fixed-size raw binaries with a 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 a pad size of 0.</t>
        </section>
        <section anchor="large-fixed-raw-size-table-with-1-lead-byte">
          <name>Large Fixed Raw Size Table With 1 Lead Byte</name>
          <t>This table uses <tt>2</tt> as its first character or selector. The remaining 3 characters provide the type of each code. Only fixed-size raw binaries with a 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 a pad size of 1.</t>
        </section>
        <section anchor="large-fixed-raw-size-table-with-2-lead-bytes">
          <name>Large Fixed Raw Size Table With 2 Lead Bytes</name>
          <t>This table uses <tt>3</tt> as its first character or selector. The remaining 3 characters provide the type of each code. Only fixed-size raw binaries with a 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 a pad size of 2.</t>
        </section>
      </section>
      <section anchor="small-variable-raw-size-tables">
        <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 sizings such as either encrypted material or legacy cryptographic material types found in the GPG or OpenSSL libraries (like RSA). Furthermore, CESR is meant to support not merely cryptographic material types but other basic types, such as generic text strings and numbers. These basic non-cryptographic types may also 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 lead 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 in each table is, therefore, 64. A given type code is repeated in each table for the same type so that all that differs between codes of the same type in each table is the number of lead bytes needed to align a given variable length on a twenty-four-bit boundary. To clarify, what is different in each table is the number of lead bytes needed to achieve twenty-four-bit alignment for a given variable length. Thus, the selector not only encodes for which type table but also implicitly encodes the number of lead 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-lead-bytes">
          <name>Small Variable Raw Size Table With 0 Lead 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 a 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 a pad size of 0 that each includes 0 lead bytes.</t>
        </section>
        <section anchor="small-variable-raw-size-table-with-1-lead-byte">
          <name>Small Variable Raw Size Table With 1 Lead 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 a 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 a pad size of 1 that each includes 1 lead byte.</t>
        </section>
        <section anchor="small-variable-raw-size-table-with-2-lead-bytes">
          <name>Small Variable Raw Size Table With 2 Lead 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 a 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 a pad size of 2 that each includes 2 lead bytes.</t>
        </section>
      </section>
      <section anchor="large-variable-raw-size-tables">
        <name>Large Variable Raw Size Tables</name>
        <t>Many legacy cryptographic libraries such as OpenSSL and GPG support any variable-sized primitive for keys, signatures, and digests such as RSA. 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 non-cryptographic raw primitive types for the foreseeable future.</t>
        <t>The three tables in this group are for large variable raw size primitives. These three large variable raw size tables use 0, 1, or 2 lead 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. As a special case, the first 62 entries in these tables represent that same crypto suite type as the 62 entries in the small variable raw size tables above. This allows one type to use a smaller 4-character text code when the raw size is small enough.</t>
        <t>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 lead bytes needed to align a given length on a twenty-four bit boundary. The selector not only encodes the table but also implicitly encodes the number of lead 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-lead-bytes">
          <name>Large Variable Raw Size Table With 0 Lead 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 a 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 includes 0 lead bytes.</t>
        </section>
        <section anchor="large-variable-raw-size-table-with-1-lead-byte">
          <name>Large Variable Raw Size Table With 1 Lead 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 a 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 a pad size of 1 that each includes 1 lead byte.</t>
        </section>
        <section anchor="large-variable-raw-size-table-with-2-lead-bytes">
          <name>Large Variable Raw Size Table With 2 Lead 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 a 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 a pad size of 2 that each includes 2 lead bytes.</t>
        </section>
      </section>
      <section anchor="count-framing-code-tables">
        <name>Count (Framing) Code Tables</name>
        <t>There may be as many at 13 count code tables, but only three are currently specified. These three are the small count, four-character table, the large count, eight-character table, and the eight character protocol genus and version table. Because count codes only count quadlets/triplets or the number of primitives or groups of primitives, count codes have no value component but have 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 or group being counted and the size indicates either how many of that type are in the group or the number of quadlets/triplets consumed by that group. 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 count 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 gives a total of 52 single-character count code types.</t>
        <section anchor="small-count-code-table">
          <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 provides 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">
          <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="protocol-genus-and-version-table">
        <name>Protocol Genus and Version Table</name>
        <t>The protocol genus/version table is special because its codes modify the following count code group. A protocol genus and version code itself does not provide a count of the following quadlets or triplets but modifies the protocol genus and version of all the following count codes until another protocol and genus count code is provided. Consequently, a protocol genus and version code <bcp14>MUST</bcp14> only appear at the top level of any count group. In other words, a protocol genus and version code <bcp14>MUST NOT</bcp14> be nested inside any other count code.</t>
        <t>The purpose of this table is twofold. Firstly it allows CESR to be used for different protocols and protocol stacks, where each protocol may have its own dedicated set of code tables. The only table that all protocols must share is the protocol genus and version table (protocol table for short) in the set count code tables. All other entries in all other tables may vary by protocol. Secondly, for a given protocol genus, a protocol genus and version code provides the version of that given protocol's table set. This allows versioning of the CESR code tables for a given protocol.</t>
        <t>The format for a protocol genus and version code is as follows: <tt>--GGGVVV</tt> where <tt>GGG</tt> represents the protocol genus and <tt>VVV</tt> is the version of that protocol genus. The genus uses three Base64 characters for a possible total of 262,144 different protocol genera. The version also uses three Base64 characters which can be used in a protocol genus-specific manner. One suggested approach is to use one character for each of the three components of a semantic version of the form <tt>major.minor.patch</tt> <xref target="SEMVER"/>. This provides 64 major versions, where each major version has up to 64 minor versions, and where each minor version in turn, has up to 64 patches.</t>
      </section>
      <section anchor="opcode-tables">
        <name>OpCode Tables</name>
        <t>The <tt>_</tt> selector is reserved for the yet-to-be-defined opcode table or tables. Opcodes are meant to provide stream processing instructions that are more general and flexible than simply concatenated primitives or groups of primitives. A yet-to-be-determined stack-based virtual machine could be executed using a set of opcodes that provides primitive, primitive group, or stream processing instructions. This would enable highly customizable uses for CESR.</t>
      </section>
      <section anchor="selector-codes-and-encoding-schemes">
        <name>Selector Codes and Encoding Schemes</name>
        <section anchor="encoding-scheme-table">
          <name>Encoding Scheme Table</name>
          <t>The following table summarizes the <em>T</em> domain coding schemes by selector code for the 13 code tables defined above.</t>
          <table>
            <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">Lead 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">
                  <tt>1*</tt></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;</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;</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;</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;</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;</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;</tt></td>
              </tr>
              <tr>
                <td align="center">
                  <tt>-</tt></td>
                <td align="center">
                  <tt>[A-Z,a-z]</tt></td>
                <td align="center">
                  <tt>1*</tt></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">
                  <tt>-</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>--$$$###</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>
            </tbody>
          </table>
        </section>
        <section anchor="encoding-scheme-symbols">
          <name>Encoding Scheme Symbols</name>
          <t>The following table defines the meaning of the symbols used in the encoding scheme table</t>
          <table>
            <thead>
              <tr>
                <th align="center">Symbol</th>
                <th align="center">Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center"> </td>
                <td align="center"> </td>
              </tr>
              <tr>
                <td align="center">
                  <tt>*</tt></td>
                <td align="center">selector-code character also provides the type</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$</tt></td>
                <td align="center">type-code character from  subset of Base64  <tt>[A-Z,a-z,0-9,-,_]</tt></td>
              </tr>
              <tr>
                <td align="center">
                  <tt>%</tt></td>
                <td align="center">lead byte where pre-converted binary includes the number of lead bytes shown</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>#</tt></td>
                <td align="center">Base64 digit as part of a base 64 integer. When part of primitive determines the number of following quadlets or triplets. When part of a count code determines the count of the following primitives or groups of primitives</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>&amp;</tt></td>
                <td align="center">Base64 value characters that represent the converted raw binary value.  The actual number of characters is determined by the prepended text code.  Shown is the minimum number of value characters.</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>TBD</tt></td>
                <td align="center">to be determined, reserved for future</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="parse-tables">
        <name>Parse Tables</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 for 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 domain, 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>
        <section anchor="selector-code-size-table">
          <name>Selector Code Size Table</name>
          <table>
            <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>
        </section>
        <section anchor="parse-size-table">
          <name>Parse Size Table</name>
          <t>Below is a snippet from the Parse Size Table for some example codes</t>
          <table>
            <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">ls</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>
        </section>
        <section anchor="parse-table-symbols">
          <name>Parse Table Symbols</name>
          <table>
            <thead>
              <tr>
                <th align="center">Symbol</th>
                <th align="center">Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center"> </td>
                <td align="center"> </td>
              </tr>
              <tr>
                <td align="center">
                  <tt>*</tt></td>
                <td align="center">entry's size may be calculated from other sizes</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>#</tt></td>
                <td align="center">entry's size may be calculated from extracted code characters given by other sizes</td>
              </tr>
              <tr>
                <td align="center"> </td>
                <td align="center"> </td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="parse-part-sizes">
          <name>Parse Part Sizes</name>
          <t>The following table includes both labels of parts shown in the columns in the Parse Size table as well as parts that may be derived from the Parse Table parts or from transformations,</t>
          <table>
            <thead>
              <tr>
                <th align="center">Label</th>
                <th align="center">Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">
                  <strong><em>hs</em></strong></td>
                <td align="center">hard size in chars (fixed) part of code size</td>
              </tr>
              <tr>
                <td align="center">
                  <strong><em>ss</em></strong></td>
                <td align="center">soft size in chars, (variable) part of code size</td>
              </tr>
              <tr>
                <td align="center">
                  <strong><em>os</em></strong></td>
                <td align="center">other size in chars, when soft part includes two variable values</td>
              </tr>
              <tr>
                <td align="center">
                  <em>ms</em></td>
                <td align="center">main size in chars, (derived) when soft part provides two variable values where <em>ms = ss - os</em></td>
              </tr>
              <tr>
                <td align="center">
                  <em>cs</em></td>
                <td align="center">code size in chars (derived value), where where <em>cs = hs + ss</em></td>
              </tr>
              <tr>
                <td align="center">
                  <strong><em>vs</em></strong></td>
                <td align="center">value size in chars</td>
              </tr>
              <tr>
                <td align="center">
                  <strong><em>fs</em></strong></td>
                <td align="center">full size in chars where <em>fs = hs + ss + vs</em></td>
              </tr>
              <tr>
                <td align="center">
                  <strong><em>ls</em></strong></td>
                <td align="center">lead size in bytes to pre-pad raw binary bytes</td>
              </tr>
              <tr>
                <td align="center">
                  <strong><em>ps</em></strong></td>
                <td align="center">pad size in chars Base64 encoded</td>
              </tr>
              <tr>
                <td align="center">
                  <em>rs</em></td>
                <td align="center">raw size in bytes (derived) of binary value where *rs is derived from <tt>R(T)</tt></td>
              </tr>
              <tr>
                <td align="center">
                  <em>bs</em></td>
                <td align="center">binary size in bytes (derived) where where <em>bs = ls + rs</em></td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="special-context-specific-code-tables">
        <name>Special Context-Specific Code Tables</name>
        <t>The set of tables above provides the basic or master encoding schemes. These coding schemes constitute the basic or master set of code tables. This basic or master set, however, 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 or master encoding schemes and tables.</t>
        <section anchor="indexed-codes">
          <name>Indexed Codes</name>
          <t>Currently, there is only one context-specific coding scheme, that is, for indexed signatures. A common use case is thresholded multi-signature schemes. A threshold-satisficing subset of signatures belonging to an ordered set or list of public keys may be provided as part of a 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.</t>
          <t>A popular signature raw binary size 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 the Base64 encoded integer index.  By using a similar dual selector type code character scheme as above, where the selectors are the numbers <tt>0-9</tt> and <tt>-</tt> and <tt>_</tt>. Then there are 52 type codes given by the letters <tt>A- Z</tt> and <tt>a-z</tt>. The index has 64 values which support 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 indices. Some applications of CESR, like KERI, have the need for dual-indexed signatures (i.e., each signature has two indices) in order to support pre-rotation with partial or reserved participants in a rotation. With partial rotation, a given signature may contribute to the signing threshold for two different thresholds, each on two different lists of keys where the associated key may appear at a different location in each list. For 64-byte signatures, the Ed25519 and ECDSA secp256k1 schemes have entries in the table. For dual-indexed codes, the next larger code size that aligns a 64-byte signature on a 24-bit boundary is 6 characters. The table provides entries for dual-indexed 64-byte signatures. The code includes one selector character, one type character, and two each of two character indices.</t>
          <t>A new signature scheme based on Ed448 with 114-byte signatures is also supported. These signatures have a pad size of zero so require a four-character text code. The first character is the selector <tt>0</tt>, the second character is the type with 64 values, and the last two characters each provide a one-character index as a Base64 encoded integer with 64 different values. A big version code consumes eight characters with one character for the selector, one for the type, and three characters for each of the dual indices.</t>
          <section anchor="indexed-code-table">
            <name>Indexed Code Table</name>
            <t>The associated indexed schemes are provided in the following table.</t>
            <table>
              <thead>
                <tr>
                  <th align="center">Selector</th>
                  <th align="center">Type Chars</th>
                  <th align="center">Index Chars</th>
                  <th align="center">Ondex Chars</th>
                  <th align="center">Code Size</th>
                  <th align="center">Lead 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">
                    <tt>1*</tt></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>$#&amp;&amp;</tt></td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>0</tt></td>
                  <td align="center">1</td>
                  <td align="center">1</td>
                  <td align="center">1</td>
                  <td align="center">4</td>
                  <td align="center">0</td>
                  <td align="center">0</td>
                  <td align="right">
                    <tt>0$##&amp;&amp;&amp;&amp;</tt></td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>2</tt></td>
                  <td align="center">1</td>
                  <td align="center">2</td>
                  <td align="center">2</td>
                  <td align="center">6</td>
                  <td align="center">0</td>
                  <td align="center">2</td>
                  <td align="right">
                    <tt>0$####&amp;&amp;&amp;&amp;</tt></td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>3</tt></td>
                  <td align="center">1</td>
                  <td align="center">3</td>
                  <td align="center">3</td>
                  <td align="center">6</td>
                  <td align="center">0</td>
                  <td align="center">0</td>
                  <td align="right">
                    <tt>0$######&amp;&amp;&amp;&amp;</tt></td>
                </tr>
              </tbody>
            </table>
          </section>
          <section anchor="encoding-scheme-symbols-1">
            <name>Encoding Scheme Symbols</name>
            <t>The following table defines the meaning of the symbols used in the Indexed Code table</t>
            <table>
              <thead>
                <tr>
                  <th align="center">Symbol</th>
                  <th align="center">Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center"> </td>
                  <td align="center"> </td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>*</tt></td>
                  <td align="center">selector-code character also provides the type</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$</tt></td>
                  <td align="center">type-code character from  subset of Base64  <tt>[A-Z,a-z,0-9,-,_]</tt></td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>%</tt></td>
                  <td align="center">lead byte where pre-converted binary includes the number of lead bytes shown</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>#</tt></td>
                  <td align="center">Base64 digit as part of a base 64 integer. When part of primitive determines the number of following quadlets or triplets. When part of a count code determines the count of following primitives or groups of primitives</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>&amp;</tt></td>
                  <td align="center">Base64 value characters that represent the converted raw binary value.  The actual number of characters is determined by the prepended text code.  Shown is the minimum number of value characters.</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>TBD</tt></td>
                  <td align="center">to be determined, reserved for future</td>
                </tr>
              </tbody>
            </table>
            <t>The appendix contains the master code table with the concrete codes.</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="appendix-keri-protocol-stack-code-tables">
      <name>Appendix: KERI Protocol Stack Code Tables</name>
      <section anchor="code-table-entry-policy">
        <name>Code Table Entry Policy</name>
        <t>The policy for placing entries into the tables in general is in order of first needed first-entered basis. In addition, the compact code tables prioritize  entries that satisfy the requirement that the associated cryptographic operations maintain at least 128 bits of cryptographic strength. This precludes the entry of many weak cryptographic suites into the compact tables. CESR's compact code table includes only best-of-class cryptographic operations along with common non-cryptograpic primitive types. At the time of this writing, there is the expectaion that NIST will soon approve standardized post-quantum resistant cryptographic operations. When that happens, codes for the most appropriate post-quantum operations will be added. For example, Falcon appears to be one of the leading candidates with open source code already available.</t>
      </section>
      <section anchor="master-code-table">
        <name>Master Code Table</name>
        <t>This master table includes both the primitive and count code types. The types are 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 count portion of the code
5) The length in characters of the fully qualified primitive, including code and its appended material or the number of elements in the group. This is empty when variable length.</t>
        <table>
          <thead>
            <tr>
              <th align="center">Code</th>
              <th align="left">Description</th>
              <th align="center">Code Length</th>
              <th align="center">Count 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">
                <tt>A</tt></td>
              <td align="left">Seed of Ed25519 private key</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">
                <tt>B</tt></td>
              <td align="left">Ed25519 non-transferable prefix public verification key</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">
                <tt>C</tt></td>
              <td align="left">X25519 public encryption key.</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">
                <tt>D</tt></td>
              <td align="left">Ed25519 public verification key</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">
                <tt>E</tt></td>
              <td align="left">Blake3-256 Digest</td>
              <td align="center"> </td>
              <td align="center">44</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>F</tt></td>
              <td align="left">Blake2b-256 Digest</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">
                <tt>G</tt></td>
              <td align="left">Blake2s-256 Digest</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">
                <tt>H</tt></td>
              <td align="left">SHA3-256 Digest</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">
                <tt>I</tt></td>
              <td align="left">SHA2-256 Digest</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">
                <tt>J</tt></td>
              <td align="left">Seed of ECDSA secp256k1 private key</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">
                <tt>K</tt></td>
              <td align="left">Seed of Ed448 private key</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">76</td>
            </tr>
            <tr>
              <td align="center">
                <tt>L</tt></td>
              <td align="left">X448 public encryption key</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">76</td>
            </tr>
            <tr>
              <td align="center">
                <tt>M</tt></td>
              <td align="left">Short number 2 byte b2</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">4</td>
            </tr>
            <tr>
              <td align="center">
                <tt>N</tt></td>
              <td align="left">Big number 4 byte b2</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">12</td>
            </tr>
            <tr>
              <td align="center">
                <tt>O</tt></td>
              <td align="left">X25519 private decryption key</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">44</td>
            </tr>
            <tr>
              <td align="center">
                <tt>P</tt></td>
              <td align="left">X25519 124 char b64 Cipher of 44 char qb64 Seed</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center">124</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">
                <tt>0A</tt></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">
                <tt>0B</tt></td>
              <td align="left">Ed25519 signature</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">
                <tt>0C</tt></td>
              <td align="left">ECDSA secp256k1 signature</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">
                <tt>0D</tt></td>
              <td align="left">Blake3-512 Digest</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">
                <tt>0E</tt></td>
              <td align="left">Blake2b-512 Digest</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">
                <tt>0F</tt></td>
              <td align="left">SHA3-512 Digest</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">
                <tt>0G</tt></td>
              <td align="left">SHA2-512 Digest</td>
              <td align="center">2</td>
              <td align="center"> </td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="center">
                <tt>0H</tt></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">
                <tt>1AAA</tt></td>
              <td align="left">ECDSA secp256k1 non-transferable prefix public verification key</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">48</td>
            </tr>
            <tr>
              <td align="center">
                <tt>1AAB</tt></td>
              <td align="left">ECDSA secp256k1 public verification or encryption key</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">48</td>
            </tr>
            <tr>
              <td align="center">
                <tt>1AAC</tt></td>
              <td align="left">Ed448 non-transferable prefix public verification key</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">80</td>
            </tr>
            <tr>
              <td align="center">
                <tt>1AAD</tt></td>
              <td align="left">Ed448 public verification key</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">80</td>
            </tr>
            <tr>
              <td align="center">
                <tt>1AAE</tt></td>
              <td align="left">Ed448 signature</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">156</td>
            </tr>
            <tr>
              <td align="center">
                <tt>1AAF</tt></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">
                <tt>1AAG</tt></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">
                <tt>1AAH</tt></td>
              <td align="left">X25519 100 char b64 Cipher of 24 char qb64 Salt</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center">100</td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="left">
                <strong>Small Variable Raw Size Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>4A</tt></td>
              <td align="left">String Base64 Only Lead Size 0</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>5A</tt></td>
              <td align="left">String Base64 Only Lead Size 1</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>6A</tt></td>
              <td align="left">String Base64 Only Lead Size 2</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>4B</tt></td>
              <td align="left">Bytes Lead Size 0</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>5B</tt></td>
              <td align="left">Bytes Lead Size 1</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>6B</tt></td>
              <td align="left">Bytes Lead Size 2</td>
              <td align="center">4</td>
              <td align="center">2</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center"> </td>
              <td align="left">
                <strong>Large Variable Raw Size Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>7AAA</tt></td>
              <td align="left">String Big Base64 Only Lead Size 0</td>
              <td align="center">8</td>
              <td align="center">4</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>8AAA</tt></td>
              <td align="left">String Big Base64 Only Lead Size 1</td>
              <td align="center">8</td>
              <td align="center">4</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>7AAA</tt></td>
              <td align="left">String Big Base64 Only Lead Size 2</td>
              <td align="center">8</td>
              <td align="center">4</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>7AAB</tt></td>
              <td align="left">Bytes Big Lead Size 0</td>
              <td align="center">8</td>
              <td align="center">4</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>8AAB</tt></td>
              <td align="left">Bytes Big Lead Size 1</td>
              <td align="center">8</td>
              <td align="center">4</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>9AAB</tt></td>
              <td align="left">Bytes Big Lead Size 2</td>
              <td align="center">8</td>
              <td align="center">4</td>
              <td align="center"> </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">
                <tt>-A##</tt></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">
                <tt>-B##</tt></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">
                <tt>-C##</tt></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">
                <tt>-D##</tt></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">
                <tt>-E##</tt></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">
                <tt>-F##</tt></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">
                <tt>-V##</tt></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"> </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">
                <tt>-0V#####</tt></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"> </td>
              <td align="left">
                <strong>Protocol Genus Version Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="center">
                <tt>--AAA###</tt></td>
              <td align="left">KERI ACDC protocol stack  version</td>
              <td align="center">8</td>
              <td align="center">5</td>
              <td align="center">8</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="indexed-code-table-1">
        <name>Indexed Code Table</name>
        <table>
          <thead>
            <tr>
              <th align="left">Code</th>
              <th align="left">Description</th>
              <th align="center">Code Length</th>
              <th align="center">Index Length</th>
              <th align="center">Ondex Length</th>
              <th align="center">Total Length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left"> </td>
              <td align="left">
                <strong>Indexed Two Character Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="left">
                <tt>A#</tt></td>
              <td align="left">Ed25519 indexed signature both same</td>
              <td align="center">2</td>
              <td align="center">1</td>
              <td align="center">0</td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="left">
                <tt>B#</tt></td>
              <td align="left">Ed25519 indexed signature current only</td>
              <td align="center">2</td>
              <td align="center">1</td>
              <td align="center">0</td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="left">
                <tt>C#</tt></td>
              <td align="left">ECDSA secp256k1 indexed sig both same</td>
              <td align="center">2</td>
              <td align="center">1</td>
              <td align="center">0</td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="left">
                <tt>D#</tt></td>
              <td align="left">ECDSA secp256k1 indexed sig curr only</td>
              <td align="center">2</td>
              <td align="center">1</td>
              <td align="center">0</td>
              <td align="center">88</td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">
                <strong>Indexed Four Character Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="left">
                <tt>0A##</tt></td>
              <td align="left">Ed448 indexed signature  dual</td>
              <td align="center">4</td>
              <td align="center">1</td>
              <td align="center">1</td>
              <td align="center">156</td>
            </tr>
            <tr>
              <td align="left">
                <tt>0B##</tt></td>
              <td align="left">Ed448 indexed signature current only</td>
              <td align="center">4</td>
              <td align="center">1</td>
              <td align="center">1</td>
              <td align="center">156</td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">
                <strong>Indexed Six Character Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="left">
                <tt>2A####</tt></td>
              <td align="left">Ed25519 indexed sig big dual</td>
              <td align="center">6</td>
              <td align="center">2</td>
              <td align="center">2</td>
              <td align="center">92</td>
            </tr>
            <tr>
              <td align="left">
                <tt>2B####</tt></td>
              <td align="left">Ed25519 indexed sig big current only</td>
              <td align="center">6</td>
              <td align="center">2</td>
              <td align="center">2</td>
              <td align="center">92</td>
            </tr>
            <tr>
              <td align="left">
                <tt>2C####</tt></td>
              <td align="left">ECDSA secp256k1 indexed sig big dual</td>
              <td align="center">6</td>
              <td align="center">2</td>
              <td align="center">2</td>
              <td align="center">92</td>
            </tr>
            <tr>
              <td align="left">
                <tt>2D####</tt></td>
              <td align="left">ECDSA secp256k1 idx sig big curr only</td>
              <td align="center">6</td>
              <td align="center">2</td>
              <td align="center">2</td>
              <td align="center">92</td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">
                <strong>Indexed Eight Character Codes</strong></td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="left">
                <tt>3A######</tt></td>
              <td align="left">Ed448 indexed signature  big dual</td>
              <td align="center">8</td>
              <td align="center">3</td>
              <td align="center">3</td>
              <td align="center">160</td>
            </tr>
            <tr>
              <td align="left">
                <tt>3B######</tt></td>
              <td align="left">Ed448 indexed signature  big curr only</td>
              <td align="center">8</td>
              <td align="center">3</td>
              <td align="center">3</td>
              <td align="center">160</td>
            </tr>
          </tbody>
        </table>
        <section anchor="examples-1">
          <name>Examples</name>
          <t>The tables above include complex groups that maybe 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.
This is known as the TransIndexedSigGroups counter.  Within the complex group are one or 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 a complex nested group may appear.</t>
          <t>The example has only one group that includes nested groups. The example is annotated with comments, spaces, and line feeds for clarity.</t>
          <sourcecode type="text"><![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

ToDo more examples



]]></sourcecode>
        </section>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <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"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <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">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC20">
          <front>
            <title>ASCII format for network interchange</title>
            <author fullname="V.G. Cerf" initials="V.G." surname="Cerf"/>
            <date month="October" year="1969"/>
          </front>
          <seriesInfo name="STD" value="80"/>
          <seriesInfo name="RFC" value="20"/>
          <seriesInfo name="DOI" value="10.17487/RFC0020"/>
        </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"/>
            <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"/>
            <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">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </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>
        <reference anchor="SEMVER" target="https://semver.org">
          <front>
            <title>Semantic Versioning</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 974?>

<section numbered="false" anchor="acknowledgments">
      <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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
CGuZgwqjs/JgzVHxw0KxGwN4Ah/4PZD81tbOYHMFlYf6WLDuNY+j546jehr9
X9tp9P65p6GSCmy0IVxKpj6tcY9V5TCWlqw8LhINLeDR3npMffVx99Y87v5K
6tv5tZ13/9d33lYddufdX3He0YYWCzbD4+93H36N4+9rSfp704ssvNUPpljM
6fyCPSpqRBISao2RhZfgy1p4oz/HBkuw8RZttG3lJWElQzwgGhBBQIbVOjGh
TELIbX81WBSFoptJRBUCFMGlUGCO2JdRPknO41Gj7dxcaMvMBgM9ff2UIweT
7PT0uXisETc3KAz65PRg02vt27YlGDA4u9SGEJQWJNxt5fykMNAesM70iD91
FnByf+LHrr8pm1WkcpqRsfhl6pPszcaTqHy9GqB2pI3hWJq3riX7sVZjz+Wr
i3/nLkf0ZhFQo0ddN7+7ioIEjIr50hf3jYWlWaZ3Ramo4XXQcEGzTN0FURwu
quis6gaOtV14W060rKoInswIK/IMyNhK/MCAWdeOxKKQsdRuU6/bagwUzo4v
mPbYNl2RbZyuGSevwgRs2vfCZTWKyJXGu5XzNj3w8KuGEorXfh7BldSucPbY
Oy3npsKH9eg5tY70ZRFY5iraBQ7AdksC2pcqGj6JBCFbPy/j8TQx9dcUckre
MI2tsmQp1k6HSOEjC3QBeDXV/Ne9frjLIvIbo7qV656TugwVmrkmk44pQ1Vd
FSfIiDPi2gzsb3x4He1uU0Rj3dS86nVmPbztrDvCha5yW7yOuG6VETDhm3AI
dTr3LIiJfXcREXe7j+6D5IICSz/q9EhmuaCqpl6knT8mMos5ftzba+889Lp8
bgxoxP/zv/53tAvqB+y+B1LKw/sCGvU1ykcSWL9K7FhH69tdX+6s8FkvYNkZ
PCdULvtWrLYW0iv5L4mzX0GD7K0tw9ZYgkQc5ZFm8XtyhPu9QXl/tjm2eHz7
FQzE6w+PV7ODqvk24AOa7r0aaprgDzASZ3Eb/ZVvFGEgFFhfwIeKq62NeytV
3Pv/yqi3hrr8b9SrgVoN6vUc6q2Peau17b1/ZdT7N9e7C+r161CvH3I9sfI0
6vlUr69W93UKrdEvjaqLe0Lt1/rxs2tfP9SVh1E0Xand2+FBY0YwiN3BK5lM
jd4mJcVLwbAjmoOakVvTdpljQSVM7aR6gFJ0eqa251Ul5IIXnD+BEn5yLvku
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
z0TaonF/SGqqZJPAr0Wrc3xw2D2o/XfII9T4ZtHPllwmWelG/G3h5bDa8Y+v
Zn8up6Piw8v8+Nnjyc+POz+mFzsv9/L7hzsXy9nJny4PD6dZ/6fl2fGLSKDD
XVRvORFoNo/lfYe9GsQBcHcUcGmAg4P7/b0Hb6ZPzns/fZcku4/j5UX54MHp
h6fThz+8OXrbzdPZX5/efzbZOR0/e3X64YcXD/9cPDp9Ev90kE7/PMo//OWP
32fDd3+9X5RP3/5p9+XwT+OXh7sHf7Y8/lu6pbqtg8PD8+TnrPzxh52ny93v
nncvdvLxXz/sPY9/fHv6YjJ7dva8c1jmP7998OrHJ8nO897eT7NXye6jN4te
9+HVdw9m2WH8c//4bfdN92V3dP/yfPHH8vGcJ+I5eq2Do7PHD14+/sujnR+f
nr378fBweZqcPi0O/vxg2b3Izucvz348+9PbN7MHizc/Ps2en7z842V+P3+V
ZUe9P/bTwz9/t3yf//zw9fVP47Odw+9O+8/T14uif3RuZugDfeWPc+Y+ieHn
LUJ25PJ4BnhuHFIL1PEY0xwoYlnyINA3RmW3o2+wqPY3bf6JxbXx95PjP795
dnL8GH8//e7g+XP7S0ueOP3u1Zvnj91v7s2jVy9eHL98zC9jsW7vo9Y3Lw7+
+g3T7DevXp89e/Xy4Pk3ttvrOB8t6YqgHFsKasU0gcUco8YxGbvFoZtDzsk4
PHr9//2/vd3o48f/dvLkqN/rPfr8Wf542HuwC39guCLPRhyI/wSWft2STEkp
ZT2K5ynor8hNTC4DcnFgIFt/Q8j8fT/678PRvLf7B/kAN+x9aGDmfUgwq35S
eZmBWPNRzTQWmt7nAaT99R781fvbwF19+N//B3HQTu/h//gDodBpAmIHsFAq
Bo+XeWzQ59XjV/ZbfPLZwcuD6lPeaeINkOX8ZCy1cVsttA0M49E7SgMY4d08
TcbnxNxbH/eZ4SXj338zgXNJvvlsMBeuz2u4jy6TaT7n0PkknnEkPhlV8IJY
ZtSt2eQanuXPXrOxBZD+neXo263/H6BICCOAjwEA

-->

</rfc>
