<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>ImperialViolet</title>
 <link href="http://www.imperialviolet.org/iv-rss.xml" rel="self"/>
 <link href="http://www.imperialviolet.org/"/>
 <updated>2009-07-01T16:43:21-07:00</updated>
 <id>http://www.imperialviolet.org/</id>
 <author>
   <name>Adam Langley</name>
 </author>

 
 <entry>
   <title>General homomorphic encryption</title>
   <link href="http://www.imperialviolet.org/2009/06/16/hal-finney-homomorphic.html"/>
   <updated>2009-06-16T00:00:00-07:00</updated>
   <id>http://www.imperialviolet.org/2009/06/16/hal-finney-homomorphic</id>
   <content type="html">
&lt;p&gt;If you've heard of &lt;a href=&quot;http://www.finney.org/~hal/&quot;&gt;Hal Finney&lt;/a&gt;, the
following quote should be enough to get you to read: &lt;a
  href=&quot;http://www.mail-archive.com/cryptography@metzdowd.com/msg10571.html&quot;&gt;his
  explanation of the recent homomorphic encryption paper&lt;/a&gt;:&lt;/p&gt;

&lt;q&gt;This is IMO one of the most remarkable crypto papers ever. Not only
does it solve one of the oldest open problems in cryptography, the
construction of a fully homomorphic encryption system, it does so by
means of a self-embedding technique reminiscent of Godel's theorem.&lt;/q&gt;

</content>
 </entry>
 
 <entry>
   <title>Linux sandboxing with LSMSB</title>
   <link href="http://www.imperialviolet.org/2009/06/07/lsmsb.html"/>
   <updated>2009-06-07T00:00:00-07:00</updated>
   <id>http://www.imperialviolet.org/2009/06/07/lsmsb</id>
   <content type="html">
&lt;p&gt;Chrome Linux &lt;a
  href=&quot;http://www.imperialviolet.org/2009/06/04/dev-channel-rel.html&quot;&gt;got a
  dev channel release&lt;/a&gt; and I'm very happy with it. It's now my primary
browser.&lt;/p&gt;

&lt;p&gt;However, one of the big selling points for Chrome on Windows is that the
renderers (which deal with decoding the HTML, CSS, image files etc) are
sandboxed. We've had exploitable issues in the renderers which which have been
stopped by the sandbox. It's a Good Thing.&lt;/p&gt;

&lt;p&gt;However, we don't have a sandbox on Linux! The Mac team have been &lt;a
  href=&quot;http://blog.chromium.org/2009/06/google-chrome-sandboxing-and-mac-os-x.html&quot;&gt;talking
  about how nice their sandbox is&lt;/a&gt; (and I expect we'll get some official
documentation about it after WWDC this week). We have to hack around with SUID
binaries, chrooting, &lt;a href=&quot;http://lwn.net/Articles/332974/&quot;&gt;seccomp&lt;/a&gt; and
one-size-fits all &lt;a href=&quot;http://danwalsh.livejournal.com/28545.html&quot;&gt;SELinux
  solutions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(I don't wish to discount the good work that the SELinux folks have done:
we'll probably use something like that sandbox on Fedora, but Chromium was very
carefully written to be sandboxed and we should aim higher.)&lt;/p&gt;

&lt;p&gt;So, as part of the exploration of what we could do with sandboxing on Linux,
longer term, I have a prototype implementation of &lt;a
  href=&quot;http://www.github.com/agl/lsmsb&quot;&gt;LSMSB&lt;/a&gt;. It's another literate
program of mine, so you can usefully &lt;a href=&quot;/binary/lsmsb.html&quot;&gt;read the
  source too&lt;/a&gt;. The README is included below:&lt;/p&gt;

&lt;pre&gt;This is LSMSB, a sandboxing scheme for Linux based on the ideas of the OS X
sandbox (which, in turn, was inspired by TrustedBSD and FreeBSD).

Imagine that you're working on a university computer and you get a binary which
promises to do some fiendishly complex calculation, reading from a file ./input
and writing to a file ./output. It also talks to a specific server to access a
pre-computed lookup table. You want to run it, but you don't want to have to
trust that it won't do anything malicious (save giving the wrong answer).

This code is incomplete, but currently you can take a sandbox specification
like this:

