<?xml version="1.0"?>

<rss version="2.0">
  <channel>
    <title>Imperialviolet</title>
    <link>http://www.imperialviolet.org</link>
    <description>Adam Langley's Weblog</description>
    <language>en-us</language>
    <lastBuildDate>Tue, 08 Jul 2008 05:55:08 BST</lastBuildDate>
<item><link>http://imperialviolet.org/page30.html#e593</link><pubDate>Tue, 08 Jul 2008 04:55:00 GMT</pubDate><title>Entry 593</title><link>http://imperialviolet.org/page30.html#e593</link><description>
&lt;p&gt;Google has, at last, open sourced &lt;a href=&quot;http://code.google.com/p/protobuf/&quot;&gt;Protocol buffers&lt;/a&gt;. My, very minor contribution to this is that I wrote the basis for the &lt;a href=&quot;http://code.google.com/apis/protocolbuffers/docs/encoding.html&quot;&gt;encoding documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Protocol buffers pretty much hit the sweet spot of complexity and capability. (See XML and ASN.1 for examples of attempts which missed.) I have the beginnings of a protocol buffer compiler for Haskell that I wrote for internal apps. Now that the C/Java/Python versions are out, I should probably clean that up and put it on Hackage. But every coder should consider protocol buffers for their serialisation needs from now on.&lt;/p&gt;
</description></item><item><link>http://imperialviolet.org/page30.html#e592</link><pubDate>Wed, 02 Jul 2008 03:31:14 GMT</pubDate><title>Entry 592</title><link>http://imperialviolet.org/page30.html#e592</link><description>
&lt;p&gt;Firstly, if you're wondering what happened to all the ObsTCP stuff, it didn't disappear, it just moved &lt;a href=&quot;http://obstcp.blogspot.com&quot;&gt;to a different blog&lt;/a&gt;. Things are still moving as fast as I can push them.&lt;/p&gt;

&lt;h6&gt;The Black Swan&lt;/h6&gt;

