<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.3.8) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-gallagher-openpgp-padding-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>Padding in OpenPGP</title>

    <author fullname="Andrew Gallagher" role="editor">
      <organization>PGPKeys.EU</organization>
      <address>
        <email>andrewg@andrewg.com</email>
      </address>
    </author>

    <date year="2026" month="October" day="05"/>

    <area>int</area>
    <workgroup>openpgp</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 29?>

<t>This document provides updated guidance around the generation of padding in OpenPGP data streams.
It does not specify any new OpenPGP wire formats, but does propose some higher-level best practices.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://andrewgdotcom.gitlab.io/padding"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-gallagher-openpgp-padding/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        OpenPGP Working Group mailing list (<eref target="mailto:openpgp@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/openpgp/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/openpgp/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://gitlab.com/andrewgdotcom/padding"/>.</t>
    </note>


  </front>

  <middle>


<?line 34?>

<section anchor="introduction"><name>Introduction</name>

<t><xref section="5.14" sectionFormat="of" target="RFC9580"/> specifies a Padding packet, but provides little guidance beyond recommending that its contents <bcp14>SHOULD</bcp14> be random octets.
This document provides the following additional guidance:</t>

<t><list style="symbols">
  <t>Random padding is overkill in certain contexts, and padding with zeros can be a viable, cheaper alternative</t>
  <t>Some padding lengths are not possible to generate without special-casing, so a method is proposed to generate these "irregular" lengths safely</t>
  <t>Padding may be added either before or after ASCII-armoring, so a "conformal padding" scheme is proposed to ensure these have equivalent properties</t>
</list></t>

</section>
<section anchor="conventions-definitions"><name>Conventions and Definitions</name>

<t>The term "OpenPGP Certificate" is used in this document interchangeably with "OpenPGP Transferable Public Key", as defined in <xref section="10.1" sectionFormat="of" target="RFC9580"/>.</t>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
<section anchor="clarification-of-existing-guidance"><name>Clarification of Existing Guidance</name>

<t>We draw attention to the fact that the following two scenarios are implicitly permitted by <xref target="RFC9580"></xref>.</t>

<section anchor="not-random"><name>Non-Random Padding</name>

<t><xref section="5.14" sectionFormat="of" target="RFC9580"/> states that random padding is recommended to mitigate the effects of compression:</t>

<ul empty="true"><li>
  <t>Its contents <bcp14>SHOULD</bcp14> be random octets to make the length obfuscation it provides more robust even when compressed.</t>
</li></ul>

<t>It also states that one of the use cases is:</t>

<ul empty="true"><li>
  <t>As the last packet of an Optionally Padded Message within a version 2 Symmetrically Encrypted and Integrity Protected Data packet</t>
</li></ul>

<t>There is no advantage gained by using random padding directly inside an encrypted data packet.
The packet grammar is clear that such padding will never be compressed, since any (optional) compression is applied before padding.
On the other hand, random padding data comes at a (small) calculation cost.</t>

<t>The same argument applies to any context where the generating implementation knows that its output will not be compressed before encryption.
Padding <bcp14>MAY</bcp14> consist of non-random data, such as a string of zeros, when used in such a context.</t>

</section>
<section anchor="multiple-padding"><name>Multiple Padding Packets</name>

<t><xref section="10.3" sectionFormat="of" target="RFC9580"/> defines an Optionally Padded Message as:</t>

<ul empty="true"><li>
  <t>OpenPGP Message | OpenPGP Message, Padding Packet.</t>
</li></ul>

<t>But <xref section="5.14" sectionFormat="of" target="RFC9580"/> permits additional padding packets:</t>

<ul empty="true"><li>
  <t>An implementation <bcp14>MUST</bcp14> be able to process Padding packets anywhere else in an OpenPGP stream</t>
</li></ul>

<t>We interpret these statements inclusively, to mean that an Optionally Padded Message <bcp14>MAY</bcp14> contain any number of Padding packets.
It is <bcp14>RECOMMENDED</bcp14> however that any Padding packets come after the message data and not before, to minimise variance.</t>

