All of lore.kernel.org
 help / color / mirror / Atom feed
From: "George Spelvin" <linux@sciencehorizons.net>
To: Jason@zx2c4.com, linux@sciencehorizons.net
Cc: ak@linux.intel.com, davem@davemloft.net, David.Laight@aculab.com,
	djb@cr.yp.to, ebiggers3@gmail.com, hannes@stressinduktion.org,
	jeanphilippe.aumasson@gmail.com,
	kernel-hardening@lists.openwall.com,
	linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org,
	luto@amacapital.net, netdev@vger.kernel.org, tom@herbertland.com,
	torvalds@linux-foundation.org, tytso@mit.edu,
	vegard.nossum@gmail.com
Subject: Re: [PATCH v5 1/4] siphash: add cryptographically secure PRF
Date: 16 Dec 2016 18:44:08 -0500	[thread overview]
Message-ID: <20161216234408.30174.qmail@ns.sciencehorizons.net> (raw)
In-Reply-To: <CAHmME9oEhmqW3320Ch+Rczu_=CxQyUQXCGLnYjDm-CYbWugnSw@mail.gmail.com>

> 64-bit security for an RNG is not reasonable even with rekeying. No no
> no. Considering we already have a massive speed-up here with the
> secure version, there's zero reason to start weakening the security
> because we're trigger happy with our benchmarks. No no no.

Just to clarify, I was discussing the idea with Ted (who's in charge of
the whole thing, not me), not trying to make any sort of final decision
on the subject.  I need to look at the various users (46 non-trivial ones
for get_random_int, 15 for get_random_long) and see what their security
requirements actually are.

I'm also trying to see if HalfSipHash can be used in a way that gives
slightly more than 64 bits of effective security.

The problem is that the old MD5-based transform had unclear, but
obviously ample, security.  There were 64 bytes of global secret and
16 chaining bytes per CPU.  Adapting SipHash (even the full version)
takes more thinking.

An actual HalfSipHash-based equivalent to the existing code would be:

#define RANDOM_INT_WORDS (64 / sizeof(long))	/* 16 or 8 */

static u32 random_int_secret[RANDOM_INT_WORDS]
	____cacheline_aligned __read_mostly;
static DEFINE_PER_CPU(unsigned long[4], get_random_int_hash)
		__aligned(sizeof(unsigned long));

unsigned long get_random_long(void)
{
	unsigned long *hash = get_cpu_var(get_random_int_hash);
	unsigned long v0 = hash[0], v1 = hash[1], v2 = hash[2], v3 = hash[3];
	int i;

	/* This could be improved, but it's equivalent */
	v0 += current->pid + jiffies + random_get_entropy();

	for (i = 0; i < RANDOM_INT_WORDS; i++) {
		v3 ^= random_int_secret[i];
		HSIPROUND;
		HSIPROUND;
		v0 ^= random_int_secret[i];
	}
	/* To be equivalent, we *don't* finalize the transform */

	hash[0] = v0; hash[1] = v1; hash[2] = v2; hash[3] = v3;
	put_cpu_var(get_random_int_hash);

	return v0 ^ v1 ^ v2 ^ v3;
}

I don't think there's a 2^64 attack on that.

But 64 bytes of global secret is ridiculous if the hash function
doesn't require that minimum block size.  It'll take some thinking.


Ths advice I'd give now is:
- Implement
unsigned long hsiphash(const void *data, size_t len, const unsigned long key[2])
  .. as SipHash on 64-bit (maybe SipHash-1-3, still being discussed) and
  HalfSipHash on 32-bit.
- Document when it may or may not be used carefully.
- #define get_random_int (unsigned)get_random_long
- Ted, Andy Lutorminski and I will try to figure out a construction of
  get_random_long() that we all like.


('scuse me for a few hours, I have some unrelated things I really *should*
be working on...)

WARNING: multiple messages have this Message-ID (diff)
From: "George Spelvin" <linux@sciencehorizons.net>
To: Jason@zx2c4.com, linux@sciencehorizons.net
Cc: ak@linux.intel.com, davem@davemloft.net, David.Laight@aculab.com,
	djb@cr.yp.to, ebiggers3@gmail.com, hannes@stressinduktion.org,
	jeanphilippe.aumasson@gmail.com,
	kernel-hardening@lists.openwall.com,
	linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org,
	luto@amacapital.net, netdev@vger.kernel.org, tom@herbertland.com,
	torvalds@linux-foundation.org, tytso@mit.edu,
	vegard.nossum@gmail.com
