Commit 2aff87ca authored by Nick Mathewson's avatar Nick Mathewson 🐘
Browse files

Load hardware acceleration options when/where available. Can anybody test this?


svn:r4467
parent 5eef9177
Loading
Loading
Loading
Loading
+2 −1
Changes for doc/TODO: 2 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -107,7 +107,8 @@ N - Handle rendezvousing with unverified nodes.
    prefix.
  - cpu fixes:
    - see if we should make use of truncate to retry
    - hardware accelerator support
    o hardware accelerator support (configure engines.)
    - hardware accelerator support (use instead of aes.c when reasonable)
r   - kill dns workers more slowly
  - continue decentralizing the directory
    - Specify and design all of the below before implementing any.
+4 −0
Changes for doc/tor.1.in: 4 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -154,6 +154,10 @@ minutes for clients, 15 minutes for servers)
.TP
\fBUser \fR\fIUID\fP
On startup, setuid to this user.
.TP
\fBHardwareAccel \fR\fI0|1\fP
If non-zero, try to use crypto hardware acceleration when
available. (Default: 1. )

.SH CLIENT OPTIONS
.PP
+35 −1
Changes for src/common/crypto.c: 35 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ const char crypto_c_id[] = "$Id$";

#include <string.h>

#include <openssl/engine.h>
#include <openssl/err.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
@@ -159,14 +160,46 @@ crypto_log_errors(int severity, const char *doing)
  }
}

static void
log_engine(const char *fn, ENGINE *e)
{
  if (e) {
    const char *name, *id;
    name = ENGINE_get_name(e);
    id = ENGINE_get_id(e);
    log(LOG_NOTICE, "Using OpenSSL engine %s [%s] for %s",
        name?name:"?", id?id:"?", fn);
  } else {
    log(LOG_INFO, "Using default implementation for %s", fn);
  }
}

/** Initialize the crypto library.  Return 0 on success, -1 on failure.
 */
int crypto_global_init()
int
crypto_global_init(int useAccel)
{
  if (!_crypto_global_initialized) {
    ERR_load_crypto_strings();
    OpenSSL_add_all_algorithms();
    _crypto_global_initialized = 1;
    setup_openssl_threading();
    if (useAccel) {
      if (useAccel < 0)
        log_fn(LOG_WARN, "Initializing OpenSSL via tor_tls_init().");
      log_fn(LOG_INFO, "Initializing OpenSSL engine support.");
      ENGINE_load_builtin_engines();
      if (!ENGINE_register_all_complete())
        return -1;

      /* XXXX make sure this isn't leaking. */
      log_engine("RSA", ENGINE_get_default_RSA());
      log_engine("DH", ENGINE_get_default_DH());
      log_engine("RAND", ENGINE_get_default_RAND());
      log_engine("SHA1", ENGINE_get_digest_engine(NID_sha1));
      log_engine("3DES", ENGINE_get_cipher_engine(NID_des_ede3_ecb));
      log_engine("AES", ENGINE_get_cipher_engine(NID_aes_128_ecb));
    }
  }
  return 0;
}
@@ -176,6 +209,7 @@ int crypto_global_init()
int crypto_global_cleanup()
{
  ERR_free_strings();
  ENGINE_cleanup();
#ifdef TOR_IS_MULTITHREADED
  if (_n_openssl_mutexes) {
    int n = _n_openssl_mutexes;
+1 −1
Changes for src/common/crypto.h: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ typedef struct crypto_digest_env_t crypto_digest_env_t;
typedef struct crypto_dh_env_t crypto_dh_env_t;

/* global state */
int crypto_global_init(void);
int crypto_global_init(int hardwareAccel);
int crypto_global_cleanup(void);

/* environment setup */
+2 −3
Changes for src/common/tortls.c: 2 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -148,12 +148,11 @@ tor_tls_get_error(tor_tls *tls, int r, int extra,
/** Initialize OpenSSL, unless it has already been initialized.
 */
static void
tor_tls_init(void) {
tor_tls_init() {
  if (!tls_library_is_initialized) {
    SSL_library_init();
    SSL_load_error_strings();
    crypto_global_init();
    OpenSSL_add_all_algorithms();
    crypto_global_init(-1);
    tls_library_is_initialized = 1;
  }
}
Loading