&lt;p&gt;(&lt;i&gt;ISBN: 1400063515&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;This book has some good, if unoriginal, points about the stupidity of much of the modeling done in today's world, esp the world of finance. Sadly, these are hidden in many pages of self-centered rambling and discourse on adventitious topics. If you're thinking of buying this book, get The (Mis)behaviour of Markets by Mandelbrot instead; you'll thank me.&lt;/p&gt;
</description></item><item><link>http://imperialviolet.org/page30.html#e591</link><pubDate>Wed, 11 Jun 2008 20:00:39 GMT</pubDate><title>Entry 591</title><link>http://imperialviolet.org/page30.html#e591</link><description>
&lt;p&gt;I've added a bunch of Obsfucated TCP stuff to the &lt;a href=&quot;http://code.google.com/p/obstcp/&quot;&gt;obstcp project page&lt;/a&gt; &lt;tt&gt;code.google.com&lt;/tt&gt; include kernel patches, userland tools, specs and friendly introductions.&lt;/p&gt;

&lt;p&gt;Also, I &lt;a href=&quot;http://www.reddit.com/r/programming/info/6mz7x/comments/&quot;&gt;posted it to Reddit&lt;/a&gt;. If it doesn't get downvoted into /dev/null in 60 seconds, the comments will probably end up there.&lt;/p&gt;
</description></item><item><link>http://imperialviolet.org/page30.html#e590</link><pubDate>Tue, 27 May 2008 16:52:20 GMT</pubDate><title>Entry 590</title><link>http://imperialviolet.org/page30.html#e590</link><description>
&lt;h6&gt;OpenID - not actually spawn of Satan&lt;/h6&gt;

&lt;p&gt;A &lt;a href=&quot;http://idcorner.org/2007/08/22/the-problems-with-openid/&quot;&gt;blog
post aggregating complaints about OpenID&lt;/a&gt; has been popping up in different
places this morning. If you've read it, you might want a little perspective.
I'm not going to deal with each point in turn because there's so many, mostly
repeating each other.&lt;/p&gt;

&lt;h6&gt;Phishing&lt;/h6&gt;

&lt;p&gt;At login time, the site that you're logging into can end up redirecting you
  to your OpenID provider. Your provider then tells you to go to their site and
  enter your login information, then click a button to try again. They don't
  provide a &quot;link&quot; to their site and they don't ask for your password.&lt;/p&gt;

&lt;p&gt;Some early providers might not have followed these basic steps, but all &lt;a
href=&quot;https://www.myopenid.com/&quot;&gt;the reasonable ones&lt;/a&gt; do.&lt;/p&gt;

&lt;p&gt;Yes, it's still possible for users to be confused but, by habit they'll be
used to doing to right thing.&lt;/p&gt;

&lt;h6&gt;XSS and CSRF&lt;/h6&gt;

&lt;p&gt;XSS problems on the providers site are a big deal. This criticism is
reasonable.&lt;/p&gt;

&lt;p&gt;CSRF may be a bigger deal because you are more likely to be 'logged in' to
the target. However, most users already keep persistent cookies to save logging
into these sites. The additional attack surface here is dubious; CSRF issues
are a problem with or without OpenID.&lt;/p&gt;

&lt;h6&gt;DNS poisoning&lt;/h6&gt;

&lt;p&gt;If your OpenID starts with &lt;tt&gt;https://&lt;/tt&gt;, you should be protected from
DNS poisoning attacks and the like by the usual TLS PKI. This isn't perfect,
but it's pretty good.&lt;/p&gt;

&lt;p&gt;However, the OpenID spec says that plain domain names are normalised by
prepending &lt;tt&gt;http://&lt;/tt&gt;. This is a technical problem with the spec and
should be fixed. Until then, this is a reasonable criticism but not a
fundamental issue.&lt;/p&gt;

&lt;h6&gt;Privacy&lt;/h6&gt;

&lt;p&gt;The OpenID provider has a lot of information about your activities. This is
little different than, say, your email account and many people are happy with
Gmail. Likewise, password recovery on most of the sites which could use OpenID
is based on email access, so most people already have a single password that
suffices for entry to many sites.&lt;/p&gt;

&lt;p&gt;If you don't like the idea of Gmail you can run your own email server.
Likewise, you can run your own OpenID provider.&lt;/p&gt;

&lt;p&gt;Using the same OpenID on many sites does allow them to link your activities.
So does giving these sites your email address for password recovery. So does
using the same IP (although to a lesser extent).&lt;/p&gt;

&lt;p&gt;Some providers will let you have many OpenIDs linked to the same account for
this reason. Joe user probably won't use that feature and probably gives the
same email address to all those sites already and so looses nothing.&lt;/p&gt;

&lt;h6&gt;Trust problems&lt;/h6&gt;

&lt;p&gt;OpenID is not a trust system. Trust systems may be built on top of identity
systems. Likewise, apples are not oranges and complaints about their lack of
tangyness are moot.&lt;/p&gt;

&lt;h6&gt;Usability / Adoption&lt;/h6&gt;

&lt;p&gt;Somewhat valid points here. It's a big job to get widespread adoption and,
at the moment, it's a pretty small crowd that uses OpenID. However, OpenID
doesn't need a flag day; it can have incremental deployment.&lt;/p&gt;

&lt;h6&gt;Availability&lt;/h6&gt;

&lt;p&gt;Valid points. If your provider goes down you're going to have a bad day.&lt;/p&gt;

&lt;h6&gt;Conclusion&lt;/h6&gt;

&lt;p&gt;I don't believe that OpenID should be used to login to your bank account.
However, for the myriad of sites that I login to (Google Reader, reddit, ...)
it would be nice to just be able to type my OpenID in. It's decently suited to
that because I'm fed up with all these accounts.&lt;/p&gt;
</description></item><item><link>http://imperialviolet.org/page30.html#e589</link><pubDate>Wed, 21 May 2008 03:48:46 GMT</pubDate><title>Entry 589</title><link>http://imperialviolet.org/page30.html#e589</link><description>
&lt;p&gt;I'm now running a Ubuntu based laptop with a somewhat functions Obsfucated TCP patch in its kernel. (If you have a Neo like view of the Internets you'll be able to see it by the funny options in the SYN packets.)&lt;/p&gt;

&lt;p&gt;Hopefully soon I'll be able to post a first draft patch for other people to try. In the mean time, I wrote the start of the mounds of documentation I suspect it'll need: &lt;a href=&quot;http://code.google.com/p/obstcp/wiki/Introduction&quot;&gt;a very non-technical introduction&lt;/a&gt;.&lt;/p&gt;
</description></item><item><link>http://imperialviolet.org/page30.html#e588</link><pubDate>Thu, 01 May 2008 03:55:31 GMT</pubDate><title>Entry 588</title><link>http://imperialviolet.org/page30.html#e588</link><description>
&lt;p&gt;I've updated the patches linked to in the last post with today's work. Both
sides now end up with the same shared key (and not just because they got the
same private key from lack of entropy like before). That took some fun tracking
down of bugs.&lt;/p&gt;

