On Mon, October 1, 2012 3:08 pm, Michael Demeter wrote:
>  Hello,
>
>  I work in the Open Source Technology group at Intel in the security group.
>
>  I have been tasked with contacting the maintainer of libnss to start
>  discussions about the possibility of Intel submitting patches to enable
>  the new HW based digital random number generator.
>
>  What I would like to do is to have a short (or long) discussion over how
>  you would like to see this doneĀ…In the current implementation it will do
>  the right thing if drngd(Fedora 18) is running since libnss still pulls
>  from /dev/random. But it does a lot of unnecessary work afterwards since
>  the HW based DRNG for /dev/random can be used directly.
>
>  What I would like to do is to implement native DRNG functions to replace
>  the current functions if the HW is available..So I would like some input
>  as to how you would like to see this implemented or if there is any
>  interest at all..
>
>  Thanks
>
>
>  Michael Demeter
>  Staff Software Engineer
>  Open Source Technology Center - SSG
>  Intel Corporation

Hi Michael,

There is definite interest in being able to take advantage of hardware
intrinsics - whether they be the DRNG or the AESNI instructions. For
example, NSS just recently added support for AES-GCM, and taking better
advantage of PCLMULQDQ is one of the items on the roadmap, since currently
no support exists (there is support for AESENC/AESDEC and it will be used
as the bulk AES function when support is detected at runtime)

There are one of two places the the DRNG can go in. One would be to
utilize it within NSPR (Netscape Portable Runtime), which NSS makes use of
for a number of primitive types and cross-platform abstraction. This would
make it available to any applications that depended on NSPR (which there
are many). However, they may not need as strong a source of hardware
entropy, but it's worth considering.

Within NSPR, the "core" entry point is
http://mxr.mozilla.org/security/source/nsprpub/pr/src/misc/prrng.c , which
shuffles you off to the platform-specific RNG (eg:
nsprpub/pr/src/md/windows/w32rng.c  or nsprpub/pr/src/md/unix/uxrng.c )

In the Unix implementation, you can see some inline intrinsics are already
being used, albiet non-portably.

Within NSS proper, the RNG is handled by freebl (the core primitives),
which are then exposed as a software PKCS#11 token in softoken (aptly
named, right?)

The FreeBL implementation is declared at
http://mxr.mozilla.org/security/source/security/nss/lib/freebl/secrng.h ,
and then implemented accordingly through sysrand.c, unix_rand.c, and
win_rand.c in the same directory.

Now, as for actual exposing/implementation, presumably an approach similar
to the use of AES-NI would be appropriate. For that, look at freebl's
intel-aes.h, as well as it's related use in rijndael.c

http://mxr.mozilla.org/security/source/security/nss/lib/freebl/rijndael.c#969
 - compile time check to disable
 - run time env check for a flag to disable
 - run-time input check to make sure it can be used
 - Function signature typedef that can match either the 'native' (Intel)
implementation or the 'builtin' (NSS) implementation, and the function
pointer is updated accordingly.

Right now, I'm not aware of a good cross-platform assembler solution in
use for NSS - eg: yasm to abstract for cross-platform object file
generation. So for usage on both Windows and Posix/BSD, it may be
necessary to write two implementations.

Feel free to ask more questions if the above is vague. I'm sure Wan-Teh,
Bob, or Brian will chime in if I misdirected, but I'm fairly confident
that the above is the right approach for integrating hardware specific
features (for now at least).

If you or any of your coworkers feel especially motivated, support for
PCLMULQDQ would be hip too ;)

-- 
dev-tech-crypto mailing list
dev-tech-crypto@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-tech-crypto

Reply via email to