</section>
</section>
<section anchor="new-guidance"><name>New Guidance</name>

<t>The crucial property of padding is its overall length, however an OpenPGP packet consists not only of the packet body but also the packet framing.
In OpenPGP format (<xref section="4.2.1" sectionFormat="of" target="RFC9580"/>), this framing consists of a single initial octet followed by a Body Length header.
The Body Length header is itself of variable length (the "length-of-length"):</t>

<t><list style="symbols">
  <t>A 1-octet Body Length header encodes packet lengths of up to 191 octets.</t>
  <t>A 2-octet Body Length header encodes packet lengths of 192 to 8383 octets.</t>
  <t>A 5-octet Body Length header encodes packet lengths of up to 4,294,967,295 (0xFFFFFFFF) octets in length.</t>
</list></t>

<t>The minimum size for a framed OpenPGP packet is therefore two octets.
While it is possible to pad by zero octets by not including any Padding packet, it is not possible to pad a data stream by one octet.</t>

<t>The largest possible Padding packet has a body length of 4,294,967,295 and a total framed length of 4,294,967,301.</t>

<t>To ensure that an uninterrupted range of padding lengths can be generated, an implementation that supports the generation of padding must pad by an excess of <spanx style="verb">E</spanx> octets, where <spanx style="verb">E &gt;= 2</spanx>.
For consistency, all padded data streams must be over-padded by the same excess - the caller must anticipate this and allocate sufficient space.</t>

<section anchor="api-design"><name>API Design</name>

<t>It is <bcp14>RECOMMENDED</bcp14> that OpenPGP libraries expose a low-level padding-generation API to higher layers that is constrained within safe limits:</t>

<t><list style="symbols">
  <t>The API should accept an unsigned integer of no more than 32 bits as its <spanx style="verb">length</spanx> parameter</t>
  <t>The API should generate padding of total length <spanx style="verb">length+E</spanx> octets, where the excess <spanx style="verb">E &gt;= 2</spanx> is a constant</t>
</list></t>

<t>This ensures that all valid inputs produce valid output of length between <spanx style="verb">E</spanx> and <spanx style="verb">4,294,967,295 + E</spanx> inclusive.
If <spanx style="verb">E &lt;= 6</spanx>, the maximum padding length can be represented by a single Padding packet.</t>

<t>It is <bcp14>RECOMMENDED</bcp14> to fix <spanx style="verb">E = 3</spanx> to ensure compatibility with conformal padding (see <xref target="conformal-padding"/>).</t>

<t>In the (highly unlikely) event that a caller requires more than 4GB of padding it would have to call the API multiple times.
Each additional API call will introduce an additional excess that must be compensated for by the caller.
Generating more than 4GB of padding is therefore <bcp14>NOT RECOMMENDED</bcp14>.</t>

</section>
<section anchor="packet-construction"><name>Construction of Padding Packets</name>

<t>An OpenPGP ipmlementation will generally construct a framed packet using a deterministic process:</t>

<t><list style="symbols">
  <t>determine the packet body length <spanx style="verb">B</spanx></t>
  <t>determine the shortest length-of-length <spanx style="verb">L</spanx> capable of encoding <spanx style="verb">B</spanx></t>
  <t>construct a framed packet of total length <spanx style="verb">F = 1 + L + B</spanx></t>
</list></t>

<t>However, when constructing padding we must work backwards from a known framed packet length <spanx style="verb">F</spanx> to find <spanx style="verb">B</spanx>.
If the shortest length-of-length is always used, then there are values of <spanx style="verb">F</spanx> that cannot be obtained by any choice of <spanx style="verb">B</spanx>.</t>

