Zooko forwarded a hash question over to the SHA-3 competition mailing list, and
mentioned the discussion that has been going on here. He's going to forward
over comments that I made and John Kelsey made. Nonetheless, I'd like to offer
some comments on what I've read in a larger context.
I don't see any discussions of requirements, goals, or anything like that. I
see discussions of what hash function to use, ECC, symmetric modes, and so on,
and yet no reasons why you would do anything. If you don't have requirements,
you aren't going to get a good answer. Any of those proposed solutions needs to
have an answer to the question "What is this trying to solve?" at the very
least. The next question should be, "How does it solve it?"
Protocols are almost never broken because of the crypto. That's not the
problem. Tor as a protocol and as a *service* has many things it needs to worry
about long before you should worry about the crypto. Don't lose sight of the
real issues. Trust me, they aren't the crypto. You need to stick to
well-understood ciphers. Do not be frightened by warts on a function. The
property of being well-understood means that it will have warts.
Additionally, you should stick to well-recognized constructions, too. The main
reason is that warts and all, we know most about these things. The alternatives
frequently either have different warts, or have unknown warts that will bite
you in the ass when they're finally found. Moreover, Tor is an important
protocol, service, and system. If you use a weird-ass construction, then a flaw
in that will be publicized as a flaw in Tor. If someone finds a non-important
problem in AES or SHA256, you'll be shielded by ubiquity. If you use the
Whizzy2^n-1 whatever, then when a problem is found in it, that will hit the
press as "FLAW FOUND IN TOR! EVERYONE RUN FOR THEIR LIVES!" and you'll be left
defending it yourself. The crypto elders will also cluck their tongues and say,
"Yeah, they really should have used what NIST documented in SP 800-9999."
Lastly on that, Tor is no important that you'll be a target. People *will*
target Tor because a teenie, tiny, unimportant break in Tor is a g
uaranteed paper acceptance in Usenix Security or Eurocrypt. Anonymity loves
crowds; so do cryptographers.
Here are some specifics:
* Hash functions. Zooko will forward my full response, the summary of which is
to use SHA-2 in whatever length or form. Should you not want to do that, why?
What are you after? Speed? How much speed? Again, I don't see what you're
trying to solve, but I'll recommend using Skein if you don't like SHA-2. I'm a
co-designer of it, for full disclosure.
Skein is secure, fast (under 7 clocks per byte on x64, and at 15.5 on armv7),
and has lots of Swiss Army Knife features. You can use it as a KDF, PRNG, and
so on. It has a one-pass MAC that has a proof of security on it, so it is a
valuable alternative to HMAC. ZRTP is using Skein's MAC to speed up VOIP
encryption as an alternative to HMAC (more full disclosure, I'm a co-author of
ZRTP, too, but Phil Z had to talk me into it, and he had real performance goals
to meet).
However, the safe, sane thing to do is use SHA-256.
* ECC. I don't see a reason why you're looking at it; my remark isn't code for
thinking it's a bad idea, it means I don't see *reasons*, and yeah, yeah, I
keep harping on that.
ECC can be faster than RSA. But sometimes it isn't. I have seen RSA 1280
running at 10x the speed of P-256. Note that P-256 has the security properties
of RSA 3072, so it's not comparing apples to apples. But I'll bet that Tor
could run for the next five years on RSA 1280 or RSA 1536, and punt the problem
into the future. It is my gut feel that if you migrate to 256 bit ECC from RSA
1024, you will see a performance drop. Nonetheless, you need to move from RSA
1024 to *something*. I am just noting that from a performance standpoint,
you're not at the place where ECC is clearly better yet. Yet.
Now on the other hand, ECC is the wave of the future and why not bite the
bullet now? The patent issues are still thorny and that's another reason to
punt the decision into the future. The major ECC patents started expiring this
last summer, and if you delay the decision for three to five years, it'll be
pretty much a non-issue. On the other, other hand, I don't think the Tor
project has a lot to worry about. It is unlikely that RIM/Certicom will come
after Tor. Heck, they are as likely to donate a license to the project as
anything else. The IP issues shouldn't be much of a concern, but if they are --
wait. I see no requirements that say why you need ECC, and as I've said, you
might find that ECC is slower than RSA 1280 or 1536.
Should you go to ECC, use P-256; do not use some variant of 25519. You want to
be in a crowd. You want to use something that lots of smart people have looked
at. That means P-256. For *any* counter argument, please supply the requirement
or goal that makes P-256 the inferior choice, preferably with a metric. Absent
such, P-256 is your baby.
* Stream ciphers. For a stream cipher, you should be doing at AES-CTR. Really.
Stop worrying about the warts. There are hardware implementations with AES-NI,
or attached hardware that don't have problems. ArmV8 has AES in hardware along
with SHA256, which another reason to stick to the well-understood. AES-NI on an
x64 processor runs at under 1 clock per byte. That's all goodness.
If, for some reason, you really, really want to go off on a limb, then look
seriously at counter mode with either Twofish or Serpent, as they're likely the
next best-understood algorithms there are. However, there's not a lot of glory
in breaking them, so they haven't seen nearly as much work. Ditto for any
eStream cipher. If you must be trendy, then heck, please look at Threefish,
which runs twice as fast as AES and is inherently tweakable (note again, that
I'm a co-designer). But really, just use AES-CTR.
GCM is an alternative, but I'd use CTR and an HMAC, myself, especially since
you don't seem to have performance goals that are driving it. As others have
noted, it's really tetchy to use correctly, and there are limits on the
security it gives you. There is a 128-bit hardware multiply in the same Intel
processors that have AES-NI to speed it up, but I'd stick to the tried-and-true
HMAC, absent reasons with metrics.
Whatever you do, please do not do something as gosh-darned daft as XOR two
keystreams together. The crypto is not the problem, and every time someone
tries to do something like that to strengthen the crypto it all ends up with
someone's eye out.
* Random number generators. You're bikeshedding. Any of those are great things
to do, and there's no reason why continuing with what you've been doing (yeah,
throw in more entropy sources, it never hurts) is wrong or suboptimal.
Whatever. Do what you want, but I think you have bigger fish to fry.
* Fingerprints. Also a reasonable discussion of what color the shed should be.
My sole comment is that the gods punish hubris, and coding your hash function
into two bits is hubris. One of the major lessons of the obsessive
bit-conservation that PGP did is that you write more code and make more bugs
saving those bits than the bits were worth. If you use something smaller than a
byte, you will regret it.
* Other comments. In the relay crypto comments, there was something about
counter "in a less scary mode" -- just use what they describe in NIST
SP800-whatever.
Okay, that's it for me.
Regards,
Jon
_______________________________________________
tor-dev mailing list
[email protected]
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-dev