filter dentry-open {
  constants {
    var etc-prefix bytestring = &quot;/etc/&quot;;
  }

  ldc r2,etc-prefix;
  isprefixof r2,r2,r0;
  jc r2,#fail;
  ldi r0,1;
  ret r0;
#fail:
  ldi r0,0;
  ret r0;
}

... and use it to remove access to /etc.

*** This code functions, but is incomplete ***

It's written in a literate programming style, but the derived sources are
included so that you don't have to bother with that in order to build. You'll
need a recent (&amp;gt; 2.6.30-rc1) kernel in order to apply the included patch. Once
you've applied the patch, drop lsmsb.c into security/lsmsb and rebuild.

You can assemble a sandbox file with:
  ./lsmsb-as sandbox-input.sb &amp;gt; sandbox
And then run a shell in the sandbox with:
  ./lsmsb-install sandbox

To read the code, see http://www.imperialviolet.org/binary/lsmsb.html&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Chrome for Linux</title>
   <link href="http://www.imperialviolet.org/2009/06/04/dev-channel-rel.html"/>
   <updated>2009-06-04T00:00:00-07:00</updated>
   <id>http://www.imperialviolet.org/2009/06/04/dev-channel-rel</id>
   <content type="html">
&lt;p&gt;Myself and the rest of the Chrome Linux team have been working hard over the
past few months to get Chrome ported to Linux. It's certainly very rough still,
but it runs and the first development release just &lt;a
  href=&quot;http://dev.chromium.org/getting-involved/dev-channel#TOC-For-Linux&quot;&gt;got
  released&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm very happy with this and we should be pushing new releases frequently
from now on. If you're in the San Francisco office tomorrow, feel free to pop
by the office as I'll be bringing in champagne.&lt;/p&gt;

&lt;p&gt;Just to be clear, here are some of the things which &lt;i&gt;don't&lt;/i&gt; work:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Plugins (so, no Flash)&lt;/li&gt;
  &lt;li&gt;Complex text (this is my TODO, I just got distracted)&lt;/li&gt;
  &lt;li&gt;Printing&lt;/li&gt;
  &lt;li&gt;Much of the options UI!&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>W2SP and Seccomp</title>
   <link href="http://www.imperialviolet.org/2009/05/21/w2sp.html"/>
   <updated>2009-05-21T00:00:00-07:00</updated>
   <id>http://www.imperialviolet.org/2009/05/21/w2sp</id>
   <content type="html">
&lt;img src=&quot;/binary/w2sp-badge.jpeg&quot; width=&quot;400&quot; height=&quot;300&quot; style=&quot;float: left;&quot;&gt;

&lt;p&gt;I gave a talk today at &lt;a href=&quot;http://w2spconf.com&quot;&gt;W2SP&lt;/a&gt; about
opportunistic encryption. You would have to ask someone in the audience how it
went to get a real answer, but I feel it went OK.&lt;/p&gt;

&lt;p&gt;The talk was based on &lt;a href=&quot;/binary/paper-w2sp-agl-opportunistic-encryption-everywhere.pdf&quot;&gt;a paper&lt;/a&gt; that I wrote for the conference.&lt;/p&gt;

&lt;p style=&quot;clear: left;&quot;&gt;Also, LWN &lt;a href=&quot;http://lwn.net/Articles/332974/&quot;&gt;covered some recent work
  that I've been doing&lt;/a&gt; at Google with Linux sandboxing.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Moved to GitHub</title>
   <link href="http://www.imperialviolet.org/2009/05/09/moved-iv.html"/>
   <updated>2009-05-09T00:00:00-07:00</updated>
   <id>http://www.imperialviolet.org/2009/05/09/moved-iv</id>
   <content type="html">
&lt;p&gt;I've finally manged to move IV off &lt;tt&gt;heeps&lt;/tt&gt;, a server which it's been
ticking along on for the last half decade.&lt;/p&gt;

&lt;p&gt;In the process, I've moved to &lt;a href=&quot;http://github.com&quot;&gt;GitHub&lt;/a&gt; using
their &lt;a href=&quot;http://github.com/blog/272-github-pages&quot;&gt;Pages&lt;/a&gt; system. We'll
see how well it works out!&lt;/p&gt;

