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

Reply via email to