<t>For example, if <spanx style="verb">B = 191</spanx>, then <spanx style="verb">L = 1</spanx> and <spanx style="verb">F = 1 + 1 + 191 = 193</spanx> - but increment <spanx style="verb">B</spanx> by one and <spanx style="verb">L</spanx> increases to 2, giving <spanx style="verb">F = 1 + 2 + 192 = 195</spanx>.
Similarly, if <spanx style="verb">B = 8383</spanx>, then <spanx style="verb">F = 1 + 2 + 8383 = 8386</spanx>, while <spanx style="verb">B = 8384</spanx> gives <spanx style="verb">F = 1 + 5 + 8384 = 8390</spanx>.</t>

<t>There is no choice of body length that results in a framed packet length of 194, 8387, 8388, or 8389 if the "shortest length-of-length" method is used.
A generating implementation must therefore handle the generation of Padding packets as a special case, in order to permit the construction of such "irregular" framed packet lengths.
The optimal method will vary between implementations, but some suggestions are listed below.</t>

<section anchor="overlong-encoding"><name>Overlong Encoding</name>

<t>Most receiving implementations will accept overlong encodings of packet body lengths.
An example of an overlong encoding would be a 5-octet Body Length header indicating a body length of 184, giving <spanx style="verb">F = 1 + 5 + 188 = 194</spanx>.</t>

<t>If an implementation can override the length-of-length <spanx style="verb">L</spanx> in its own framing layer, it can construct all framed packet lengths <spanx style="verb">F &gt; 2</spanx> (including "irregular" ones) as follows:</t>

<t><list style="symbols">
  <t>if <spanx style="verb">F &lt; 194</spanx>:
  <list style="symbols">
      <t><spanx style="verb">B := F - 2</spanx></t>
      <t><spanx style="verb">L := 1</spanx></t>
    </list></t>
  <t>else:
  <list style="symbols">
      <t><spanx style="verb">B = F - 6</spanx></t>
      <t><spanx style="verb">L := 5</spanx></t>
    </list></t>
</list></t>

<t>Two-octet length encodings are not necessary if overlong encodings are acceptable.
This simplifies the algorithm significantly.</t>

</section>
<section anchor="multi-packet-encoding"><name>Multi-Packet Encoding</name>

<t>A generating implementation <bcp14>MAY</bcp14> output multiple Padding packets, and a receiving implementation <bcp14>MUST</bcp14> accept them (see above).
An implementation can therefore split the padding into two packets to avoid the "irregular" lengths:</t>

<t><list style="symbols">
  <t>if F is one of the "irregular" framed lengths (194, 8387, 8388, or 8389):
  <list style="symbols">
      <t>Output an initial Padding packet of framed length <spanx style="verb">N</spanx>, where <spanx style="verb">2 &lt; N &lt; 192</spanx></t>
      <t>Followed by a second Padding packet of framed length <spanx style="verb">F - N</spanx></t>
    </list></t>
  <t>else, output a single packet of framed length <spanx style="verb">F</spanx></t>
</list></t>

<t>Every non-"irregular" framed length F can then be constructed using "shortest length-of-length" as normal:</t>

<t><list style="symbols">
  <t>if <spanx style="verb">F &lt; 194</spanx>, then <spanx style="verb">B := F - 2</spanx></t>
  <t>else if <spanx style="verb">F &lt; 8387</spanx>, then <spanx style="verb">B := F - 3</spanx></t>
  <t>else <spanx style="verb">B := F - 6</spanx></t>
</list></t>

</section>
</section>
</section>
<section anchor="conformal-padding"><name>Conformal Padding</name>

<t>A generating implementation <bcp14>MAY</bcp14> pad a binary OpenPGP data stream using Padding packets before ASCII-armoring.
If this is not possible or appropriate, armored data can be padded using printable characters.
One scenario where Padding packets may not be appropriate is when transferring a certificate bundle containing only v4 certificates,
since the Padding packet is not backwards-compatible with legacy clients (see <xref section="10.1.5" sectionFormat="of" target="RFC9580"/>).</t>

<t>Conformal padding is a method of padding OpenPGP data after ASCII-armoring so that no additional information is leaked to an eavesdropper if:</t>

