Prediction resistance is a useful feature to have in some circles. It's definitely an option that's useful for OpenVPN-NL, which is why I ported it to the mainline. If there is no interest, could we include it in a contrib directory or something along those lines?
Adriaan > -----Original Message----- > From: Alon Bar-Lev [mailto:alon.bar...@gmail.com] > Sent: maandag 2 april 2012 11:19 > To: Adriaan de Jong > Cc: openvpn-devel@lists.sourceforge.net > Subject: Re: [Openvpn-devel] [PATCH 2/6] Added a configuration option > to enable prediction resistance in the PolarSSL random number > generator. > > Hello, > I think that we should not have these options specific to one crypto > library. > Alon. > > On Mon, Apr 2, 2012 at 10:28 AM, Adriaan de Jong <dej...@fox-it.com> > wrote: > > Signed-off-by: Eelse-jan Stutvoet <stutv...@fox-it.com> > > Signed-off-by: Adriaan de Jong <dej...@fox-it.com> > > --- > > doc/openvpn.8 | 14 ++++++++++++++ > > src/openvpn/crypto_polarssl.c | 9 +++++++++ > > src/openvpn/crypto_polarssl.h | 7 +++++++ > > src/openvpn/init.c | 6 ++++++ > > src/openvpn/options.c | 22 ++++++++++++++++++++++ > > src/openvpn/options.h | 3 +++ > > src/openvpn/syshead.h | 8 ++++++++ > > 7 files changed, 69 insertions(+), 0 deletions(-) > > > > diff --git a/doc/openvpn.8 b/doc/openvpn.8 index 53d6bdb..ee46de6 > > 100644 > > --- a/doc/openvpn.8 > > +++ b/doc/openvpn.8 > > @@ -3846,6 +3846,20 @@ space-saving optimization that uses the unique > > identifier for > > datagram replay protection as the IV. > > .\"********************************************************* > > .TP > > +.B \-\-use-prediction-resistance > > +Enable prediction resistance on PolarSSL's RNG. > > + > > +Enabling prediction resistance causes the RNG to reseed in each call > > +for random. Reseeding this often can quickly deplete the kernel > > +entropy pool. > > + > > +If you need this option, please consider running a daemon that adds > > +entropy to the kernel pool. > > + > > +Note that this option only works with PolarSSL versions greater than > > +1.1. > > +.\"********************************************************* > > +.TP > > .B \-\-test-crypto > > Do a self-test of OpenVPN's crypto options by encrypting and > > decrypting test packets using the data channel encryption options > > diff --git a/src/openvpn/crypto_polarssl.c > > b/src/openvpn/crypto_polarssl.c index 158ccfc..96d41b7 100644 > > --- a/src/openvpn/crypto_polarssl.c > > +++ b/src/openvpn/crypto_polarssl.c > > @@ -219,6 +219,15 @@ havege_state * rand_ctx_get() > > > > #endif /* (POLARSSL_VERSION_NUMBER >= 0x01010000) */ > > > > +#ifdef ENABLE_PREDICTION_RESISTANCE > > +void rand_ctx_enable_prediction_resistance() > > +{ > > + ctr_drbg_context *cd_ctx = rand_ctx_get(); > > + > > + ctr_drbg_set_prediction_resistance(cd_ctx, 1); } #endif /* > > +ENABLE_PREDICTION_RESISTANCE */ > > + > > int > > rand_bytes (uint8_t *output, int len) > > { > > diff --git a/src/openvpn/crypto_polarssl.h > > b/src/openvpn/crypto_polarssl.h index 2f303db..6152878 100644 > > --- a/src/openvpn/crypto_polarssl.h > > +++ b/src/openvpn/crypto_polarssl.h > > @@ -96,4 +96,11 @@ ctr_drbg_context * rand_ctx_get(); > > havege_state * rand_ctx_get(); > > #endif > > > > +#ifdef ENABLE_PREDICTION_RESISTANCE > > +/** > > + * Enable prediction resistance on the random number generator. > > + */ > > +void rand_ctx_enable_prediction_resistance(); > > +#endif > > + > > #endif /* CRYPTO_POLARSSL_H_ */ > > diff --git a/src/openvpn/init.c b/src/openvpn/init.c index > > bc7718e..05a07fa 100644 > > --- a/src/openvpn/init.c > > +++ b/src/openvpn/init.c > > @@ -2008,6 +2008,12 @@ init_crypto_pre (struct context *c, const > > unsigned int flags) > > > > if (c->options.mute_replay_warnings) > > c->c2.crypto_options.flags |= CO_MUTE_REPLAY_WARNINGS; > > + > > +#ifdef ENABLE_PREDICTION_RESISTANCE > > + if (c->options.use_prediction_resistance) > > + rand_ctx_enable_prediction_resistance(); > > +#endif > > + > > } > > > > /* > > diff --git a/src/openvpn/options.c b/src/openvpn/options.c index > > bd83843..5b52ed0 100644 > > --- a/src/openvpn/options.c > > +++ b/src/openvpn/options.c > > @@ -545,6 +545,10 @@ static const char usage_message[] = > > " using file.\n" > > "--test-crypto : Run a self-test of crypto features enabled.\n" > > " For debugging only.\n" > > +#ifdef ENABLE_PREDICTION_RESISTANCE > > + "--use-prediction-resistance: Enable prediction resistance on the > random\n" > > + " number generator.\n" > > +#endif > > #ifdef ENABLE_SSL > > "\n" > > "TLS Key Negotiation Options:\n" > > @@ -837,6 +841,9 @@ init_options (struct options *o, const bool > > init_gc) > > o->replay_time = DEFAULT_TIME_BACKTRACK; > > o->use_iv = true; > > o->key_direction = KEY_DIRECTION_BIDIRECTIONAL; > > +#ifdef ENABLE_PREDICTION_RESISTANCE > > + o->use_prediction_resistance = false; #endif > > #ifdef ENABLE_SSL > > o->key_method = 2; > > o->tls_timeout = 2; > > @@ -1581,6 +1588,9 @@ show_settings (const struct options *o) > > SHOW_STR (packet_id_file); > > SHOW_BOOL (use_iv); > > SHOW_BOOL (test_crypto); > > +#ifdef ENABLE_PREDICTION_RESISTANCE > > + SHOW_BOOL (use_prediction_resistance); #endif > > > > #ifdef ENABLE_SSL > > SHOW_BOOL (tls_server); > > @@ -3018,6 +3028,11 @@ options_string (const struct options *o, > > buf_printf (&out, ",no-replay"); > > if (!o->use_iv) > > buf_printf (&out, ",no-iv"); > > + > > +#ifdef ENABLE_PREDICTION_RESISTANCE > > + if (o->use_prediction_resistance) > > + buf_printf (&out, ",use-prediction-resistance"); #endif > > } > > > > #ifdef ENABLE_SSL > > @@ -6416,6 +6431,13 @@ add_option (struct options *options, > > options->keysize = keysize; > > } > > #endif > > +#ifdef ENABLE_PREDICTION_RESISTANCE > > + else if (streq (p[0], "use-prediction-resistance")) > > + { > > + VERIFY_PERMISSION (OPT_P_GENERAL); > > + options->use_prediction_resistance = true; > > + } > > +#endif > > #ifdef ENABLE_SSL > > else if (streq (p[0], "show-tls")) > > { > > diff --git a/src/openvpn/options.h b/src/openvpn/options.h index > > 9e78d00..1be3dfa 100644 > > --- a/src/openvpn/options.h > > +++ b/src/openvpn/options.h > > @@ -520,6 +520,9 @@ struct options > > const char *packet_id_file; > > bool use_iv; > > bool test_crypto; > > +#ifdef ENABLE_PREDICTION_RESISTANCE > > + bool use_prediction_resistance; > > +#endif > > > > #ifdef ENABLE_SSL > > /* TLS (control channel) parms */ > > diff --git a/src/openvpn/syshead.h b/src/openvpn/syshead.h index > > e60dc44..b14d50d 100644 > > --- a/src/openvpn/syshead.h > > +++ b/src/openvpn/syshead.h > > @@ -534,6 +534,14 @@ socket_defined (const socket_descriptor_t sd) > > #define MANAGMENT_EXTERNAL_KEY > > #endif > > > > +/* Enable PolarSSL RNG prediction resistance support */ #ifdef > > +ENABLE_CRYPTO_POLARSSL #include <polarssl/version.h> #if > > +POLARSSL_VERSION_NUMBER >= 0x01010000 #define > > +ENABLE_PREDICTION_RESISTANCE #endif #endif /* ENABLE_CRYPTO_POLARSSL > > +*/ > > + > > /* > > * MANAGEMENT_IN_EXTRA allows the management interface to > > * read multi-line inputs from clients. > > -- > > 1.7.5.4 > > > > > > --------------------------------------------------------------------- > - > > -------- > > This SF email is sponsosred by: > > Try Windows Azure free for 90 days Click Here > > http://p.sf.net/sfu/sfd2d-msazure > > _______________________________________________ > > Openvpn-devel mailing list > > Openvpn-devel@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/openvpn-devel