Re: Towards design criteria for cprng_fast()

Mindaugas Rasiukevicius <[email protected]> Wed, 23 Apr 2014 12:15:08 +0100
Newsgroups gmane.os.netbsd.devel.crypto,gmane.os.netbsd.devel.kernel
Message-ID <[email protected]>
Thor Lancelot Simon <[email protected]> wrote:
> I would like to offer some observations about the use of cprng_fast()
> (once known as arc4random()) in our kernel and, from these, express
> what I believe are reasonable design criteria for that function.
> 
> O1) cprng_fast() is used in some performance-critical parts of the kernel:
> 
> 	<...>
> 
> 	D) It appears that it can be called per-packet by a few parts of
> 	   the networking stack in some cases -- ALTQ, possibly ip_id.

Port number randomisation as well, which is another frequent user.

> O4) We have non-cryptographic RNGs in the kernel (random(), mertwist))
> which seem to exist for two reasons: reproducible testing, and
> performance.

What is their real use?  They cause confusion; irresponsible use of them
may cause problems, and cprng_fast ought to be fast enough.  I strongly
suggest to delete them.

> With those observations in mind, I offer these design criteria for
> cprng_fast():
> 
> 	Strength criterion: At the time of the selection of an algorithm
> 			      for cprng_fast(), there should be no known,
> 			      practical cryptographic attack which either:
>       <...>
> 
> 	Speed criterion 1: cprng_fast() should be as fast as possible
> subject to the Strength criterion and the general mandates
> 			   of portability and code cleanliness which apply
> 			   throughout our tree.
> 	<...>
> 
> 	Speed criterion 2: cprng_fast()'s performance should be evaluated
> 			   primarily with regard to short requests.
>       <...>

I agree.

-- 
Mindaugas