<t><list style="symbols">
  <t>the same ASCII data stream is transferred using two different line-ending formats</t>
  <t>the same data is transferred in both armored and binary formats</t>
</list></t>

<t>In the general case, armored data <bcp14>MAY</bcp14> consist of lines up to 76 printable characters and <bcp14>MAY</bcp14> also contain extra headers and a checksum.
If conformal padding is enabled, extra headers and checksums <bcp14>MUST NOT</bcp14> be added, and the Base64 data <bcp14>MUST</bcp14> be line-broken at exactly 64 characters.
This ensures consistency of padded data length after newline characters are included.</t>

<section anchor="outline"><name>Outline of the Conformal Padding Problem</name>

<t>We recall that ASCII armored data always comes in a whole number of padded "chunks", each containing four printable characters and representing up to three bytes of data.
We also recall that binary padding introduces an excess of E octets to all data streams, where <spanx style="verb">2 &lt;= E &lt;= 6</spanx>.
IFF E is divisible by 3, this consistently adds <spanx style="verb">e = E/3</spanx> chunks of Base64 characters, regardless of unpadded data length.</t>

<t>Let us assume that <spanx style="verb">E = 3</spanx>, for reasons that will be explained in <xref target="derivation"/>.</t>

<t>Binary-padded data is then represented as an armored block of <spanx style="verb">J = M/3 + e = (L-1)*16 + 1</spanx> chunks and <spanx style="verb">L</spanx> newlines, where
* <spanx style="verb">L = M/48 + 1</spanx> is the number of lines,
* <spanx style="verb">e = 1</spanx> is the number of excess chunks due to binary over-padding,
* <spanx style="verb">M</spanx> is the desired padded data length in bytes (NOT including excess).</t>

<t>Unpadded data is represented as an armored block of <spanx style="verb">j = ceil(m/3) = (l-1)*16 + i</spanx> chunks and <spanx style="verb">l</spanx> newlines, where
* <spanx style="verb">l = ceil(m/48)</spanx> is the number of lines,
* <spanx style="verb">i = ceil(m/3) - (l-1)*16</spanx> is the number of Base64 chunks on the last line (<spanx style="verb">1 &lt;= i &lt;= 16</spanx>),
* <spanx style="verb">m</spanx> is the unpadded data length in bytes.</t>

<t>The shortfall of chunks "missing" from an unpadded armored block due to lack of binary padding is <spanx style="verb">J - j = M/3 + e - ceil(m/3)</spanx>,
and the corresponding shortfall of newlines is <spanx style="verb">L - l = M/48 + 1 - ceil(m/48)</spanx>.</t>

</section>
<section anchor="derivation"><name>Derivation of the Conformal Padding Formula</name>

<t>We wish to ensure that a padding string of length equal to the shortfall of chunks also compensates for the shortfall of newlines.</t>

<t>For a newline-terminated string of length <spanx style="verb">c</spanx> split across lines of length <spanx style="verb">C</spanx>, the total number of newlines required is <spanx style="verb">ceil(c/C)</spanx>.
Let us split a padding string of <spanx style="verb">M/3 + e - ceil(m/3)</spanx> chunks across lines of length 64 characters (=16 chunks), where <spanx style="verb">e</spanx> is the number of excess chunks in our over-padding.
The number of newlines <spanx style="verb">k</spanx> automatically added to the string is therefore:</t>

<figure><artwork><![CDATA[
k = ceil( (M/3 + e - ceil(m/3)) / 16 )
]]></artwork></figure>

<t>IFF M is divisible by 48, we can bring it outside:</t>

<figure><artwork><![CDATA[
k = M/48 + ceil( (e - ceil(m/3)) / 16 )
]]></artwork></figure>

<t>Since <spanx style="verb">ceil(-n) = -floor(n)</spanx>:</t>

<figure><artwork><![CDATA[
k = M/48 - floor( (ceil(m/3) - e) / 16 )
]]></artwork></figure>

