mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-23 14:40:51 +01:00
Merge remote-tracking branch 'public/bug12169_relay_check'
This commit is contained in:
commit
95d47a7481
2 changed files with 10 additions and 5 deletions
5
changes/bug12169_simple
Normal file
5
changes/bug12169_simple
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
o Minor bugfixes (performance):
|
||||||
|
- Avoid using tor_memeq() for checking relay cell integrity.
|
||||||
|
This removes a possible performance bottleneck. Fixes part of bug
|
||||||
|
12169; bugfix on 0.2.1.31.
|
||||||
|
|
|
@ -111,14 +111,14 @@ relay_set_digest(crypto_digest_t *digest, cell_t *cell)
|
||||||
static int
|
static int
|
||||||
relay_digest_matches(crypto_digest_t *digest, cell_t *cell)
|
relay_digest_matches(crypto_digest_t *digest, cell_t *cell)
|
||||||
{
|
{
|
||||||
char received_integrity[4], calculated_integrity[4];
|
uint32_t received_integrity, calculated_integrity;
|
||||||
relay_header_t rh;
|
relay_header_t rh;
|
||||||
crypto_digest_t *backup_digest=NULL;
|
crypto_digest_t *backup_digest=NULL;
|
||||||
|
|
||||||
backup_digest = crypto_digest_dup(digest);
|
backup_digest = crypto_digest_dup(digest);
|
||||||
|
|
||||||
relay_header_unpack(&rh, cell->payload);
|
relay_header_unpack(&rh, cell->payload);
|
||||||
memcpy(received_integrity, rh.integrity, 4);
|
memcpy(&received_integrity, rh.integrity, 4);
|
||||||
memset(rh.integrity, 0, 4);
|
memset(rh.integrity, 0, 4);
|
||||||
relay_header_pack(cell->payload, &rh);
|
relay_header_pack(cell->payload, &rh);
|
||||||
|
|
||||||
|
@ -127,15 +127,15 @@ relay_digest_matches(crypto_digest_t *digest, cell_t *cell)
|
||||||
// received_integrity[2], received_integrity[3]);
|
// received_integrity[2], received_integrity[3]);
|
||||||
|
|
||||||
crypto_digest_add_bytes(digest, (char*) cell->payload, CELL_PAYLOAD_SIZE);
|
crypto_digest_add_bytes(digest, (char*) cell->payload, CELL_PAYLOAD_SIZE);
|
||||||
crypto_digest_get_digest(digest, calculated_integrity, 4);
|
crypto_digest_get_digest(digest, (char*) &calculated_integrity, 4);
|
||||||
|
|
||||||
if (tor_memneq(received_integrity, calculated_integrity, 4)) {
|
if (calculated_integrity != received_integrity) {
|
||||||
// log_fn(LOG_INFO,"Recognized=0 but bad digest. Not recognizing.");
|
// log_fn(LOG_INFO,"Recognized=0 but bad digest. Not recognizing.");
|
||||||
// (%d vs %d).", received_integrity, calculated_integrity);
|
// (%d vs %d).", received_integrity, calculated_integrity);
|
||||||
/* restore digest to its old form */
|
/* restore digest to its old form */
|
||||||
crypto_digest_assign(digest, backup_digest);
|
crypto_digest_assign(digest, backup_digest);
|
||||||
/* restore the relay header */
|
/* restore the relay header */
|
||||||
memcpy(rh.integrity, received_integrity, 4);
|
memcpy(rh.integrity, &received_integrity, 4);
|
||||||
relay_header_pack(cell->payload, &rh);
|
relay_header_pack(cell->payload, &rh);
|
||||||
crypto_digest_free(backup_digest);
|
crypto_digest_free(backup_digest);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue