<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="info" docName="draft-hallambaker-jsonbcd-23" indexInclude="false" ipr="trust200902" prepTime="2022-10-23T18:05:31Z" scripts="Common,Latin" sortRefs="true" submissionType="independent" symRefs="true" tocDepth="3" tocInclude="true" version="3" xml:lang="en"><front>
<title abbrev="JSON-B, JSON-C, JSON-D">Binary Encodings for JavaScript Object Notation: JSON-B, JSON-C, JSON-D</title>
<seriesInfo name="Internet-Draft" value="draft-hallambaker-jsonbcd" stream="independent"/>
<author fullname="Phillip Hallam-Baker" initials="P. M." surname="Hallam-Baker"><address>
<email>phill@hallambaker.com</email>
</address>
</author>
<date day="23" month="October" year="2022"/>
<area/>
<workgroup/>
<abstract>
<t>Three binary encodings for JavaScript Object Notation (JSON) are presented. JSON-B (Binary) is a strict superset of the JSON encoding that permits efficient binary encoding of intrinsic JavaScript data types. JSON-C (Compact) is a strict superset of JSON-B that supports compact representation of repeated data strings with short numeric codes. JSON-D (Data) supports additional binary data types for integer and floating-point representations for use in scientific applications where conversion between binary and decimal representations would cause a loss of precision.</t>
<t>This document is also available online at <eref target="http://mathmesh.com/Documents/draft-hallambaker-jsonbcd.html"></eref>.</t>
</abstract>
</front>
<middle>
<section title="Introduction" anchor="n-introduction"><t>JavaScript Object Notation (JSON) is a simple text encoding for the JavaScript Data model that has found wide application beyond its original field of use. In particular JSON has rapidly become a preferred encoding for Web Services.</t>
<t>JSON encoding supports just four fundamental data types (integer, floating point, string and boolean), arrays and objects which consist of a list of tag-value pairs.</t>
<t>Although the JSON encoding is sufficient for many purposes it is not always efficient. In particular there is no efficient representation for blocks of binary data. Use of base64 encoding increases data volume by 33%. This overhead increases exponentially in applications where nested binary encodings are required making use of JSON encoding unsatisfactory in cryptographic applications where nested binary structures are frequently required.</t>
<t>Another source of inefficiency in JSON encoding is the repeated occurrence of object tags. A JSON encoding containing an array of a hundred objects such as {"first":1,"second":2} will contain a hundred occurrences of the string "first" (seven bytes) and a hundred occurrences of the string "second" (eight bytes). Using two byte code sequences in place of strings allows a saving of 11 bytes per object without loss of information, a saving of 50%.</t>
<t>A third objection to the use of JSON encoding is that floating point numbers can only be represented in decimal form and this necessarily involves a loss of precision when converting between binary and decimal representations. While such issues are rarely important in network applications they can be critical in scientific applications. It is not acceptable for saving and restoring a data set to change the result of a calculation.</t>
<section title="Objectives" anchor="n-objectives"><t>The following were identified as core objectives for a binary JSON encoding:</t>
<ul>
<li>Easy to convert existing encoders and decoders to add binary support</li>
<li>Efficient encoding of binary data</li>
<li>Ability to convert from JSON to binary encoding in a streaming mode (i.e. without reading the entire binary data block before beginning encoding.</li>
<li>Lossless encoding of JavaScript data types</li>
<li>The ability to support JSON tag compression and extended data types are considered desirable but not essential for typical network applications.</li>
</ul>
<t>Three binary encodings are defined:</t>
<dl>
<dt>JSON-B (Binary)</dt>
<dd>
<t>Encodes JSON data in binary. Only the JavaScript data model is supported (i.e. atomic types are integers, double or string). Integers may be 8, 16, 32 or 64 bits either signed or unsigned. Floating points are IEEE 754 binary64 format <xref target="IEEE754"></xref>. Supports chunked encoding for binary and UTF-8 string types.</t>
</dd>
<dt>JSON-C (Compact)</dt>
<dd>
<t>As JSON-B but with support for representing JSON tags in numeric code form (16 bit code space). This is done for both compact encoding and to allow simplification of encoders/decoders in constrained environments. Codes may be defined inline or by reference to a known dictionary of codes referenced via a digest value.</t>
</dd>
<dt>JSON-D (Data)</dt>
<dd>
<t>As JSON-C but with support for representing additional data types without loss of precision. In particular other IEEE 754 floating point formats, both binary and decimal and Intel's 80 bit floating point, plus 128 bit integers and bignum integers.</t>
</dd>
</dl>
<t>Each encoding is a proper superset of JSON, JSON-C is a proper superset of JSON-B and JSON-D is a proper superset of JSON-C. Thus a single decoder <bcp14>MAY</bcp14> be used for all three new encodings and for JSON. Figure 1 shows these relationships graphically:</t>
<figure>
<name>
Encoding Relationships.</name>
<!-- Include SVG File ../Images/json-bcd.svg --><artwork type="svg">
<svg width="200" height="201" xmlns="http://www.w3.org/2000/svg" >
<g transform="translate(8,16)">
  <path d="M 0,0 L 184,0" fill="none" stroke="black" />
  <path d="M 16,16 L 168,16" fill="none" stroke="black" />
  <path d="M 32,32 L 152,32" fill="none" stroke="black" />
  <path d="M 48,48 L 136,48" fill="none" stroke="black" />
  <path d="M 48,80 L 136,80" fill="none" stroke="black" />
  <path d="M 32,112 L 152,112" fill="none" stroke="black" />
  <path d="M 16,144 L 168,144" fill="none" stroke="black" />
  <path d="M 0,176 L 184,176" fill="none" stroke="black" />
  <path d="M 0,0 L 0,176" fill="none" stroke="black" />
  <path d="M 16,16 L 16,144" fill="none" stroke="black" />
  <path d="M 32,32 L 32,112" fill="none" stroke="black" />
  <path d="M 48,48 L 48,80" fill="none" stroke="black" />
  <path d="M 136,48 L 136,80" fill="none" stroke="black" />
  <path d="M 152,32 L 152,112" fill="none" stroke="black" />
  <path d="M 168,16 L 168,144" fill="none" stroke="black" />
  <path d="M 184,0 L 184,176" fill="none" stroke="black" />
  <text text-anchor="middle" font-family="sans-serif" x="80" y="100">S</text>
  <text text-anchor="middle" font-family="sans-serif" x="72" y="132">J</text>
  <text text-anchor="middle" font-family="sans-serif" x="88" y="132">O</text>
  <text text-anchor="middle" font-family="sans-serif" x="88" y="164">C</text>
  <text text-anchor="middle" font-family="sans-serif" x="96" y="164">N</text>
  <text text-anchor="middle" font-family="sans-serif" x="112" y="164">D</text>
  <text text-anchor="middle" font-family="sans-serif" x="104" y="68">N</text>
  <text text-anchor="middle" font-family="sans-serif" x="88" y="100">O</text>
  <text text-anchor="middle" font-family="sans-serif" x="112" y="100">B</text>
  <text text-anchor="middle" font-family="sans-serif" x="112" y="132">C</text>
  <text text-anchor="middle" font-family="sans-serif" x="80" y="164">S</text>
  <text text-anchor="middle" font-family="sans-serif" x="88" y="68">S</text>
  <text text-anchor="middle" font-family="sans-serif" x="72" y="100">J</text>
  <text text-anchor="middle" font-family="sans-serif" x="104" y="100">-</text>
  <text text-anchor="middle" font-family="sans-serif" x="104" y="132">-</text>
  <text text-anchor="middle" font-family="sans-serif" x="80" y="68">J</text>
  <text text-anchor="middle" font-family="sans-serif" x="96" y="100">N</text>
  <text text-anchor="middle" font-family="sans-serif" x="80" y="132">S</text>
  <text text-anchor="middle" font-family="sans-serif" x="96" y="132">N</text>
  <text text-anchor="middle" font-family="sans-serif" x="72" y="164">J</text>
  <text text-anchor="middle" font-family="sans-serif" x="104" y="164">-</text>
  <text text-anchor="middle" font-family="sans-serif" x="96" y="68">O</text>
</g></svg>
</artwork>
</figure>
</section>
</section>
<section title="Definitions" anchor="n-definitions"><t>This section presents the related specifications and standard, the terms that are used as terms of art within the documents and the terms used as requirements language.</t>
<section title="Requirements Language" anchor="n-requirements-language"><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>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as described in [RFC2119].</t>
</section>
<section title="Defined Terms" anchor="n-defined-terms"><t>The terms of art used in this document are described in the <em>Mesh Architecture Guide</em> <xref target="draft-hallambaker-mesh-architecture"></xref>.</t>
</section>
<section title="Related Specifications" anchor="n-related-specifications"><t>The JSON-B, JSON-C and JSON-D encodings are all based on the JSON grammar <xref target="RFC7159"></xref>. IEEE 754 Floating Point Standard is used for encoding floating point numbers <xref target="IEEE754"></xref>,</t>
</section>
<section title="Terminology" anchor="n-terminology"><t>No new terms of art are defined</t>
</section>
</section>
<section title="Extended JSON Grammar" anchor="n-extended-json-grammar"><t>The JSON-B, JSON-C and JSON-D encodings are all based on the JSON grammar <xref target="RFC7159"></xref> using the same syntactic structure but different lexical encodings.</t>
<t>JSON-B0 and JSON-C0 replace the JSON lexical encodings for strings and numbers with binary encodings. JSON-B1 and JSON-C1 allow either lexical encoding to be used. Thus, any valid JSON encoding is a valid JSON-B1 or JSON-C1 encoding.</t>
<t>The grammar of JSON-B, JSON-C and JSON-D is a superset of the JSON grammar. The following productions are added to the grammar:</t>
<dl>
<dt>x-value</dt>
<dd>
<t>Binary encodings for data values. As the binary value encodings are all self-delimiting</t>
</dd>
<dt>x-member</dt>
<dd>
<t>An object member where the value is specified as an X-value and thus does not require a value-separator.</t>
</dd>
<dt>b-value</dt>
<dd>
<t>Binary data encodings defined in JSON-B.</t>
</dd>
<dt>b-string</dt>
<dd>
<t>Defined length string encoding defined in JSON-B.</t>
</dd>
<dt>c-def</dt>
<dd>
<t>Tag code definition defined in JSON-C. These may only appear before the beginning of an Object or Array and before any preceding white space.</t>
</dd>
<dt>c-tag</dt>
<dd>
<t>Tag code value defined in JSON-C.</t>
</dd>
<dt>d-value</dt>
<dd>
<t>Additional binary data encodings defined in JSON-D for use in scientific data applications.</t>
</dd>
</dl>
<t>The JSON grammar is modified to permit the use of x-value productions in place of ( value value-separator ) :</t>
<sourcecode>JSON-text = (object / array)

object = *cdef begin-object [
         *( member value-separator | x-member )
         (member | x-member) ] end-object

member = tag value
x-member = tag x-value

tag = string name-separator | b-string | c-tag

array = *cdef begin-array [  *( value value-separator | x-value )
 (value | x-value) ] end-array

x-value = b-value / d-value

value = false / null / true / object / array / number / string

name-separator  = ws %x3A ws  ; : colon
value-separator = ws %x2C ws  ; , comma</sourcecode>
<t></t>
<sourcecode>The following lexical values are unchanged:
begin-array     = ws %x5B ws  ; [ left square bracket
begin-object    = ws %x7B ws  ; { left curly bracket
end-array       = ws %x5D ws  ; ] right square bracket
end-object      = ws %x7D ws  ; } right curly bracket

ws = *( %x20 %x09 %x0A  %x0D )

false = %x66.61.6c.73.65   ; false
null  = %x6e.75.6c.6c      ; null
true  = %x74.72.75.65      ; true</sourcecode>
<t>The productions number and string are defined as before:</t>
<sourcecode>number = [ minus ] int [ frac ] [ exp ]
decimal-point = %x2E       ; .
digit1-9 = %x31-39         ; 1-9
e = %x65 / %x45            ; e E
exp = e [ minus / plus ] 1*DIGIT
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
minus = %x2D               ; -
plus = %x2B                ; +
zero = %x30                ; 0

string = quotation-mark *char quotation-mark
char = unescaped /
escape ( %x22 / %x5C / %x2F / %x62 / %x66 /
%x6E / %x72 / %x74 /  %x75 4HEXDIG )

escape = %x5C              ; \
quotation-mark = %x22      ; "
unescaped = %x20-21 / %x23-5B / %x5D-10FFFF</sourcecode>
</section>
<section title="JSON-B" anchor="n-jsonb"><t>The JSON-B encoding defines the b-value and b-string productions:</t>
<sourcecode>b-value = b-atom | b-string | b-data | b-integer |
b-float

b-string = *( string-chunk ) string-term
b-data = *( data-chunk ) data-last

b-integer = p-int8 | p-int16 | p-int32 | p-int64 | p-bignum16 |
n-int8 | n-int16 | n-int32 | n-int64 | n-bignum16

b-float = binary64</sourcecode>
<t>The lexical encodings of the productions are defined in the following tables where the column 'tag' specifies the byte code that begins the production, 'Fixed' specifies the number of data bytes that follow and 'Length' specifies the number of bytes used to define the length of a variable length field following the data bytes:</t>
<table><thead>
<tr>
<th>
Production   </th>
<th>
Tag</th>
<th>
Fixed</th>
<th>
Length</th>
<th>
Data Description            </th>
</tr>
</thead>
<tbody>
<tr>
<td>
string-term  </td>
<td>
x80</td>
<td>
-</td>
<td>
1</td>
<td>
Terminal String 8 bit length</td>
</tr>
<tr>
<td>
string-term  </td>
<td>
x81</td>
<td>
-</td>
<td>
2</td>
<td>
Terminal String 16 bit length</td>
</tr>
<tr>
<td>
string-term  </td>
<td>
x82</td>
<td>
-</td>
<td>
4</td>
<td>
Terminal String 32 bit length</td>
</tr>
<tr>
<td>
string-term  </td>
<td>
x83</td>
<td>
-</td>
<td>
8</td>
<td>
Terminal String 64 bit length</td>
</tr>
<tr>
<td>
string-chunk</td>
<td>
x84</td>
<td>
-</td>
<td>
1</td>
<td>
Terminal String 8 bit length</td>
</tr>
<tr>
<td>
string-chunk</td>
<td>
x85</td>
<td>
-</td>
<td>
2</td>
<td>
Terminal String 16 bit length</td>
</tr>
<tr>
<td>
string-chunk</td>
<td>
x86</td>
<td>
-</td>
<td>
4</td>
<td>
Terminal String 32 bit length</td>
</tr>
<tr>
<td>
string-chunk</td>
<td>
x87</td>
<td>
-</td>
<td>
8</td>
<td>
Terminal String 64 bit length</td>
</tr>
<tr>
<td>
data-term    </td>
<td>
x88</td>
<td>
-</td>
<td>
1</td>
<td>
Terminal String 8 bit length</td>
</tr>
<tr>
<td>
data-term    </td>
<td>
x89</td>
<td>
-</td>
<td>
2</td>
<td>
Terminal String 16 bit length</td>
</tr>
<tr>
<td>
data-term    </td>
<td>
x8A</td>
<td>
-</td>
<td>
4</td>
<td>
Terminal String 32 bit length</td>
</tr>
<tr>
<td>
data-term    </td>
<td>
x8B</td>
<td>
-</td>
<td>
8</td>
<td>
Terminal String 64 bit length</td>
</tr>
<tr>
<td>
data-chunk   </td>
<td>
X8C</td>
<td>
-</td>
<td>
1</td>
<td>
Terminal String 8 bit length</td>
</tr>
<tr>
<td>
data-chunk</td>
<td>
x8D</td>
<td>
-</td>
<td>
2</td>
<td>
Terminal String 16 bit length</td>
</tr>
<tr>
<td>
data-chunk</td>
<td>
x8E</td>
<td>
-</td>
<td>
4</td>
<td>
Terminal String 32 bit length</td>
</tr>
<tr>
<td>
data-chunk</td>
<td>
x8F</td>
<td>
-</td>
<td>
8</td>
<td>
Terminal String 64 bit length</td>
</tr>
</tbody>
</table><t>Table 1: Codes for String and Data items</t>
<table><thead>
<tr>
<th>
Production   </th>
<th>
Tag</th>
<th>
Fixed</th>
<th>
Length</th>
<th>
Data Description            </th>
</tr>
</thead>
<tbody>
<tr>
<td>
p-int8       </td>
<td>
xA0</td>
<td>
1</td>
<td>
-</td>
<td>
Positive 8 bit Integer</td>
</tr>
<tr>
<td>
p-int16</td>
<td>
xa1</td>
<td>
2</td>
<td>
-</td>
<td>
Positive 16 bit Integer</td>
</tr>
<tr>
<td>
p-int32</td>
<td>
xa2</td>
<td>
4</td>
<td>
-</td>
<td>
Positive 32 bit Integer</td>
</tr>
<tr>
<td>
p-int64</td>
<td>
xa3</td>
<td>
8</td>
<td>
-</td>
<td>
Positive 64 bit Integer</td>
</tr>
<tr>
<td>
p-bignum16</td>
<td>
Xa7</td>
<td>
-</td>
<td>
2</td>
<td>
Positive Bignum</td>
</tr>
<tr>
<td>
n-int8       </td>
<td>
xA8</td>
<td>
1</td>
<td>
-</td>
<td>
Negative 8 bit Integer</td>
</tr>
<tr>
<td>
n-int16</td>
<td>
xA9</td>
<td>
2</td>
<td>
-</td>
<td>
Negative 16 bit Integer</td>
</tr>
<tr>
<td>
n-int32</td>
<td>
xAA</td>
<td>
4</td>
<td>
-</td>
<td>
Negative 32 bit Integer</td>
</tr>
<tr>
<td>
n-int64</td>
<td>
xAB</td>
<td>
8</td>
<td>
-</td>
<td>
Negative 64 bit Integer</td>
</tr>
<tr>
<td>
n-bignum16</td>
<td>
xAF</td>
<td>
-</td>
<td>
2</td>
<td>
Negative Bignum</td>
</tr>
<tr>
<td>
binary64     </td>
<td>
x92</td>
<td>
8</td>
<td>
-</td>
<td>
IEEE 754 Floating Point Binary 64 bit</td>
</tr>
<tr>
<td>
b-value      </td>
<td>
xB0</td>
<td>
-</td>
<td>
-</td>
<td>
True</td>
</tr>
<tr>
<td>
b-value      </td>
<td>
xB1</td>
<td>
-</td>
<td>
-</td>
<td>
False</td>
</tr>
<tr>
<td>
b-value      </td>
<td>
xB2</td>
<td>
-</td>
<td>
-</td>
<td>
Null</td>
</tr>
</tbody>
</table><t>Table 2: Codes for Integers, 64 Bit Floating Point, Boolean and Null items.</t>
<t>A data type commonly used in networking that is not defined in this scheme is a datetime representation. To define such a data type, a string containing a date-time value in Internet type format is typically used.</t>
<section title="JSON-B Examples" anchor="n-jsonb-examples"><t>The following examples show examples of using JSON-B encoding:</t>
<sourcecode>A0 2A                            42 (as 8 bit integer)
A1 00 2A                         42 (as 16 bit integer)
A2 00 00 00 2A                   42 (as 32 bit integer)
A3 00 00 00 00 00 00 00 2A       42 (as 64 bit integer)
A5 00 01 42                      42 (as Bignum)

80 05 48 65 6c 6c 6f             "Hello" (single chunk)
81 00 05 48 65 6c 6c 6f          "Hello" (single chunk)
84 05 48 65 6c 6c 6f 80 00       "Hello" (as two chunks)

92 3f f0 00 00 00 00 00 00       1.0
92 40 24 00 00 00 00 00 00       10.0
92 40 09 21 fb 54 44 2e ea       3.14159265359
92 bf f0 00 00 00 00 00 00       -1.0

B0                               true
B1                               false
B2                               null</sourcecode>
</section>
</section>
<section title="JSON-C" anchor="n-jsonc"><t>JSON-C (Compressed) permits numeric code values to be substituted for strings and binary data. Tag codes <bcp14>MAY</bcp14> be 8, 16 or 32 bits long encoded in network byte order.</t>
<t>Tag codes <bcp14>MUST</bcp14> be defined before they are referenced. A Tag code <bcp14>MAY</bcp14> be defined before the corresponding data or string value is used or at the same time that it is used.</t>
<t>A dictionary is a list of tag code definitions. An encoding <bcp14>MAY</bcp14> incorporate definitions from a dictionary using the dict-hash production. The dict hash production specifies a (positive) offset value to be added to the entries in the dictionary followed by the UDF fingerprint <xref target="draft-hallambaker-udf"></xref> of the dictionary to be used.</t>
<table><thead>
<tr>
<th>
Production   </th>
<th>
Tag</th>
<th>
Fixed</th>
<th>
Length</th>
<th>
Data Description            </th>
</tr>
</thead>
<tbody>
<tr>
<td>
c-tag      </td>
<td>
xC0</td>
<td>
1</td>
<td>
-</td>
<td>
8 bit tag code</td>
</tr>
<tr>
<td>
c-tag      </td>
<td>
xC1</td>
<td>
2</td>
<td>
-</td>
<td>
16 bit tag code</td>
</tr>
<tr>
<td>
c-tag      </td>
<td>
xC2</td>
<td>
4</td>
<td>
-</td>
<td>
32 bit tag code</td>
</tr>
<tr>
<td>
c-def      </td>
<td>
xC4</td>
<td>
1</td>
<td>
-</td>
<td>
8 bit tag definition</td>
</tr>
<tr>
<td>
c-def      </td>
<td>
xC5</td>
<td>
2</td>
<td>
-</td>
<td>
16 bit tag definition</td>
</tr>
<tr>
<td>
c-def      </td>
<td>
xC6</td>
<td>
4</td>
<td>
-</td>
<td>
32 bit tag definition</td>
</tr>
<tr>
<td>
c-tag      </td>
<td>
xC8</td>
<td>
1</td>
<td>
-</td>
<td>
8 bit tag code and definition</td>
</tr>
<tr>
<td>
c-tag      </td>
<td>
xC9</td>
<td>
2</td>
<td>
-</td>
<td>
16 bit tag code and definition</td>
</tr>
<tr>
<td>
c-tag      </td>
<td>
xCA</td>
<td>
4</td>
<td>
-</td>
<td>
32 bit tag code and definition</td>
</tr>
<tr>
<td>
c-def      </td>
<td>
xCC</td>
<td>
1</td>
<td>
-</td>
<td>
8 bit tag dictionary definition</td>
</tr>
<tr>
<td>
c-def      </td>
<td>
xCD</td>
<td>
2</td>
<td>
-</td>
<td>
16 bit tag dictionary definition</td>
</tr>
<tr>
<td>
c-def      </td>
<td>
xCE</td>
<td>
4</td>
<td>
-</td>
<td>
32 bit tag dictionary definition</td>
</tr>
<tr>
<td>
dict-hash</td>
<td>
xD0</td>
<td>
4</td>
<td>
1</td>
<td>
UDF fingerprint of dictionary</td>
</tr>
</tbody>
</table><t>Table 3: Codes Used for Compression</t>
<t>All integer values are encoded in Network Byte Order (most significant byte first).</t>
<section title="JSON-C Examples" anchor="n-jsonc-examples"><t>The following examples show examples of using JSON-C encoding:</t>
<sourcecode>C8 20 80 05 48 65 6c 6c 6f       "Hello"    20 = "Hello"
C4 21 80 05 48 65 6c 6c 6f                  21 = "Hello"
C0 20                            "Hello"
C1 00 20                         "Hello"

D0 00 00 01 00 20             Insert dictionary at code 256
e3 b0 c4 42 98 fc 1c 14
9a fb f4 c8 99 6f b9 24
27 ae 41 e4 64 9b 93 4c
a4 95 99 1b 78 52 b8 55       UDF (C4 21 80 05 48 65 6c 6c 6f)</sourcecode>
</section>
</section>
<section title="JSON-D (Data)" anchor="n-jsond-data"><t>JSON-B and JSON-C only support the two numeric types defined in the JavaScript data model: Integers and 64 bit floating point values. JSON-D (Data) defines binary encodings for additional data types that are commonly used in scientific applications. These comprise positive and negative 128 bit integers, six additional floating point representations defined by IEEE 754 <xref target="IEEE754"></xref> and the Intel extended precision 80 bit floating point representation <xref target="INTEL"></xref>.</t>
<t>Should the need arise, even bigger bignums could be defined with the length specified as a 32 bit value permitting bignums of up to 2^35 bits to be represented.</t>
<sourcecode>d-value = d-integer | d-float

d-float = binary16 | binary32 | binary128 | binary80 |
decimal32 | decimal64 | decimal 128</sourcecode>
<t>The codes for these values are as follows:</t>
<table><thead>
<tr>
<th>
Production   </th>
<th>
Tag</th>
<th>
Fixed</th>
<th>
Length</th>
<th>
Data Description            </th>
</tr>
</thead>
<tbody>
<tr>
<td>
p-int128</td>
<td>
xA4</td>
<td>
16</td>
<td>
-</td>
<td>
Positive 128 bit Integer</td>
</tr>
<tr>
<td>
n-int128</td>
<td>
xAC</td>
<td>
16</td>
<td>
-</td>
<td>
Negative 128 bit Integer      </td>
</tr>
<tr>
<td>
binary16</td>
<td>
x90</td>
<td>
2</td>
<td>
-</td>
<td>
IEEE 754 Floating Point Binary 16 bit</td>
</tr>
<tr>
<td>
binary32</td>
<td>
x91</td>
<td>
4</td>
<td>
-</td>
<td>
IEEE 754 Floating Point Binary 32 bit</td>
</tr>
<tr>
<td>
binary128</td>
<td>
x94</td>
<td>
16</td>
<td>
-</td>
<td>
IEEE 754 Floating Point Binary 64 bit</td>
</tr>
<tr>
<td>
Intel80</td>
<td>
x95</td>
<td>
10</td>
<td>
-</td>
<td>
Intel extended Floating Point 80 bit</td>
</tr>
<tr>
<td>
decimal32</td>
<td>
x96</td>
<td>
4</td>
<td>
-</td>
<td>
IEEE 754 Floating Point Decimal 32</td>
</tr>
<tr>
<td>
Decimal64</td>
<td>
x97</td>
<td>
8</td>
<td>
-</td>
<td>
IEEE 754 Floating Point Decimal 64</td>
</tr>
<tr>
<td>
Decimal128</td>
<td>
x98</td>
<td>
16</td>
<td>
-</td>
<td>
IEEE 754 Floating Point Decimal 128</td>
</tr>
</tbody>
</table><t>Table 4: Additional Codes for Scientific Data </t>
</section>
<section title="JBCD Frames and Records" anchor="n-jbcd-frames-and-records"><t>Tag codes in the range xF0-XFF are reserved for specifying markers for <em>frames</em> and <em>records</em>. These tags are not used to encode JSON data, they are only used to encapsulate opaque binary data blobs as a unit.</t>
<t>A JBCD record consists of consist of the tag, a length and the data item. The length indication provided by the record format allows efficient traversal of a sequence of records in the forward direction only.</t>
<t>A JBCD Frames consists of consist of the tag, a length and the data item followed by the tag-length sequence repeated with the bytes written in the reverse order. The first length indication allows efficient traversal of a sequence of records in the forward direction and the second allows efficient traversal in the reverse direction.</t>
<figure>
<name>
JBCD Records and Frames</name>
<!-- Include SVG File ../Images/jbcd-frame.svg --><artwork type="svg">
<svg width="400" height="153" xmlns="http://www.w3.org/2000/svg" >
<g transform="translate(8,16)">
  <path d="M 0,0 L 40,0" fill="none" stroke="black" />
  <path d="M 40,0 L 80,0" fill="none" stroke="black" />
  <path d="M 80,0 L 120,0" fill="none" stroke="black" />
  <path d="M 120,0 L 264,0" fill="none" stroke="black" />
  <path d="M 0,32 L 40,32" fill="none" stroke="black" />
  <path d="M 40,32 L 80,32" fill="none" stroke="black" />
  <path d="M 80,32 L 120,32" fill="none" stroke="black" />
  <path d="M 120,32 L 264,32" fill="none" stroke="black" />
  <path d="M 0,80 L 40,80" fill="none" stroke="black" />
  <path d="M 40,80 L 80,80" fill="none" stroke="black" />
  <path d="M 80,80 L 120,80" fill="none" stroke="black" />
  <path d="M 120,80 L 264,80" fill="none" stroke="black" />
  <path d="M 264,80 L 304,80" fill="none" stroke="black" />
  <path d="M 304,80 L 344,80" fill="none" stroke="black" />
  <path d="M 344,80 L 384,80" fill="none" stroke="black" />
  <path d="M 0,112 L 40,112" fill="none" stroke="black" />
  <path d="M 40,112 L 80,112" fill="none" stroke="black" />
  <path d="M 80,112 L 120,112" fill="none" stroke="black" />
  <path d="M 120,112 L 264,112" fill="none" stroke="black" />
  <path d="M 264,112 L 304,112" fill="none" stroke="black" />
  <path d="M 304,112 L 344,112" fill="none" stroke="black" />
  <path d="M 344,112 L 384,112" fill="none" stroke="black" />
  <path d="M 0,0 L 0,32" fill="none" stroke="black" />
  <path d="M 0,80 L 0,112" fill="none" stroke="black" />
  <path d="M 40,0 L 40,32" fill="none" stroke="black" />
  <path d="M 40,80 L 40,112" fill="none" stroke="black" />
  <path d="M 80,0 L 80,32" fill="none" stroke="black" />
  <path d="M 80,80 L 80,112" fill="none" stroke="black" />
  <path d="M 120,0 L 120,32" fill="none" stroke="black" />
  <path d="M 120,80 L 120,112" fill="none" stroke="black" />
  <path d="M 264,0 L 264,32" fill="none" stroke="black" />
  <path d="M 264,80 L 264,112" fill="none" stroke="black" />
  <path d="M 304,80 L 304,112" fill="none" stroke="black" />
  <path d="M 344,80 L 344,112" fill="none" stroke="black" />
  <path d="M 384,80 L 384,112" fill="none" stroke="black" />
  <text text-anchor="middle" font-family="sans-serif" x="48" y="52">e</text>
  <text text-anchor="middle" font-family="sans-serif" x="144" y="52">m</text>
  <text text-anchor="middle" font-family="sans-serif" x="320" y="100">0</text>
  <text text-anchor="middle" font-family="sans-serif" x="160" y="132">c</text>
  <text text-anchor="middle" font-family="sans-serif" x="216" y="52">n</text>
  <text text-anchor="middle" font-family="sans-serif" x="64" y="100">1</text>
  <text text-anchor="middle" font-family="sans-serif" x="192" y="100">b</text>
  <text text-anchor="middle" font-family="sans-serif" x="64" y="52">t</text>
  <text text-anchor="middle" font-family="sans-serif" x="48" y="132">c</text>
  <text text-anchor="middle" font-family="sans-serif" x="96" y="52">a</text>
  <text text-anchor="middle" font-family="sans-serif" x="120" y="132">r</text>
  <text text-anchor="middle" font-family="sans-serif" x="248" y="132">3</text>
  <text text-anchor="middle" font-family="sans-serif" x="304" y="132">e</text>
  <text text-anchor="middle" font-family="sans-serif" x="312" y="52">e</text>
  <text text-anchor="middle" font-family="sans-serif" x="224" y="100">s</text>
  <text text-anchor="middle" font-family="sans-serif" x="64" y="132">i</text>
  <text text-anchor="middle" font-family="sans-serif" x="200" y="132">i</text>
  <text text-anchor="middle" font-family="sans-serif" x="208" y="52">i</text>
  <text text-anchor="middle" font-family="sans-serif" x="232" y="100">&gt;</text>
  <text text-anchor="middle" font-family="sans-serif" x="208" y="132">n</text>
  <text text-anchor="middle" font-family="sans-serif" x="312" y="132">s</text>
  <text text-anchor="middle" font-family="sans-serif" x="40" y="52">r</text>
  <text text-anchor="middle" font-family="sans-serif" x="168" y="52">c</text>
  <text text-anchor="middle" font-family="sans-serif" x="288" y="52">b</text>
  <text text-anchor="middle" font-family="sans-serif" x="304" y="52">t</text>
  <text text-anchor="middle" font-family="sans-serif" x="168" y="100">0</text>
  <text text-anchor="middle" font-family="sans-serif" x="104" y="20">C</text>
  <text text-anchor="middle" font-family="sans-serif" x="160" y="20">3</text>
  <text text-anchor="middle" font-family="sans-serif" x="216" y="20">e</text>
  <text text-anchor="middle" font-family="sans-serif" x="8" y="52">n</text>
  <text text-anchor="middle" font-family="sans-serif" x="224" y="52">i</text>
  <text text-anchor="middle" font-family="sans-serif" x="80" y="52">o</text>
  <text text-anchor="middle" font-family="sans-serif" x="320" y="52">s</text>
  <text text-anchor="middle" font-family="sans-serif" x="112" y="132">f</text>
  <text text-anchor="middle" font-family="sans-serif" x="264" y="132">0</text>
  <text text-anchor="middle" font-family="sans-serif" x="288" y="100">C</text>
  <text text-anchor="middle" font-family="sans-serif" x="24" y="132">i</text>
  <text text-anchor="middle" font-family="sans-serif" x="136" y="132">m</text>
  <text text-anchor="middle" font-family="sans-serif" x="64" y="20">1</text>
  <text text-anchor="middle" font-family="sans-serif" x="24" y="52">d</text>
  <text text-anchor="middle" font-family="sans-serif" x="56" y="52">c</text>
  <text text-anchor="middle" font-family="sans-serif" x="104" y="52">l</text>
  <text text-anchor="middle" font-family="sans-serif" x="240" y="52">g</text>
  <text text-anchor="middle" font-family="sans-serif" x="128" y="132">a</text>
  <text text-anchor="middle" font-family="sans-serif" x="168" y="20">0</text>
  <text text-anchor="middle" font-family="sans-serif" x="176" y="100">0</text>
  <text text-anchor="middle" font-family="sans-serif" x="192" y="132">a</text>
  <text text-anchor="middle" font-family="sans-serif" x="56" y="20">0</text>
  <text text-anchor="middle" font-family="sans-serif" x="208" y="20">t</text>
  <text text-anchor="middle" font-family="sans-serif" x="96" y="132">l</text>
  <text text-anchor="middle" font-family="sans-serif" x="40" y="132">e</text>
  <text text-anchor="middle" font-family="sans-serif" x="80" y="132">n</text>
  <text text-anchor="middle" font-family="sans-serif" x="216" y="132">i</text>
  <text text-anchor="middle" font-family="sans-serif" x="128" y="52">r</text>
  <text text-anchor="middle" font-family="sans-serif" x="136" y="52">a</text>
  <text text-anchor="middle" font-family="sans-serif" x="256" y="52">3</text>
  <text text-anchor="middle" font-family="sans-serif" x="296" y="52">y</text>
  <text text-anchor="middle" font-family="sans-serif" x="200" y="100">y</text>
  <text text-anchor="middle" font-family="sans-serif" x="296" y="132">t</text>
  <text text-anchor="middle" font-family="sans-serif" x="208" y="100">t</text>
  <text text-anchor="middle" font-family="sans-serif" x="232" y="20">&gt;</text>
  <text text-anchor="middle" font-family="sans-serif" x="264" y="52">0</text>
  <text text-anchor="middle" font-family="sans-serif" x="16" y="100">F</text>
  <text text-anchor="middle" font-family="sans-serif" x="56" y="100">0</text>
  <text text-anchor="middle" font-family="sans-serif" x="184" y="132">t</text>
  <text text-anchor="middle" font-family="sans-serif" x="280" y="132">b</text>
  <text text-anchor="middle" font-family="sans-serif" x="176" y="52">o</text>
  <text text-anchor="middle" font-family="sans-serif" x="32" y="132">r</text>
  <text text-anchor="middle" font-family="sans-serif" x="256" y="132">0</text>
  <text text-anchor="middle" font-family="sans-serif" x="232" y="132">g</text>
  <text text-anchor="middle" font-family="sans-serif" x="200" y="20">y</text>
  <text text-anchor="middle" font-family="sans-serif" x="184" y="52">n</text>
  <text text-anchor="middle" font-family="sans-serif" x="232" y="52">n</text>
  <text text-anchor="middle" font-family="sans-serif" x="360" y="100">F</text>
  <text text-anchor="middle" font-family="sans-serif" x="72" y="132">o</text>
  <text text-anchor="middle" font-family="sans-serif" x="192" y="20">b</text>
  <text text-anchor="middle" font-family="sans-serif" x="192" y="52">t</text>
  <text text-anchor="middle" font-family="sans-serif" x="16" y="132">d</text>
  <text text-anchor="middle" font-family="sans-serif" x="56" y="132">t</text>
  <text text-anchor="middle" font-family="sans-serif" x="288" y="132">y</text>
  <text text-anchor="middle" font-family="sans-serif" x="0" y="132">B</text>
  <text text-anchor="middle" font-family="sans-serif" x="120" y="52">f</text>
  <text text-anchor="middle" font-family="sans-serif" x="152" y="52">e</text>
  <text text-anchor="middle" font-family="sans-serif" x="272" y="52">0</text>
  <text text-anchor="middle" font-family="sans-serif" x="160" y="100">3</text>
  <text text-anchor="middle" font-family="sans-serif" x="328" y="100">1</text>
  <text text-anchor="middle" font-family="sans-serif" x="96" y="20">2</text>
  <text text-anchor="middle" font-family="sans-serif" x="224" y="20">s</text>
  <text text-anchor="middle" font-family="sans-serif" x="88" y="52">n</text>
  <text text-anchor="middle" font-family="sans-serif" x="104" y="100">C</text>
  <text text-anchor="middle" font-family="sans-serif" x="224" y="132">n</text>
  <text text-anchor="middle" font-family="sans-serif" x="88" y="132">a</text>
  <text text-anchor="middle" font-family="sans-serif" x="16" y="20">F</text>
  <text text-anchor="middle" font-family="sans-serif" x="0" y="52">U</text>
  <text text-anchor="middle" font-family="sans-serif" x="96" y="100">2</text>
  <text text-anchor="middle" font-family="sans-serif" x="152" y="100">&lt;</text>
  <text text-anchor="middle" font-family="sans-serif" x="8" y="132">i</text>
  <text text-anchor="middle" font-family="sans-serif" x="368" y="100">5</text>
  <text text-anchor="middle" font-family="sans-serif" x="216" y="100">e</text>
  <text text-anchor="middle" font-family="sans-serif" x="144" y="132">e</text>
  <text text-anchor="middle" font-family="sans-serif" x="168" y="132">o</text>
  <text text-anchor="middle" font-family="sans-serif" x="16" y="52">i</text>
  <text text-anchor="middle" font-family="sans-serif" x="176" y="132">n</text>
  <text text-anchor="middle" font-family="sans-serif" x="152" y="20">&lt;</text>
  <text text-anchor="middle" font-family="sans-serif" x="176" y="20">0</text>
  <text text-anchor="middle" font-family="sans-serif" x="280" y="100">2</text>
  <text text-anchor="middle" font-family="sans-serif" x="24" y="20">1</text>
  <text text-anchor="middle" font-family="sans-serif" x="32" y="52">i</text>
  <text text-anchor="middle" font-family="sans-serif" x="72" y="52">i</text>
  <text text-anchor="middle" font-family="sans-serif" x="200" y="52">a</text>
  <text text-anchor="middle" font-family="sans-serif" x="24" y="100">5</text>
</g></svg>
</artwork>
</figure>
<t>The JBCD-Frame tags currently defined are:</t>
<table><thead>
<tr>
<th>
Production   </th>
<th>
Tag</th>
<th>
Fixed</th>
<th>
Length</th>
<th>
Data Description            </th>
</tr>
</thead>
<tbody>
<tr>
<td>
uframe  </td>
<td>
xF0</td>
<td>
-</td>
<td>
1</td>
<td>
Record, 8 bit length</td>
</tr>
<tr>
<td>
uframe  </td>
<td>
xF1</td>
<td>
-</td>
<td>
2</td>
<td>
Record, 16 bit length</td>
</tr>
<tr>
<td>
uframe  </td>
<td>
xF2</td>
<td>
-</td>
<td>
4</td>
<td>
Record, 32 bit length</td>
</tr>
<tr>
<td>
uframe  </td>
<td>
xF3</td>
<td>
-</td>
<td>
8</td>
<td>
Record, 64 bit length</td>
</tr>
<tr>
<td>
bframe  </td>
<td>
xF4</td>
<td>
-</td>
<td>
1</td>
<td>
Frame, 8 bit length</td>
</tr>
<tr>
<td>
bframe</td>
<td>
xF5</td>
<td>
-</td>
<td>
2</td>
<td>
Frame, 16 bit length</td>
</tr>
<tr>
<td>
bframe</td>
<td>
xF6</td>
<td>
-</td>
<td>
4</td>
<td>
Frame, 32 bit length</td>
</tr>
<tr>
<td>
bframe</td>
<td>
xF7</td>
<td>
-</td>
<td>
8</td>
<td>
Frame, 64 bit length</td>
</tr>
<tr>
<td>
</td>
<td>
xF8-xFF</td>
<td>
-</td>
<td>
-</td>
<td>
Reserved</td>
</tr>
</tbody>
</table><t>The author does not expect additional framing tags to be added but codes F8-FF are reserved in case this is desired.</t>
<t>It may prove convenient to represent message digest values as large integers rather than binary strings. While very few platforms or programming languages support mathematical operations on fixed size integers larger than 64, this is not a major concern since message digests are rarely used for any purpose other than comparison for equality.</t>
<table><thead>
<tr>
<th>
Production   </th>
<th>
Tag</th>
<th>
Fixed</th>
<th>
Length</th>
<th>
Data Description            </th>
</tr>
</thead>
<tbody>
<tr>
<td>
p-int128</td>
<td>
Xa4</td>
<td>
16</td>
<td>
-</td>
<td>
Positive 128 bit Integer</td>
</tr>
<tr>
<td>
p-int256</td>
<td>
Xa5</td>
<td>
32</td>
<td>
-</td>
<td>
Positive 256 bit Integer</td>
</tr>
<tr>
<td>
p-int512</td>
<td>
Xa6</td>
<td>
64</td>
<td>
-</td>
<td>
Positive 512 bit Integer</td>
</tr>
</tbody>
</table><t></t>
</section>
<section title="JSON-BCD Application Binding" anchor="n-jsonbcd-application-binding"><t>The JSON serialization format is intentionally limited in the range of data types it supports. To serialize data not supported by the JSON data model, it is necessary to specify a means of transforming the unsupported data type into a supported one.</t>
<t>In particular JSON does not provide a Date-Time object or a means of encoding binary data except as an array of bytes.</t>
<t>The JSON-BCD Application Binding specifies a data model designed to support the needs of specifying network protocols and associated static data. The data model is close to that of JSON with three additional types:</t>
<ul>
<li>Binary data</li>
<li>DateTime</li>
<li>Object of specified type</li>
</ul>
<section title="JSON Binding" anchor="n-json-binding"><t>The following data field types are specified:</t>
<t>Integer</t>
<t>Integer values are encoded as JSON number values.</t>
<t>Float</t>
<t>Float values are encoded as JSON number values.</t>
<t>String</t>
<t>Test strings are encoded as JSON text strings.</t>
<t>Boolean</t>
<t>Boolean values are encoded as JSON 'false', 'true' or 'null' tokens according to value.</t>
<t>Sequence</t>
<t>Sequences of data items that are encoded as JSON arrays</t>
<t>Object of known type</t>
<t>Objects whose type is known to the receiver are encoded as JSON objects</t>
<t>Object of variable type</t>
<t>Objects whose type is not known to the receiver are encoded as JSON objects containing a single field whose name describes the type of the object value and whose value contains the value.</t>
<t>Binary Data</t>
<t>Byte sequences are converted to BASE64-url encoding <xref target="RFC4648"></xref> and encoded as JSON string values.</t>
<t>Date Time</t>
<t>Date Time values are converted to Internet time format as described in <xref target="RFC3339"></xref> and encoded as JSON string values.</t>
</section>
<section title="JSON-B Binding" anchor="n-jsonb-binding"><t>The JSON-B value allows a superset of the JSON encodings to be used.</t>
<t>Integer</t>
<t>Integer values are encoded as JSON number values or as JSON-B b-integer values.</t>
<t>Float</t>
<t>Float values are encoded as JSON number values or as JSON-B b-integer or b-float values.</t>
<t>String</t>
<t>Test strings are encoded as JSON text strings or as JSON-B b-string values.</t>
<t>Boolean</t>
<t>Boolean values are encoded as JSON 'false', 'true' or 'null' tokens or as JSON-B b-atom values according to value </t>
<t>Sequence</t>
<t>Sequences of data items that are encoded as JSON arrays</t>
<t>Object of known type</t>
<t>Objects whose type is known to the receiver are encoded as JSON objects</t>
<t>Object of variable type</t>
<t>Objects whose type is not known to the receiver are encoded as JSON objects containing a single field whose name describes the type of the object value and whose value contains the value.</t>
<t>Binary Data</t>
<t>Byte sequences are converted to BASE64-url encoding <xref target="RFC4648"></xref> and encoded as JSON string values or as JSON-B b-data values. </t>
<t>Date Time</t>
<t>Date Time values are converted to Internet time format as described in <xref target="RFC3339"></xref> and encoded as JSON string values or as JSON-B b-string values.</t>
</section>
<section title="Examples" anchor="n-examples"></section>
</section>
<section title="Acknowledgements" anchor="n-acknowledgements"><t>This work was assisted by conversations with Nico Williams and other participants on the applications area mailing list.</t>
</section>
<section title="Security Considerations" anchor="n-security-considerations"><t>A correctly implemented data encoding mechanism should not introduce new security vulnerabilities. However, experience demonstrates that some data encoding approaches are more prone to introduce vulnerabilities when incorrectly implemented than others.</t>
<t>In particular, whenever variable length data formats are used, the possibility of a buffer overrun vulnerability is introduced. While best practice suggests that a coding language with native mechanisms for bounds checking is the best protection against such errors, such approaches are not always followed. While such vulnerabilities are most commonly seen in the design of decoders, it is possible for the same vulnerabilities to be exploited in encoders.</t>
<t>A common source of such errors is the case where nested length encodings are used. For example, a decoder relies on an outermost length encoding that specifies a length on 50 bytes to allocate memory for the entire result and then attempts to copy a string with a declared length of 1000 bytes within the sequence.</t>
<t>The extensions to the JSON encoding described in this document are designed to avoid such errors. Length encodings are only used to define the length of x-value constructions which are always terminal and cannot have nested data entries. </t>
</section>
<section title="IANA Considerations" anchor="n-iana-considerations"><t>[TBS list out all the code points that require an IANA registration]</t>
</section>
</middle>
<back>
<references title="Normative References"><reference anchor="IEEE754"><front>
<title>IEEE Standard for Floating-Point Arithmetic</title>
<author><organization>IEEE Computer Society</organization>
<address>
</address>
</author>
<date day="29" month="August" year="2008"/>
</front>
<seriesInfo name="IEEE" value="754-2008"/>
<seriesInfo name="DOI" value="10.1109/IEEESTD.2008.4610935"/>
</reference>
<reference anchor="RFC7159"><front>
<title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
<author fullname="T. Bray" initials="T." surname="Bray"><address>
</address>
</author>
<date month="March" year="2014"/>
</front>
<seriesInfo name="RFC" value="7159"/>
<seriesInfo name="DOI" value="10.17487/RFC7159"/>
</reference>
<reference anchor="INTEL"><front>
<title>Unknown</title>
<author><organization>Intel Corp.</organization>
<address>
</address>
</author>
<date/>
</front>
</reference>
<reference anchor="RFC4648"><front>
<title>The Base16, Base32, and Base64 Data Encodings</title>
<author fullname="S. Josefsson" initials="S." surname="Josefsson"><address>
</address>
</author>
<date month="October" year="2006"/>
</front>
<seriesInfo name="RFC" value="4648"/>
<seriesInfo name="DOI" value="10.17487/RFC4648"/>
</reference>
<reference anchor="RFC3339"><front>
<title>Date and Time on the Internet: Timestamps</title>
<author fullname="G. Klyne" initials="G." surname="Klyne"><address>
</address>
</author>
<author fullname="C. Newman" initials="C." surname="Newman"><address>
</address>
</author>
<date month="July" year="2002"/>
</front>
<seriesInfo name="RFC" value="3339"/>
<seriesInfo name="DOI" value="10.17487/RFC3339"/>
</reference>
<reference anchor="draft-hallambaker-udf"><front>
<title>Uniform Data Fingerprint (UDF)</title>
<author fullname="Phillip Hallam-Baker" surname="Phillip Hallam-Baker"><organization>Comodo Group Inc.</organization>
<address>
</address>
</author>
<date day="6" month="January" year="2019"/>
</front>
<seriesInfo name="Internet-Draft" value="draft-hallambaker-udf-12"/>
</reference>
</references>
<references title="Informative References"><reference anchor="draft-hallambaker-mesh-architecture"><front>
<title>Mathematical Mesh 3.0 Part I: Architecture Guide</title>
<author fullname="Phillip Hallam-Baker" surname="Phillip Hallam-Baker"><organization>ThresholdSecrets.com</organization>
<address>
</address>
</author>
<date day="20" month="April" year="2022"/>
</front>
<seriesInfo name="Internet-Draft" value="draft-hallambaker-mesh-architecture-20"/>
</reference>
</references>
</back>
</rfc>