<t>Now IFF the binary excess is <spanx style="verb">E = 3</spanx>, then <spanx style="verb">e = 1</spanx> and we can apply the identity <spanx style="verb">floor( (n-1) / m ) = ceil(n/m) - 1</spanx> to get:</t>

<figure><artwork><![CDATA[
k = M/48 + 1 - ceil( ceil(m/3) / 16 )
k = M/48 + 1 - ceil(m/48)
]]></artwork></figure>

<t>which equals the shortfall of newlines <spanx style="verb">L - l</spanx> identified above.</t>

<t>This means that IFF:</t>

<t><list style="symbols">
  <t>the binary excess <spanx style="verb">E = 3</spanx>,</t>
  <t>the target padded data length <spanx style="verb">M</spanx> (without excess) is divisible by 48,</t>
  <t>ASCII armor is always line-wrapped at 64 characters,</t>
  <t>and we over-pad by exactly one excess chunk (corresponding to three excess bytes of binary padding),</t>
</list></t>

<t>the act of splitting a padding string of the required length into 64-character lines exactly compensates for the shortfall of newlines.</t>

</section>
<section anchor="string-construction"><name>Construction of Conformal Padding Strings</name>

<t>A padding string <bcp14>MUST</bcp14> always be present when padding is enabled, regardless of the original data length.</t>

<t>A conformal padding string consists of:</t>

<t><list style="symbols">
  <t>a fixed 4-character prefix <spanx style="verb">P: =</spanx> to represent the excess,</t>
  <t>followed by <spanx style="verb">(M/3 - ceil(m/3))*4</spanx> additional printable characters,</t>
  <t>line-wrapped at the 64th column,</t>
  <t>with the first four characters of each subsequent line also being <spanx style="verb">P: =</spanx>,</t>
  <t>and newline-terminated.</t>
</list></t>

<t>An example of a conformal padding string is:</t>

<figure><artwork><![CDATA[
P: =2/b1DpDX1pBa+VjLcJfVh0fOpFLe3BGaiBCqouqc0wlw2pjyBnpxZFfwnss5rCbA
P: =Z6y02No1
]]></artwork></figure>

<t>It is <bcp14>RECOMMENDED</bcp14> to place the padding string before the message data, to force the receiver to consume all of the padding and thereby prevent early connection drops.
Depending on context, the padding string <bcp14>MAY</bcp14> be located in one of several locations:</t>

<t><list style="symbols">
  <t>Inside the ASCII armor, as armor headers</t>
  <t>Before the ASCII armor, as plain text</t>
  <t>Within an enclosing protocol, for example as HTTP headers</t>
</list></t>

<t>The entire string <bcp14>MUST</bcp14> be included verbatim, without indentation, charset transformation, escape sequences or any other modification.
It <bcp14>MAY</bcp14> be enclosed in another structure such as quotes or a block comment, so long as it is internally unchanged.</t>

<t>The conformal padding string is designed to be valid in a broad variety of contexts,
however it may cause warnings such as "unknown header" to be generated by a receiving implementation.
It is the generating implementation's responsibility to ensure that padding is placed in a way that minimises harmful consequences.</t>

<t>The prefix and line-wrapping requirements ensure that the combined padding and armor always contains both a constant number of printable characters, and a constant number of newlines.
As a consequence, the anonymity cohort survives transformation between newline formats.
Further, IFF binary padding uses a fixed excess of <spanx style="verb">E = 3</spanx>, the anonymity cohort also survives transformation between binary-padded and ASCII-padded format
(assuming the same bucketing model is used for both).
A visual demonstration of this can be found in <xref target="visual-demonstration"/>.</t>

</section>
</section>
<section anchor="bucketing-strategies"><name>Bucketing Strategies</name>

<t>A complete discussion of bucketing strategies is beyond the scope of this document.
Many common bucketing strategies such as "next power of two" are not compatible with conformal padding, because they do not allocate bucket widths in multiples of of 48.</t>