&lt;p&gt;Also, packets are now HMAC-MD5'ed with the shared key, and invalid packets
are dropped. That also took far longer than expected. I ended up using the MD5
implementation from the CIFS filesystem because the kernel's crypto library is
just plain terrible. It's also totally undocumented but, from what I can see,
you can't lookup an algorithm without taking a semaphore, and that requires
that you be able to sleep. I almost think I must be missing something because
that's dumber than the bastard offspring of Randy Hickey and Jade Goodie.&lt;/p&gt;

&lt;p&gt;But there we go. Encryption (with Salsa20) to come next Wednesday.&lt;/p&gt;
</description></item><item><link>http://imperialviolet.org/page30.html#e587</link><pubDate>Thu, 24 Apr 2008 03:20:41 GMT</pubDate><title>Entry 587</title><link>http://imperialviolet.org/page30.html#e587</link><description>
&lt;h6&gt;First Obsfucated TCP patches&lt;/h6&gt;

&lt;p&gt;After a day of kernel hacking, I have a few patches which, together, make a
start towards implementing ObsTCP.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add support for Jumbo TCP options, as documented &lt;a href=&quot;/binary/jumbo-tcp-options.html&quot;&gt;here&lt;/a&gt;: &lt;a href=&quot;/binary/obstcp/tcp-jumbo-options&quot;&gt;&lt;tt&gt;tcp-jumbo-options.patch&lt;/tt&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Add curve25519: &lt;a href=&quot;/binary/obstcp/curve25519&quot;&gt;&lt;tt&gt;curve25519.patch&lt;/tt&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Some ObsTCP work: &lt;a href=&quot;/binary/obstcp/tcp-obsfucated-tcp&quot;&gt;&lt;tt&gt;tcp-obsfucated-tcp.patch&lt;/tt&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the moment, it will advertise ObsTCP on all connections and, if you have
two kernels which support it, you'll get a shared key setup. At the moment, the
private key is generated at boot time and since the host doesn't have any
entropy then, it's always the same. So I'll have to do something special there.
Also, I've a problem where the ACK with the connecting host's public key can
get lost. Since ACKs aren't ACKed, this can be a real pain. I think I need to
include it in every transmitted packet until (yet another) option signifies
that it's been received.&lt;/p&gt;
</description></item><item><link>http://imperialviolet.org/page30.html#e586</link><pubDate>Wed, 16 Apr 2008 22:13:37 GMT</pubDate><title>Entry 586</title><link>http://imperialviolet.org/page30.html#e586</link><description>
&lt;p&gt;After the last post explained why small curves aren't good enough for obsfucated TCP, I decided that, since I'm going to have to do some damage to the TCP header to get a bigger public key in there anyway, I might as well go the whole way and use &lt;a href=&quot;http://cr.yp.to/ecdh.html&quot;&gt;curve25519&lt;/a&gt;, by djb. Now, djb has forgotten more about elliptic curves than I'll ever know and I feel much happier using a curve that's been designed by him. As you can probably guess from the name, it's a curve over 2&lt;sup&gt;255&lt;/sup&gt;-19 - a prime. So the public keys are 32 bytes long.&lt;/p&gt;

&lt;p&gt;In order to get that much public key material into a TCP header, here's my proposed hack: &lt;a href=&quot;/binary/jumbo-tcp-options.html&quot;&gt;Jumbo TCP options&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;djb's sample implementation of curve25519 is written in a special assembly language called &lt;a href=&quot;http://cr.yp.to/qhasm.html&quot;&gt;qhasm&lt;/a&gt;. Sadly, it's so alpha that he's not actually released it. So the sample implementation is for ia32 only, uses the floating point registers and has 5100 lines of uncommented assembly. It is, however, freaking quick.&lt;/p&gt;

