In message <[EMAIL PROTECTED]> on Mon, 24 Nov 2003 10:47:10 +0100 (CET), Richard
Levitte - VMS Whacker <[EMAIL PROTECTED]> said:
levitte> Listen, I'll code and show you the patch, then you can judge for
levitte> yourself. Deal?
It was even easier than I thought. I changed my mind on one point and
had the seeding of the internal OpenSSL pool be performed in
hwcrhk_init(). That way, there's no need for any extra flags or
anything like that.
Attached are diff for 0.9.8-dev, 0.9.7-stable and 0.9.6-stable [engine].
Please take a look when you can.
-----
Please consider sponsoring my work on free software.
See http://www.free.lp.se/sponsoring.html for details.
You don't have to be rich, a $10 donation is appreciated!
--
Richard Levitte \ Tunnlandsv�gen 3 \ [EMAIL PROTECTED]
[EMAIL PROTECTED] \ S-168 36 BROMMA \ T: +46-8-26 52 47
\ SWEDEN \ or +46-708-26 53 44
Procurator Odiosus Ex Infernis -- [EMAIL PROTECTED]
Member of the OpenSSL development team: http://www.openssl.org/
Unsolicited commercial email is subject to an archival fee of $400.
See <http://www.stacken.kth.se/~levitte/mail/> for more info.
Index: engines/e_ncipher.c
===================================================================
RCS file: /e/openssl/cvs/openssl/engines/e_ncipher.c,v
retrieving revision 1.9
diff -u -r1.9 e_ncipher.c
--- engines/e_ncipher.c 26 Jun 2003 07:10:10 -0000 1.9
+++ engines/e_ncipher.c 24 Nov 2003 12:15:18 -0000
@@ -213,7 +213,7 @@
hwcrhk_rand_bytes,
NULL,
NULL,
- hwcrhk_rand_bytes,
+ NULL,
hwcrhk_rand_status,
};
@@ -329,6 +329,9 @@
#ifndef OPENSSL_NO_DH
const DH_METHOD *meth2;
#endif
+#ifndef OPENSSL_NO_RAND
+ const RAND_METHOD *meth3;
+#endif
if(!ENGINE_set_id(e, engine_hwcrhk_id) ||
!ENGINE_set_name(e, engine_hwcrhk_name) ||
#ifndef OPENSSL_NO_RSA
@@ -369,6 +372,15 @@
hwcrhk_dh.compute_key = meth2->compute_key;
#endif
+#ifndef OPENSSL_NO_RAND
+ /* Much the same for RAND */
+ meth3 = RAND_SSLeay();
+ hwcrhk_rand.seed = meth3->seed;
+ hwcrhk_rand.cleanup = meth3->cleanup;
+ hwcrhk_rand.add = meth3->add;
+ hwcrhk_rand.pseudorand = meth3->pseudorand;
+#endif
+
/* Ensure the hwcrhk error handling is set up */
ERR_load_HWCRHK_strings();
return 1;
@@ -509,6 +521,10 @@
#endif
HWCryptoHook_RandomBytes_t *p8;
HWCryptoHook_ModExpCRT_t *p9;
+#ifndef OPENSSL_NO_RAND
+ int rand_cnt;
+ RAND_METHOD *rand_method = RAND_SSLeay();
+#endif
if(hwcrhk_dso != NULL)
{
@@ -593,6 +609,29 @@
hndidx_rsa = RSA_get_ex_new_index(0,
"nFast HWCryptoHook RSA key handle",
NULL, NULL, hwcrhk_ex_free);
+#endif
+
+#ifndef OPENSSL_NO_RAND
+ /* Let's seed the OpenSSL pool with a bit of hardware randomness
+ for a maximum of 32 rounds. Beyond that, the OpenSSL random
+ pool should be good, and if not, we assume something is seriously
+ wrong with OpenSSL (for now, we let it be and let the user discover
+ it through normal means. That may need to change). */
+ rand_cnt = 32;
+ do
+ {
+ unsigned char buf[8];
+
+ /* If something went wrong, it's OK to just return a fault.
+ All that may happen is that the OpenSSL randomness pool
+ is a bit more seeded, and that can't really be a bad thing,
+ right? */
+ if (!hwcrhk_rand.bytes(buf, sizeof(buf)))
+ goto err;
+
+ rand_method->seed(buf, sizeof(buf));
+ }
+ while(rand_cnt-- > 0 && rand_method->status());
#endif
return 1;
err:
Index: crypto/engine/hw_ncipher.c
===================================================================
RCS file: /e/openssl/cvs/openssl/crypto/engine/Attic/hw_ncipher.c,v
retrieving revision 1.26.2.7
diff -u -r1.26.2.7 hw_ncipher.c
--- crypto/engine/hw_ncipher.c 12 Dec 2002 17:41:34 -0000 1.26.2.7
+++ crypto/engine/hw_ncipher.c 24 Nov 2003 12:15:25 -0000
@@ -220,7 +220,7 @@
hwcrhk_rand_bytes,
NULL,
NULL,
- hwcrhk_rand_bytes,
+ NULL,
hwcrhk_rand_status,
};
@@ -336,6 +336,9 @@
#ifndef OPENSSL_NO_DH
const DH_METHOD *meth2;
#endif
+#ifndef OPENSSL_NO_RAND
+ const RAND_METHOD *meth3;
+#endif
if(!ENGINE_set_id(e, engine_hwcrhk_id) ||
!ENGINE_set_name(e, engine_hwcrhk_name) ||
#ifndef OPENSSL_NO_RSA
@@ -376,6 +379,15 @@
hwcrhk_dh.compute_key = meth2->compute_key;
#endif
+#ifndef OPENSSL_NO_RAND
+ /* Much the same for RAND */
+ meth3 = RAND_SSLeay();
+ hwcrhk_rand.seed = meth3->seed;
+ hwcrhk_rand.cleanup = meth3->cleanup;
+ hwcrhk_rand.add = meth3->add;
+ hwcrhk_rand.pseudorand = meth3->pseudorand;
+#endif
+
/* Ensure the hwcrhk error handling is set up */
ERR_load_HWCRHK_strings();
return 1;
@@ -516,6 +528,10 @@
#endif
HWCryptoHook_RandomBytes_t *p8;
HWCryptoHook_ModExpCRT_t *p9;
+#ifndef OPENSSL_NO_RAND
+ int rand_cnt;
+ RAND_METHOD *rand_method = RAND_SSLeay();
+#endif
if(hwcrhk_dso != NULL)
{
@@ -608,6 +624,28 @@
hndidx_rsa = RSA_get_ex_new_index(0,
"nFast HWCryptoHook RSA key handle",
NULL, NULL, hwcrhk_ex_free);
+#endif
+#ifndef OPENSSL_NO_RAND
+ /* Let's seed the OpenSSL pool with a bit of hardware randomness
+ for a maximum of 32 rounds. Beyond that, the OpenSSL random
+ pool should be good, and if not, we assume something is seriously
+ wrong with OpenSSL (for now, we let it be and let the user discover
+ it through normal means. That may need to change). */
+ rand_cnt = 32;
+ do
+ {
+ unsigned char buf[8];
+
+ /* If something went wrong, it's OK to just return a fault.
+ All that may happen is that the OpenSSL randomness pool
+ is a bit more seeded, and that can't really be a bad thing,
+ right? */
+ if (!hwcrhk_rand.bytes(buf, sizeof(buf)))
+ goto err;
+
+ rand_method->seed(buf, sizeof(buf));
+ }
+ while(rand_cnt-- > 0 && rand_method->status());
#endif
return 1;
err:
Index: crypto/engine/hw_ncipher.c
===================================================================
RCS file: /e/openssl/cvs/openssl/crypto/engine/Attic/hw_ncipher.c,v
retrieving revision 1.1.2.21.4.5
diff -u -r1.1.2.21.4.5 hw_ncipher.c
--- crypto/engine/hw_ncipher.c 5 Dec 2002 00:57:41 -0000 1.1.2.21.4.5
+++ crypto/engine/hw_ncipher.c 24 Nov 2003 12:15:30 -0000
@@ -164,7 +164,7 @@
hwcrhk_rand_bytes,
NULL,
NULL,
- hwcrhk_rand_bytes,
+ NULL,
hwcrhk_rand_status,
};
@@ -293,6 +293,7 @@
{
RSA_METHOD *meth1;
DH_METHOD *meth2;
+ const RAND_METHOD *meth3;
/* We know that the "PKCS1_SSLeay()" functions hook properly
* to the cswift-specific mod_exp and mod_exp_crt so we use
@@ -311,6 +312,14 @@
meth2 = DH_OpenSSL();
hwcrhk_dh.generate_key = meth2->generate_key;
hwcrhk_dh.compute_key = meth2->compute_key;
+
+ /* Much the same for RAND */
+ meth3 = RAND_SSLeay();
+ hwcrhk_rand.seed = meth3->seed;
+ hwcrhk_rand.cleanup = meth3->cleanup;
+ hwcrhk_rand.add = meth3->add;
+ hwcrhk_rand.pseudorand = meth3->pseudorand;
+
return &engine_hwcrhk;
}
@@ -386,6 +395,8 @@
HWCryptoHook_RSAUnloadKey_t *p7;
HWCryptoHook_RandomBytes_t *p8;
HWCryptoHook_ModExpCRT_t *p9;
+ int rand_cnt;
+ RAND_METHOD *rand_method = RAND_SSLeay();
if(hwcrhk_dso != NULL)
{
@@ -466,6 +477,28 @@
hndidx = RSA_get_ex_new_index(0,
"nFast HWCryptoHook RSA key handle",
NULL, NULL, hwcrhk_ex_free);
+
+ /* Let's seed the OpenSSL pool with a bit of hardware randomness
+ for a maximum of 32 rounds. Beyond that, the OpenSSL random
+ pool should be good, and if not, we assume something is seriously
+ wrong with OpenSSL (for now, we let it be and let the user discover
+ it through normal means. That may need to change). */
+ rand_cnt = 32;
+ do
+ {
+ unsigned char buf[8];
+
+ /* If something went wrong, it's OK to just return a fault.
+ All that may happen is that the OpenSSL randomness pool
+ is a bit more seeded, and that can't really be a bad thing,
+ right? */
+ if (!hwcrhk_rand.bytes(buf, sizeof(buf)))
+ goto err;
+
+ rand_method->seed(buf, sizeof(buf));
+ }
+ while(rand_cnt-- > 0 && rand_method->status());
+
return 1;
err:
if(hwcrhk_dso)