gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lsd0011] 01/01: initial commit


From: gnunet
Subject: [lsd0011] 01/01: initial commit
Date: Fri, 19 Jul 2024 10:28:07 +0200

This is an automated email from the git hooks/post-receive script.

martin-schanzenbach pushed a commit to branch master
in repository lsd0011.

commit 411556aa19cd9912a2f39da75796f3d75b86ee48
Author: Martin Schanzenbach <schanzen@gnunet.org>
AuthorDate: Fri Jul 19 10:28:03 2024 +0200

    initial commit
---
 .buildbot/build.sh                         |    3 +
 .buildbot/firefly-x86_64-amdepyc_deploy.sh |   10 +
 .gitignore                                 |    2 +
 Makefile                                   |    8 +
 draft-schanzen-hpke-elligator-kem.xml      |  509 ++++++++++++
 style.css                                  | 1149 ++++++++++++++++++++++++++++
 6 files changed, 1681 insertions(+)

diff --git a/.buildbot/build.sh b/.buildbot/build.sh
new file mode 100755
index 0000000..2aad486
--- /dev/null
+++ b/.buildbot/build.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+make
diff --git a/.buildbot/firefly-x86_64-amdepyc_deploy.sh 
b/.buildbot/firefly-x86_64-amdepyc_deploy.sh
new file mode 100755
index 0000000..cdc35c1
--- /dev/null
+++ b/.buildbot/firefly-x86_64-amdepyc_deploy.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+# Deploy rest api from buildbot
+
+if [ -e index.html ]; then
+  rm index.html
+fi
+ln -s draft-schanzen-hpke-elligator-kem.html index.html
+chmod -R ag+rX draft-schanzen-hpke-elligator-kem.* index.html .
+rsync --exclude=".*" --exclude="Makefile" -a --delete ./ 
lsd@firefly.gnunet.org:~/public/lsd0011/
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e15ea06
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+draft-schanzen-hpke-elligator-kem.html
+draft-schanzen-hpke-elligator-kem.txt
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..053bb4b
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,8 @@
+all: txt html
+
+html:
+       xml2rfc --html --css style.css draft-schanzen-hpke-elligator-kem.xml
+
+txt:
+       xml2rfc draft-schanzen-hpke-elligator-kem.xml
+
diff --git a/draft-schanzen-hpke-elligator-kem.xml 
b/draft-schanzen-hpke-elligator-kem.xml
new file mode 100644
index 0000000..7e5740c
--- /dev/null
+++ b/draft-schanzen-hpke-elligator-kem.xml
@@ -0,0 +1,509 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!DOCTYPE rfc [
+<!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 RFC1928 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.1928.xml";>
+<!ENTITY RFC2119 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml";>
+<!--<!ENTITY RFC2693 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.2693.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 RFC4033 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.4033.xml";>
+<!ENTITY RFC5237 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.5237.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 RFC5895 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.5895.xml";>
+<!ENTITY RFC6066 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.6066.xml";>
+<!ENTITY RFC6761 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.6761.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 RFC7363 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.7363.xml";>
+<!ENTITY RFC8806 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.8806.xml";>
+<!ENTITY RFC7748 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.7748.xml";>
+<!ENTITY RFC8126 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.8126.xml";>
+<!ENTITY RFC8174 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.8174.xml";>
+<!ENTITY RFC8244 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.8244.xml";>
+<!ENTITY RFC8324 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.8324.xml";>
+<!ENTITY RFC8499 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.8499.xml";>
+<!ENTITY RFC9106 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.9106.xml";>
+<!ENTITY RFC9180 PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml/reference.RFC.9180.xml";>
+<!ENTITY I-D.ietf-dnsop-alt-tld PUBLIC '' 
"http://xml.resource.org/public/rfc/bibxml3/reference.I-D.ietf-dnsop-alt-tld.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 xmlns:xi="http://www.w3.org/2001/XInclude";
+     category="info"
+     docName="draft-schanzen-hpke-elligator-kem-00"
+     ipr="trust200902"
+     obsoletes="" updates=""
+     submissionType="independent" 
+     xml:lang="en"
+     version="3">
+ <!-- xml2rfc v2v3 conversion 2.26.0 -->
+ <front>
+  <title abbrev="The HPKE Elligator KEM">
+   The HPKE Elligator KEM
+  </title>
+  <seriesInfo name="Internet-Draft" 
value="draft-schanzen-hpke-elligator-kem-00"/>
+  <author fullname="Martin Schanzenbach" initials="M." surname="Schanzenbach">
+   <organization>Fraunhofer AISEC</organization>
+   <address>
+    <postal>
+     <street>Lichtenbergstrasse 11</street>
+     <city>Garching</city>
+     <code>85748</code>
+     <country>DE</country>
+    </postal>
+    <email>martin.schanzenbach@aisec.fraunhofer.de</email>
+   </address>
+  </author>
+  <author fullname="Pedram Fardzadeh" initials="P." surname="Fardzadeh">
+    <organization>Technischen Universität München</organization>
+   <address>
+    <postal>
+     <street>Boltzmannstrasse 3</street>
+     <city>Garching</city>
+     <code>85748</code>
+     <country>DE</country>
+    </postal>
+    <email>pedram.fardzadeh@tum.de</email>
+   </address>
+  </author>
+
+
+  <!-- Meta-data Declarations -->
+  <area>General</area>
+  <workgroup>Independent Stream</workgroup>
+  <keyword>transport protocols</keyword>
+  <abstract>
+    <t>
+      This document contains the GNUnet communicator
+      specification.
+    </t>
+    <t>
+      This document defines the normative wire format of communicator 
protocols,
+      cryptographic routines and security
+      considerations for use by implementers.
+    </t>
+    <t>
+      This specification was developed outside the IETF and does not have
+      IETF consensus.  It is published here to inform readers about the
+      function of GNUnet communicators, guide future communicator 
implementations, and ensure
+      interoperability among implementations including with the pre-existing
+      GNUnet implementation.
+    </t>
+  </abstract>
+ </front>
+ <middle>
+   <section anchor="introduction" numbered="true" toc="default">
+     <name>Introduction</name>
+     <t>
+       This document defines the normative wire format of resource
+       records, resolution processes, cryptographic routines and
+       security considerations for use by implementers.
+     </t>
+     <t>
+       This specification was developed outside the IETF and does not have
+       IETF consensus.  It is published here to guide implementers of GNS
+       and to ensure interoperability among implementations.
+     </t>
+     <section numbered="true" toc="default">
+       <name>Requirements Notation</name>
+       <t>
+         The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+         "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+         "OPTIONAL" in this document are to be interpreted as described in
+         BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and 
only
+         when, they appear in all capitals, as shown here.
+       </t>
+     </section>
+   </section>
+   <section anchor="primitives" numbered="true" toc="default">
+     <name>Cryptographic dependencies</name>
+   <section anchor="elligator_dhkem" numbered="true" toc="default">
+   <name>Elligator DHKEM</name>
+      <t>
+        While standard Diffie-Hellman-based KEMs securely establish a secret 
between two parties, an observer can easily identify
+        the encapsulation as a public key.
+        In the presence of an active attacker this could lead to packet 
dropping based on this information,
+        preventing communication between peers.
+        The Elligator KEM defined in the following to produce random-looking 
encapsulations (referred to as a "representative").
+        This leaves the attacker with the option to either do nothing or 
intercept all random-looking packets,
+        thereby potentially disrupting a large part of today's internet 
communication.
+      </t>
+   <t>
+     Elligator KEM utilizes Elligator for the encoding and decoding of the 
ephemeral public keys
+     as described in Section 5 of <xref target="BHKL13"/>.
+     The general idea when generating an Elligator key pair is is to create 
both a random high-order curve point and a low-order curve point.
+     Adding them together results in a curve point that is evenly distributed 
on the whole Curve25519.
+     Not all Curve25519 points are suitable for use with Elligator.
+     In particular, not all Curve25519 points have the property that the 
Elligator encoding and subsequent
+     decoding result in the original point (See <xref 
target="security_elligator"/> for details).
+     To create a Curve25519 point that can be used with Elligator, one needs 
to find a curve point
+     for which this property holds.
+     One heurisitic is to generate random key pairs until one such point is 
found.
+   </t>
+      <t>
+        We define our KEMs analoguous to <xref target="RFC9180"/> Section 4.
+        The <tt>kem_id</tt> in the <tt>suite_id</tt> for the Elligator KEM is 
<tt>256</tt> (NOTE: This value is not registered in IANA yet).
+      </t>
+      <t>
+      The value of <tt>suite_id</tt> depends on the KEM used. The 
<tt>ExtractAndExpand()</tt>, <tt>Encap()</tt>
+      and <tt>Decap()</tt> functions are used as defined in <xref 
target="RFC9180"/> for standard DHKEMs.
+      The communicators use the standard <tt>DHKEM(X25519, HKDF-SHA256)</tt> 
and a special Elligator-based KEM
+      defined below which we call <tt>DHKEM(X25519Elligator, HKDF-SHA256)</tt>.
+      </t>
+    <section anchor="elligator_dhkem_keygen" numbered="true" toc="default">
+    <name>GenerateKeyPair()</name>
+   <t>
+     Let G be the generator of the prime order group of Ed25519, H the 
generator of the low order subgroup of
+     Ed25519 and EdToCurve() a function which converts Ed25519 points to their 
corresponding Curve25519 points.
+     We define "KeyGenElligator" as follows:
+   </t>
+<artwork name="" type="" align="left" alt=""><![CDATA[
+GenerateKeyPair():
+  VALID := 0
+  while(!VALID):
+    skX := random(256)
+    skX[0] &= 248
+    skX[31] &= 127
+    skX[31] |= 64
+    E_high := skX * G
+    E_low := (skX mod 8) * H
+    E := E_high + E_low
+    pkX := EdToCurve(E)
+    if ElligatorDec(ElligatorEnc(pkX)) == pkX:
+      return (skX,pkX)
+  ]]></artwork>
+   </section>
+   <section anchor="elligator_dhkem_serialize" numbered="true" toc="default">
+     <name>SerializePublicKey()</name>
+  <t>
+    The serialization functions incorporate the Elligator encoding and 
decoding functions to obfuscate a curve
+    point and are are defined in the following.
+    The obfuscated curve point is called the Elligator "Representative".
+    Let A and P be the parameters for Curve25519 as specified in section 4.1 
of <xref target="RFC7748"/>.
+    Further, let X be any valid x-coordinate of a Curve25519 point, L() a 
function which computes the legendre symbol 
+    of a field element with regard to the odd prime P.
+    In order for the square root operation sqrt within the encoding function 
to work deterministically, we need to 
+    define the notion of positive and negative numbers within the field. There 
are multiple valid ways to partition 
+    the field elements, but a common choice is to define the set {0,..., 
(P-1)/2} as the set of positive numbers, 
+    and {(P-1)/2 + 1,…,P−1} as the set of the negative numbers. The encoding 
function also requires a non-square number
+    U of the finite field. While U could be chosen arbitrarily, small numbers 
like sqrt(-1) are preferred due to reduce
+    computation.
+    The elligator implementations of both peers <bcp14>MUST</bcp14> 
+    use the same definition regarding positive and negative numbers and U to 
be interoperable.
+    The encoding function algorithm is:
+  </t>
+<artwork name="" type="" align="left" alt=""><![CDATA[
+SerializeElligatorPublicKey(pkX):
+  B := random(1)
+  if B == 1:
+    pkXm :=  sqrt(-X / ((X + A) * U))
+  else:
+    pkXm :=  sqrt(-(X + A) / (U * X))
+  return pkXm
+]]></artwork>
+   </section>
+   <section anchor="elligator_dhkem_deserialize" numbered="true" toc="default">
+     <name>DeserializePublicKey()</name>
+ <t>
+ The corresponding decoding agorithm is:
+ </t>
+ <artwork name="" type="" align="left" alt=""><![CDATA[
+DeserializeElligatorPublicKey(pkXm):
+  V := -A / (1 + U * R^2)
+  E := L(V^3 + A * V^2 + V)
+  pkX := E * V - (1 - E)(A / 2)
+  return pkX
+  ]]></artwork>
+   </section>
+   </section>
+   </section>
+   <section anchor="security" numbered="true" toc="default">
+   <name>Security and Privacy Considerations</name>
+   <section anchor="security_elligator" numbered="true" toc="default">
+       <name>Elligator</name>
+       <t>
+       In case of Montgomery curves, such as Curve25519, a point [X, Y] on 
that curve (e.g. the ephemeral public key) follows the equation 
+       Y^2 = X^3 + A * X^2 + X mod P, where A and P are parameters for 
Curve25519 specified in section 4.1 of <xref target="RFC7748"/>. For any 
+       valid x-coordinate, the left side of the equation is always a quadratic 
number. An attacker could read the x-coordinate
+       and verify if this property holds. While this property holds for any 
valid Curve25519 point, it only holds in about 50% of the cases for a 
+       random number. By observing multiple communication attempts, an 
attacker can be certain that curve points are being sent if the property 
consistently holds. 
+       To circumvent this attack, curve points should be encoded into 
property-less numbers, making valid and invalid curve points indistinguishable 
+       to an outside observer.
+       The Elligator encoding function "ElligatorEnc" (also known as the 
"inverse map") and decoding function "ElligatorDec" (also known as the "direct 
map") implement this feature. 
+       </t>
+      <t>
+      The encoding function is defined for the entire Curve25519. Most modern 
implementations of Curve25519 only generate points from its prime 
+      subgroup to circumvent known attacks for which points not within the 
prime subgroup are susceptible. In our case, those attacks are not an 
+      issue as we use the ephemeral secret key only once for computing key 
material. The exclusive use of the prime subgroup is a recognizable 
+      property that an outside observer can easily detect, even in the case of 
using the encoding function. An attacker could decode the suspected 
+      parts of packets to the corresponding Curve25519 points and check if the 
resulting points are always in the prime subgroup. To circumvent 
+      this attack, we need to choose the ephemeral key pair randomly from the 
whole curve as defined in "KeyGenElligator".
+      </t>
+      <t>
+      Note that both for a value R and its negative counterpart -R (in the 
finite field), the decoding function will result in the same 
+      x-coordinate. Moreover, for two different valid x-coordinates, the 
resulting representatives of the corresponding encoding calls are 
+      different. Conversely, this means that we can't decode both 
representatives back to their original x-coordinate. This is why the sender 
+      eventually tries a number of random key pairs in KeyGenElligator() in 
order to create a valid public key that can be used 
+      for a key exchange. Also note that this effectively reduces the entropy 
of our public keys by 1 bit, which is tolerable.
+      </t>
+      <t>
+      In the original paper, Elligator's encoding function takes the sign of 
y-coordinate as an additional input parameter. Its value determines 
+      which of the two terms is used instead of our random selection. We also 
skip the calculation of the corresponding y-coordinate in the decoding 
function. 
+      We omitted the y-coordinate parts of both functions because Curve25519 
points are solely represented by their x-coordinate in modern crypto systems 
due to 
+      known attacks. Nevertheless, the desired feature of Elligator is still 
ensured.
+      </t>
+      <t>
+      Lastly, we emphasize that the resulting representative of the encoding 
function is strictly smaller than 2^254 - 9. Therefore, the most and second 
most 
+      significant bit are always zero, which is an obvious property an 
attacker could observe. We avoid this problem by randomly flipping
+      both bits. These bits will be ignored by the target peer after 
reception. 
+      </t>
+      </section>
+      </section>
+      <section anchor="work_in_progress" numbered="true" toc="default">
+       <name>Work in Progress</name>
+       <t>
+       TRANSPORT API: GNUNET_TRANSPORT_MessageCompletedCallback, 
GNUNET_TRANSPORT_communicator_receive, and 
+       GNUNET_TRANSPORT_MessageCompletedCallback should follow a generic API 
for all communicator types. 
+       </t>
+       <t>
+       UDP Communicator: RTT (Round-Trip Time) measurement is missing. Values 
such as the number of shared secrets could be adapted based on the RTT.
+       </t>
+       <t>
+       TCP Communicator: Currently, the only sanity check for a valid TCP 
handshake message is the verification of the signature. Additional checks, such 
as 
+       verifying the sender's peer identity, are needed. 
+       The use of the mac-then-encrypt approach within the TCP BOX messages 
should be analyzed further, specifically regarding padding-oracle attacks.
+       </t>
+    </section>
+     <section anchor="gana" numbered="true" toc="default">
+       <name>GANA Considerations</name>
+    </section>
+     <!-- gana -->
+    <section>
+       <name>IANA Considerations</name>
+       <t>
+       This document defines a new KEM as allowed in <xref target="RFC9180"/>.
+       It is requested that the "HPKE KEM Identifiers" registry is updated with
+       the values from <xref target="kemid-values"/>.
+       This section may be removed on publication as an RFC.
+       </t>
+      <table anchor="kemid-values" align="center" pn="table-2">
+          <name slugifiedName="name-kem-ids">KEM IDs</name>
+          <thead>
+            <tr>
+              <th align="left" colspan="1" rowspan="1">Value</th>
+              <th align="left" colspan="1" rowspan="1">KEM</th>
+              <th align="left" colspan="1" rowspan="1">Nsecret</th>
+              <th align="left" colspan="1" rowspan="1">Nenc</th>
+              <th align="left" colspan="1" rowspan="1">Npk</th>
+              <th align="left" colspan="1" rowspan="1">Nsk</th>
+              <th align="left" colspan="1" rowspan="1">Auth</th>
+              <th align="left" colspan="1" rowspan="1">Reference</th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr>
+              <td align="left" colspan="1" rowspan="1">0x0120</td>
+              <td align="left" colspan="1" rowspan="1">DHKEM(X25519Elligator, 
HKDF-SHA256)</td>
+              <td align="left" colspan="1" rowspan="1">32</td>
+              <td align="left" colspan="1" rowspan="1">32</td>
+              <td align="left" colspan="1" rowspan="1">32</td>
+              <td align="left" colspan="1" rowspan="1">32</td>
+              <td align="left" colspan="1" rowspan="1">yes</td>
+              <td align="left" colspan="1" rowspan="1">
+              <xref target="LSD0007"/></td>
+            </tr>
+          </tbody>
+        </table> 
+ </section>
+       <!-- <section>
+       <name>Implementation and Deployment Status</name>
+       <t>
+         FIXME
+       </t>
+     </section>
+     <section>
+        <name>Acknowledgements</name>
+        <t>
+          FIXME
+        </t>
+        </section>-->
+   </middle>
+   <back>
+     <references>
+       <name>Normative References</name>
+         &RFC2119;
+         &RFC5869;
+         &RFC7748;
+         &RFC8174;
+         &RFC9180;
+
+     </references>
+     <references>
+       <name>Informative References</name>
+  <reference anchor="BHKL13" target="https://eprint.iacr.org/2013/325.pdf";>
+       <front>
+         <title>Elligator: Elliptic-curve points indistinguishable from 
uniform random strings</title>
+         <author initials="D.J" surname="Bernstein"
+                 fullname="Daniel J.  Bernstein">
+         </author>
+         <author initials="M." surname="Hamburg"
+                 fullname="Mike Hamburg">
+         </author>
+         <author initials="A." surname="Krasnova"
+                 fullname="Anna Krasnova">
+         </author>
+         <author initials="T." surname="Lange"
+                 fullname="Tanja Lange">
+         </author>
+         <date month="August" year="2013" />
+     </front>
+  </reference>
+  <reference anchor="LSD0007" target="https://lsd.gnunet.org/lsd0007";>
+       <front>
+         <title>The GNUnet communicators</title>
+         <author initials="M" surname="Schanzenbach"
+                 fullname="Martin Schanzenbach">
+         </author>
+         <author initials="C." surname="Grothoff"
+                 fullname="Christian Grothoff">
+         </author>
+         <author initials="P." surname="Fardzadeh"
+                 fullname="Pedram Fardzadeh">
+         </author>
+         <date month="July" year="2024" />
+     </front>
+  </reference>     </references>
+   
+ 
+ <section>
+ <name>Elligator implementation</name>
+  <t>
+    This section provides test vectors for the different Elligator functions 
and should aid in verifying implementations. 
+    Note that Elligator has two parameters: the set of positive and negative 
numbers, and a non-square number U
+    within the finite field, as described in FIXME. The displayed test vectors 
assume that the set of positive 
+    numbers is defined as {0,...,(P-1)/2}, the set of negative numbers as 
{(P-1)/2 + 1,...,P−1} and U is the non-square number 
+    sqrt(-1). Unless indicated otherwise, the test vectors are provided as 
little-endian hexadecimal byte arrays.
+    </t>
+  <section>
+    <name>ElligatorEnc():</name>
+    <artwork name="" type="" align="left" alt=""><![CDATA[
+  Ephemeral public key (little-endian):  
+    99 9b 59 1b 66 97 d0 74
+    f2 66 19 22 77 d5 54 de
+    c3 c2 4c 2e f6 10 81 01
+    f6 3d 94 f7 ff f3 a0 13
+
+  Representative (little-endian):
+    99 9b 59 1b 66 97 d0 74
+    f2 66 19 22 77 d5 54 de
+    c3 c2 4c 2e f6 10 81 01
+    f6 3d 94 f7 ff f3 a0 13
+           ]]></artwork>
+    </section>
+    <section>
+    <name>ElligatorDec():</name>
+    <t>
+    The Most Significant Bit (MSB) and the second MSB of the representative 
should be randomly flipped (serialized) before 
+    transmission. The resulting public key for both the original 
(unserialized) representative and the serialized representative 
+    must be the same.
+    </t>
+    <artwork name="" type="" align="left" alt=""><![CDATA[
+  Representative unserialized (little-endian):  
+    95 a1 60 19 04 1d be fe
+    d9 83 20 48 ed e1 19 28
+    d9 03 65 f2 4a 38 aa 7a
+    ef 1b 97 e2 39 54 10 1b
+  
+  Representative serialized (little-endian):  
+    95 a1 60 19 04 1d be fe
+    d9 83 20 48 ed e1 19 28
+    d9 03 65 f2 4a 38 aa 7a
+    ef 1b 97 e2 39 54 10 9b
+
+  Ephemeral public key (little-endian):
+    79 4f 05 ba 3e 3a 72 95
+    80 22 46 8c 88 98 1e 0b
+    e5 78 2b e1 e1 14 5c e2
+    c3 c6 fd e1 6d ed 53 63
+           ]]></artwork>
+    </section>
+    <section>
+    <name>Encap():</name>
+  <t>
+  Refer to <xref target="elligator_dhkem"/> for the definition of the utilized 
Encap and Decap functions. Note
+  that the receivers public key (aka peer identity) is an Edwards Curve point 
and need to be transformed 
+  into an X25519 public key. The denoted Representative is the elligator 
encoding of the ephemeral 
+  public key for which the most significant bit and second most significant 
bit are set to zero (unserialized).
+  </t>
+    
+    <artwork name="" type="" align="left" alt=""><![CDATA[
+  Receivers Edwards public key (little-endian):
+    3f eb ad ac 12 2d 39 77
+    25 ff 58 0f 6c e9 a3 e1
+    c1 c4 a7 de 19 80 7f 13
+    d3 83 f2 f9 b6 46 71 36
+
+  Ephemeral private key sender (little-endian):
+    09 39 59 66 d6 d1 c4 93
+    b9 91 7d d1 2c 8d d2 4e
+    2c 05 c0 81 c9 8a 67 eb
+    2d 6d ff 62 2e c9 c0 69
+
+  Ephemeral public key sender (little-endian):
+    3f 73 ee 0d d1 97 0f f9
+    57 f7 ec 15 e0 b5 15 11
+    66 be 30 46 e6 a8 b0 ee
+    53 be ca 39 5b 74 e4 2c
+
+  Representative (little-endian):
+    1d 93 07 7a b5 e9 ae c4
+    93 1a 92 21 ad fa 48 a4
+    6f 40 1b 69 9b 8e e7 44
+    a2 0b 07 e5 7e 5c c5 be
+
+  Key Material (little-endian):
+    68 6d 3c e6 08 a6 b8 77
+    42 4b a2 fb 71 b1 03 f2
+    c0 d4 f7 ab e5 f1 e5 2b
+    30 97 a8 4a 71 4a c7 7b
+           ]]></artwork>
+    </section>
+    <section>
+    <name>Decap():</name>
+    <t>
+    The depicted "receivers edwards private key" is the corresponding private 
key of the "receivers Edwards public key"
+    defined above. The resulting key material should therefore be the same for 
the same Representative.
+    </t>
+  <artwork name="" type="" align="left" alt=""><![CDATA[
+  Receivers Edwards private key (little-endian):
+    f3 38 87 a8 56 2d ad 51
+    51 e9 28 9a 0a fa 13 01
+    cc c6 98 91 78 50 d5 6e
+    a4 09 a9 94 94 97 ba a4
+
+  Representative (little-endian):
+    1d 93 07 7a b5 e9 ae c4
+    93 1a 92 21 ad fa 48 a4
+    6f 40 1b 69 9b 8e e7 44
+    a2 0b 07 e5 7e 5c c5 be
+
+  Key Material (little-endian):
+    68 6d 3c e6 08 a6 b8 77
+    42 4b a2 fb 71 b1 03 f2
+    c0 d4 f7 ab e5 f1 e5 2b
+    30 97 a8 4a 71 4a c7 7b
+           ]]></artwork>
+    </section>
+ </section>
+ </back>
+</rfc>
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..d6e4d93
--- /dev/null
+++ b/style.css
@@ -0,0 +1,1149 @@
+/* This is the built-in CSS used by xml2rfc without Google Fonts. */
+
+/*
+
+  NOTE: Changes at the bottom of this file overrides some earlier settings.
+
+  Once the style has stabilized and has been adopted as an official RFC style,
+  this can be consolidated so that style settings occur only in one place, but
+  for now the contents of this file consists first of the initial CSS work as
+  provided to the RFC Formatter (xml2rfc) work, followed by itemized and
+  commented changes found necssary during the development of the v3
+  formatters.
+
+*/
+
+/* fonts */
+/* @import url('https://fonts.googleapis.com/css?family=Noto+Sans'); /\* 
Sans-serif *\/ */
+/* @import url('https://fonts.googleapis.com/css?family=Noto+Serif'); /\* 
Serif (print) *\/ */
+/* @import url('https://fonts.googleapis.com/css?family=Roboto+Mono'); /\* 
Monospace *\/ */
+
+@viewport {
+  zoom: 1.0;
+  width: extend-to-zoom;
+}
+@-ms-viewport {
+  width: extend-to-zoom;
+  zoom: 1.0;
+}
+/* general and mobile first */
+html {
+}
+body {
+  max-width: 90%;
+  margin: 1.5em auto;
+  color: #222;
+  background-color: #fff;
+  font-size: 14px;
+  font-family: 'Noto Sans', Arial, Helvetica, sans-serif;
+  line-height: 1.6;
+  scroll-behavior: smooth;
+}
+.ears {
+  display: none;
+}
+
+/* headings */
+#title, h1, h2, h3, h4, h5, h6 {
+  margin: 1em 0 0.5em;
+  font-weight: bold;
+  line-height: 1.3;
+}
+#title {
+  clear: both;
+  border-bottom: 1px solid #ddd;
+  margin: 0 0 0.5em 0;
+  padding: 1em 0 0.5em;
+}
+.author {
+  padding-bottom: 4px;
+}
+h1 {
+  font-size: 26px;
+  margin: 1em 0;
+}
+h2 {
+  font-size: 22px;
+  margin-top: -20px;  /* provide offset for in-page anchors */
+  padding-top: 33px;
+}
+h3 {
+  font-size: 18px;
+  margin-top: -36px;  /* provide offset for in-page anchors */
+  padding-top: 42px;
+}
+h4 {
+  font-size: 16px;
+  margin-top: -36px;  /* provide offset for in-page anchors */
+  padding-top: 42px;
+}
+h5, h6 {
+  font-size: 14px;
+}
+#n-copyright-notice {
+  border-bottom: 1px solid #ddd;
+  padding-bottom: 1em;
+  margin-bottom: 1em;
+}
+/* general structure */
+p {
+  padding: 0;
+  margin: 0 0 1em 0;
+  text-align: left;
+}
+div, span {
+  position: relative;
+}
+div {
+  margin: 0;
+}
+.alignRight.art-text {
+  background-color: #f9f9f9;
+  border: 1px solid #eee;
+  border-radius: 3px;
+  padding: 1em 1em 0;
+  margin-bottom: 1.5em;
+}
+.alignRight.art-text pre {
+  padding: 0;
+}
+.alignRight {
+  margin: 1em 0;
+}
+.alignRight > *:first-child {
+  border: none;
+  margin: 0;
+  float: right;
+  clear: both;
+}
+.alignRight > *:nth-child(2) {
+  clear: both;
+  display: block;
+  border: none;
+}
+svg {
+  display: block;
+}
+.alignCenter.art-text {
+  background-color: #f9f9f9;
+  border: 1px solid #eee;
+  border-radius: 3px;
+  padding: 1em 1em 0;
+  margin-bottom: 1.5em;
+}
+.alignCenter.art-text pre {
+  padding: 0;
+}
+.alignCenter {
+  margin: 1em 0;
+}
+.alignCenter > *:first-child {
+  border: none;
+  /* this isn't optimal, but it's an existence proof.  PrinceXML doesn't
+     support flexbox yet.
+  */
+  display: table;
+  margin: 0 auto;
+}
+
+/* lists */
+ol, ul {
+  padding: 0;
+  margin: 0 0 1em 2em;
+}
+ol ol, ul ul, ol ul, ul ol {
+  margin-left: 1em;
+}
+li {
+  margin: 0 0 0.25em 0;
+}
+.ulCompact li {
+  margin: 0;
+}
+ul.empty, .ulEmpty {
+  list-style-type: none;
+}
+ul.empty li, .ulEmpty li {
+  margin-top: 0.5em;
+}
+ul.ulBare, li.ulBare {
+  margin-left: 0em !important;
+}
+ul.compact, .ulCompact,
+ol.compact, .olCompact {
+  line-height: 100%;
+  margin: 0 0 0 2em;
+}
+
+/* definition lists */
+dl {
+}
+dl > dt {
+  float: left;
+  margin-right: 1em;
+}
+/* 
+dl.nohang > dt {
+  float: none;
+}
+*/
+dl > dd {
+  margin-bottom: .8em;
+  min-height: 1.3em;
+}
+dl.compact > dd, .dlCompact > dd {
+  margin-bottom: 0em;
+}
+dl > dd > dl {
+  margin-top: 0.5em;
+  margin-bottom: 0em;
+}
+
+/* links */
+a {
+  text-decoration: none;
+}
+a[href] {
+  color: #22e; /* Arlen: WCAG 2019 */
+}
+a[href]:hover {
+  background-color: #f2f2f2;
+}
+figcaption a[href],
+a[href].selfRef {
+  color: #222;
+}
+/* XXX probably not this:
+a.selfRef:hover {
+  background-color: transparent;
+  cursor: default;
+} */
+
+/* Figures */
+tt, code, pre, code {
+  background-color: #f9f9f9;
+  font-family: 'Roboto Mono', monospace;
+}
+pre {
+  border: 1px solid #eee;
+  margin: 0;
+  padding: 1em;
+}
+img {
+  max-width: 100%;
+}
+figure {
+  margin: 0;
+}
+figure blockquote {
+  margin: 0.8em 0.4em 0.4em;
+}
+figcaption {
+  font-style: italic;
+  margin: 0 0 1em 0;
+}
+@media screen {
+  pre {
+    overflow-x: auto;
+    max-width: 100%;
+    max-width: calc(100% - 22px);
+  }
+}
+
+/* aside, blockquote */
+aside, blockquote {
+  margin-left: 0;
+  padding: 1.2em 2em;
+}
+blockquote {
+  background-color: #f9f9f9;
+  color: #111; /* Arlen: WCAG 2019 */
+  border: 1px solid #ddd;
+  border-radius: 3px;
+  margin: 1em 0;
+}
+cite {
+  display: block;
+  text-align: right;
+  font-style: italic;
+}
+
+/* tables */
+table {
+  width: 100%;
+  margin: 0 0 1em;
+  border-collapse: collapse;
+  border: 1px solid #eee;
+}
+th, td {
+  text-align: left;
+  vertical-align: top;
+  padding: 0.5em 0.75em;
+}
+th {
+  text-align: left;
+  background-color: #e9e9e9;
+}
+tr:nth-child(2n+1) > td {
+  background-color: #f5f5f5;
+}
+table caption {
+  font-style: italic;
+  margin: 0;
+  padding: 0;
+  text-align: left;
+}
+table p {
+  /* XXX to avoid bottom margin on table row signifiers. If paragraphs should
+     be allowed within tables more generally, it would be far better to select 
on a class. */
+  margin: 0;
+}
+
+/* pilcrow */
+a.pilcrow {
+  color: #666; /* Arlen: AHDJ 2019 */
+  text-decoration: none;
+  visibility: hidden;
+  user-select: none;
+  -ms-user-select: none;
+  -o-user-select:none;
+  -moz-user-select: none;
+  -khtml-user-select: none;
+  -webkit-user-select: none;
+  -webkit-touch-callout: none;
+}
+@media screen {
+  aside:hover > a.pilcrow,
+  p:hover > a.pilcrow,
+  blockquote:hover > a.pilcrow,
+  div:hover > a.pilcrow,
+  li:hover > a.pilcrow,
+  pre:hover > a.pilcrow {
+    visibility: visible;
+  }
+  a.pilcrow:hover {
+    background-color: transparent;
+  }
+}
+
+/* misc */
+hr {
+  border: 0;
+  border-top: 1px solid #eee;
+}
+.bcp14 {
+  font-variant: small-caps;
+}
+
+.role {
+  font-variant: all-small-caps;
+}
+
+/* info block */
+#identifiers {
+  margin: 0;
+  font-size: 0.9em;
+}
+#identifiers dt {
+  width: 3em;
+  clear: left;
+}
+#identifiers dd {
+  float: left;
+  margin-bottom: 0;
+}
+/* Fix PDF info block run off issue */
+@media print {
+  #identifiers dd {
+    float: none;
+  }
+}
+#identifiers .authors .author {
+  display: inline-block;
+  margin-right: 1.5em;
+}
+#identifiers .authors .org {
+  font-style: italic;
+}
+
+/* The prepared/rendered info at the very bottom of the page */
+.docInfo {
+  color: #666; /* Arlen: WCAG 2019 */
+  font-size: 0.9em;
+  font-style: italic;
+  margin-top: 2em;
+}
+.docInfo .prepared {
+  float: left;
+}
+.docInfo .prepared {
+  float: right;
+}
+
+/* table of contents */
+#toc  {
+  padding: 0.75em 0 2em 0;
+  margin-bottom: 1em;
+}
+nav.toc ul {
+  margin: 0 0.5em 0 0;
+  padding: 0;
+  list-style: none;
+}
+nav.toc li {
+  line-height: 1.3em;
+  margin: 0.75em 0;
+  padding-left: 1.2em;
+  text-indent: -1.2em;
+}
+/* references */
+.references dt {
+  text-align: right;
+  font-weight: bold;
+  min-width: 7em;
+}
+.references dd {
+  margin-left: 8em;
+  overflow: auto;
+}
+
+.refInstance {
+  margin-bottom: 1.25em;
+}
+
+.references .ascii {
+  margin-bottom: 0.25em;
+}
+
+/* index */
+.index ul {
+  margin: 0 0 0 1em;
+  padding: 0;
+  list-style: none;
+}
+.index ul ul {
+  margin: 0;
+}
+.index li {
+  margin: 0;
+  text-indent: -2em;
+  padding-left: 2em;
+  padding-bottom: 5px;
+}
+.indexIndex {
+  margin: 0.5em 0 1em;
+}
+.index a {
+  font-weight: 700;
+}
+/* make the index two-column on all but the smallest screens */
+@media (min-width: 600px) {
+  .index ul {
+    -moz-column-count: 2;
+    -moz-column-gap: 20px;
+  }
+  .index ul ul {
+    -moz-column-count: 1;
+    -moz-column-gap: 0;
+  }
+}
+
+/* authors */
+address.vcard {
+  font-style: normal;
+  margin: 1em 0;
+}
+
+address.vcard .nameRole {
+  font-weight: 700;
+  margin-left: 0;
+}
+address.vcard .label {
+  font-family: "Noto Sans",Arial,Helvetica,sans-serif;
+  margin: 0.5em 0;
+}
+address.vcard .type {
+  display: none;
+}
+.alternative-contact {
+  margin: 1.5em 0 1em;
+}
+hr.addr {
+  border-top: 1px dashed;
+  margin: 0;
+  color: #ddd;
+  max-width: calc(100% - 16px);
+}
+
+/* temporary notes */
+.rfcEditorRemove::before {
+  position: absolute;
+  top: 0.2em;
+  right: 0.2em;
+  padding: 0.2em;
+  content: "The RFC Editor will remove this note";
+  color: #9e2a00; /* Arlen: WCAG 2019 */
+  background-color: #ffd; /* Arlen: WCAG 2019 */
+}
+.rfcEditorRemove {
+  position: relative;
+  padding-top: 1.8em;
+  background-color: #ffd; /* Arlen: WCAG 2019 */
+  border-radius: 3px;
+}
+.cref {
+  background-color: #ffd; /* Arlen: WCAG 2019 */
+  padding: 2px 4px;
+}
+.crefSource {
+  font-style: italic;
+}
+/* alternative layout for smaller screens */
+@media screen and (max-width: 1023px) {
+  body {
+    padding-top: 2em;
+  }
+  #title {
+    padding: 1em 0;
+  }
+  h1 {
+    font-size: 24px;
+  }
+  h2 {
+    font-size: 20px;
+    margin-top: -18px;  /* provide offset for in-page anchors */
+    padding-top: 38px;
+  }
+  #identifiers dd {
+    max-width: 60%;
+  }
+  #toc {
+    position: fixed;
+    z-index: 2;
+    top: 0;
+    right: 0;
+    padding: 0;
+    margin: 0;
+    background-color: inherit;
+    border-bottom: 1px solid #ccc;
+  }
+  #toc h2 {
+    margin: -1px 0 0 0;
+    padding: 4px 0 4px 6px;
+    padding-right: 1em;
+    min-width: 190px;
+    font-size: 1.1em;
+    text-align: right;
+    background-color: #444;
+    color: white;
+    cursor: pointer;
+  }
+  #toc h2::before { /* css hamburger */
+    float: right;
+    position: relative;
+    width: 1em;
+    height: 1px;
+    left: -164px;
+    margin: 6px 0 0 0;
+    background: white none repeat scroll 0 0;
+    box-shadow: 0 4px 0 0 white, 0 8px 0 0 white;
+    content: "";
+  }
+  #toc nav {
+    display: none;
+    padding: 0.5em 1em 1em;
+    overflow: auto;
+    height: calc(100vh - 48px);
+    border-left: 1px solid #ddd;
+  }
+}
+
+/* alternative layout for wide screens */
+@media screen and (min-width: 1024px) {
+  body {
+    max-width: 724px;
+    margin: 42px auto;
+    padding-left: 1.5em;
+    padding-right: 29em;
+  }
+  #toc {
+    position: fixed;
+    top: 42px;
+    right: 42px;
+    width: 25%;
+    margin: 0;
+    padding: 0 1em;
+    z-index: 1;
+  }
+  #toc h2 {
+    border-top: none;
+    border-bottom: 1px solid #ddd;
+    font-size: 1em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0.25em 1em 1em 0;
+  }
+  #toc nav {
+    display: block;
+    height: calc(90vh - 84px);
+    bottom: 0;
+    padding: 0.5em 0 0;
+    overflow: auto;
+  }
+  img { /* future proofing */
+    max-width: 100%;
+    height: auto;
+  }
+}
+
+/* pagination */
+@media print {
+  body {
+
+    width: 100%;
+  }
+  p {
+    orphans: 3;
+    widows: 3;
+  }
+  #n-copyright-notice {
+    border-bottom: none;
+  }
+  #toc, #n-introduction {
+    page-break-before: always;
+  }
+  #toc {
+    border-top: none;
+    padding-top: 0;
+  }
+  figure, pre {
+    page-break-inside: avoid;
+  }
+  figure {
+    overflow: scroll;
+  }
+  h1, h2, h3, h4, h5, h6 {
+    page-break-after: avoid;
+  }
+  h2+*, h3+*, h4+*, h5+*, h6+* {
+    page-break-before: avoid;
+  }
+  pre {
+    white-space: pre-wrap;
+    word-wrap: break-word;
+    font-size: 10pt;
+  }
+  table {
+    border: 1px solid #ddd;
+  }
+  td {
+    border-top: 1px solid #ddd;
+  }
+}
+
+/* This is commented out here, as the string-set: doesn't
+   pass W3C validation currently */
+/*
+.ears thead .left {
+  string-set: ears-top-left content();
+}
+
+.ears thead .center {
+  string-set: ears-top-center content();
+}
+
+.ears thead .right {
+  string-set: ears-top-right content();
+}
+
+.ears tfoot .left {
+  string-set: ears-bottom-left content();
+}
+
+.ears tfoot .center {
+  string-set: ears-bottom-center content();
+}
+
+.ears tfoot .right {
+  string-set: ears-bottom-right content();
+}
+*/
+
+@page :first {
+  padding-top: 0;
+  @top-left {
+    content: normal;
+    border: none;
+  }
+  @top-center {
+    content: normal;
+    border: none;
+  }
+  @top-right {
+    content: normal;
+    border: none;
+  }
+}
+
+@page {
+  size: A4;
+  margin-bottom: 45mm;
+  padding-top: 20px;
+  /* The follwing is commented out here, but set appropriately by in code, as
+     the content depends on the document */
+  /*
+  @top-left {
+    content: 'Internet-Draft';
+    vertical-align: bottom;
+    border-bottom: solid 1px #ccc;
+  }
+  @top-left {
+    content: string(ears-top-left);
+    vertical-align: bottom;
+    border-bottom: solid 1px #ccc;
+  }
+  @top-center {
+    content: string(ears-top-center);
+    vertical-align: bottom;
+    border-bottom: solid 1px #ccc;
+  }
+  @top-right {
+    content: string(ears-top-right);
+    vertical-align: bottom;
+    border-bottom: solid 1px #ccc;
+  }
+  @bottom-left {
+    content: string(ears-bottom-left);
+    vertical-align: top;
+    border-top: solid 1px #ccc;
+  }
+  @bottom-center {
+    content: string(ears-bottom-center);
+    vertical-align: top;
+    border-top: solid 1px #ccc;
+  }
+  @bottom-right {
+      content: '[Page ' counter(page) ']';
+      vertical-align: top;
+      border-top: solid 1px #ccc;
+  }
+  */
+
+}
+
+/* Changes introduced to fix issues found during implementation */
+/* Make sure links are clickable even if overlapped by following H* */
+a {
+  z-index: 2;
+}
+/* Separate body from document info even without intervening H1 */
+section {
+  clear: both;
+}
+
+
+/* Top align author divs, to avoid names without organization dropping level 
with org names */
+.author {
+  vertical-align: top;
+}
+
+/* Leave room in document info to show Internet-Draft on one line */
+#identifiers dt {
+  width: 8em;
+}
+
+/* Don't waste quite as much whitespace between label and value in doc info */
+#identifiers dd {
+  margin-left: 1em;
+}
+
+/* Give floating toc a background color (needed when it's a div inside section 
*/
+#toc {
+  background-color: white;
+}
+
+/* Make the collapsed ToC header render white on gray also when it's a link */
+@media screen and (max-width: 1023px) {
+  #toc h2 a,
+  #toc h2 a:link,
+  #toc h2 a:focus,
+  #toc h2 a:hover,
+  #toc a.toplink,
+  #toc a.toplink:hover {
+    color: white;
+    background-color: #444;
+    text-decoration: none;
+  }
+}
+
+/* Give the bottom of the ToC some whitespace */
+@media screen and (min-width: 1024px) {
+  #toc {
+    padding: 0 0 1em 1em;
+  }
+}
+
+/* Style section numbers with more space between number and title */
+.section-number {
+  padding-right: 0.5em;
+}
+
+/* prevent monospace from becoming overly large */
+tt, code, pre, code {
+  font-size: 95%;
+}
+
+/* Fix the height/width aspect for ascii art*/
+pre.sourcecode,
+.art-text pre {
+  line-height: 1.12;
+}
+
+
+/* Add styling for a link in the ToC that points to the top of the document */
+a.toplink {
+  float: right;
+  margin-right: 0.5em;
+}
+
+/* Fix the dl styling to match the RFC 7992 attributes */
+dl > dt,
+dl.dlParallel > dt {
+  float: left;
+  margin-right: 1em;
+}
+dl.dlNewline > dt {
+  float: none;
+}
+
+/* Provide styling for table cell text alignment */
+table td.text-left,
+table th.text-left {
+  text-align: left;
+}
+table td.text-center,
+table th.text-center {
+  text-align: center;
+}
+table td.text-right,
+table th.text-right {
+  text-align: right;
+}
+
+/* Make the alternative author contact informatio look less like just another
+   author, and group it closer with the primary author contact information */
+.alternative-contact {
+  margin: 0.5em 0 0.25em 0;
+}
+address .non-ascii {
+  margin: 0 0 0 2em;
+}
+
+/* With it being possible to set tables with alignment
+  left, center, and right, { width: 100%; } does not make sense */
+table {
+  width: auto;
+}
+
+/* Avoid reference text that sits in a block with very wide left margin,
+   because of a long floating dt label.*/
+.references dd {
+  overflow: visible;
+}
+
+/* Control caption placement */
+caption {
+  caption-side: bottom;
+}
+
+/* Limit the width of the author address vcard, so names in right-to-left
+   script don't end up on the other side of the page. */
+
+address.vcard {
+  max-width: 30em;
+  margin-right: auto;
+}
+
+/* For address alignment dependent on LTR or RTL scripts */
+address div.left {
+  text-align: left;
+}
+address div.right {
+  text-align: right;
+}
+
+/* Provide table alignment support.  We can't use the alignX classes above
+   since they do unwanted things with caption and other styling. */
+table.right {
+ margin-left: auto;
+ margin-right: 0;
+}
+table.center {
+ margin-left: auto;
+ margin-right: auto;
+}
+table.left {
+ margin-left: 0;
+ margin-right: auto;
+}
+
+/* Give the table caption label the same styling as the figcaption */
+caption a[href] {
+  color: #222;
+}
+
+@media print {
+  .toplink {
+    display: none;
+  }
+
+  /* avoid overwriting the top border line with the ToC header */
+  #toc {
+    padding-top: 1px;
+  }
+
+  /* Avoid page breaks inside dl and author address entries */
+  .vcard {
+    page-break-inside: avoid;
+  }
+
+}
+/* Tweak the bcp14 keyword presentation */
+.bcp14 {
+  font-variant: small-caps;
+  font-weight: bold;
+  font-size: 0.9em;
+}
+/* Tweak the invisible space above H* in order not to overlay links in text 
above */
+ h2 {
+  margin-top: -18px;  /* provide offset for in-page anchors */
+  padding-top: 31px;
+ }
+ h3 {
+  margin-top: -18px;  /* provide offset for in-page anchors */
+  padding-top: 24px;
+ }
+ h4 {
+  margin-top: -18px;  /* provide offset for in-page anchors */
+  padding-top: 24px;
+ }
+/* Float artwork pilcrow to the right */
+@media screen {
+  .artwork a.pilcrow {
+    display: block;
+    line-height: 0.7;
+    margin-top: 0.15em;
+  }
+}
+/* Make pilcrows on dd visible */
+@media screen {
+  dd:hover > a.pilcrow {
+    visibility: visible;
+  }
+}
+/* Make the placement of figcaption match that of a table's caption
+   by removing the figure's added bottom margin */
+.alignLeft.art-text,
+.alignCenter.art-text,
+.alignRight.art-text {
+   margin-bottom: 0;
+}
+.alignLeft,
+.alignCenter,
+.alignRight {
+  margin: 1em 0 0 0;
+}
+/* In print, the pilcrow won't show on hover, so prevent it from taking up 
space,
+   possibly even requiring a new line */
+@media print {
+  a.pilcrow {
+    display: none;
+  }
+}
+/* Styling for the external metadata */
+div#external-metadata {
+  background-color: #eee;
+  padding: 0.5em;
+  margin-bottom: 0.5em;
+  display: none;
+}
+div#internal-metadata {
+  padding: 0.5em;                       /* to match the external-metadata 
padding */
+}
+/* Styling for title RFC Number */
+h1#rfcnum {
+  clear: both;
+  margin: 0 0 -1em;
+  padding: 1em 0 0 0;
+}
+/* Make .olPercent look the same as <ol><li> */
+dl.olPercent > dd {
+  margin-bottom: 0.25em;
+  min-height: initial;
+}
+/* Give aside some styling to set it apart */
+aside {
+  border-left: 1px solid #ddd;
+  margin: 1em 0 1em 2em;
+  padding: 0.2em 2em;
+}
+aside > dl,
+aside > ol,
+aside > ul,
+aside > table,
+aside > p {
+  margin-bottom: 0.5em;
+}
+/* Additional page break settings */
+@media print {
+  figcaption, table caption {
+    page-break-before: avoid;
+  }
+}
+/* Font size adjustments for print */
+@media print {
+  body  { font-size: 10pt;      line-height: normal; max-width: 96%; }
+  h1    { font-size: 1.72em;    padding-top: 1.5em; } /* 1*1.2*1.2*1.2 */
+  h2    { font-size: 1.44em;    padding-top: 1.5em; } /* 1*1.2*1.2 */
+  h3    { font-size: 1.2em;     padding-top: 1.5em; } /* 1*1.2 */
+  h4    { font-size: 1em;       padding-top: 1.5em; }
+  h5, h6 { font-size: 1em;      margin: initial; padding: 0.5em 0 0.3em; }
+}
+/* Sourcecode margin in print, when there's no pilcrow */
+@media print {
+  .artwork,
+  .sourcecode {
+    margin-bottom: 1em;
+  }
+}
+/* Avoid narrow tables forcing too narrow table captions, which may render 
badly */
+table {
+  min-width: 20em;
+}
+/* ol type a */
+ol.type-a { list-style-type: lower-alpha; }
+ol.type-A { list-style-type: upper-alpha; }
+ol.type-i { list-style-type: lower-roman; }
+ol.type-I { list-style-type: lower-roman; }
+/* Apply the print table and row borders in general, on request from the RPC,
+and increase the contrast between border and odd row background sligthtly */
+table {
+  border: 1px solid #ddd;
+}
+td {
+  border-top: 1px solid #ddd;
+}
+tr:nth-child(2n+1) > td {
+  background-color: #f8f8f8;
+}
+/* Use style rules to govern display of the TOC. */
+@media screen and (max-width: 1023px) {
+  #toc nav { display: none; }
+  #toc.active nav { display: block; }
+}
+/* Add support for keepWithNext */
+.keepWithNext {
+  break-after: avoid-page;
+  break-after: avoid-page;
+}
+/* Add support for keepWithPrevious */
+.keepWithPrevious {
+  break-before: avoid-page;
+}
+/* Change the approach to avoiding breaks inside artwork etc. */
+figure, pre, table, .artwork, .sourcecode  {
+  break-before: auto;
+  break-after: auto;
+}
+/* Avoid breaks between <dt> and <dd> */
+dl {
+  break-before: auto;
+  break-inside: auto;
+}
+dt {
+  break-before: auto;
+  break-after: avoid-page;
+}
+dd {
+  break-before: avoid-page;
+  break-after: auto;
+  orphans: 3;
+  widows: 3
+}
+span.break, dd.break {
+  margin-bottom: 0;
+  min-height: 0;
+  break-before: auto;
+  break-inside: auto;
+  break-after: auto;
+}
+/* Undo break-before ToC */
+@media print {
+  #toc {
+    break-before: auto;
+  }
+}
+/* Text in compact lists should not get extra bottim margin space,
+   since that would makes the list not compact */
+ul.compact p, .ulCompact p,
+ol.compact p, .olCompact p {
+ margin: 0;
+}
+/* But the list as a whole needs the extra space at the end */
+section ul.compact,
+section .ulCompact,
+section ol.compact,
+section .olCompact {
+  margin-bottom: 1em;                    /* same as p not within ul.compact 
etc. */
+}
+/* The tt and code background above interferes with for instance table cell
+   backgrounds.  Changed to something a bit more selective. */
+tt, code {
+  background-color: transparent;
+}
+p tt, p code, li tt, li code {
+  background-color: #f8f8f8;
+}
+/* Tweak the pre margin -- 0px doesn't come out well */
+pre {
+   margin-top: 0.5px;
+}
+/* Tweak the comact list text */
+ul.compact, .ulCompact,
+ol.compact, .olCompact,
+dl.compact, .dlCompact {
+  line-height: normal;
+}
+/* Don't add top margin for nested lists */
+li > ul, li > ol, li > dl,
+dd > ul, dd > ol, dd > dl,
+dl > dd > dl {
+  margin-top: initial;
+}
+/* Elements that should not be rendered on the same line as a <dt> */
+/* This should match the element list in writer.text.TextWriter.render_dl() */
+dd > div.artwork:first-child,
+dd > aside:first-child,
+dd > figure:first-child,
+dd > ol:first-child,
+dd > div:first-child > pre.sourcecode,
+dd > table:first-child,
+dd > ul:first-child {
+  clear: left;
+}
+/* fix for weird browser behaviour when <dd/> is empty */
+dt+dd:empty::before{
+  content: "\00a0";
+}
+/* Make paragraph spacing inside <li> smaller than in body text, to fit better 
within the list */
+li > p {
+  margin-bottom: 0.5em
+}
+/* Don't let p margin spill out from inside list items */
+li > p:last-of-type {
+  margin-bottom: 0;
+}
+
+.label-expires,.expires {
+  display: none;
+}

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]