[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lsd0003] branch master updated: added file
From: |
gnunet |
Subject: |
[lsd0003] branch master updated: added file |
Date: |
Tue, 23 Feb 2021 09:14:15 +0100 |
This is an automated email from the git hooks/post-receive script.
elias-summermatter pushed a commit to branch master
in repository lsd0003.
The following commit(s) were added to refs/heads/master by this push:
new 15b3b8f added file
15b3b8f is described below
commit 15b3b8f4b371f6c5488528276da2b66127d14358
Author: Elias Summermatter <elias.summermatter@seccom.ch>
AuthorDate: Tue Feb 23 09:12:54 2021 +0100
added file
---
draft-summermatter-set-union.xml | 2257 ++++++++++++++++++++++++++++++++++++++
1 file changed, 2257 insertions(+)
diff --git a/draft-summermatter-set-union.xml b/draft-summermatter-set-union.xml
new file mode 100644
index 0000000..a18fbc6
--- /dev/null
+++ b/draft-summermatter-set-union.xml
@@ -0,0 +1,2257 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent" [
+ <!ENTITY RFC1034 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.1034.xml">
+ <!ENTITY RFC1035 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.1035.xml">
+ <!ENTITY RFC2119 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
+ <!ENTITY RFC2782 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.2782.xml">
+ <!ENTITY RFC3629 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.3629.xml">
+ <!ENTITY RFC3686 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.3686.xml">
+ <!ENTITY RFC3826 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.3826.xml">
+ <!ENTITY RFC3912 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.3912.xml">
+ <!ENTITY RFC5869 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.5869.xml">
+ <!ENTITY RFC5890 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.5890.xml">
+ <!ENTITY RFC5891 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.5891.xml">
+ <!ENTITY RFC6781 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.6781.xml">
+ <!ENTITY RFC6895 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.6895.xml">
+ <!ENTITY RFC6979 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.6979.xml">
+ <!ENTITY RFC7748 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.7748.xml">
+ <!ENTITY RFC8032 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.8032.xml">
+ <!ENTITY RFC8126 PUBLIC ''
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.8126.xml">
+ ]>
+<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
+<?rfc strict="yes" ?>
+<?rfc toc="yes" ?>
+<?rfc symrefs="yes"?>
+<?rfc sortrefs="yes" ?>
+<?rfc compact="yes" ?>
+<?rfc subcompact="no" ?>
+<rfc category="info" docName="draft-schanzen-gns-01" ipr="trust200902"
+ obsoletes="" updates="" submissionType="IETF" xml:lang="en" version="3">
+ <!-- xml2rfc v2v3 conversion 2.26.0 -->
+ <front>
+ <title abbrev="Set Union">
+ Byzantine Fault Tolerant Set Reconciliation
+ </title>
+ <seriesInfo name="Internet-Draft"
value="draft-summermatter-set-union-01"/>
+ <author fullname="Elias Summermatter" initials="E."
surname="Summermatter">
+ <organization>Seccom GmbH</organization>
+ <address>
+ <postal>
+ <street>Brunnmattstrasse 44</street>
+ <city>Bern</city>
+ <code>3007</code>
+ <country>CH</country>
+ </postal>
+ <email>elias.summermatter@seccom.ch</email>
+ </address>
+ </author>
+ <author fullname="Christian Grothoff" initials="C." surname="Grothoff">
+ <organization>Berner Fachhochschule</organization>
+ <address>
+ <postal>
+ <street>Hoeheweg 80</street>
+ <city>Biel/Bienne</city>
+ <code>2501</code>
+ <country>CH</country>
+ </postal>
+ <email>grothoff@gnunet.org</email>
+ </address>
+ </author>
+
+ <!-- Meta-data Declarations -->
+ <area>General</area>
+ <workgroup>Independent Stream</workgroup>
+ <keyword>name systems</keyword>
+ <abstract>
+ <t>This document contains a protocol specification for Byzantine
fault-tolerant
+ Set Reconciliation.
+ </t>
+ </abstract>
+ </front>
+ <middle>
+ <section anchor="introduction" numbered="true" toc="default">
+ <name>Introduction</name>
+ <t>
+ This document describes a Byzantine fault-tolerant set
reconciliation protocol used to efficient and securely
+ synchronize two sets of elements between two peers.
+ </t>
+ <t>
+ This Byzantine fault-tolerant set reconciliation
+ protocol can be used in a variety of applications.
+
+ Our primary envisioned application domain is the
+ distribution of revocation messages in the GNU Name
+ System (GNS) <xref target="GNUNET" format="default" />. In GNS,
+ key revocation messages are usually flooded across the
+ peer-to-peer overlay network to all connected peers
+ whenever a key is revoked. However, as peers may be
+ offline or the network might have been partitioned,
+ there is a need to reconcile revocation lists whenever
+ network partitions are healed or peers go online. The
+ GNU Name System uses the protocol described in this
+ specification to efficiently distribute revocation
+ messages whenever network partitions are healed.
+
+ Another application domain for the protocol described
+ in this specification are Byzantine fault-tolerant
+ bulletin boards, like those required in some secure
+ multiparty computations. A well-known example for
+ secure multiparty computations are various E-voting
+ protocols <xref target="CryptographicallySecureVoting"
format="default"/> which
+ use a bulletin board to share the votes and intermediate
+ computational results. We note that for such systems,
+ the set reconciliation protocol is merely a component of
+ a multiparty consensus protocol, such as the one
+ described in (FIXME-CITE: DOLD MS Thesis! Which paper is his MS
thesis on fdold.eu).
+ </t>
+ <t>
+ The protocol described in this report is generic and
+ suitable for a wide range of applicaitons. As a result,
+ the internal structure of the elements in the sets must
+ be defined and verified by the application using the
+ protocol. This document thus does not cover the elemtn
+ structure, except for imposing a limit on the maximum
+ size of an element.
+ </t>
+ <t>
+ The protocol faces an inherent trade-off between minimizing
+ the number of network round-trips and the number of bytes
+ sent over the network. Thus, for the protocol to choose
+ the right parameters for a given situation, applications
+ using the protocol must provide a parameter that specifies
+ the cost-ratio of round-trips vs. bandwidth usage. Given
+ this trade-off factor, the protocol will then choose parameters
+ that minimize the total execution cost. In particular, there
+ is one major choice to be made, which is between sending the
+ full set of elements, or just sending the elements that differ.
+ In the latter case, our design is basically a concrete
+ implementation of a proposal by Eppstein.<xref target="Eppstein"
format="default" />
+ </t>
+
+ <t>
+ We say that our set reconciliation protocol is Byzantine
+ fault-tolerant because it provides cryptographic and
+ probabilistic methods to discover if the other peer
+ is dishonest or misbehaving.
+ </t>
+ <t>
+ The objective here is to limit resources wasted on
+ malicious actors. Malicious actors could send malformed
+ messages, including malformed set elements, claim to
+ have much larger numbers of valid set elements than the
+ actually hold, or request the retransmission of elements
+ that they have already received in previous
+ interactions. Bounding resources consumed by malicous
+ actors is important to ensure that higher-level protocols
+ can use set reconciliation and still meet their resource
+ targets. This can be particularly critical in multi-round
+ synchronous consensus protocols where peers that cannot
+ answer in a timely fashion would have to be treated as
+ failed or malicious.
+ </t>
+ <t>
+ To defend against some of these attacks, applications
+ need to remember the number of elements previously
+ shared with a peer, and offer a means to check that
+ elements are well-formed. Applications may also be able
+ to provide an upper bound on the total number of valid
+ elements that may exist. For example, in E-voting, the
+ number of eligible voters could be used to provide such
+ an upper bound.
+ </t>
+
+ <t>
+ This document defines the normative wire format of resource
records, resolution processes,
+ cryptographic routines and security considerations for use by
implementors.
+ SETU requires a bidirectional secure communication channel
between the two parties.
+ Specification of the communication channel is out of scope of
this document.
+ </t>
+ <t>
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
+ NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described
+ in<xref target="RFC2119"/>.
+ </t>
+ </section>
+
+ <section anchor="background" numbered="true" toc="default">
+ <name>Background</name>
+ <section anchor="bf" numbered="true" toc="default">
+ <name>Bloom Filters</name>
+ <t>
+ A Bloom filter (BF) is a space-efficient datastructure to
test if am element is part of a set of elements.
+ Elements are identified by an element ID.
+ Since a BF is a probabilistic datastructure, it is
possible to have false-positives: when asked
+ if an element is in the set, the answer from a BF is
either "no" or "maybe".
+ </t>
+ <t>
+ A BF consists of L buckets. Every bucket is a binary value
that can be either 0 or 1. All buckets are initialized
+ to 0. A mapping function M is used to map each the ID of
each element from the set to a subset of k buckets. M is non-injective
+ and can thus map the same element multiple times to the
same bucket.
+ The type of the mapping function can thus be described by
the following mathematical notation:
+ </t>
+ <figure anchor="bf_mapping_function_math">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ ------------------------------------
+ # M: E->B^k
+ ------------------------------------
+ # L = Number of buckets
+ # B = 0,1,2,3,4,...L-1 (the buckets)
+ # k = Number of buckets per element
+ # E = Set of elements
+ ------------------------------------
+ Example: L=256, k=3
+ M('element-data') = {4,6,255}
+
+ ]]></artwork>
+ </figure>
+ <t>
+ A typical mapping function is constructed by hashing the
element, for example
+ using the well-known <relref section="2" target="RFC5869"
displayFormat="of">HKDF construction</relref>.
+ </t>
+ <t>
+ To add an element to the BF, the corresponding buckets
under the map M are set to 1.
+ To check if an element may be in the set, one tests if all
buckets under the map M are set to 1.
+ </t>
+ <t>
+ Further in this document a bitstream outputted by the
mapping function is represented by
+ a set of numeric values for example (0101) = (2,4).
+ In the BF the buckets are set to 1 if the corresponding
bit in the bitstream is 1.
+ If there is a collision and a bucket is already set to 1,
the bucket stays 1.
+ </t>
+ <t>
+ In the following example the element M(element) = (1,3)
has been added:
+ </t>
+ <figure anchor="figure_bf_insert_0">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ | 0 | 1 | 0 | 1 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>
+ Is easy to see that the M(element) = (0,3) could be in the
BF bellow and M(element) = (0,2) can't be
+ in the BF bellow:
+ </t>
+
+ <figure anchor="figure_bf_contains">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ | 1 | 0 | 0 | 1 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>
+ The parameters L and k depend on the set size and must be
+ chosen carefully to ensure that the BF does not return too
+ many false-positives.
+ </t>
+ <t>
+ It is not possible to remove an element from the BF
because buckets can only be set to 1 or 0. Hence it is impossible to
+ differentiate between buckets containing one or more
elements. To remove elements from the BF a <xref target="cbf" format="title" />
+ is required.
+ </t>
+ </section>
+
+ <section anchor="cbf" numbered="true" toc="default">
+ <name>Counting Bloom Filter</name>
+ <t>
+ A Counting Bloom Filter (CBF) is an extension of the <xref
target="bf" format="title" />. In the CBF, buckets are
+ unsigned numbers instead of binary values. This allows the
removal of an elements from the CBF.
+ </t>
+ <t>
+ Adding an element to the CBF is similar to the adding
operation of the BF. However, instead of setting the bucket on hit to 1 the
+ numeric value stored in the bucket is increased by 1. For
example if two colliding elements M(element1) = (1,3) and
+ M(element2) = (0,3) are added to the CBF, bucket 0 and 1
are set to 1 and bucket 3 (the colliding bucket) is set
+ to 2:
+ </t>
+ <figure anchor="figure_cbf_insert_0">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ | 1 | 1 | 0 | 2 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>
+ The counter stored in the bucket is also called the order
of the bucket.
+ </t>
+ <t>
+ To remove an element form the CBF the counters of all
buckets the element is mapped to are decreased by 1.
+ </t>
+ <t>
+ Removing M(element2) = (1,3) from the CBF above:
+ </t>
+ <figure anchor="figure_cbf_remove_0">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ | 1 | 0 | 0 | 1 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>
+ In practice, the number of bits available for the counters
is usually finite. For example, given a 4-bit
+ counter, a CBF bucket would overflow once 16 elements are
mapped to the same bucket. To efficiently
+ handle this case, the maximum value (15 in our example) is
considered to represent "infinity". Once the
+ order of a bucket reaches "infinity", it is no longer
incremented or decremented.
+ </t>
+ <t>
+ The parameters L and k and the number of bits allocated to
the counters should depend on the set size.
+ An IBF will degenerate when subjected to insert and remove
iterations of different elements, and eventually all
+ buckets will reach "infinity". The speed of the degradation
will depend on the choice of L and k in
+ relation to the number of elements stored in the IBF.
+ </t>
+ </section>
+ </section>
+
+ <section anchor="ibv" numbered="true" toc="default">
+ <name>Invertible Bloom Filter</name>
+ <t>
+ An Invertible Bloom Filter (IBF) is a further extension of the
<xref target="cbf" format="title" />.
+ An IBF extends the <xref target="cbf" format="title" /> with
two more operations:
+ decode and set difference. This two extra operations are
useful to efficiently extract
+ small differences between large sets.
+ </t>
+ <section anchor="ibf_structure" numbered="true" toc="default">
+ <name>Structure</name>
+ <t>
+ An IBF consists of a mapping function M and
+ L buckets that each store a signed
+ counter and an XHASH. An XHASH is the XOR of various
+ hash values. As before, the
+ values used for k, L and the number of bits used
+ for the signed counter and the XHASH depend
+ on the set size and various other trade-offs,
+ including the CPU architecture.
+ </t>
+ <t>
+ If the IBF size is to small or the mapping
+ function does not spread out the elements
+ uniformly, the signed counter can overflow or
+ underflow. As with the CBF, the "maximum" value is
+ thus used to represent "infinite". As there is no
+ need to distinguish between overflow and
+ underflow, the most canonical representation of
+ "infinite" would be the minimum value of the
+ counter in the canonical 2-complement
+ interpretation. For example, given a 4-bit
+ counter a value of -8 would be used to represent
+ "infinity".
+ </t>
+ <figure anchor="figure_ibf_structure">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+-------
+ count | COUNTER | COUNTER | COUNTER | COUNTER | C...
+ +-------------+-------------+-------------+-------------+------
+ idSum | IDSUM | IDSUM | IDSUM | IDSUM | I...
+ +-------------+-------------+-------------+-------------+------
+hashSum | HASHSUM | HASHSUM | HASHSUM | HASHSUM | H..
+ +-------------+-------------+-------------+-------------+-------
+ ]]></artwork>
+ </figure>
+
+ </section>
+ <section anchor="ibf_operations" numbered="true" toc="default">
+ <name>Operations</name>
+ <t>
+ When an IBF is created, all counters and IDSUM and HASHSUM
values of
+ all buckets are initialized to zero.
+ </t>
+ <section anchor="ibv_operations_insert" numbered="true"
toc="default">
+ <name>Insert Element</name>
+ <t>
+ To add an element to a IBF, the element is mapped to a
subset of k buckets using
+ the mapping function M as described in the <xref
target="bf" format="title" /> section introducing
+ BFs. For the buckets selected by the mapping function,
the counter is increased by one and the
+ IDSUM field is set to the XOR of the element ID and the
previously stored IDSUM. Furthermore,
+ the HASHSUM is set to the XOR of the hash of the element
ID and the previously stored HASHSUM.
+ </t>
+ <t>
+ In the following example, the insert operation is
illustrated using an element with the
+ ID 0x0102 and a hash of 0x4242, and a second element
with the ID 0x0304 and
+ a hash of 0x0101.
+ </t>
+ <t>Empty IBF:</t>
+ <figure anchor="figure_ibf_insert_0">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ count | 0 | 0 | 0 | 0 |
+ +-------------+-------------+-------------+-------------+
+ idSum | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
+ +-------------+-------------+-------------+-------------+
+hashSum | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>Insert first element: [0101] with ID 0x0102 and hash
0x4242:</t>
+ <figure anchor="figure_ibf_insert_1">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ count | 0 | 1 | 0 | 1 |
+ +-------------+-------------+-------------+-------------+
+ idSum | 0x0000 | 0x0102 | 0x0000 | 0x0102 |
+ +-------------+-------------+-------------+-------------+
+hashSum | 0x0000 | 0x4242 | 0x0000 | 0x4242 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>Insert second element: [1100] with ID 0x0304 and hash
0101:</t>
+ <figure anchor="figure_ibf_insert_2">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ count | 1 | 2 | 0 | 1 |
+ +-------------+-------------+-------------+-------------+
+ idSum | 0x0304 | 0x0206 | 0x0000 | 0x0102 |
+ +-------------+-------------+-------------+-------------+
+hashSum | 0x0101 | 0x4343 | 0x0000 | 0x4242 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ </section>
+ <section anchor="ibf_operations_remove" numbered="true"
toc="default">
+ <name>Remove Element</name>
+ <t>
+ To remove an element from the IBF the element is again
mapped to a subset of the buckets using M.
+ Then all the counters of the buckets selected by M are
reduced by one, the IDSUM is
+ replaced by the XOR of the old IDSUM and the ID of the
element being removed, and the
+ HASHSUM is similarly replaced with the XOR of the old
HASHSUM and the hash of the ID.
+ </t>
+ <t>
+ In the following example the remove operation for the
element [1100] with the hash 0x0101 is demonstrated.
+ </t>
+ <t>IBF with encoded elements:</t>
+ <figure anchor="figure_ibf_remove_0">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ count | 1 | 2 | 0 | 1 |
+ +-------------+-------------+-------------+-------------+
+ idSum | 0x0304 | 0x0206 | 0x0000 | 0x0102 |
+ +-------------+-------------+-------------+-------------+
+hashSum | 0x0101 | 0x4343 | 0x0000 | 0x4242 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>Remove element [1100] with ID 0x0304 and hash 0x0101
from the IBF:</t>
+ <figure anchor="figure_ibf_remove_1">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ count | 0 | 1 | 0 | 1 |
+ +-------------+-------------+-------------+-------------+
+ idSum | 0x0000 | 0x0102 | 0x0000 | 0x0102 |
+ +-------------+-------------+-------------+-------------+
+hashSum | 0x0000 | 0x4242 | 0x0000 | 0x4242 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>
+ Note that it is possible to "remove" elements from an
IBF that were never present
+ in the IBF in the first place. A negative counter value
is thus indicative of
+ elements that were removed without having been added.
Note that an IBF bucket
+ counter of zero no longer warrants that an element
mapped to that bucket is not
+ present in the set: a bucket with a counter of zero can
be the result of one
+ element being added and a different element (mapped to
the same bucket) being removed.
+ To check that an element is not present requires a
counter of zero and an
+ IDSUM and HASHSUM of zero --- and some assurance that
there was no collision due
+ to the limited number of bits in IDSUM and HASHSUM.
Thus,
+ IBFs are not suitable to replace BFs or IBFs.
+ </t>
+ <t>
+ Buckets in an IBF with a counter of 1 or -1 are crucial
for decoding an IBF, as
+ they might represent only a single element, with the
IDSUM being the ID of that element.
+ Following Eppstein (CITE), we will call buckets that
only represent a single
+ element pure buckets.
+ Note that due to the possibility of multiple insertion
and removal operations
+ affecting the same bucket, not all buckets with a
counter of 1 or -1 are
+ actually pure buckets. Sometimes a counter can be 1 or
-1 because N elements
+ mapped to that bucket were added while N-1 or N+1
different elements also
+ mapped to that bucket were removed.
+ </t>
+ </section>
+
+ <section anchor="ibf_operations_decode" numbered="true"
toc="default">
+ <name>Decode IBF</name>
+ <t>
+ Decoding an IBF yields the HASH of an element from the
IBF, or failure.
+ </t>
+ <t>
+ A decode operation requires a pure bucket, that is a
bucket to which M
+ only mapped a single element, to succeed. Thus, if
there is no bucket with
+ a counter of 1 or -1, decoding fails. However, as a
counter of 1 or -1 is
+ not a guarantee that the bucket is pure, there is also
a chance that the
+ decoder returns an IDSUM value that is actually the
XOR of several IDSUMs.
+ This is primarily detected by checking that the
HASHSUM is the hash of the IDSUM.
+ Only if the HASHSUM also matches, the bucket could be
pure. Additionally,
+ one should check that the IDSUM value actually would
be mapped by M to
+ the respective bucket. If not, there was a hash
collision.
+ </t>
+ <t>
+ The very rare case that after all these checks a
bucket is still
+ falsely identified as pure must be detected (say by
determining that
+ extracted element IDs do not match any actual
elements), and addressed
+ at a higher level in the protocol. As these failures
are probabilistic
+ and depend on element IDs and the IBF construction,
they can typically
+ be avoided by retrying with different parameters, such
as a different
+ way to assign element IDs to elements, using a larger
value for L, or
+ a different mapping function M.
+ A more common scenario (especially if L was too small)
is that
+ IBF decoding fails because there is no pure bucket. In
this case, the
+ higher-level protocol also should retry using
different parameters.
+ </t>
+ <t>
+ Suppose the IBF contains a pure bucket. In this case,
the IDSUM in the
+ bucket identifies a single element. Furthermore, it
is then possible
+ to remove that element from the IBF (by inserting it
if the counter
+ was negative, and by removing it if the counter was
positive). This
+ is likely to cause other buckets to become pure,
allowing further
+ elements to be decoded. Eventually, decoding should
succeed with
+ all counters and IDSUM and HASHSUM values reaching
zero. However, it is also
+ possible that an IBF only partly decodes and then
decoding fails after
+ yielding some elements.
+ </t>
+ <t>
+ In the following example the successful decoding of an
IBF containing
+ the two elements previously added in our running
example.
+ </t>
+ <t>
+ IBF with the two encoded elements:
+ </t>
+ <figure anchor="figure_ibf_decode_0">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ count | 1 | 2 | 0 | 1 |
+ +-------------+-------------+-------------+-------------+
+ idSum | 0x0304 | 0x0206 | 0x0000 | 0x0102 |
+ +-------------+-------------+-------------+-------------+
+hashSum | 0x0101 | 0x4343 | 0x0000 | 0x4242 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>
+ In the IBF are two pure buckets to decode (bit-1 and
bit-4) we choose to start with decoding bucket 1,
+ we decode the element with the hash 1010 and we see
that there is a new pure bucket created (bit-2)
+ </t>
+ <figure anchor="figure_ibf_decode_1">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ count | 0 | 1 | 0 | 1 |
+ +-------------+-------------+-------------+-------------+
+ idSum | 0x0000 | 0x0102 | 0x0000 | 0x0102 |
+ +-------------+-------------+-------------+-------------+
+hashSum | 0x0000 | 0x4242 | 0x0000 | 0x4242 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>
+ In the IBF only pure buckets are left, we choose to
continue decoding bucket 2 and decode element
+ with the hash 0x4242. Now the IBF is empty (all
buckets have count 0) that means the IBF has successfully
+ decoded.
+ </t>
+ <figure anchor="figure_ibf_decode_2">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ count | 0 | 0 | 0 | 0 |
+ +-------------+-------------+-------------+-------------+
+ idSum | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
+ +-------------+-------------+-------------+-------------+
+hashSum | 0x0000 | 0x0000 | 0x0000 | 0x0000 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ </section>
+
+ <section anchor="ibv_operations_setdiff" numbered="true"
toc="default">
+ <name>Set Difference</name>
+ <t>
+ Given addition and removal as defined above, it is
possible to define an operation on IBFs
+ that computes an IBF representing the set difference.
Suppose IBF1 represents set A, and
+ IBF2 represents set B. Then this set difference
operation will compute IBF3 which
+ represents the set A - B --- without needing elements
from set A or B.
+
+ To calculate the IBF representing this set difference,
both IBFs must have the same
+ length L, the same number of buckets per element k and
use the same map M. Given this,
+ one can compute the IBF representing the set
difference by taking the XOR of the IDSUM and HASHSUM values
+ of the respective buckets and subtracting the
respective counters. Care should be taken
+ to handle overflows and underflows by setting the
counter to "infinity" as necessary.
+ The result is a new IBF with the same number of
buckets representing the set difference.
+ </t>
+ <t>
+ This new IBF can be decoded as described in section
<xref target="ibf_operations_decode" format="counter" />.
+ The new IBF can have two types of pure buckets with
counter set to 1 or -1. If the counter is set to 1
+ the element is missing in the secondary set, and if
the counter is set to -1 the element is missing in
+ the primary set.
+ </t>
+ <t>
+ To demonstrate the set difference operation we compare
IBF-A with IBF-B and generate as described
+ IBF-AB
+ </t>
+ <t>IBF-A containing elements with hashes 0x0101 and
0x4242:</t>
+ <figure anchor="figure_ibf_setdiff_A">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ count | 1 | 2 | 0 | 1 |
+ +-------------+-------------+-------------+-------------+
+ idSum | 0x0304 | 0x0206 | 0x0000 | 0x0102 |
+ +-------------+-------------+-------------+-------------+
+hashSum | 0x0101 | 0x4343 | 0x0000 | 0x4242 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>IBF-B containing elements with hashes 0x4242 and
0x5050</t>
+ <figure anchor="figure_ibf_setdiff_B">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ count | 0 | 1 | 1 | 1 |
+ +-------------+-------------+-------------+-------------+
+ idSum | 0x0000 | 0x0102 | 0x1345 | 0x0102 |
+ +-------------+-------------+-------------+-------------+
+hashSum | 0x0000 | 0x4242 | 0x5050 | 0x4242 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>IBF-AB XOR value and subtract count:</t>
+ <figure anchor="figure_ibf_setdiff_AB">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ bucket-0 bucket-1 bucket-2 bucket-3
+ +-------------+-------------+-------------+-------------+
+ count | 1 | 1 | -1 | 0 |
+ +-------------+-------------+-------------+-------------+
+ idSum | 0x0304 | 0x0304 | 0x1345 | 0x0000 |
+ +-------------+-------------+-------------+-------------+
+hashSum | 0x0101 | 0x0101 | 0x5050 | 0x0000 |
+ +-------------+-------------+-------------+-------------+
+ ]]></artwork>
+ </figure>
+ <t>After calculating and decoding the IBF-AB its clear that in
IBF-A the element with the hash 0x5050
+ is missing (-1 in bit-3) while in IBF-B the element with
the hash 0101 is missing
+ (1 in bit-1 and bit-2). The element with hash 0x4242 is
present in IBF-A and IBF-B and is
+ removed by the set difference operation (bit-4).
+ </t>
+ </section>
+ </section>
+
+ <section anchor="ibf_format" numbered="true" toc="default">
+ <name>Wire format</name>
+ <t>
+ To facilitate a reasonably CPU-efficient
+ implementation, this specification requires the
+ IBF counter to always use 8 bits. Fewer bits
+ would result in a paritcularly inefficient
+ implementation, while more bits are rarely useful
+ as sets with so many elements should likely be
+ represented using a larger number of buckets. This
+ means the counter of this design can reach a
+ minimum of -127 and a maximum of 127 before the
+ counter reaches "infinity" (-128).
+ </t>
+ <t>
+ For the "IDSUM", we always use a 64-bit representation.
+ The IDSUM value must have sufficient entropy for the
+ mapping function M to yield reasonably random buckets
+ even for very large values of L. With a 32 bit
+ value the chance that multiple elements may be mapped
+ to the same ID would be quite high, even for moderately
+ large sets. Using more than 64 bits would at best make
+ sense for very large sets, but then it is likely always
+ better to simply afford additional round trips to handle
+ the occasional collision. 64 bits are also a reasonable
+ size for many CPU architectures.
+ </t>
+ <t>
+ For the "HASHSUM", we always use a 32-bit
+ representation. Here, it is mostly important to
+ avoid collisions, where different elements are
+ mapped to the same hash. However, we note that
+ by design only a few elements (certainly less than
+ 127) should ever be mapped
+ to the same bucket, so a small number of bits
+ should suffice. Furthermore, our protocol is designed
+ to handle occasional collisions, so while with
+ 32-bits there remains a chance of
+ accidental collisions, at 32 bit the chance is
+ generally believed to be sufficiently small enough
+ for the protocol to handle those cases efficiently
+ for a wide range of use-cases. Smaller hash
+ values would safe bandwidth, but also drastically
+ increase the chance of collisions. 32 bits are
+ also again a reasonable size for many CPU
+ architectures.
+ </t>
+ <section anchor="ibf_format_id_generation" numbered="true"
toc="default">
+ <name>ID Calculation</name>
+ <t>
+ The ID is generated as 64-bit output from a <relref
section="2" target="RFC5869" displayFormat="of">HKDF construction</relref>
+ with HMAC-SHA512 as XTR and HMAC-SHA256 as PRF and
salt is set to the unsigned 64-bit equivalent of 0.
+ The output is then truncated to 64-bit.
+ Its important that the elements can be redistributed
over the buckets in case the IBF does not
+ decode, that's why the ID is salted with a random salt
given in the SALT field of this message.
+ Salting is done by calculation the a random salt
modulo 64 (using only the lowest 6-bits of the salt)
+ and do a bitwise right rotation of output of KDF by
the 6-bit salts numeric representation.
+ </t>
+ <t>
+ Representation in pseudocode:
+ </t>
+ <figure anchor="ibf_format_id_generation_pseudo_code">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+# INPUTS:
+# key: Pre calculated and truncated key from id_calculation function
+# ibf_salt: Salt of the IBF
+# OUTPUT:
+# value: salted key
+FUNCTION salt_key(key,ibf_salt):
+ s = ibf_salt % 64;
+ k = key
+
+ /* rotate ibf key */
+ k = (k >> s) | (k << (64 - k))
+ return key
+
+
+# INPUTS:
+# element: Element to calculated id from.
+# salt: Salt of the IBF
+# OUTPUT:
+# value: the ID of the element
+
+FUNCTION id_calculation (element,ibf_salt):
+ salt = 0
+ XTR=HMAC-SHA256
+ PRF=HMAC-SHA256
+ key = HKDF(XTR, PRF, salt, element)
+ key = key modulo 2^64 // Truncate
+ return salt_key(key,ibf_salt)
+
+
+ ]]></artwork>
+ </figure>
+ </section>
+ <section anchor="ibf_format_bucket_identification"
numbered="true" toc="default">
+ <name>Mapping Function</name>
+ <t>
+ The mapping function M as described above in the
figure <xref target="bf_mapping_function_math" format="default" />
+ decides in which buckets the ID and HASH have to be
binary XORed to. In practice
+ there the following algorithm is used:
+ </t>
+ <t>
+ The first index is simply the HASH modulo the IBF
size. The second
+ index is calculated by creating a new 64-bit value by
shifting the 32-bit
+ value left and setting the lower 32-bit to the number
of indexes already processed. From the
+ resulting 64-bit value a CRC32 checksum is created the
second index is now the modulo of the
+ CRC32 output this is repeated until the predefined
amount indexes is generated.
+ In the case a index is hit twice, which would mean
this bucket could not get pure again,
+ the second hit is just skipped and the next iteration
is used as.
+ </t>
+ <figure
anchor="ibf_format_bucket_identification_pseudo_code">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+# INPUTS:
+# key: Is the ID of the element calculated in the id_calculation function
above.
+# number_of_buckets_per_element: Pre-defined count of buckets elements are
inserted into
+# ibf_size: the size of the ibf (count of buckets)
+# OUTPUT:
+# dst: Array with bucket IDs to insert ID and HASH
+
+FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size)
+ bucket = CRC32(key)
+
+ i = 0
+ filled = 0
+ WHILE filled < number_of_buckets_per_element
+
+ element_already_in_bucket = false
+ j = 0
+ WHILE j < filled
+ IF dst[j] == bucket modulo ibf_size THEN
+ element_already_in_bucket = true
+ ENDIF
+ j++
+ ENDWHILE
+
+ IF !element_already_in_bucket THEN
+ dst[filled++] = bucket modulo ibf_size
+ ENDIF
+
+ x = (bucket << 32) | i
+ bucket = CRC32(x)
+
+ i++
+ ENDWHILE
+ return dst
+ ]]></artwork>
+ </figure>
+ </section>
+ <section anchor="ibf_format_HASH_calculation" numbered="true"
toc="default">
+ <name>HASH calculation</name>
+ <t>
+ The HASH is calculated by calculating the CRC32
checksum of the 64-bit ID value
+ which returns a 32-bit value.
+ </t>
+ </section>
+ </section>
+ </section>
+
+ <section anchor="se" numbered="true" toc="default">
+ <name>Strata Estimator</name>
+ <section anchor="se_description" numbered="true" toc="default">
+ <name>Description</name>
+ <t>
+ Strata Estimators help estimate the size of the set
difference between two set of elements.
+ This is necessary to efficiently determinate the tuning
parameters for an IBF, in particular
+ a good value for L.
+ </t>
+ <t>
+ Basically a Strata Estimator (SE) is a series of IBFs
(with a rather small value of L)
+ in which increasingly large subsets of the full set
+ of elements are added to each IBF. For the n-th IBF, the
function selecting the
+ subset of elements should sample to select
(probabilistically) 1/(2^n) of all
+ elements. This can be done by counting the number of
trailing bits set to "1"
+ in an element ID, and then inserting the element into the
IBF identified by that
+ counter. As a result, all elements will be mapped to one
IBF, with the n-th
+ IBF being statistically expected to contain 1/(2^n)
elements.
+ </t>
+ <t>
+ Given two SEs, the set size difference can be estimated by
trying to decode all of the
+ IBFs. Given that L was set to a rather small value, IBFs
containing large strata
+ will likely fail to decode. For those IBFs that failed to
decode, one simply
+ extrapolates the number of elements by scaling the numbers
obtained from the
+ other IBFs that did decode. If none of the IBFs of the SE
decoded (which given
+ a reasonable choice of L should be highly unlikely), one
can retry using a different
+ mapping function M.
+ </t>
+ </section>
+ </section>
+
+
+ <section anchor="modeofoperation" numbered="true" toc="default">
+ <name>Mode of operation</name>
+ <t>
+ The set union protocol uses IBFs and SEs as primitives.
+ Depending on the state of the two sets there are different
strategies or operation modes how to efficiently
+ determinate missing elements between the two sets.
+ </t>
+
+ <t>
+ The simplest mode is the "full" synchronization mode. The idea
is that if the difference between the sets of the two
+ peers exceeds a certain threshold, the overhead to determine
which elements are different outweighs
+ the overhead of sending the complete set. In this case, the
most efficient method can be to just
+ exchange the full sets.
+ </t>
+ <t>
+ <!-- TODO: Add smaller version -->
+ <eref
target="https://git.gnunet.org/lsd0003.git/plain/statemaschine/full_state_maschine.jpg">Link
to statemachine diagram</eref>
+ </t>
+ <t>
+ The second possibility is that the difference of the sets is
small compared to the set size.
+ Here, an efficient "delta" synchronization mode is more
efficient. Given these two possibilities,
+ the first steps of the protocol are used to determine which
mode should be used.
+ </t>
+
+ <t>
+ Thus, the set synchronization protocol always begins with the
following operation mode independent steps.
+ </t>
+
+ <t>
+ The initiating peer begins in the <strong>Initiating
Connection</strong> state and the receiving peer in the <strong>Expecting
Connection</strong>
+ state. The first step for the initiating peer in the protocol
is to send an <em><xref target="messages_operation_request" format="title"
/></em> to the receiving peer and
+ transition into the <strong>Expect SE</strong> state. After
receiving the <em><xref target="messages_operation_request" format="title"
/></em> the receiving peer
+ transitions to the <strong>Expecting IBF</strong> state and
answers with the
+ <em><xref target="messages_se" format="title" /></em> message.
When the initiating peer receives the <em><xref target="messages_se"
format="title" /></em> message,
+ it decides with some heuristics which operation mode is likely
more suitable for the estimated set difference and the application-provided
latency-bandwidth tradeoff.
+ The detailed tradeoff between the <xref
target="modeofoperation_full-sync" format="title" /> and the <xref
target="modeofoperation_individual-elements" format="title" />
+ is explained in the section <xref
target="modeofoperation_combined-mode" format="title" />.
+ </t>
+ <section anchor="modeofoperation_full-sync" numbered="true"
toc="default">
+ <name>Full Synchronisation Mode</name>
+
+ <t>
+ When the initiating peer decides to use the full
synchronisation mode and the set of the initiating peer is bigger than the set
of the receiving peer, the initiating
+ peer sends a <em><xref target="messages_request_full"
format="title" /></em> message, and transitions from <strong>Expecting
SE</strong> to the <strong>Full Receiving</strong> state.
+ If the set of the initiating peer is smaller, it sends all
set elements to the other peer followed by the <em><xref
target="messages_full_done" format="title" /></em> message, and
+ transitions into the <strong>Full Sending</strong> state.
+ </t>
+ <t>
+ <!-- TODO: Add smaller version -->
+ <eref
target="https://git.gnunet.org/lsd0003.git/plain/statemaschine/full_state_maschine.jpg">Link
to statemachine diagram</eref>
+ </t>
+ <t><strong>The behavior of the participants the different
state is described below:</strong></t>
+ <dl>
+ <dt><strong>Expecting IBF:</strong></dt>
+ <dd>
+ If a peer in the <strong>Expecting IBF</strong> state
receives a <em><xref target="messages_request_full" format="title" /></em>
message from the other peer, the
+ peer sends all the elements of its set followed by a
<em><xref target="messages_full_done" format="title" /></em> message to the
other peer, and transitions to the
+ <strong>Full Sending</strong> state. If the peer
receives an <em><xref target="messages_full_element" format="title" /></em>
message, it processes the element and transitions to the <strong>Full
Receiving</strong> state.
+ </dd>
+ <dt><strong>Full Sending:</strong></dt>
+ <dd>
+ While a peer is in <strong>Full Sending</strong> state
the peer expects to continuously receive elements from the other
+ peer. As soon as a the <em><xref
target="messages_full_done" format="title" /></em> message is received, the
peer transitions into
+ the <strong>Finished</strong> state.
+ </dd>
+ <dt><strong>Full Receiving (In code: Expecting IBF):
</strong></dt>
+ <dd>
+ While a peer is in the <strong>Full Receiving</strong>
state, it expects to continuously receive elements from the other
+ peer. As soon as a the <em><xref
target="messages_full_done" format="title" /></em> message is received, it sends
+ the remaining elements (those it did not receive) from
its set to the other
+ peer, followed by a <em><xref
target="messages_full_done" format="title" /></em>.
+ After sending the last message, the peer transitions
into the <strong>Finished</strong> state.
+ </dd>
+ </dl>
+ </section>
+ <section anchor="modeofoperation_individual-elements"
numbered="true" toc="default">
+ <name>Delta Synchronisation Mode</name>
+ <t>
+ When the initiating peer in the <strong>Expected
SE</strong> state decides to use the delta synchronisation mode, it
+ sends a <em><xref target="messages_ibf" format="title"
/></em> to the receiving peer and transitions into the <strong>Passive
Decoding</strong> state.
+ </t>
+ <t>
+ The receiving peer in the <strong>Expecting IBF</strong>
state receives the
+ <em><xref target="messages_ibf" format="title" /></em>
message from
+ the initiating peer and transitions into the
<strong>Expecting IBF Last</strong> state when there
+ are multiple <em><xref target="messages_ibf"
format="title" /></em> messages to sent,
+ when there is just a single <em><xref
target="messages_ibf" format="title" /></em> message the reviving peer
+ transitions directly to the <strong>Active
Decoding</strong> state.
+ </t>
+ <t>
+ The peer that is in the <strong>Active Decoding</strong>,
<strong>Finish Closing</strong> or in the <strong>Expecting IBF Last</strong>
+ state is called the active peer and the peer that is in
either the <strong>Passive Decoding</strong> or the <strong>Finish
Waiting</strong> state
+ is called the passive peer.
+ </t>
+ <t>
+ <!-- TODO: Add smaler version -->
+ <eref
target="https://git.gnunet.org/lsd0003.git/plain/statemaschine/full_state_maschine.jpg">Link
to statemachine diagram</eref>
+ </t>
+ <t><strong>The behavior of the participants the different
states is described below:</strong></t>
+ <dl>
+ <dt><strong>Passive Decoding:</strong></dt>
+ <dd>
+ <t>
+ In the <strong>Passive Decoding</strong> state the
passive peer reacts to requests from the active peer.
+ The action the passive peer executes depends on the
message the passive peer receives in the <strong>Passive Decoding</strong>
state from the active peer
+ and is described below on a per message basis.
+ </t>
+
+ <dl>
+ <dt><em><xref target="messages_inquiry"
format="title" /></em> message:</dt>
+ <dd>
+ The <em><xref target="messages_inquiry"
format="title" /></em> message
+ is received if the active peer requests the
SHA-512 hash of one or more elements (by sending the 64 bit element ID)
+ that are missing from the active peer's set.
+ In this case the passive peer answers with
<em><xref target="messages_offer" format="title" /></em> messages
+ which contain the SHA-512 hash of the
requested element. If the passive peer does not have an element with
+ a matching element ID, it MUST ignore the
inquiry. If multiple elements match the 64 bit element ID, the passive
+ peer MUST send offers for all of the matching
elements.
+ </dd>
+ <dt><em><xref target="messages_demand"
format="title" /></em> message:</dt>
+ <dd>
+ The <em><xref target="messages_demand"
format="title" /></em> message
+ is received if the active peer requests a
complete element that is missing in the active peers set. If the requested
element is valid
+ the passive peer answers with an <em><xref
target="messages_elements" format="title" /></em> message which contains the
full,
+ application-dependent data of the requested
element. If the passive peer receives a demand for a SHA-512 hash for which
+ it has no element, a protocol violation is
detected and the protocol MUST be aborted.
+ Implementations MAY strengthen this and forbid
demands without previous matching offers.
+ </dd>
+ <dt><em><xref target="messages_offer"
format="title" /></em> message:</dt>
+ <dd>
+ The <em><xref target="messages_offer"
format="title" /></em> message
+ is received if the active peer has decoded an
element that is present in the active peers set and may be missing in the
+ set of the passive peer. If the SHA-512 hash
of the offer is indeed not a hash of any of the elements from the set of
+ the passive peer, the passive peer MUST answer
with a <em><xref target="messages_demand" format="title" /></em> message
+ for that SHA-512 hash and remember that it
issued this demand. The send demand need to be added to a list with unsatisfied
demands.
+ </dd>
+ <dt><em><xref target="messages_elements"
format="title" /></em> message:</dt>
+ <dd>
+ When a new element message has been received
the peer checks if a corresponding
+ <em><xref target="messages_demand"
format="title" /></em> for the element has been sent
+ and the demand is still unsatisfied.
+ If the element has been demanded the peer
checks the element for validity, removed it from the list
+ of pending demands and then then saves the
element to the the set otherwise the peer
+ rejects the element.
+ </dd>
+ <dt><em><xref target="messages_ibf" format="title"
/></em> message:</dt>
+ <dd>
+ If an <em><xref target="messages_ibf"
format="title" /></em> message is received, this
+ indicates that decoding of the IBF on the
active site has failed and roles should be swapped.
+ The receiving passive peer transitions into
the <strong>Expecting IBF Last</strong> state,
+ and waits for more <em><xref
target="messages_ibf" format="title" /></em> messages
+ or the final <em><xref
target="messages_ibf_last" format="title" /></em> message to be received.
+ </dd>
+ <dt><em><xref target="messages_ibf_last"
format="title" /></em> message:</dt>
+ <dd>
+ If an <em><xref target="messages_ibf_last"
format="title" /></em> message is received this
+ indicates that the there is just one IBF slice
and a direct state and role transition from
+ <strong>Passive Decoding</strong> to
<strong>Active Decoding</strong> is initiated.
+ </dd>
+ <dt><em><xref target="messages_done"
format="title" /></em> message:</dt>
+ <dd>
+ Receiving the <em><xref target="messages_done"
format="title" /></em> message signals
+ the passive peer that all demands of the
active peer have been satisfied. Alas, the
+ active peer will continue to process demands
from the passive peer.
+ Upon receiving this message, the passive peer
transitions into the
+ <strong>Finish Waiting</strong> state.
+ </dd>
+ </dl>
+ </dd>
+ <dt><strong>Active Decoding:</strong></dt>
+ <dd>
+ <t>
+ In the <strong>Active Decoding</strong> state the
active peer decodes the IBFs and evaluates the set difference
+ between the active and passive peer. Whenever an
element ID is obtained by decoding the IBF, the active peer
+ sends either an offer or an inquiry to the passive
peer, depending on which site the decoded element is missing.
+ </t>
+ <t>
+ If the IBF decodes a positive (1) pure bucket, the
element is missing on the passive peers site.
+ Thus the active peer sends an <em><xref
target="messages_offer" format="title" /></em> to the passive peer.
+ A negative (-1) pure bucket indicates that a
element is missing in the active peers set, so the active peer
+ sends a <em><xref target="messages_inquiry"
format="title" /></em> to the passive peer.
+ </t>
+ <t>
+ In case the IBF does not successfully decode
anymore, the active peer sends a new IBF to the passive client
+ and changes into <strong>Passive Decoding</strong>
state. This initiates a role swap.
+ To reduce overhead and prevent double transmission
of offers and elements the new IBF is created
+ on the new complete set after all demands and
inquiries have been satisfied.
+
+ </t>
+ <t>
+ As soon as the active peer successfully finished
decoding the IBF, the active peer sends a
+ <em><xref target="messages_done" format="title"
/></em> message to the passive peer.
+ </t>
+ <t>
+ All other actions taken by the active peer depend
on the message the active peer receives from
+ the passive peer. The actions are described below
on a per message basis:
+ </t>
+ <dl>
+ <dt><em><xref target="messages_offer"
format="title" /></em> message:</dt>
+ <dd>
+ The <em><xref target="messages_offer"
format="title" /></em> message indicates that the
+ passive peer received a <em><xref
target="messages_inquiry" format="title" /></em> message from
+ the active peer. If a Inquiry has been sent
and <!-- FIXME: is this indeed a condition that is checked? -->
+ the offered element is missing in the active
peers set,
+ the active peer sends a <em><xref
target="messages_demand" format="title" /></em> message to the
+ passive peer. The send demand need to be added
to a list with unsatisfied demands.
+ In the case the received offer is for an
element that is already in the set of the peer the offer is ignored.
+ <!-- FIXME: what happens if the offer is for
an element that is not missing? I think then we just ignore it, right? -->
+ </dd>
+ <dt><em><xref target="messages_demand"
format="title" /></em> message:</dt>
+ <dd>
+ The <em><xref target="messages_demand"
format="title" /></em> message indicates that the
+ passive peer received a <em><xref
target="messages_offer" format="title" /></em> from
+ the active peer. The active peer satisfies the
demand of the passive peer by sending
+ <em><xref target="messages_elements"
format="title" /></em> message if a offer request
+ for the element has been sent.
+ <!-- IMPLEMENT: This is not implemented in
code // Change -->
+ In the case the demanded element does not
exist in the
+ set there was probably a bucket decoded that
was not really pure so potentially all <em><xref target="messages_offer"
format="title" /></em>
+ and <em><xref target="messages_demand"
format="title" /></em> messages sent after are invalid
+ in this case a role change active -> passive
with a new IBF is easiest.
+ If a demand for the same element is received
multiple times the demands should be
+ discarded.
+ <!-- IMPLEMENT: This is not implemented in
code // Change -->
+ <!--FIXME: Do we really check that we first
made an offer?-->
+ </dd>
+ <dt><em><xref target="messages_elements"
format="title" /></em> message:</dt>
+ <dd>
+ A element that is received is marked in the
list of demanded elements as satisfied, validated and
+ saved and not further action is taken.
+ Elements that are not demanded or already
known are discarded.
+ </dd>
+ <dt><em><xref target="messages_done"
format="title" /></em> message:</dt>
+ <dd>
+ Receiving the message <em><xref
target="messages_done" format="title" /></em> indicates
+ that all demands of the passive peer have been
satisfied. The active peer then changes into the
+ state <strong>Finish Closing</strong> state.
+ <!-- IMPLEMENT: This is not implemented in
code // Change -->
+ If the IBF is not finished decoding and the
<em><xref target="messages_done" format="title" /></em>
+ is received the other peer is not in
compliance with the protocol and the set reconciliation MUST be aborted.
+ <!-- IMPLEMENT: This is not implemented in
code // Change -->
+ </dd>
+ </dl>
+ </dd>
+ <dt><strong>Expecing IBF Last</strong></dt>
+ <dd>
+ <t>
+ In the <strong>Expecing IBF Last</strong> state
the active peer continuously receives <em><xref target="messages_ibf"
format="title" /></em>
+ messages from the passive peer. When the last
<em><xref target="messages_ibf_last" format="title" /></em> message is received
+ the active peer changes into <strong>Active
Decoding</strong> state.
+ </t>
+ </dd>
+ <dt><strong>Finish Closing</strong> / <strong>Finish
Waiting</strong></dt>
+ <dd>
+ <t>
+ In this states the peers are waiting for all
demands to be satisfied and for the synchronisation
+ to be completed. When all demands are satisfied
the peer changes into state <strong>Finished</strong>.
+ </t>
+ </dd>
+ </dl>
+ </section>
+ <section anchor="modeofoperation_combined-mode" numbered="true"
toc="default">
+ <name>Combined Mode</name>
+ <t>
+ In the combined mode the <xref
target="modeofoperation_full-sync" format="title" /> and
+ the <xref target="modeofoperation_individual-elements"
format="title" />
+ are combined to minimize resource consumption.
+ </t>
+ <t>
+ The <xref target="modeofoperation_individual-elements"
format="title" /> is only efficient on small set
+ differences or if the byte-size of the elements is large.
Is the set difference is estimated to be large
+ the <xref target="modeofoperation_full-sync"
format="title" /> is
+ more efficient. The exact heuristics and parameters on
which the protocol decides which mode
+ should be used are described in the <xref
target="performance" format="title" /> section of this document.
+ </t>
+ <t>
+ There are two main cases when a <xref
target="modeofoperation_full-sync" format="title" />
+ is always used.
+ The first case is when one of the peers announces having
an empty set. This is announced by setting
+ the SETSIZE field in the <em><xref target="messages_se"
format="title" /></em> to 0.
+ The second case is if the application requested full
synchronization explicitly.
+ This is useful for testing and should not be used in
production.
+ </t>
+ <!--
+ <t>
+ ############# NOTE ############
+ To ensure that ...... the difference is multiplied by 1.5
if there are more than 200 elements differences between the sets (WHY? line
1398).
+ The Full Synchronisation Mode is used if the flag to force
full sync is set, the estimated difference between the two sets is bigger
+ than 25% or the set size of the receiving peer is zero.
Otherwise the delta synchronisation mode is used.
+ ############# NOTE END############
+ </t>
+ -->
+ </section>
+ </section>
+
+
+ <section anchor="messages" numbered="true" toc="default">
+ <name>Messages</name>
+
+ <section anchor="messages_operation_request" numbered="true"
toc="default">
+ <name>Operation Request</name>
+
+ <section anchor="messages_operation_request_description"
numbered="true" toc="default">
+ <name>Description</name>
+ <t>
+ This message is the first message of the protocol and
it is sent to signal to the receiving peer
+ that the initiating peer wants to initialize a new
connection.
+ </t>
+ <t>
+ This message is sent in the transition between the
<strong>Initiating Connection</strong> state and the <strong>Expect SE</strong>
state.
+ </t>
+ <t>
+ If a peer receives this message and is willing to run
the protocol, it answers by sending back a <em><xref target="messages_se"
format="title" /></em> message.
+ Otherwise it simply closes the connection.
+ </t>
+ </section>
+ <section anchor="messages_operation_request_structure"
numbered="true" toc="default">
+ <name>Structure</name>
+
+ <figure anchor="figure_operation_request">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ 0 8 16 24 32 40 48 56
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | MSG SIZE | MSG TYPE | ELEMENT COUNT |
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | APX
+ +-----+-----+-----+-----+-----+-----+-----+-----+
/
+ / /
+ / /
+ ]]></artwork>
+ </figure>
+ <t>where:</t>
+ <dl>
+ <dt>MSG SIZE</dt>
+ <dd>
+ is 16-bit unsigned integer in network byte order
witch describes the message size in bytes and the header is included.
+ </dd>
+ <dt>MSG TYPE</dt>
+ <dd>
+ the type of SETU_P2P_OPERATION_REQUEST as
registered in <xref target="gana" format="title" />, in network byte order.
+ </dd>
+ <!-- dt>OPERATION TYPE</dt>
+ <dd>
+ is a 32-bit unsigned integer which describes the
type of operation that should be initiated on the set. The filed can have three
+ different value NONE, INTERSECTION and UNION,
numeric represented by 0,1 and 2. - @Christian can you check?: Right, alas we
+ here only do UNION and INTERSECTION is a
completely different protocol => we shall simply REMOVE this field. Hence
commented out here:
+ reminder to _remove_ in implementation!
+ NONE should never occur and signals the set
supports no operation and is just for local use.
+ INTERSECTION returns only elements that are in
both sets and the default case UNION, return all
+ elements that are in at least one of the sets.
+ </dd -->
+ <dt>ELEMENT COUNT</dt>
+ <dd>
+ is the number of the elements the requesting party
has in its set, as a 32-bit unsigned integer in network byte order.
+ </dd>
+ <dt>APX</dt>
+ <dd>
+ is a SHA-512 hash that identifies the application.
+ </dd>
+ </dl>
+ </section>
+ </section>
+
+ <section anchor="messages_ibf" numbered="true" toc="default">
+ <name>IBF</name>
+
+ <section anchor="messages_ibf_description" numbered="true"
toc="default">
+ <name>Description</name>
+ <t>
+ The IBF message contains a slice of the IBF.
+ </t>
+ <t>
+ The <em>IBF</em> message is sent at the start of the
protocol from the initiating peer in the transaction
+ between <strong>Expect SE</strong> ->
<strong>Expecting IBF Last</strong> or when the IBF does not
+ decode and there is a role change in the transition
between <strong>Active Decoding</strong> -> <strong>Expecting IBF Last</strong>.
+ This message is only sent if there are more than one
IBF slice to sent, in the case there is just
+ one slice the <xref target="messages_ibf_last"
format="title" /> message is sent.
+ </t>
+ </section>
+ <section anchor="messages_ibf_structure" numbered="true"
toc="default">
+ <name>Structure</name>
+ <figure anchor="figure_ibf">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ 0 8 16 24 32 40 48 56
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | MSG SIZE | MSG TYPE |ORDER| PAD |
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | OFFSET | SALT |
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | IBF-SLICE
+ + /
+ / /
+ / /
+ ]]></artwork>
+ </figure>
+ <t>where:</t>
+ <dl>
+ <dt>MSG SIZE</dt>
+ <dd>
+ is 16-bit unsigned integer in network byte order
witch describes the message size in bytes and the header is included.
+ </dd>
+ <dt>MSG TYPE</dt>
+ <dd>
+ the type of SETU_P2P_REQUEST_IBF as registered in
<xref target="gana" format="title" /> in network byte order.
+ </dd>
+ <dt>ORDER</dt>
+ <dd>
+ is a 8-bit unsigned integer which signals the
order of the IBF. The order of the IBF
+ is defined as the logarithm of the number of
buckets of the IBF.
+ </dd>
+ <dt>PAD</dt>
+ <dd>
+ is 24-bit always set to zero
+ </dd>
+ <dt>OFFSET</dt>
+ <dd>
+ is a 32-bit unsigned integer which signals the
offset to the following ibf slices in the original.
+ </dd>
+ <dt>SALT</dt>
+ <dd>
+ is a 32-bit unsigned integer that contains the
salt which was used to create the
+ IBF.
+ </dd>
+ <dt>IBF-SLICE</dt>
+ <dd>
+ <t>
+ are variable count of slices in an array. A
single slice contains out multiple 64-bit IDSUMS,
+ 32-bit HASHSUMS and 8-bit COUNTERS. In the
network order the array of IDSUMS is first, followed
+ by an array of HASHSUMS and ended with an
array of COUNTERS. Length of the array is defined
+ by MIN( 2^ORDER - OFFSET,
MAX_BUCKETS_PER_MESSAGE). MAX_BUCKETS_PER_MESSAGE is defined as
+ 32768 divided by the BUCKET_SIZE which is
13-byte (104-bit).
+ </t>
+ <t>
+ To get the IDSUM field, all IDs who hit a
bucket are added up with a binary XOR operation.
+ See <xref target="ibf_format_id_generation"
format="title" /> for details about ID generation.
+ </t>
+ <t>
+ The calculation of the HASHSUM field is done
accordingly to the calculation of the IDSUM field:
+ all HASHes are added up with a binary XOR
operation.
+ The HASH value is calculated as described in
detail in section <xref target="ibf_format_HASH_calculation" format="title" />.
+ </t>
+ <t>
+ The algorithm to find the correct bucket in
which the ID and the HASH have to be added
+ is described in detail in section <xref
target="ibf_format_bucket_identification" format="title" />.
+ </t>
+
+ <!--
+ FIXME: this is not sufficiently precise! How are
the element IDs (and IDSUMS) computed?
+ How are the HASHes (and HASHSUMS) computed? Which
byte order is used? What role does
+ the SALT have in these computations? Definitively
needs DETAILED algorithm(s) and
+ test vectors.-->
+ </dd>
+ </dl>
+ <figure anchor="figure_ibf_slice">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ IBF-SLICE
+ 0 8 16 24 32 40 48 56
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | IDSUMS |
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | IDSUMS |
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | HASHSUMS | HASHSUMS |
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | COUNTERS | COUNTERS |
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ / /
+ / /
+ ]]></artwork>
+ </figure>
+ </section>
+ </section>
+
+ <section anchor="messages_ibf_last" numbered="true" toc="default">
+ <name>IBF</name>
+
+ <section anchor="messages_ibf_last_description"
numbered="true" toc="default">
+ <name>Description</name>
+ <t>
+ This message indicates to the remote peer that all
slices of the bloom filter have been sent.
+ The binary structure is exactly the same as the <xref
target="messages_ibf_structure" format="title" /> of
+ the message <xref target="messages_ibf" format="title"
/> with a different "MSG TYPE"
+ which is defined in <xref target="gana" format="title"
/> "SETU_P2P_IBF_LAST".
+ </t>
+ <t>
+ Receiving this message initiates the state
transmissions
+ <strong>Expecting IBF Last</strong> -> <strong>Active
Decoding</strong>,
+ <strong>Expecting IBF</strong> -> <strong>Active
Decoding</strong> and
+ <strong>Passive Decoding</strong> -> <strong>Active
Decoding</strong>. This message
+ can initiate a peer the roll change from
<strong>Active Decoding</strong> to
+ <strong>Passive Decoding</strong>.
+ </t>
+ </section>
+ </section>
+
+ <section anchor="messages_elements" numbered="true" toc="default">
+ <name>Elements</name>
+
+ <section anchor="messages_elements_description"
numbered="true" toc="default">
+ <name>Description</name>
+ <t>
+ The Element message contains an element that is
synchronized in the <xref target="modeofoperation_individual-elements"
format="title" />
+ and transmits a full element between the peers.
+ </t>
+ <t>
+ This message is sent in the state <strong>Active
Decoding</strong> and <strong>Passive Decoding</strong>
+ as answer to a <em><xref target="messages_demand"
format="title" /></em> message from the remote peer.
+ The Element message can also be received in the
<strong>Finish Closing</strong> or <strong>Finish Waiting</strong>
+ state after receiving a <em><xref
target="messages_done" format="title" /></em> message from the remote peer, in
this
+ case the client changes to the
<strong>Finished</strong> state as soon as all demands for elements have been
satisfied.
+ </t>
+ <t>
+ This message is exclusively sent in the <xref
target="modeofoperation_individual-elements" format="title" />.
+ </t>
+ </section>
+ <section anchor="messages_elements_structure" numbered="true"
toc="default">
+ <name>Structure</name>
+ <figure anchor="figure_elements">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ 0 8 16 24 32 40 48 56
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | MSG SIZE | MSG TYPE | E TYPE | PADDING |
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | E SIZE | AE TYPE | DATA
+ +-----+-----+-----+-----+ /
+ / /
+ / /
+ ]]></artwork>
+ </figure>
+ <t>where:</t>
+ <dl>
+ <dt>MSG SIZE</dt>
+ <dd>
+ is 16-bit unsigned integer in network byte order
witch describes the message size in bytes and the header is included.
+ </dd>
+ <dt>MSG TYPE</dt>
+ <dd>
+ the type of SETU_P2P_ELEMENTS as registered in
<xref target="gana" format="title" /> in network byte order.
+ </dd>
+ <dt>E TYPE</dt>
+ <dd>
+ element type is a 16-bit unsigned integer witch
defines the element type for
+ the application.
+ </dd>
+ <dt>PADDING</dt>
+ <dd>
+ is 16-bit always set to zero
+ </dd>
+ <dt>E SIZE</dt>
+ <dd>
+ element size is 16-bit unsigned integer that
signals the size of the elements data part.
+ </dd>
+ <dt>AE TYPE</dt>
+ <dd>
+ application specific element type is a 16-bit
unsigned integer that is needed to identify
+ the type of element that is in the data field
+ </dd>
+ <dt>DATA</dt>
+ <dd>
+ is a field with variable length that contains the
data of the element.
+ </dd>
+ </dl>
+ </section>
+ </section>
+
+ <section anchor="messages_offer" numbered="true" toc="default">
+ <name>Offer</name>
+
+ <section anchor="messages_offer_description" numbered="true"
toc="default">
+ <name>Description</name>
+ <t>
+ The offer message is an answer to an <em><xref
target="messages_inquiry" format="title" /></em> message
+ and transmits the full hash of an element that has
been requested by the other peer.
+ This full hash enables the other peer to check if the
element is really missing in its set and
+ eventually sends a <em><xref target="messages_demand"
format="title" /></em> message for that a element.
+ </t>
+ <t>
+ The offer is sent and received only in the
<strong>Active Decoding</strong> and in the <strong>Passive Decoding</strong>
+ state.
+ </t>
+ <t>
+ This message is exclusively sent in the <xref
target="modeofoperation_individual-elements" format="title" />.
+ </t>
+ </section>
+ <section anchor="messages_offer_structure" numbered="true"
toc="default">
+ <name>Structure</name>
+ <figure anchor="figure_offer">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ 0 8 16 24 32 40 48 56
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | MSG SIZE | MSG TYPE | HASH
+ +-----+-----+-----+-----+
+ / /
+ / /
+ ]]></artwork>
+ </figure>
+ <t>where:</t>
+ <dl>
+ <dt>MSG SIZE</dt>
+ <dd>
+ is 16-bit unsigned integer in network byte order
witch describes the message size in bytes and the header is included.
+ </dd>
+ <dt>MSG TYPE</dt>
+ <dd>
+ the type of SETU_P2P_OFFER as registered in <xref
target="gana" format="title" /> in network byte order.
+ </dd>
+ <dt>HASH</dt>
+ <dd>
+ is a SHA 512-bit hash of the element that is
requested with a inquiry message.
+ </dd>
+ </dl>
+ </section>
+ </section>
+
+
+ <section anchor="messages_inquiry" numbered="true" toc="default">
+ <name>Inquiry</name>
+
+ <section anchor="messages_inquiry_description" numbered="true"
toc="default">
+ <name>Description</name>
+ <t>
+ The Inquiry message is exclusively sent by the active
peer in <strong>Active Decoding</strong> state
+ to request the full hash of an element that is missing
in the active peers set. This is normally answered
+ by the passive peer with <em><xref
target="messages_offer" format="title" /></em> message.
+ </t>
+ <t>
+ This message is exclusively sent in the <xref
target="modeofoperation_individual-elements" format="title" />.
+ </t>
+ <t>
+ NOTE: HERE IS AN IMPLEMENTATION BUG UNNECESSARY 32-BIT
PADDING!
+ </t>
+ </section>
+ <section anchor="messages_inquiry_structure" numbered="true"
toc="default">
+ <name>Structure</name>
+ <figure anchor="figure_inquiry">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ 0 8 16 24 32 40 48 56
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | MSG SIZE | MSG TYPE | SALT |
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | IBF KEY |
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ ]]></artwork>
+ </figure>
+ <t>where:</t>
+ <dl>
+ <dt>MSG SIZE</dt>
+ <dd>
+ is 16-bit unsigned integer in network byte order
witch describes the message size in bytes and the header is included.
+ </dd>
+ <dt>MSG TYPE</dt>
+ <dd>
+ the type of SETU_P2P_INQUIRY as registered in
<xref target="gana" format="title" /> in network byte order.
+ </dd>
+ <dt>IBF KEY</dt>
+ <dd>
+ is a 64-bit unsigned integer that contains the key
for which the inquiry is sent.
+ </dd>
+ </dl>
+ </section>
+ </section>
+
+ <section anchor="messages_demand" numbered="true" toc="default">
+ <name>Demand</name>
+
+ <section anchor="messages_demand_description" numbered="true"
toc="default">
+ <name>Description</name>
+ <t>
+ The demand message is sent in the <strong>Active
Decoding</strong> and in the <strong>Passive Decoding</strong>
+ state. It is a answer to a received <em><xref
target="messages_offer" format="title" /></em> message
+ and is sent if the element described in the <em><xref
target="messages_offer" format="title" /></em> message
+ is missing in the peers set. In the normal workflow
the answer to the demand message is an
+ <em><xref target="messages_elements" format="title"
/></em> message.
+ </t>
+ <t>
+ This message is exclusively sent in the <xref
target="modeofoperation_individual-elements" format="title" />.
+ </t>
+ </section>
+ <section anchor="messages_demand_structure" numbered="true"
toc="default">
+ <name>Structure</name>
+ <figure anchor="figure_demand">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ 0 8 16 24 32 40 48 56
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | MSG SIZE | MSG TYPE | HASH
+ +-----+-----+-----+-----+
+ / /
+ / /
+ ]]></artwork>
+ </figure>
+ <t>where:</t>
+ <dl>
+ <dt>MSG SIZE</dt>
+ <dd>
+ is 16-bit unsigned integer in network byte order
witch describes the message size in bytes and the header is included.
+ </dd>
+ <dt>MSG TYPE</dt>
+ <dd>
+ the type of SETU_P2P_DEMAND as registered in <xref
target="gana" format="title" /> in network byte order.
+ </dd>
+ <dt>HASH</dt>
+ <dd>
+ is a 512-bit Hash of the element that is demanded.
+ </dd>
+ </dl>
+ </section>
+ </section>
+
+ <section anchor="messages_done" numbered="true" toc="default">
+ <name>Done</name>
+
+ <section anchor="messages_done_description" numbered="true"
toc="default">
+ <name>Description</name>
+ <t>
+ The done message is sent when all <em><xref
target="messages_demand" format="title" /></em> messages
+ have been successfully satisfied and the set is
complete synchronized.
+ <!-- IMPLEMENT: This is not implemented in code //
Change -->
+ A final checksum (XOR SHA-512 hash) over all elements
of the set is added to the message
+ to allow the other peer to make sure that the sets are
equal.
+ <!-- IMPLEMENT: This is not implemented in code //
Change -->
+
+ </t>
+ <t>
+ This message is exclusively sent in the <xref
target="modeofoperation_individual-elements" format="title" />.
+ </t>
+ </section>
+ <section anchor="messages_done_structure" numbered="true"
toc="default">
+ <name>Structure</name>
+ <figure anchor="figure_done">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ 0 8 16 24 32
+ +-----+-----+-----+-----+
+ | MSG SIZE | MSG TYPE |
+ +-----+-----+-----+-----+
+ | HASH
+ +-----+-----+-----+-----+
+ ]]></artwork>
+ </figure>
+ <t>where:</t>
+ <dl>
+ <dt>MSG SIZE</dt>
+ <dd>
+ is 16-bit unsigned integer in network byte order
witch describes the message size in bytes and the header is included.
+ </dd>
+ <dt>MSG TYPE</dt>
+ <dd>
+ the type of SETU_P2P_DONE as registered in <xref
target="gana" format="title" /> in network byte order.
+ </dd>
+ <dt>HASH</dt>
+ <dd>
+ is a 512-bit hash of the set to allow a final
equality check.
+ </dd>
+
+ </dl>
+ </section>
+ </section>
+
+ <section anchor="messages_full_done" numbered="true" toc="default">
+ <name>Full Done</name>
+
+ <section anchor="messages_full_done_description"
numbered="true" toc="default">
+ <name>Description</name>
+ <t>
+ The full done message is sent in the <xref
target="modeofoperation_full-sync" format="title" />
+ to signal that all remaining elements of the set have
been sent. The message is received and sent in in the
+ <strong>Full Sending</strong> and in the <strong>Full
Receiving</strong> state. When the full done message is received
+ in <strong>Full Sending</strong> state the peer
changes directly into <strong>Finished</strong> state. In
+ <strong>Full Receiving</strong> state receiving a full
done message initiates the sending of
+ the remaining elements that are missing in the set of
the other peer.
+ </t>
+ </section>
+ <section anchor="messages_full_done_structure" numbered="true"
toc="default">
+ <name>Structure</name>
+ <figure anchor="figure_full_done">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ 0 8 16 24 32
+ +-----+-----+-----+-----+
+ | MSG SIZE | MSG TYPE |
+ +-----+-----+-----+-----+
+ ]]></artwork>
+ </figure>
+ <t>where:</t>
+ <dl>
+ <dt>MSG SIZE</dt>
+ <dd>
+ is 16-bit unsigned integer in network byte order
witch describes the message size in bytes and the header is included.
+ </dd>
+ <dt>MSG TYPE</dt>
+ <dd>
+ the type of SETU_P2P_FULL_DONE as registered in
<xref target="gana" format="title" /> in network byte order.
+ </dd>
+ </dl>
+ </section>
+ </section>
+
+ <section anchor="messages_request_full" numbered="true"
toc="default">
+ <name>Request Full</name>
+
+ <section anchor="messages_request_full_description"
numbered="true" toc="default">
+ <name>Description</name>
+ <t>
+ The request full message is sent by the initiating
peer in <strong>Expect SE</strong> state to the receiving peer if
+ the operation mode "<xref
target="modeofoperation_full-sync" format="title" />" is
+ determined as the better <xref
target="modeofoperation" format="title" /> and the set size of the initiating
peer is smaller
+ than the set size of the receiving peer. The
initiating peer changes after sending the request full message into
+ <strong>Full Receiving</strong> state.
+ </t>
+ <t>
+ The receiving peer receives the Request Full message
in the <strong>Expecting IBF</strong>, afterwards the receiving peer
+ starts sending its complete set in <xref
target="messages_full_element" format="title" /> messages to the initiating
peer.
+ </t>
+ </section>
+ <section anchor="messages_request_full_structure"
numbered="true" toc="default">
+ <name>Structure</name>
+ <figure anchor="figure_request_full">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ 0 8 16 24 32
+ +-----+-----+-----+-----+
+ | MSG SIZE | MSG TYPE |
+ +-----+-----+-----+-----+
+ ]]></artwork>
+ </figure>
+ <t>where:</t>
+ <dl>
+ <dt>MSG SIZE</dt>
+ <dd>
+ is 16-bit unsigned integer in network byte order
witch describes the message size in bytes and the header is included.
+ </dd>
+ <dt>MSG TYPE</dt>
+ <dd>
+ the type of SETU_P2P_REQUEST_FULL as registered in
<xref target="gana" format="title" /> in network byte order.
+ </dd>
+ </dl>
+ </section>
+ </section>
+
+ <section anchor="messages_se" numbered="true" toc="default">
+ <name>Strata Estimator</name>
+
+ <section anchor="messages_se_description" numbered="true"
toc="default">
+ <name>Description</name>
+ <t>
+ The strata estimator is sent by the receiving peer at
the start of the protocol right after the
+ <xref target="messages_operation_request"
format="title" /> message has been received.
+ </t>
+ <t>
+ The strata estimator is used to estimate the
difference between the two sets as described in section <xref target="se"
format="counter" />.
+ </t>
+ <t>
+ When the initiating peer receives the strata estimator
the peer decides which <xref target="modeofoperation" format="title" /> to use
+ for the synchronization. Depending on the size of the
set difference and the <xref target="modeofoperation" format="title" /> the
initiating peer
+ changes into <strong>Full Sending</strong>,
<strong>Full Receiving</strong> or <strong>Passive Decoding</strong> state.
+ </t>
+ </section>
+ <section anchor="messages_se_structure" numbered="true"
toc="default">
+ <name>Structure</name>
+ <figure anchor="figure_se">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ 0 8 16 24 32 40 48 56
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | MSG SIZE | MSG TYPE | SETSIZE
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ SETSIZE | SE-SLICES
+ +-----+-----+-----+-----+
+ / /
+ / /
+ ]]></artwork>
+ </figure>
+ <t>where:</t>
+ <dl>
+ <dt>MSG SIZE</dt>
+ <dd>
+ is 16-bit unsigned integer in network byte order
witch describes the message size in bytes and the header is included.
+ </dd>
+ <dt>MSG TYPE</dt>
+ <dd>
+ the type of SETU_P2P_SE as registered in <xref
target="gana" format="title" /> in network byte order.
+ </dd>
+ <dt>SETSIZE</dt>
+ <dd>
+ is a 64-bit unsigned integer that is defined by
the size of the set the SE is <!--IMPLEMENT: Mögliche optimierung wäre wäre
hier eine 32bit padding einzuführen damit es aligned -->
+ </dd>
+ <dt>SE-SLICES</dt>
+ <dd>
+ is variable in size and contains the same
structure as the IBF-SLICES field in the IBF message.
+ </dd>
+ </dl>
+ </section>
+ </section>
+
+ <section anchor="messages_sec" numbered="true" toc="default">
+ <name>Strata Estimator Compressed</name>
+
+ <section anchor="messages_sec_description" numbered="true"
toc="default">
+ <name>Description</name>
+ <t>
+ The Strata estimator can be compressed with gzip to
improve performance. For
+ details see section <xref target="performance"
format="title" />.
+ </t>
+ <t>
+ Since the content of the message is the same as the
uncompressed Strata Estimator, the details
+ aren't repeated here for details see section <xref
target="messages_se" format="counter" />.
+ </t>
+ </section>
+ </section>
+
+
+ <section anchor="messages_full_element" numbered="true"
toc="default">
+ <name>Full Element</name>
+
+ <section anchor="messages_full_element_description"
numbered="true" toc="default">
+ <name>Description</name>
+ <t>
+ The full element message is the equivalent of the
<xref target="messages_elements" format="title" /> message in
+ the <xref target="modeofoperation_full-sync"
format="title" />. It contains a complete element that is missing
+ in the set of the peer that receives this message.
+ </t>
+ <t>
+ The full element message is exclusively sent in the
transitions <strong>Expecting IBF</strong> -> <strong>Full Receiving</strong>
and
+ <strong>Full Receiving</strong> ->
<strong>Finished</strong>. The message is only received in the <strong> Full
Sending</strong> and
+ <strong>Full Receiving</strong> state.
+ </t>
+ <t>
+ After the last full element messages has been sent the
<xref target="messages_full_done" format="title" /> message
+ is sent to conclude the full synchronisation of the
element sending peer.
+ </t>
+ </section>
+ <section anchor="messages_full_element_structure"
numbered="true" toc="default">
+ <name>Structure</name>
+ <figure anchor="figure_full_element">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+ 0 8 16 24 32 40 48 56
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | MSG SIZE | MSG TYPE | E TYPE | PADDING |
+ +-----+-----+-----+-----+-----+-----+-----+-----+
+ | SIZE | AE TYPE | DATA
+ +-----+-----+-----+-----+
+ / /
+ / /
+ ]]></artwork>
+ </figure>
+ <t>where:</t>
+ <dl>
+ <dt>MSG SIZE</dt>
+ <dd>
+ is 16-bit unsigned integer in network byte order
witch describes the message size in bytes and the header is included.
+ </dd>
+ <dt>MSG TYPE</dt>
+ <dd>
+ the type of SETU_P2P_REQUEST_FULL_ELEMENT as
registered in <xref target="gana" format="title" /> in network byte order.
+ </dd>
+ <dt>E TYPE</dt>
+ <dd>
+ element type is a 16-bit unsigned integer witch
defines the element type for
+ the application.
+ </dd>
+ <dt>PADDING</dt>
+ <dd>
+ is 16-bit always set to zero
+ </dd>
+ <dt>E SIZE</dt>
+ <dd>
+ element size is 16-bit unsigned integer that
signals the size of the elements data part.
+ </dd>
+ <dt>AE TYPE</dt>
+ <dd>
+ application specific element type is a 16-bit
unsigned integer that is needed to identify
+ the type of element that is in the data field
+ </dd>
+ <dt>DATA</dt>
+ <dd>
+ is a field with variable length that contains the
data of the element.
+ </dd>
+ </dl>
+ </section>
+ </section>
+
+ </section>
+
+
+ <section anchor="performance" numbered="true" toc="default">
+ <name>Performance Considerations</name>
+ <!--
+ <t>
+ - TEXT HERE -
+ On what basis is the new IBF constructed? Specifically, which set
is used? Do we
+ wait for the completion of pending demands first? How do L/k/M
change? Some of this should
+ be detailed here, but the full details likely need a separate
section on the algorithms.
+ </t>
+ -->
+ </section>
+
+ <section anchor="security" numbered="true" toc="default">
+ <name>Security Considerations</name>
+
+ <t>
+ In this protocol the definition of security is different then in
other
+ protocols. This peer to peer protocol should primarily prevent an
attacker from
+ wasting cpu and network resources.
+ </t>
+ <t>
+ To prevent Denial of Service attacks its vital to check that any
other peer can only try to
+ reconcile a set once in a pre defined time span. If necessary to
enhance reliability and to allow
+ failures in the protocol its possible to introduce a threshold for
max failed reconciliation
+ ties in given time. The optimal values for these thresholds depend
on the use case.
+ <!-- IMPLEMENT: How to implement? IP? Other construct? -->
+ </t>
+ <t>
+ The formal format of all messages needs to be properly validated,
this is important to prevent many
+ attacks on the code. The application data should be validated by
the application using
+ the protocol not by the implementation of the protocol.
+ In case the format validation fails the set operation should be
terminated.
+ <!-- IMPLEMENT: Are all messages checked for formal valid format
-->
+ </t>
+
+ <t>
+ Its important to close and purge connections after a given timeout
+ to prevent draining attacks.
+ <!-- IMPLEMENT: How ist this handeld right now? -->
+ </t>
+
+
+ <section anchor="security_states" numbered="true" toc="default">
+ <name>States</name>
+
+ <t>
+ In this section the security considerations for each valid
message
+ in all states is described, if any other message
+ is received the peer MUST terminate the operation.
+ </t>
+
+ <section anchor="security_states_expecting_ibf" numbered="true"
toc="default">
+ <name>Expecting IBF</name>
+ <t>Security considerations for received messages:</t>
+ <dl>
+ <dt><xref target="messages_request_full" format="title"
/></dt>
+ <dd>
+ This message does offer a small attack surface to an
attacker because
+ its a fixed-size message and no custom content can be
passed.
+ Its important to check that its not possible for an
attacker to request
+ the full set multiple times.
+ <!-- IMPLEMENT: Check if this two checks already
exists -->
+ </dd>
+ <dt><xref target="messages_ibf" format="title" /></dt>
+ <dd>
+ This message contains variable content and needs to be
checked for
+ a valid formal format of an IBF. Its important do
define a threshold to limit
+ the maximal count of IBFs that are expected from the
other peer.
+ <!-- IMPLEMENT: Is this already checked?-->
+
+ </dd>
+ <dt><xref target="messages_full_element" format="title"
/></dt>
+ <dd>
+ If a valid full element is received in this state
there are
+ no additional security measurement that need to be
implemented in this
+ state.
+ </dd>
+ </dl>
+ </section>
+
+ <section anchor="security_states_full_sending" numbered="true"
toc="default">
+ <name>Full Sending</name>
+ <t>
+ Bla Bla
+ </t>
+ </section>
+
+ <section anchor="security_states_expecting_ibf_last"
numbered="true" toc="default">
+ <name>Expecting IBF Last</name>
+ <t>
+ Bla Bla
+ </t>
+ </section>
+ <section anchor="security_states_active_decoding" numbered="true"
toc="default">
+ <name>Active Decoding</name>
+ <t>
+ Bla Bla
+ </t>
+ </section>
+ <section anchor="security_states_finish_closing" numbered="true"
toc="default">
+ <name>Finish Closing</name>
+ <t>
+ Bla Bla
+ </t>
+ </section>
+ <section anchor="security_states_finished" numbered="true"
toc="default">
+ <name>Finished</name>
+ <t>
+ Bla Bla
+ </t>
+ </section>
+ <section anchor="security_states_expect_se" numbered="true"
toc="default">
+ <name>Expect SE</name>
+ <t>
+ Bla Bla
+ </t>
+ </section>
+ <section anchor="security_states_full_receiving" numbered="true"
toc="default">
+ <name>Full Receiving</name>
+ <t>
+ Bla Bla
+ </t>
+ </section>
+ <section anchor="security_states_passive_decoding" numbered="true"
toc="default">
+ <name>Passive Decoding</name>
+ <t>
+ Bla Bla
+ </t>
+ </section>
+ <section anchor="security_states_finish_waiting" numbered="true"
toc="default">
+ <name>Finish Waiting</name>
+ <t>
+ Bla Bla
+ </t>
+ </section>
+
+
+ </section>
+
+ <!--
+ <section anchor="security_crypto" numbered="true" toc="default">
+ <name>BLAH</name>
+ <t>
+ Bulub.
+ </t>
+ <t>
+ Another probabilistic approach to discover bad behaving peers is
sampling, in this approach the proving peer needs
+ to prove that he is in possession of the elements he claimed to
be. This is achieved by the following procedure:
+ </t>
+ <t>
+ The verifying peer chooses some
+ random salt and sends the salt to the proving peer. The proving
peer salts the hash of elements with the given
+ salt from the verifying peer. Then the proving peer calculates the
new hashes modulo a number depending on the set sized difference and
+ sends all the elements where the modulo calculation equals 0 to
the verifying peer.
+ As soon as the verifying peer receives the elements the verifying
peer can verify that all the elements
+ are valid and the modulo calculation equals 0 then the verifying
peer can be assured with a high probability
+ that the peer is honest about his remaining set size and
difference.
+ </t>
+ </section>
+ -->
+ </section>
+
+ <section anchor="gana" numbered="true" toc="default">
+ <name>GANA Considerations</name>
+ <t>
+ GANA is requested to amend the "GNUnet Message Type" registry
+ as follows:
+ </t>
+ <figure anchor="figure_purposenums">
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+Type | Name | References | Description
+--------+----------------------------+------------+--------------------------
+ 559 | SETU_P2P_REQUEST_FULL | [This.I-D] | Request the full set of
the other peer
+ 560 | SETU_P2P_DEMAND | [This.I-D] | Demand the whole element
from the other peer, given only the hash code.
+ 561 | SETU_P2P_INQUIRY | [This.I-D] | Tell the other peer to
send us a list of hashes that match an IBF key.
+ 562 | SETU_P2P_OFFER | [This.I-D] | Tell the other peer which
hashes match a given IBF key.
+ 563 | SETU_P2P_OPERATION_REQUEST | [This.I-D] | Request a set union
operation from a remote peer.
+ 564 | SETU_P2P_SE | [This.I-D] | Strata Estimator
uncompressed
+ 565 | SETU_P2P_IBF | [This.I-D] | Invertible Bloom Filter
Slice.
+ 566 | SETU_P2P_ELEMENTS | [This.I-D] | Actual set elements.
+ 567 | SETU_P2P_IBF_LAST | [This.I-D] | Invertible Bloom Filter
Last Slice.
+ 568 | SETU_P2P_DONE | [This.I-D] | Set operation is done.
+ 569 | SETU_P2P_SEC | [This.I-D] | Strata Estimator compressed
+ 570 | SETU_P2P_FULL_DONE | [This.I-D] | All elements in full
synchronization mode have been send is done.
+ 571 | SETU_P2P_FULL_ELEMENT | [This.I-D] | Send an actual element in
full synchronization mode.
+
+ ]]></artwork>
+ </figure>
+ </section>
+ <!-- gana -->
+ <section anchor="contributors" numbered="true" toc="default">
+ <name>Contributors</name>
+ <t>
+ The original GNUnet implementation of the Byzantine Fault
Tolerant Set Reconciliation
+ protocol has mainly been
+ written by Florian Dold and Christian Grothoff.
+ </t>
+ </section>
+ </middle>
+ <back>
+ <references>
+ <name>Normative References</name>
+ &RFC5869;
+ &RFC1034;
+ &RFC1035;
+ &RFC2782;
+ &RFC2119;
+ &RFC3629;
+ &RFC3686;
+ &RFC3826;
+ &RFC3912;
+ &RFC5890;
+ &RFC5891;
+ &RFC6781;
+ &RFC6895;
+ &RFC6979;
+ &RFC7748;
+ &RFC8032;
+ &RFC8126;
+
+ <reference anchor="GANA" target="https://gana.gnunet.org/">
+ <front>
+ <title>GNUnet Assigned Numbers Authority (GANA)</title>
+ <author>
+ <organization>GNUnet e.V.</organization>
+ </author>
+ <date month="April" year="2020"/>
+ </front>
+ </reference>
+
+ <reference anchor="CryptographicallySecureVoting"
target="https://git.gnunet.org/bibliography.git/plain/docs/ba_dold_voting_24aug2014.pdf">
+ <front>
+ <title>Cryptographically Secure, DistributedElectronic
Voting</title>
+ <author initials="F." surname="Dold" fullname="Florian
Dold">
+ <organization>Technische Universität
München</organization>
+ </author>
+ </front>
+ </reference>
+
+
+ <reference anchor="GNUNET"
target="https://git.gnunet.org/bibliography.git/plain/docs/gns2014wachs.pdf">
+ <front>
+ <title>A Censorship-Resistant, Privacy-Enhancing andFully
Decentralized Name System</title>
+ <author initials="M." surname="Wachs" fullname="Matthias
Wachs">
+ <organization>Technische Universität
München</organization>
+ </author>
+ <author initials="M." surname="Schanzenbach"
fullname="Martin Schanzenbach">
+ <organization>Technische Universität
München</organization>
+ </author>
+ <author initials="C." surname="Grothoff"
fullname="Christian Grothoff">
+ <organization>Technische Universität
München</organization>
+ </author>
+ </front>
+ </reference>
+
+ <reference anchor="Eppstein"
target="https://doi.org/10.1145/2018436.2018462">
+ <front>
+ <title>What’s the Difference? Efficient Set Reconciliation
without Prior Context</title>
+ <author initials="D." surname="Eppstein" fullname="David
Eppstein">
+ <organization>U.C. Irvine</organization>
+ </author>
+ <author initials="M." surname="Goodrich" fullname="Michael
T. Goodrich">
+ <organization>U.C. Irvine</organization>
+ </author>
+ <author initials="F." surname="Uyeda" fullname="Frank
Uyeda">
+ <organization>U.C. San Diego</organization>
+ </author>
+ <author initials="G." surname="Varghese" fullname="George
Varghese">
+ <organization>U.C. San Diego</organization>
+ </author>
+ </front>
+ </reference>
+
+ <reference anchor="GNS"
target="https://doi.org/10.1007/978-3-319-12280-9_9">
+ <front>
+ <title>A Censorship-Resistant, Privacy-Enhancing and Fully
Decentralized Name System</title>
+ <author initials="M." surname="Wachs" fullname="Matthias
Wachs">
+ <organization>Technische Universitaet
Muenchen</organization>
+ </author>
+
+ <author initials="M." surname="Schanzenbach"
fullname="Martin Schanzenbach">
+ <organization>Technische Universitaet
Muenchen</organization>
+ </author>
+
+ <author initials="C." surname="Grothoff"
+ fullname="Christian Grothoff">
+ <organization>Technische Universitaet
Muenchen</organization>
+ </author>
+ <date year="2014"/>
+ </front>
+ </reference>
+ <reference anchor="R5N"
target="https://doi.org/10.1109/ICNSS.2011.6060022">
+ <front>
+ <title>R5N: Randomized recursive routing for
restricted-route networks</title>
+ <author initials="N. S." surname="Evans" fullname="Nathan
S. Evans">
+ <organization>Technische Universitaet
Muenchen</organization>
+ </author>
+
+ <author initials="C." surname="Grothoff"
+ fullname="Christian Grothoff">
+ <organization>Technische Universitaet
Muenchen</organization>
+ </author>
+ <date year="2011"/>
+ </front>
+ </reference>
+
+
+ <reference anchor="Argon2"
target="https://datatracker.ietf.org/doc/draft-irtf-cfrg-argon2/">
+ <front>
+ <title>The memory-hard Argon2 password hash and
proof-of-work function</title>
+ <author initials="A." surname="Biryukov" fullname="Alex
Biryukov">
+ <organization>University of Luxembourg</organization>
+ </author>
+
+ <author initials="D." surname="Dinu" fullname="Daniel
Dinu">
+ <organization>University of Luxembourg</organization>
+ </author>
+
+ <author initials="D." surname="Khovratovich"
+ fullname="Dmitry Khovratovich">
+ <organization>ABDK Consulting</organization>
+ </author>
+ <author initials="S." surname="Josefsson"
+ fullname="Simon Josefsson">
+ <organization>SJD AB</organization>
+ </author>
+ <date year="2020" month="March"/>
+ <abstract>
+ <t>
+ This document describes the Argon2 memory-hard
function for
+ password hashing and proof-of-work applications.
We provide an
+ implementer-oriented description with
+ test vectors. The purpose is to simplify adoption
of Argon2 for
+ Internet protocols. This document is a product of
the Crypto Forum Research Group (CFRG)
+ in the IRTF.
+ </t>
+ </abstract>
+ </front>
+ </reference>
+ <reference anchor="MODES"
target="https://doi.org/10.6028/NIST.SP.800-38A">
+ <front>
+ <title>Recommendation for Block Cipher Modes of Operation:
Methods and Techniques</title>
+ <author initials="M." surname="Dworkin" fullname="Morris
Dworkin">
+ <organization>NIST</organization>
+ </author>
+
+ <date year="2001" month="December"/>
+ <abstract>
+ <t>
+ This recommendation defines five confidentiality
modes of operation for use with an
+ underlying symmetric key block cipher algorithm:
Electronic Codebook (ECB), Cipher Block
+ Chaining (CBC), Cipher Feedback (CFB), Output
Feedback (OFB), and Counter (CTR). Used with
+ an underlying block cipher algorithm that is
approved in a Federal Information Processing
+ Standard (FIPS), these modes can provide
cryptographic protection for sensitive, but
+ unclassified, computer data.
+ </t>
+ </abstract>
+ </front>
+ </reference>
+ <reference anchor="ed25519"
target="http://link.springer.com/chapter/10.1007/978-3-642-23951-9_9">
+ <front>
+ <title>High-Speed High-Security Signatures</title>
+ <author initials="D." surname="Bernstein" fullname="Daniel
Bernstein">
+ <organization>University of Illinois at
Chicago</organization>
+ </author>
+
+ <author initials="N." surname="Duif"
+ fullname="Niels Duif">
+ <organization>Technische Universiteit
Eindhoven</organization>
+
+ </author>
+ <author initials="T." surname="Lange"
+ fullname="Tanja Lange">
+ <organization>Technische Universiteit
Eindhoven</organization>
+
+ </author>
+ <author initials="P." surname="Schwabe"
+ fullname="Peter Schwabe">
+ <organization>National Taiwan University</organization>
+
+ </author>
+ <author initials="B." surname="Yang"
+ fullname="Bo-Yin Yang">
+ <organization>Academia Sinica</organization>
+
+ </author>
+ <date year="2011"/>
+ </front>
+ </reference>
+
+ <!-- <reference anchor="ISO20022">
+ <front>
+ <title>ISO 20022 Financial Services - Universal financial
industry message scheme</title>
+ <author>
+ <organization>International Organization for
Standardization</organization>
+ <address>
+ <uri>http://www.iso.ch</uri>
+ </address>
+ </author>
+ <date month="May" year="2013"/>
+ </front>
+ </reference>-->
+ </references>
+ <section anchor="test_vectors" numbered="true" toc="default">
+ <name>Test Vectors</name>
+ <section anchor="test_vectors_map_function" numbered="true"
toc="default">
+ <name>Map Function</name>
+ <t>
+ INPUTS:
+ </t>
+ <t>
+ key: 0xFFFFFFFFFFFFFFFF (64-bit)
+ number_of_buckets_per_element: 3
+ ibf_size: 300
+ </t>
+ <t>
+ OUTPUT:
+ </t>
+ <t>
+ ["222","32","10"]
+ </t>
+ </section>
+ <section anchor="test_vectors_id_function" numbered="true"
toc="default">
+ <name>ID Calculation Function</name>
+ <t>
+ INPUTS:
+ </t>
+ <t>
+ element: 0xadadadadadadadad
+ ibf_salt 0x3F (6-bit)
+ </t>
+ <t>
+ OUTPUT:
+ </t>
+ <t>
+ 0xFFFFFFFFFFFFFFFF
+ </t>
+ </section>
+ </section>
+ </back>
+</rfc>
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [lsd0003] branch master updated: added file,
gnunet <=