|
@@ -151,9 +151,9 @@ relay_digest_matches(crypto_digest_t *digest, cell_t *cell)
|
|
|
{
|
|
|
uint32_t received_integrity, calculated_integrity;
|
|
|
relay_header_t rh;
|
|
|
- crypto_digest_t *backup_digest=NULL;
|
|
|
+ crypto_digest_checkpoint_t backup_digest;
|
|
|
|
|
|
- backup_digest = crypto_digest_dup(digest);
|
|
|
+ crypto_digest_checkpoint(&backup_digest, digest);
|
|
|
|
|
|
relay_header_unpack(&rh, cell->payload);
|
|
|
memcpy(&received_integrity, rh.integrity, 4);
|
|
@@ -167,19 +167,21 @@ relay_digest_matches(crypto_digest_t *digest, cell_t *cell)
|
|
|
crypto_digest_add_bytes(digest, (char*) cell->payload, CELL_PAYLOAD_SIZE);
|
|
|
crypto_digest_get_digest(digest, (char*) &calculated_integrity, 4);
|
|
|
|
|
|
+ int rv = 1;
|
|
|
+
|
|
|
if (calculated_integrity != received_integrity) {
|
|
|
|
|
|
|
|
|
|
|
|
- crypto_digest_assign(digest, backup_digest);
|
|
|
+ crypto_digest_restore(digest, &backup_digest);
|
|
|
|
|
|
memcpy(rh.integrity, &received_integrity, 4);
|
|
|
relay_header_pack(cell->payload, &rh);
|
|
|
- crypto_digest_free(backup_digest);
|
|
|
- return 0;
|
|
|
+ rv = 0;
|
|
|
}
|
|
|
- crypto_digest_free(backup_digest);
|
|
|
- return 1;
|
|
|
+
|
|
|
+ memwipe(&backup_digest, 0, sizeof(backup_digest));
|
|
|
+ return rv;
|
|
|
}
|
|
|
|
|
|
|