<t>Determination of an optimal bucketing strategy must be informed by the statistical properties of the data being padded.
A bucketing strategy that works well for arbitrary internet messages may not be suitable for data sets with less well-behaved statistics, such as certificates.</t>

<t>A general-purpose library API <bcp14>MAY</bcp14> encourage multiples of 48 to enable conformal padding, but <bcp14>SHOULD</bcp14> refrain from making any other assumptions about bucketing strategies.</t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>((TO BE COMPLETED))</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>IANA is requested to add a reference to this document from the "Padding Packet" entry in the OpenPGP Packet Types Registry.</t>

</section>


  </middle>

  <back>



    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC9580">
  <front>
    <title>OpenPGP</title>
    <author fullname="P. Wouters" initials="P." role="editor" surname="Wouters"/>
    <author fullname="D. Huigens" initials="D." surname="Huigens"/>
    <author fullname="J. Winter" initials="J." surname="Winter"/>
    <author fullname="Y. Niibe" initials="Y." surname="Niibe"/>
    <date month="July" year="2024"/>
    <abstract>
      <t>This document specifies the message formats used in OpenPGP. OpenPGP provides encryption with public key or symmetric cryptographic algorithms, digital signatures, compression, and key management.</t>
      <t>This document is maintained in order to publish all necessary information needed to develop interoperable applications based on the OpenPGP format. It is not a step-by-step cookbook for writing an application. It describes only the format and methods needed to read, check, generate, and write conforming packets crossing any network. It does not deal with storage and implementation questions. It does, however, discuss implementation issues necessary to avoid security flaws.</t>
      <t>This document obsoletes RFCs 4880 ("OpenPGP Message Format"), 5581 ("The Camellia Cipher in OpenPGP"), and 6637 ("Elliptic Curve Cryptography (ECC) in OpenPGP").</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9580"/>
  <seriesInfo name="DOI" value="10.17487/RFC9580"/>
</reference>
<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>



    </references>




<?line 316?>

<section anchor="visual-demonstration"><name>Conformal Padding Visual Demonstration</name>

<t>Let us consider a toy bucketing model, where the bucket width is 96 bytes (<spanx style="verb">48*2</spanx>), and the byte values of the "data" and "padding" are faked for visual clarity.</t>

<t>Consider an unpadded certificate of binary length 86 bytes, armored:</t>

<figure><artwork><![CDATA[
-----BEGIN PGP PUBLIC KEY BLOCK-----

decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbad
decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddec=
-----END PGP PUBLIC KEY BLOCK-----
]]></artwork></figure>

<t>When binary-padded to 96+3 bytes before armoring, it is 214 bytes long over 6 lines.
Note that the three bytes of binary over-padding cause the encoded data to wrap onto an additional line:</t>

<figure><artwork><![CDATA[
-----BEGIN PGP PUBLIC KEY BLOCK-----

decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbad
decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecAAAAAAAAAAAAA
AAAA
-----END PGP PUBLIC KEY BLOCK-----
]]></artwork></figure>

<t>When first armored and then ASCII-padded with a <spanx style="verb">(96/3 - ceil(86/3) + 1)*4 = 16</spanx> character padding string, it is also 214 bytes long over 6 lines:</t>

<figure><artwork><![CDATA[
P: =DECAFBADDECA
-----BEGIN PGP PUBLIC KEY BLOCK-----

decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbad
decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddec=
-----END PGP PUBLIC KEY BLOCK-----
]]></artwork></figure>

<t>Now consider certificates of other lengths - for comparison we show first the binary-padded and then the ASCII-padded version of each.</t>

<t>If the certificate is exactly 96 bytes, we still add the minimal <spanx style="verb">(96/3 - ceil(96/3) + 1)*4 = 4</spanx> character padding string <spanx style="verb">P: /</spanx> together with its CRLF:</t>

<figure><artwork><![CDATA[
-----BEGIN PGP PUBLIC KEY BLOCK-----

decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbad
decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbad
AAAA
-----END PGP PUBLIC KEY BLOCK-----
]]></artwork></figure>

