mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 05:33:47 +01:00
Merge remote branch 'origin/maint-0.2.2'
This commit is contained in:
commit
aaa5737a2e
3
changes/dhparam
Normal file
3
changes/dhparam
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
o Minor features
|
||||||
|
- Adjust our TLS Diffie-Hellman parameters to match those used by
|
||||||
|
Apache's mod_ssl.
|
@ -1685,8 +1685,10 @@ crypto_hmac_sha1(char *hmac_out,
|
|||||||
|
|
||||||
/* DH */
|
/* DH */
|
||||||
|
|
||||||
/** Shared P parameter for our DH key exchanged. */
|
/** Shared P parameter for our circuit-crypto DH key exchanges. */
|
||||||
static BIGNUM *dh_param_p = NULL;
|
static BIGNUM *dh_param_p = NULL;
|
||||||
|
/** Shared P parameter for our TLS DH key exchanges. */
|
||||||
|
static BIGNUM *dh_param_p_tls = NULL;
|
||||||
/** Shared G parameter for our DH key exchanges. */
|
/** Shared G parameter for our DH key exchanges. */
|
||||||
static BIGNUM *dh_param_g = NULL;
|
static BIGNUM *dh_param_g = NULL;
|
||||||
|
|
||||||
@ -1695,14 +1697,16 @@ static BIGNUM *dh_param_g = NULL;
|
|||||||
static void
|
static void
|
||||||
init_dh_param(void)
|
init_dh_param(void)
|
||||||
{
|
{
|
||||||
BIGNUM *p, *g;
|
BIGNUM *p, *p2, *g;
|
||||||
int r;
|
int r;
|
||||||
if (dh_param_p && dh_param_g)
|
if (dh_param_p && dh_param_g && dh_param_p_tls)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
p = BN_new();
|
p = BN_new();
|
||||||
|
p2 = BN_new();
|
||||||
g = BN_new();
|
g = BN_new();
|
||||||
tor_assert(p);
|
tor_assert(p);
|
||||||
|
tor_assert(p2);
|
||||||
tor_assert(g);
|
tor_assert(g);
|
||||||
|
|
||||||
/* This is from rfc2409, section 6.2. It's a safe prime, and
|
/* This is from rfc2409, section 6.2. It's a safe prime, and
|
||||||
@ -1716,10 +1720,20 @@ init_dh_param(void)
|
|||||||
"A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"
|
"A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"
|
||||||
"49286651ECE65381FFFFFFFFFFFFFFFF");
|
"49286651ECE65381FFFFFFFFFFFFFFFF");
|
||||||
tor_assert(r);
|
tor_assert(r);
|
||||||
|
/* This is the 1024-bit safe prime that Apache uses for its DH stuff; see
|
||||||
|
* modules/ssl/ssl_engine_dh.c */
|
||||||
|
r = BN_hex2bn(&p2,
|
||||||
|
"D67DE440CBBBDC1936D693D34AFD0AD50C84D239A45F520BB88174CB98"
|
||||||
|
"BCE951849F912E639C72FB13B4B4D7177E16D55AC179BA420B2A29FE324A"
|
||||||
|
"467A635E81FF5901377BEDDCFD33168A461AAD3B72DAE8860078045B07A7"
|
||||||
|
"DBCA7874087D1510EA9FCC9DDD330507DD62DB88AEAA747DE0F4D6E2BD68"
|
||||||
|
"B0E7393E0F24218EB3");
|
||||||
|
tor_assert(r);
|
||||||
|
|
||||||
r = BN_set_word(g, 2);
|
r = BN_set_word(g, 2);
|
||||||
tor_assert(r);
|
tor_assert(r);
|
||||||
dh_param_p = p;
|
dh_param_p = p;
|
||||||
|
dh_param_p_tls = p2;
|
||||||
dh_param_g = g;
|
dh_param_g = g;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1728,18 +1742,26 @@ init_dh_param(void)
|
|||||||
/** Allocate and return a new DH object for a key exchange.
|
/** Allocate and return a new DH object for a key exchange.
|
||||||
*/
|
*/
|
||||||
crypto_dh_env_t *
|
crypto_dh_env_t *
|
||||||
crypto_dh_new(void)
|
crypto_dh_new(int dh_type)
|
||||||
{
|
{
|
||||||
crypto_dh_env_t *res = tor_malloc_zero(sizeof(crypto_dh_env_t));
|
crypto_dh_env_t *res = tor_malloc_zero(sizeof(crypto_dh_env_t));
|
||||||
|
|
||||||
|
tor_assert(dh_type == DH_TYPE_CIRCUIT || dh_type == DH_TYPE_TLS ||
|
||||||
|
dh_type == DH_TYPE_REND);
|
||||||
|
|
||||||
if (!dh_param_p)
|
if (!dh_param_p)
|
||||||
init_dh_param();
|
init_dh_param();
|
||||||
|
|
||||||
if (!(res->dh = DH_new()))
|
if (!(res->dh = DH_new()))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
if (dh_type == DH_TYPE_TLS) {
|
||||||
|
if (!(res->dh->p = BN_dup(dh_param_p_tls)))
|
||||||
|
goto err;
|
||||||
|
} else {
|
||||||
if (!(res->dh->p = BN_dup(dh_param_p)))
|
if (!(res->dh->p = BN_dup(dh_param_p)))
|
||||||
goto err;
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(res->dh->g = BN_dup(dh_param_g)))
|
if (!(res->dh->g = BN_dup(dh_param_g)))
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -195,7 +195,10 @@ void crypto_hmac_sha1(char *hmac_out,
|
|||||||
const char *msg, size_t msg_len);
|
const char *msg, size_t msg_len);
|
||||||
|
|
||||||
/* Key negotiation */
|
/* Key negotiation */
|
||||||
crypto_dh_env_t *crypto_dh_new(void);
|
#define DH_TYPE_CIRCUIT 1
|
||||||
|
#define DH_TYPE_REND 2
|
||||||
|
#define DH_TYPE_TLS 3
|
||||||
|
crypto_dh_env_t *crypto_dh_new(int dh_type);
|
||||||
int crypto_dh_get_bytes(crypto_dh_env_t *dh);
|
int crypto_dh_get_bytes(crypto_dh_env_t *dh);
|
||||||
int crypto_dh_generate_public(crypto_dh_env_t *dh);
|
int crypto_dh_generate_public(crypto_dh_env_t *dh);
|
||||||
int crypto_dh_get_public(crypto_dh_env_t *dh, char *pubkey_out,
|
int crypto_dh_get_public(crypto_dh_env_t *dh, char *pubkey_out,
|
||||||
|
@ -828,7 +828,7 @@ tor_tls_context_new(crypto_pk_env_t *identity, unsigned int key_lifetime)
|
|||||||
if (!SSL_CTX_check_private_key(result->ctx))
|
if (!SSL_CTX_check_private_key(result->ctx))
|
||||||
goto error;
|
goto error;
|
||||||
{
|
{
|
||||||
crypto_dh_env_t *dh = crypto_dh_new();
|
crypto_dh_env_t *dh = crypto_dh_new(DH_TYPE_TLS);
|
||||||
SSL_CTX_set_tmp_dh(result->ctx, _crypto_dh_env_get_dh(dh));
|
SSL_CTX_set_tmp_dh(result->ctx, _crypto_dh_env_get_dh(dh));
|
||||||
crypto_dh_free(dh);
|
crypto_dh_free(dh);
|
||||||
}
|
}
|
||||||
|
@ -184,7 +184,7 @@ onion_skin_create(crypto_pk_env_t *dest_router_key,
|
|||||||
*handshake_state_out = NULL;
|
*handshake_state_out = NULL;
|
||||||
memset(onion_skin_out, 0, ONIONSKIN_CHALLENGE_LEN);
|
memset(onion_skin_out, 0, ONIONSKIN_CHALLENGE_LEN);
|
||||||
|
|
||||||
if (!(dh = crypto_dh_new()))
|
if (!(dh = crypto_dh_new(DH_TYPE_CIRCUIT)))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
dhbytes = crypto_dh_get_bytes(dh);
|
dhbytes = crypto_dh_get_bytes(dh);
|
||||||
@ -258,7 +258,7 @@ onion_skin_server_handshake(const char *onion_skin, /*ONIONSKIN_CHALLENGE_LEN*/
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
dh = crypto_dh_new();
|
dh = crypto_dh_new(DH_TYPE_CIRCUIT);
|
||||||
if (crypto_dh_get_public(dh, handshake_reply_out, DH_KEY_LEN)) {
|
if (crypto_dh_get_public(dh, handshake_reply_out, DH_KEY_LEN)) {
|
||||||
log_info(LD_GENERAL, "crypto_dh_get_public failed.");
|
log_info(LD_GENERAL, "crypto_dh_get_public failed.");
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -122,7 +122,7 @@ rend_client_send_introduction(origin_circuit_t *introcirc,
|
|||||||
cpath = rendcirc->build_state->pending_final_cpath =
|
cpath = rendcirc->build_state->pending_final_cpath =
|
||||||
tor_malloc_zero(sizeof(crypt_path_t));
|
tor_malloc_zero(sizeof(crypt_path_t));
|
||||||
cpath->magic = CRYPT_PATH_MAGIC;
|
cpath->magic = CRYPT_PATH_MAGIC;
|
||||||
if (!(cpath->dh_handshake_state = crypto_dh_new())) {
|
if (!(cpath->dh_handshake_state = crypto_dh_new(DH_TYPE_REND))) {
|
||||||
log_warn(LD_BUG, "Internal error: couldn't allocate DH.");
|
log_warn(LD_BUG, "Internal error: couldn't allocate DH.");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@ -1101,7 +1101,7 @@ rend_service_introduce(origin_circuit_t *circuit, const uint8_t *request,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Try DH handshake... */
|
/* Try DH handshake... */
|
||||||
dh = crypto_dh_new();
|
dh = crypto_dh_new(DH_TYPE_REND);
|
||||||
if (!dh || crypto_dh_generate_public(dh)<0) {
|
if (!dh || crypto_dh_generate_public(dh)<0) {
|
||||||
log_warn(LD_BUG,"Internal error: couldn't build DH state "
|
log_warn(LD_BUG,"Internal error: couldn't build DH state "
|
||||||
"or generate public key.");
|
"or generate public key.");
|
||||||
|
@ -12,8 +12,8 @@
|
|||||||
static void
|
static void
|
||||||
test_crypto_dh(void)
|
test_crypto_dh(void)
|
||||||
{
|
{
|
||||||
crypto_dh_env_t *dh1 = crypto_dh_new();
|
crypto_dh_env_t *dh1 = crypto_dh_new(DH_TYPE_CIRCUIT);
|
||||||
crypto_dh_env_t *dh2 = crypto_dh_new();
|
crypto_dh_env_t *dh2 = crypto_dh_new(DH_TYPE_CIRCUIT);
|
||||||
char p1[DH_BYTES];
|
char p1[DH_BYTES];
|
||||||
char p2[DH_BYTES];
|
char p2[DH_BYTES];
|
||||||
char s1[DH_BYTES];
|
char s1[DH_BYTES];
|
||||||
|
Loading…
Reference in New Issue
Block a user