&lt;p&gt;However, since I have kernel-space in mind for this I've written a C implementation. It's about 1/3 the speed (and I've not really tried to optimise it yet), doesn't use any floating point (since kernel-space doesn't have easy access to the fp registers in Linux) and fuzz testing seems to indicate that it's correct. (At least, it's giving the same answers as djb's code.)&lt;/p&gt;

&lt;p&gt;Next step: hacking up the kernel. (And I thought the elliptic curve maths was hard enough.)&lt;/p&gt;
</description></item><item><link>http://imperialviolet.org/page30.html#e585</link><pubDate>Wed, 09 Apr 2008 05:14:54 GMT</pubDate><title>Entry 585</title><link>http://imperialviolet.org/page30.html#e585</link><description>
&lt;h6&gt;Elliptic curves don't work either&lt;/h6&gt;

&lt;p&gt;(For context, see &lt;a href=&quot;http://www.imperialviolet.org/page30.html#e580&quot;&gt;my previous post on OTCP&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;In any Diffie-Hellman exchange based on elliptic curves, we have
&lt;i&gt;Q=aP&lt;/i&gt; where &lt;i&gt;P&lt;/i&gt; and &lt;i&gt;Q&lt;/i&gt; are points on an elliptic curve. The
operation of multiplying a point and a scalar is well defined, but unimportant
here. The problem facing the attacker is, given &lt;i&gt;Q&lt;/i&gt; and &lt;i&gt;P&lt;/i&gt;, find
&lt;i&gt;a&lt;/i&gt;. If they can do that, we're sunk.&lt;/p&gt;

&lt;p&gt;If you could find a pair of numbers such that: &lt;i&gt;cP + dQ = eP + fQ&lt;/i&gt; then
you're done because: &lt;i&gt;(c-e)P = (f-d)Q = (f-d)aP&lt;/i&gt;, then &lt;i&gt;a =
(c-e)/(f-d) &lt;i&gt;mod&lt;/i&gt; n&lt;/i&gt;, where &lt;i&gt;n&lt;/i&gt; is the size of the field
underlying the curve.&lt;/p&gt;

&lt;p&gt;Finding such a point by picking random examples is never going to work
because of the storage requirements. However, if you define a step function
which takes a pair &lt;i&gt;(c, d)&lt;/i&gt; and produces a new pair &lt;i&gt;(c', d')&lt;/i&gt; you
have defined a cycle through the search space. (It must be a cycle because the
search space is finite. At some point you must hit a previous state and loop
forever.) Now you can use &lt;a
href=&quot;http://en.wikipedia.org/wiki/Cycle_detection&quot;&gt;Floyd's cycle finding
algorithm&lt;/a&gt; to find a collision with constant space. This is an &amp;radic;n
algorithm for breaking this problem and is well known as Pollard's rho method.&lt;/p&gt;

&lt;p&gt;Now, if you have many of these problems you get a big speed up by using some
storage. Assume that you do the legwork to solve an instance of the problem and
that you record some fraction of the points that you evaluated. (How you choose
the points isn't important so long as it's a function of the point; say pick
all points where the first &lt;i&gt;m&lt;/i&gt; bits are zero.)&lt;/p&gt;

&lt;p&gt;Now, future attempts to break the problem can collide with one of the
previous points. If you find &lt;i&gt;cP + dQ = eP + fR&lt;/i&gt; (note that P is a
constant of the elliptic curve system) and also that &lt;i&gt;R = bP&lt;/i&gt; (because we
solved this instance previously) then &lt;i&gt;cP + dQ = cP + adP = (e+fb)P&lt;/i&gt; and
so &lt;i&gt;(c-(e+fb)) / d = a&lt;/i&gt; (and we know all the values on the left-hand side).&lt;/p&gt;

&lt;p&gt;Now, 2&lt;sup&gt;112&lt;/sup&gt; (14 bytes) is about as big an elliptic curve point as we can fit
in a TCP header. The maximum options payload is 40 bytes, of which 20 are
already taken up in modern TCP stacks. We need 2 bytes of fluff per option and,
unless we want this to be the last TCP header ever, we need to leave at least 4
bytes. That's where the 14 byte limit comes from.&lt;/p&gt;

&lt;p&gt;We give the attacker 2&lt;sup&gt;50&lt;/sup&gt; bytes of space.  I believe that
each point will take 3*14 bytes of space for the (c,d,Y) triple, where
&lt;i&gt;Y = cP+dQ&lt;/i&gt;. Thus they can store 2&lt;sup&gt;44&lt;/sup&gt; distinguished points. Thus
one in 2&lt;sup&gt;56-44=12&lt;/sup&gt; points are distinguished. Additionally, generating those
2&lt;sup&gt;44&lt;/sup&gt; points isn't that hard, computationally. This suggests that an
attacker can find a collision in only 2&lt;sup&gt;12&lt;/sup&gt; iterations., or about
2&lt;sup&gt;13&lt;/sup&gt; field multiplications.&lt;/p&gt;

&lt;p&gt;So, again, a reasonable attacker can break our crypto in real time.&lt;/p&gt;

&lt;p&gt;This scheme becomes much harder to sell if we have to do evil things to the
TCP header in order to make it work.&lt;/p&gt;
</description></item><item><link>http://imperialviolet.org/page30.html#e584</link><pubDate>Thu, 20 Mar 2008 17:25:04 GMT</pubDate><title>Entry 584</title><link>http://imperialviolet.org/page30.html#e584</link><description>
&lt;p&gt;If you've been wondering what I'm up to at work, we now have a &lt;a href=&quot;http://rechargeit.blogspot.com&quot;&gt;public blog for the RechargeIt project&lt;/a&gt;.&lt;/p&gt;
</description></item></channel></rss>