<t>or</t>

<figure><artwork><![CDATA[
P: =
-----BEGIN PGP PUBLIC KEY BLOCK-----

decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbad
decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbad
-----END PGP PUBLIC KEY BLOCK-----
]]></artwork></figure>

<t>If the certificate is exactly N lines shorter than the bucket, the padding string wraps onto the (N+1)th line, compensating for the "missing" CRLF.
This 48-byte certificate requires <spanx style="verb">(96/3 - ceil(48/3) + 1)*4 = 68</spanx> characters of padding:</t>

<figure><artwork><![CDATA[
-----BEGIN PGP PUBLIC KEY BLOCK-----

decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbad
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA
-----END PGP PUBLIC KEY BLOCK-----
]]></artwork></figure>

<t>or</t>

<figure><artwork><![CDATA[
P: =DECAFBADDECAFBADDECAFBADDECAFBADDECAFBADDECAFBADDECAFBADDECA
P: =
-----BEGIN PGP PUBLIC KEY BLOCK-----

decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbad
-----END PGP PUBLIC KEY BLOCK-----
]]></artwork></figure>

<t>If the armored certificate is one chunk longer than an integer number of lines, the padding string doesn't wrap, avoiding an off-by-one error.
This 50-byte certificate requires <spanx style="verb">(96/3 - ceil(50/3) + 1)*4 = 64</spanx> characters of padding:</t>

<figure><artwork><![CDATA[
-----BEGIN PGP PUBLIC KEY BLOCK-----

decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbad
decAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA
-----END PGP PUBLIC KEY BLOCK-----
]]></artwork></figure>

<t>or</t>

<figure><artwork><![CDATA[
P: =DECAFBADDECAFBADDECAFBADDECAFBADDECAFBADDECAFBADDECAFBADDECA
-----BEGIN PGP PUBLIC KEY BLOCK-----

decafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbaddecafbad
dec=
-----END PGP PUBLIC KEY BLOCK-----
]]></artwork></figure>

<t>Note that in each padded example above there are always 214 bytes over 6 lines.
This is a conserved property of a 96-byte bucket.</t>

</section>
<section anchor="acknowledgments"><name>Acknowledgments</name>

<t>The author would like to thank Heiko Schäfer for discussions.</t>

</section>


  </back>

<!-- ##markdown-source:
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
eq0cgBJCJ4DmckdYS9xopz+9GI7rfzz+3yfJRTLL+mUk154aaIEds49M93C/
SnUP9qlY9MJ0ke8arnybWibdgM1OoIxcnpBqLb08Oz89vjg5PqO//8Tc/+1G
QHW/0mXVwxcHeI4hrnWlw06FIUUaZtQGywWaucqqqo/V4Z3rzGxKzn0kqZUC
6eZirF1zRmFVGzos3RDtmXPv2lBcIwN/WEVTCw6bWtB7XAm4FLFNZZWx5eOy
VlF72OnXVxd/ejtrLvBJdpaklV7/05zwtx7uaX260dqj9Bml0lhexeS1ZRNy
x5n4Y269v3nR3SRgiIXaVfFSOy4kRJdXZaRK2iTQO+hwNK9TVjboN5W4d9BQ
4v2D/lKVTSn8Y5X0+P/55/crad35furff6iWf6KSuii3pKwJt4ZQxZ4iktNS
7gyUb3uW74/XaS39UzLxX3LW3rZ0M0qGgGkjaGKHrwfSNElVP1/u/Gb9fLnT
1M/en0I/l8HHP4l+/nHc+RRw4MAstWT5+i8CcE1Iy7N0Z1b78ELrYRWWaoLj
t9q1qAWtlNLo+ifGPgK9aJ/4Yc5LjwMqPkZ2OObynFTy5J+Y0l5z+vZJUkQf
xvKlDe8TcxdM/ve/kT5KLl8WZUDE/wEJMRWRckwAAA==

-->

</rfc>