&lt;p&gt;In the process I've cleaned out a lot of stuff and probably broken lots of
links. I trust that the search engines will figure it all out soon enough.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>I'll be at CodeCon this y...</title>
   <link href="http://www.imperialviolet.org/2009/04/09/ill-be-at-codecon-this-y.html"/>
   <updated>2009-04-09T00:00:00-07:00</updated>
   <id>http://www.imperialviolet.org/2009/04/09/ill-be-at-codecon-this-y</id>
   <content type="html">

&lt;p&gt;I'll be at &lt;a href=&quot;http://www.codecon.org/2009/&quot;&gt;CodeCon&lt;/a&gt; this year.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Thanks to Alexander Sotir...</title>
   <link href="http://www.imperialviolet.org/2009/03/15/thanks-to-alexander-sotir.html"/>
   <updated>2009-03-15T00:00:00-07:00</updated>
   <id>http://www.imperialviolet.org/2009/03/15/thanks-to-alexander-sotir</id>
   <content type="html">

&lt;p&gt;Thanks to Alexander Sotirov to pushing me to check that the carry chains in
&lt;a href=&quot;http://github.com/agl/curve25519-donna&quot;&gt;donna-c64&lt;/a&gt; were sufficient.
I don't know if I realised something when I wrote it which I'm currently
missing, or if I just screwed up, but I now believe that they're wrong.&lt;/p&gt;

&lt;p&gt;I wrote this Haskell code to check it:&lt;/p&gt;