Subject: [kernel-hardening] Re: [PATCH v5 1/4] siphash: add cryptographically secure PRF
Date: 16 Dec 2016 18:44:08 -0500	[thread overview]
Message-ID: <20161216234408.30174.qmail@ns.sciencehorizons.net> (raw)
In-Reply-To: <CAHmME9oEhmqW3320Ch+Rczu_=CxQyUQXCGLnYjDm-CYbWugnSw@mail.gmail.com>

> 64-bit security for an RNG is not reasonable even with rekeying. No no
> no. Considering we already have a massive speed-up here with the
> secure version, there's zero reason to start weakening the security
> because we're trigger happy with our benchmarks. No no no.

Just to clarify, I was discussing the idea with Ted (who's in charge of
the whole thing, not me), not trying to make any sort of final decision
on the subject.  I need to look at the various users (46 non-trivial ones
for get_random_int, 15 for get_random_long) and see what their security
requirements actually are.

I'm also trying to see if HalfSipHash can be used in a way that gives
slightly more than 64 bits of effective security.

The problem is that the old MD5-based transform had unclear, but
obviously ample, security.  There were 64 bytes of global secret and
16 chaining bytes per CPU.  Adapting SipHash (even the full version)
takes more thinking.

An actual HalfSipHash-based equivalent to the existing code would be:

#define RANDOM_INT_WORDS (64 / sizeof(long))	/* 16 or 8 */

static u32 random_int_secret[RANDOM_INT_WORDS]
	____cacheline_aligned __read_mostly;
static DEFINE_PER_CPU(unsigned long[4], get_random_int_hash)
		__aligned(sizeof(unsigned long));

unsigned long get_random_long(void)
{
	unsigned long *hash = get_cpu_var(get_random_int_hash);
	unsigned long v0 = hash[0], v1 = hash[1], v2 = hash[2], v3 = hash[3];
	int i;

	/* This could be improved, but it's equivalent */
	v0 += current->pid + jiffies + random_get_entropy();

	for (i = 0; i < RANDOM_INT_WORDS; i++) {
		v3 ^= random_int_secret[i];
		HSIPROUND;
		HSIPROUND;
		v0 ^= random_int_secret[i];
	}
	/* To be equivalent, we *don't* finalize the transform */

	hash[0] = v0; hash[1] = v1; hash[2] = v2; hash[3] = v3;
	put_cpu_var(get_random_int_hash);

	return v0 ^ v1 ^ v2 ^ v3;
}

I don't think there's a 2^64 attack on that.

But 64 bytes of global secret is ridiculous if the hash function
doesn't require that minimum block size.  It'll take some thinking.


Ths advice I'd give now is:
- Implement
unsigned long hsiphash(const void *data, size_t len, const unsigned long key[2])
  .. as SipHash on 64-bit (maybe SipHash-1-3, still being discussed) and
  HalfSipHash on 32-bit.
- Document when it may or may not be used carefully.
- #define get_random_int (unsigned)get_random_long
- Ted, Andy Lutorminski and I will try to figure out a construction of
  get_random_long() that we all like.


('scuse me for a few hours, I have some unrelated things I really *should*
be working on...)

  reply	other threads:[~2016-12-16 23:44 UTC|newest]

Thread overview: 182+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-15 20:29 [PATCH v5 0/4] The SipHash Patchset Jason A. Donenfeld
2016-12-15 20:29 ` [kernel-hardening] " Jason A. Donenfeld
2016-12-15 20:30 ` [PATCH v5 1/4] siphash: add cryptographically secure PRF Jason A. Donenfeld
2016-12-15 20:30   ` [kernel-hardening] " Jason A. Donenfeld
2016-12-15 22:42   ` George Spelvin
2016-12-15 22:42     ` [kernel-hardening] " George Spelvin
2016-12-15 23:00     ` Jean-Philippe Aumasson
2016-12-15 23:00       ` [kernel-hardening] " Jean-Philippe Aumasson
2016-12-15 23:28       ` George Spelvin
2016-12-15 23:28         ` [kernel-hardening] " George Spelvin
2016-12-16 17:06         ` David Laight
2016-12-16 17:06           ` [kernel-hardening] " David Laight
2016-12-16 17:06           ` David Laight
2016-12-16 17:09           ` Jason A. Donenfeld
2016-12-16 17:09             ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16 17:09             ` Jason A. Donenfeld
2016-12-16  3:46       ` George Spelvin
2016-12-16  3:46         ` [kernel-hardening] " George Spelvin
2016-12-16  8:08         ` Jean-Philippe Aumasson
2016-12-16  8:08           ` [kernel-hardening] " Jean-Philippe Aumasson
2016-12-16 12:39           ` Jason A. Donenfeld
2016-12-16 12:39             ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16 13:22             ` Jean-Philippe Aumasson
2016-12-16 13:22               ` [kernel-hardening] " Jean-Philippe Aumasson
2016-12-16 15:51               ` Jason A. Donenfeld
2016-12-16 15:51                 ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16 17:36                 ` George Spelvin
2016-12-16 17:36                   ` [kernel-hardening] " George Spelvin
2016-12-16 18:00                   ` Jason A. Donenfeld
2016-12-16 18:00                     ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16 20:17                     ` George Spelvin
2016-12-16 20:17                       ` [kernel-hardening] " George Spelvin
2016-12-16 20:43                       ` Theodore Ts'o
2016-12-16 20:43                         ` [kernel-hardening] " Theodore Ts'o
2016-12-16 22:13                         ` George Spelvin
2016-12-16 22:13                           ` [kernel-hardening] " George Spelvin
2016-12-16 22:15                           ` Andy Lutomirski
2016-12-16 22:15                             ` [kernel-hardening] " Andy Lutomirski
2016-12-16 22:15                             ` Andy Lutomirski
2016-12-16 22:18                           ` Jason A. Donenfeld
2016-12-16 22:18                             ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16 23:44                             ` George Spelvin [this message]
2016-12-16 23:44                               ` George Spelvin
2016-12-17  1:39                               ` Jason A. Donenfeld
2016-12-17  1:39                                 ` [kernel-hardening] " Jason A. Donenfeld
2016-12-17  2:15                                 ` George Spelvin
2016-12-17  2:15                                   ` [kernel-hardening] " George Spelvin
2016-12-17 15:41                                   ` Theodore Ts'o
2016-12-17 15:41                                     ` [kernel-hardening] " Theodore Ts'o
2016-12-17 16:14                                     ` Jeffrey Walton
2016-12-17 16:14                                       ` [kernel-hardening] " Jeffrey Walton
2016-12-19 17:21                                     ` Jason A. Donenfeld
2016-12-17 12:42                 ` George Spelvin
2016-12-17 12:42                   ` [kernel-hardening] " George Spelvin
2016-12-16 20:39               ` Jason A. Donenfeld
2016-12-16 20:39                 ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16 19:47             ` Tom Herbert
2016-12-16 19:47               ` [kernel-hardening] " Tom Herbert
2016-12-16 20:41               ` George Spelvin
2016-12-16 20:41                 ` [kernel-hardening] " George Spelvin
2016-12-16 20:57                 ` Tom Herbert
2016-12-16 20:57                   ` [kernel-hardening] " Tom Herbert
2016-12-16 20:44               ` Daniel Micay
2016-12-16 20:44                 ` [kernel-hardening] " Daniel Micay
2016-12-16 21:09                 ` Jason A. Donenfeld
2016-12-17 15:21               ` George Spelvin
2016-12-17 15:21                 ` [kernel-hardening] " George Spelvin
2016-12-19 14:14                 ` David Laight
2016-12-19 14:14                   ` [kernel-hardening] " David Laight
2016-12-19 14:14                   ` David Laight
2016-12-19 18:10                   ` George Spelvin
2016-12-19 18:10                     ` [kernel-hardening] " George Spelvin
2016-12-19 20:18                     ` Jean-Philippe Aumasson
2016-12-19 20:18                       ` [kernel-hardening] " Jean-Philippe Aumasson
2016-12-16  2:14   ` kbuild test robot
2016-12-16  2:14     ` [kernel-hardening] " kbuild test robot
2016-12-17 14:55   ` Jeffrey Walton
2016-12-17 14:55     ` [kernel-hardening] " Jeffrey Walton
2016-12-19 17:08     ` Jason A. Donenfeld
2016-12-19 17:08       ` [kernel-hardening] " Jason A. Donenfeld
2016-12-19 17:19       ` Jean-Philippe Aumasson
2016-12-19 17:19         ` [kernel-hardening] " Jean-Philippe Aumasson
2016-12-15 20:30 ` [PATCH v5 2/4] siphash: add Nu{32,64} helpers Jason A. Donenfeld
2016-12-15 20:30   ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16 10:39   ` David Laight
2016-12-16 10:39     ` [kernel-hardening] " David Laight
2016-12-16 10:39     ` David Laight
2016-12-16 15:44     ` George Spelvin
2016-12-16 15:44       ` [kernel-hardening] " George Spelvin
2016-12-15 20:30 ` [PATCH v5 3/4] secure_seq: use SipHash in place of MD5 Jason A. Donenfeld
2016-12-15 20:30   ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16  9:59   ` David Laight
2016-12-16  9:59     ` [kernel-hardening] " David Laight
2016-12-16  9:59     ` David Laight
2016-12-16 15:57     ` Jason A. Donenfeld
2016-12-16 15:57       ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16 15:57       ` Jason A. Donenfeld
2016-12-15 20:30 ` [PATCH v5 4/4] random: " Jason A. Donenfeld
2016-12-15 20:30   ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16  3:03 ` [PATCH v6 0/5] The SipHash Patchset Jason A. Donenfeld
2016-12-16  3:03   ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16  3:03   ` [PATCH v6 1/5] siphash: add cryptographically secure PRF Jason A. Donenfeld
2016-12-16  3:03     ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16  3:03   ` [PATCH v6 2/5] secure_seq: use SipHash in place of MD5 Jason A. Donenfeld
2016-12-16  3:03     ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16  3:03   ` [PATCH v6 3/5] random: " Jason A. Donenfeld
2016-12-16  3:03     ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16 21:31     ` Andy Lutomirski
2016-12-16 21:31       ` [kernel-hardening] " Andy Lutomirski
2016-12-16 21:31       ` Andy Lutomirski
2016-12-16  3:03   ` [PATCH v6 4/5] md5: remove from lib and only live in crypto Jason A. Donenfeld
2016-12-16  3:03     ` [kernel-hardening] " Jason A. Donenfeld
2016-12-16  3:03   ` [PATCH v6 5/5] syncookies: use SipHash in place of SHA1 Jason A. Donenfeld
2016-12-16  3:03     ` [kernel-hardening] " Jason A. Donenfeld
2016-12-21 23:02   ` [PATCH v7 0/6] The SipHash Patchset Jason A. Donenfeld
2016-12-21 23:02     ` [kernel-hardening] " Jason A. Donenfeld
2016-12-21 23:02     ` [PATCH v7 1/6] siphash: add cryptographically secure PRF Jason A. Donenfeld
2016-12-21 23:02       ` [kernel-hardening] " Jason A. Donenfeld
2016-12-22  1:40       ` Stephen Hemminger
2016-12-22  1:40         ` [kernel-hardening] " Stephen Hemminger
2016-12-21 23:02     ` [PATCH v7 2/6] secure_seq: use SipHash in place of MD5 Jason A. Donenfeld
2016-12-21 23:02       ` [kernel-hardening] " Jason A. Donenfeld
2016-12-21 23:02     ` [PATCH v7 3/6] random: " Jason A. Donenfeld
2016-12-21 23:02       ` [kernel-hardening] " Jason A. Donenfeld
2016-12-21 23:13       ` Jason A. Donenfeld
2016-12-21 23:13         ` [kernel-hardening] " Jason A. Donenfeld
2016-12-21 23:42       ` Andy Lutomirski
2016-12-21 23:42         ` [kernel-hardening] " Andy Lutomirski
2016-12-21 23:42         ` Andy Lutomirski
2016-12-22  2:07         ` Hannes Frederic Sowa
2016-12-22  2:07           ` [kernel-hardening] " Hannes Frederic Sowa
2016-12-22  2:07           ` Hannes Frederic Sowa
2016-12-22  2:09           ` Andy Lutomirski
2016-12-22  2:09             ` [kernel-hardening] " Andy Lutomirski
2016-12-22  2:09             ` Andy Lutomirski
2016-12-22  2:49           ` Jason A. Donenfeld
2016-12-22  2:49             ` [kernel-hardening] " Jason A. Donenfeld
2016-12-22  2:49             ` Jason A. Donenfeld
2016-12-22  3:12             ` Jason A. Donenfeld
2016-12-22  3:12               ` [kernel-hardening] " Jason A. Donenfeld
2016-12-22  3:12               ` Jason A. Donenfeld
2016-12-22  5:41             ` Theodore Ts'o
2016-12-22  5:41               ` [kernel-hardening] " Theodore Ts'o
2016-12-22  6:03               ` Jason A. Donenfeld
2016-12-22 15:58                 ` Theodore Ts'o
2016-12-22 15:58                   ` [kernel-hardening] " Theodore Ts'o
2016-12-22 16:16                   ` Jason A. Donenfeld
2016-12-22 16:16                     ` [kernel-hardening] " Jason A. Donenfeld
2016-12-22 16:30                     ` Theodore Ts'o
2016-12-22 16:36                       ` Jason A. Donenfeld
2016-12-22 12:47               ` Hannes Frederic Sowa
2016-12-22 12:47                 ` [kernel-hardening] " Hannes Frederic Sowa
2016-12-22 13:10                 ` Jason A. Donenfeld
2016-12-22 15:05                   ` Hannes Frederic Sowa
2016-12-22 15:12                     ` Jason A. Donenfeld
2016-12-22 15:29                       ` Jason A. Donenfeld
2016-12-22 15:33                         ` Hannes Frederic Sowa
2016-12-22 15:33                           ` [kernel-hardening] " Hannes Frederic Sowa
2016-12-22 15:41                           ` Jason A. Donenfeld
2016-12-22 15:51                             ` Hannes Frederic Sowa
2016-12-22 15:51                               ` [kernel-hardening] " Hannes Frederic Sowa
2016-12-22 15:53                               ` Jason A. Donenfeld
2016-12-22 15:54                   ` Theodore Ts'o
2016-12-22 15:54                     ` [kernel-hardening] " Theodore Ts'o
2016-12-22 18:08                     ` Hannes Frederic Sowa
2016-12-22 18:13                       ` Jason A. Donenfeld
2016-12-22 18:13                         ` [kernel-hardening] " Jason A. Donenfeld
2016-12-22 19:50                       ` Theodore Ts'o
2016-12-22  2:31         ` Jason A. Donenfeld
2016-12-22  2:31           ` [kernel-hardening] " Jason A. Donenfeld
2016-12-22  2:31           ` Jason A. Donenfeld
2016-12-21 23:02     ` [PATCH v7 4/6] md5: remove from lib and only live in crypto Jason A. Donenfeld
2016-12-21 23:02       ` [kernel-hardening] " Jason A. Donenfeld
2016-12-21 23:02     ` [PATCH v7 5/6] syncookies: use SipHash in place of SHA1 Jason A. Donenfeld
2016-12-21 23:02       ` [kernel-hardening] " Jason A. Donenfeld
2016-12-21 23:02     ` [PATCH v7 6/6] siphash: implement HalfSipHash1-3 for hash tables Jason A. Donenfeld
2016-12-21 23:02       ` [kernel-hardening] " Jason A. Donenfeld
2016-12-22  0:46       ` Andi Kleen
2016-12-22  0:46         ` [kernel-hardening] " Andi Kleen
2016-12-16 20:43 [PATCH v5 1/4] siphash: add cryptographically secure PRF Jason A. Donenfeld
2016-12-16 20:49 Jason A. Donenfeld
2016-12-16 21:25 ` George Spelvin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161216234408.30174.qmail@ns.sciencehorizons.net \
    --to=linux@sciencehorizons.net \
    --cc=David.Laight@aculab.com \
    --cc=Jason@zx2c4.com \
    --cc=ak@linux.intel.com \
    --cc=davem@davemloft.net \
    --cc=djb@cr.yp.to \
    --cc=ebiggers3@gmail.com \
    --cc=hannes@stressinduktion.org \
    --cc=jeanphilippe.aumasson@gmail.com \
    --cc=kernel-hardening@lists.openwall.com \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=netdev@vger.kernel.org \
    --cc=tom@herbertland.com \
    --cc=torvalds@linux-foundation.org \
    --cc=tytso@mit.edu \
    --cc=vegard.nossum@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.