&lt;font face=&quot;monospace&quot;&gt;
This Haskell code has been written to experiment with the carry chains in&lt;br&gt;
curve25519-donna-c64. It's a literate Haskell program, one can load it into&lt;br&gt;
GHCI and play along.&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;module&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Main&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;where&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#cd00cd&quot;&gt;import&lt;/font&gt;&amp;nbsp;Data.Bits (shiftR, (.&amp;amp;.))&lt;br&gt;
&lt;br&gt;
There are two constants that we'll need.&lt;br&gt;
&lt;br&gt;
Our five limbs are, nominally, 51 bits wide, so this is the maximum value of&lt;br&gt;
their initial values.&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;twoFiftyOneMinusOne&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(&lt;font color=&quot;#00cd00&quot;&gt;2&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;^&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;51&lt;/font&gt;)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;1&lt;/font&gt;&lt;br&gt;
&lt;br&gt;
2^128 - 1 is the limit of the range of our temporary variables. If we exceed&lt;br&gt;
this at any point, our calculations will be incorrect.&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;two128MinusOne&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(&lt;font color=&quot;#00cd00&quot;&gt;2&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;^&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;128&lt;/font&gt;)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;1&lt;/font&gt;&lt;br&gt;
&lt;br&gt;
Now we define a type which mimics our 128-bit unsigned type in C. It's a&lt;br&gt;
disjuction of an Integer and the distinguished value 'Overflow'. 'Overflow' is&lt;br&gt;
contagious: if we try to perform any operations where one or both of the&lt;br&gt;
operands is 'Overflow', then the result is also 'Overflow'.&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;data&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128&amp;nbsp;Integer&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;|&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Overflow&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;deriving&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(Show,&amp;nbsp;Eq)&lt;br&gt;
&lt;br&gt;
We make U128 an instance of Num so that we can perform arithmetic with it.&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;instance&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Num&amp;nbsp;U128&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;where&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; (U128&amp;nbsp;a)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(U128&amp;nbsp;b)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;mayOverflow&amp;nbsp;(a&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;b)&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; _&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;_&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Overflow&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; (U128&amp;nbsp;a)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(U128&amp;nbsp;b)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;mayOverflow&amp;nbsp;(a&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;b)&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; _&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;_&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Overflow&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; (U128&amp;nbsp;a)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(U128&amp;nbsp;b)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;mayOverflow&amp;nbsp;(a&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&lt;/b&gt;&lt;/font&gt;&amp;nbsp;b)&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; _&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&lt;/b&gt;&lt;/font&gt;&amp;nbsp;_&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Overflow&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; negate&amp;nbsp;_&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Overflow&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; abs&amp;nbsp;a&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;@&lt;/b&gt;&lt;/font&gt;(U128&amp;nbsp;_)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;a&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; abs&amp;nbsp;_&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Overflow&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; signum&amp;nbsp;(U128&amp;nbsp;_)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;1&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; signum&amp;nbsp;_&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;0&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; fromInteger&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;mayOverflow&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;instance&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Ord&amp;nbsp;U128&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;where&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; compare&amp;nbsp;(U128&amp;nbsp;a)&amp;nbsp;(U128&amp;nbsp;b)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;compare&amp;nbsp;a&amp;nbsp;b&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; compare&amp;nbsp;_&amp;nbsp;_&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;EQ&lt;br&gt;
&lt;br&gt;
This function lifts an Integer to a U128. If the value is out of range, the&lt;br&gt;
result is 'Overflow'&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;mayOverflow&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Integer&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&amp;gt;&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;mayOverflow&amp;nbsp;x&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;|&lt;/b&gt;&lt;/font&gt;&amp;nbsp;x&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/font&gt;&amp;nbsp;two128MinusOne&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Overflow&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;|&lt;/b&gt;&lt;/font&gt;&amp;nbsp;x&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Overflow&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;|&lt;/b&gt;&lt;/font&gt;&amp;nbsp;otherwise&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128&amp;nbsp;x&lt;br&gt;
&lt;br&gt;
Our field elements consist of five limbs. In the C code, these limbs are&lt;br&gt;
actually uint64_t's, but we keep them as U128's here. We will convince ourselves&lt;br&gt;
that we don't hit any 64-bit overflows later.&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;data&lt;/b&gt;&lt;/font&gt;&amp;nbsp;FieldElement&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;FieldElement&amp;nbsp;{&amp;nbsp;m0&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128,&amp;nbsp;m1&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128,&amp;nbsp;m2&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128,&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m3&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128,&amp;nbsp;m4&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128&amp;nbsp;}&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;deriving&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(Show,&amp;nbsp;Eq)&lt;br&gt;
&lt;br&gt;
Now, two helper functions:&lt;br&gt;
&lt;br&gt;
This function takes only the bottom 51-bits of a value&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;clamp&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&amp;gt;&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;clamp&amp;nbsp;(U128&amp;nbsp;a)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;$&lt;/b&gt;&lt;/font&gt;&amp;nbsp;a&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;.&amp;amp;.&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;0x7ffffffffffff&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;clamp&amp;nbsp;_&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Overflow&lt;br&gt;
&lt;br&gt;
This function drop the bottom 51-bits of a value&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;topBits&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&amp;gt;&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;topBits&amp;nbsp;(U128&amp;nbsp;a)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;$&lt;/b&gt;&lt;/font&gt;&amp;nbsp;a&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;`shiftR`&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;51&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;topBits&amp;nbsp;_&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Overflow&lt;br&gt;
&lt;br&gt;
This function simulates the 'fsquare' function in donna-c64, including its carry&lt;br&gt;
chain. If the carry chain is sufficient, then iterating this function for any&lt;br&gt;
valid initial value should never overflow.&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;square&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&amp;nbsp;FieldElement&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&amp;gt;&lt;/b&gt;&lt;/font&gt;&amp;nbsp;FieldElement&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;square&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;result&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;where&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t0&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m0&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m0&amp;nbsp;e&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t1&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m0&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m1&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m1&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m0&amp;nbsp;e&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t2&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m0&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m2&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m2&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m0&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m1&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m1&amp;nbsp;e&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t3&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m0&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m3&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m3&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m0&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m1&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m2&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m2&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m1&amp;nbsp;e&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t4&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m0&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m4&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m0&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m3&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m1&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m1&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m3&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m2&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m2&amp;nbsp;e&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t5&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m4&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m1&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m1&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m4&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m2&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m3&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m3&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m2&amp;nbsp;e&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t6&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m4&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m2&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m2&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m4&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m3&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m3&amp;nbsp;e&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t7&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m3&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m4&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m3&amp;nbsp;e&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t8&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m4&amp;nbsp;e&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;m4&amp;nbsp;e&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t0' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t0&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t5&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;19&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t1' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t1&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t6&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;19&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t2' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t2&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t7&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;19&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t3' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t3&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t8&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;19&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t1'' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t1' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;topBits&amp;nbsp;t0'&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t2'' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t2' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;topBits&amp;nbsp;t1''&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t3'' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t3' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;topBits&amp;nbsp;t2''&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t4' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t4&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;topBits&amp;nbsp;t3''&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t0'' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t0' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#00cd00&quot;&gt;19&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/font&gt;&amp;nbsp;topBits&amp;nbsp;t4'&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; t1''' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;clamp&amp;nbsp;t1'' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;topBits&amp;nbsp;t0''&lt;br&gt;
&lt;br&gt;
At this point, we implement two carry chains. If 'currentChain' is true, then we&lt;br&gt;
implement the carry chain as currently written in donna-c64. Otherwise, we&lt;br&gt;
perform an extra step and carry t1 into t2.&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; result&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;currentChain&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;then&lt;/b&gt;&lt;/font&gt;&amp;nbsp;FieldElement&amp;nbsp;(clamp&amp;nbsp;t0'')&amp;nbsp;t1''' (clamp&amp;nbsp;t2'')&amp;nbsp;(clamp&amp;nbsp;t3'')&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (clamp&amp;nbsp;t4')&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt;&amp;nbsp;FieldElement&amp;nbsp;(clamp&amp;nbsp;t0'')&amp;nbsp;(clamp&amp;nbsp;t1''')&amp;nbsp;t2''' (clamp&amp;nbsp;t3'')&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (clamp&amp;nbsp;t4')&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;where&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t2''' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;clamp&amp;nbsp;t2'' &lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/font&gt;&amp;nbsp;topBits&amp;nbsp;t1'''&lt;br&gt;
&lt;br&gt;
This is the maximum initial element: an element where all limbs are 2^51 - 1.&lt;br&gt;
Inspection of the 'fexpand' function should be sufficient to convince oneself of&lt;br&gt;
this.&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;maxInitialElement&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&amp;nbsp;FieldElement&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;maxInitialElement&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;FieldElement&amp;nbsp;twoFiftyOneMinusOne&amp;nbsp;twoFiftyOneMinusOne&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;twoFiftyOneMinusOne&amp;nbsp;twoFiftyOneMinusOne&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;twoFiftyOneMinusOne&lt;br&gt;
&lt;br&gt;
This function takes two field elements and returns the worst case result: one&lt;br&gt;
where the maximum of each limb is chosen.&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;elementWiseMax&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&amp;nbsp;FieldElement&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&amp;gt;&lt;/b&gt;&lt;/font&gt;&amp;nbsp;FieldElement&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&amp;gt;&lt;/b&gt;&lt;/font&gt;&amp;nbsp;FieldElement&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;elementWiseMax&amp;nbsp;x&amp;nbsp;y&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;FieldElement&amp;nbsp;(f&amp;nbsp;m0)&amp;nbsp;(f&amp;nbsp;m1)&amp;nbsp;(f&amp;nbsp;m2)&amp;nbsp;(f&amp;nbsp;m3)&amp;nbsp;(f&amp;nbsp;m4)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;where&lt;/b&gt;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; f&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(FieldElement&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&amp;gt;&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128)&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;-&amp;gt;&lt;/b&gt;&lt;/font&gt;&amp;nbsp;U128&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; f&amp;nbsp;accessor&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;max&amp;nbsp;(accessor&amp;nbsp;x)&amp;nbsp;(accessor&amp;nbsp;y)&lt;br&gt;
&lt;br&gt;
We now define a series of values generated by squaring the previous element and&lt;br&gt;
setting any limb that is less than the maximum to the maximum value.&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;maxSeries&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;iterate&amp;nbsp;(elementWiseMax&amp;nbsp;maxInitialElement&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;.&lt;/b&gt;&lt;/font&gt;&amp;nbsp;square)&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; maxInitialElement&lt;br&gt;
&lt;br&gt;
This value controls which carry chain is used in 'square', the current one or&lt;br&gt;
the one with the extra carry&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#ee0000&quot;&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;currentChain&amp;nbsp;&lt;font color=&quot;#0000ff&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;True&lt;br&gt;
&lt;br&gt;
By running this, we can see that the current carry chain is insufficient for&lt;br&gt;
this simulation:&lt;br&gt;
&lt;br&gt;
ghci&amp;gt; maxSeries !! 4&lt;br&gt;
FieldElement {m0 = Overflow, m1 = Overflow, m2 = Overflow, m3 = Overflow,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 = Overflow}&lt;br&gt;
&lt;br&gt;
The series overflows after only four iterations. However, if we use the&lt;br&gt;
alternative carry chain, the series is stable far beyound the requirements of&lt;br&gt;
the Montgomery ladder used in donna-c64:&lt;br&gt;
&lt;br&gt;
ghci&amp;gt; maxSeries !! 100000&lt;br&gt;
FieldElement {m0 = U128 2251799813685247, m1 = U128 2251799813685247,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m2 = U128 2251799813685247, m3 = U128 2251799813685247,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m4 = U128 2251799813685247}&lt;br&gt;
&lt;br&gt;
Additionally, these values are small enough not to overflow the 64-limb limbs.&lt;br&gt;
&lt;/font&gt;</content>
 </entry>
 
 <entry>
   <title>Packet sizes in DNSSEC</title>
   <link href="http://www.imperialviolet.org/2009/03/08/packet-sizes-in-dnssec.html"/>
   <updated>2009-03-08T00:00:00-08:00</updated>
   <id>http://www.imperialviolet.org/2009/03/08/packet-sizes-in-dnssec</id>
   <content type="html">



&lt;p&gt;Even when the DNS root hasn't started signing records, one can still use
trust-anchors to employ DNSSEC for those TLDs which support it. Follow the
links from Ben Laurie's &lt;a href=&quot;http://www.links.org/?p=574&quot;&gt;latest blog post&lt;/a&gt;
on the matter.&lt;/p&gt;

&lt;p&gt;The &lt;tt&gt;.se&lt;/tt&gt; ccTLD is one of those TLDs which support DNSSEC. You can
test it with: &lt;tt&gt;dig +dnssec -t any se @a.ns.se&lt;/tt&gt;. You'll see lots of NSEC,
RRSIG and DNSKEY records. (DNSSEC is very complicated.)&lt;/p&gt;

&lt;p&gt;However, the size of that reply is 3974 bytes long! All that from a request
packet of 31 bytes. That's a very easy to use 100x DoS amplication. Of course,
if you use mirror amplication like that, you cannot forge the source addresses
of the flooding packets, making the flood easier to filter. However, DNSSEC may
well bring DoS floods into the reach of many more attackers.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>When I wrote curve25519-d...</title>
   <link href="http://www.imperialviolet.org/2009/03/08/when-i-wrote-curve25519d.html"/>
   <updated>2009-03-08T00:00:00-08:00</updated>
   <id>http://www.imperialviolet.org/2009/03/08/when-i-wrote-curve25519d</id>
   <content type="html">

&lt;p&gt;When I wrote &lt;a href=&quot;http://code.google.com/p/curve25519-donna/&quot;&gt;curve25519-donna&lt;/a&gt; I implemented many of the critical functions in x86-64 assembly. It was a &lt;a href=&quot;http://github.com/agl/curve25519-donna/blob/fab6b1b0221b08474f1726875c24461520565593/curve25519-donna-x86-64.s&quot;&gt;lot of code&lt;/a&gt;, even using the C preprocessor! This got a good 20% boost in speed. This was clearly very important because it made &lt;tt&gt;donna-x86-64&lt;/tt&gt; faster than djb's version &lt;img src=&quot;smile.png&quot;&gt;.&lt;/p&gt;

&lt;p&gt;However, djb just pointed out that the 64-bit C implementation of donna was now as fast as my hand coded version. Turns out that GCC 4.3 greatly improved the quality of the code generation for this sort of code and now equals my hand crafted efforts! Well done to the GCC team because the C code is vastly smaller and easier to understand. Thus, the &lt;tt&gt;x86-64&lt;/tt&gt; of donna has been removed from the repo.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>When Layers of Abstractio...</title>
   <link href="http://www.imperialviolet.org/2009/02/22/when-layers-of-abstractio.html"/>
   <updated>2009-02-22T00:00:00-08:00</updated>
   <id>http://www.imperialviolet.org/2009/02/22/when-layers-of-abstractio</id>
   <content type="html">

&lt;p&gt;&lt;a href=&quot;http://www.lightbluetouchpaper.org/2009/02/20/when-layers-of-abstraction-dont-get-along-the-difficulty-of-fixing-cache-side-channel-vulnerabilities/&quot;&gt;When Layers of Abstraction Don't Get Along: The Difficulty of Fixing Cache Side-Channel Vulnerabilities&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 

</feed>
