mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-25 23:21:38 +01:00
Merge remote-tracking branch 'asn/bug20852_v1'
This commit is contained in:
commit
7892683e7e
5 changed files with 26 additions and 9 deletions
|
@ -15,6 +15,7 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "hs_common.h"
|
#include "hs_common.h"
|
||||||
#include "hs_descriptor.h"
|
#include "hs_descriptor.h"
|
||||||
|
#include "networkstatus.h"
|
||||||
#include "rendcache.h"
|
#include "rendcache.h"
|
||||||
|
|
||||||
/* Directory descriptor cache. Map indexed by blinded key. */
|
/* Directory descriptor cache. Map indexed by blinded key. */
|
||||||
|
@ -366,6 +367,18 @@ hs_cache_handle_oom(time_t now, size_t min_remove_bytes)
|
||||||
return bytes_removed;
|
return bytes_removed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the maximum size of an HS descriptor we are willing to accept as an
|
||||||
|
* HSDir.
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
hs_cache_get_max_descriptor_size(void)
|
||||||
|
{
|
||||||
|
return (unsigned) networkstatus_get_param(NULL,
|
||||||
|
"HSV3MaxDescriptorSize",
|
||||||
|
HS_DESC_MAX_LEN, 1, INT32_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize the hidden service cache subsystem. */
|
/* Initialize the hidden service cache subsystem. */
|
||||||
void
|
void
|
||||||
hs_cache_init(void)
|
hs_cache_init(void)
|
||||||
|
|
|
@ -44,6 +44,8 @@ void hs_cache_free_all(void);
|
||||||
void hs_cache_clean_as_dir(time_t now);
|
void hs_cache_clean_as_dir(time_t now);
|
||||||
size_t hs_cache_handle_oom(time_t now, size_t min_remove_bytes);
|
size_t hs_cache_handle_oom(time_t now, size_t min_remove_bytes);
|
||||||
|
|
||||||
|
unsigned int hs_cache_get_max_descriptor_size(void);
|
||||||
|
|
||||||
/* Store and Lookup function. They are version agnostic that is depending on
|
/* Store and Lookup function. They are version agnostic that is depending on
|
||||||
* the requested version of the descriptor, it will be re-routed to the
|
* the requested version of the descriptor, it will be re-routed to the
|
||||||
* right function. */
|
* right function. */
|
||||||
|
|
|
@ -15,13 +15,14 @@
|
||||||
#include "ed25519_cert.h" /* Trunnel interface. */
|
#include "ed25519_cert.h" /* Trunnel interface. */
|
||||||
#include "parsecommon.h"
|
#include "parsecommon.h"
|
||||||
#include "rendcache.h"
|
#include "rendcache.h"
|
||||||
|
#include "hs_cache.h"
|
||||||
#include "torcert.h" /* tor_cert_encode_ed22519() */
|
#include "torcert.h" /* tor_cert_encode_ed22519() */
|
||||||
|
|
||||||
/* Constant string value used for the descriptor format. */
|
/* Constant string value used for the descriptor format. */
|
||||||
#define str_hs_desc "hs-descriptor"
|
#define str_hs_desc "hs-descriptor"
|
||||||
#define str_desc_cert "descriptor-signing-key-cert"
|
#define str_desc_cert "descriptor-signing-key-cert"
|
||||||
#define str_rev_counter "revision-counter"
|
#define str_rev_counter "revision-counter"
|
||||||
#define str_encrypted "encrypted"
|
#define str_superencrypted "superencrypted"
|
||||||
#define str_signature "signature"
|
#define str_signature "signature"
|
||||||
#define str_lifetime "descriptor-lifetime"
|
#define str_lifetime "descriptor-lifetime"
|
||||||
/* Constant string value for the encrypted part of the descriptor. */
|
/* Constant string value for the encrypted part of the descriptor. */
|
||||||
|
@ -35,7 +36,7 @@
|
||||||
#define str_intro_point_start "\n" str_intro_point " "
|
#define str_intro_point_start "\n" str_intro_point " "
|
||||||
/* Constant string value for the construction to encrypt the encrypted data
|
/* Constant string value for the construction to encrypt the encrypted data
|
||||||
* section. */
|
* section. */
|
||||||
#define str_enc_hsdir_data "hsdir-encrypted-data"
|
#define str_enc_hsdir_data "hsdir-superencrypted-data"
|
||||||
/* Prefix required to compute/verify HS desc signatures */
|
/* Prefix required to compute/verify HS desc signatures */
|
||||||
#define str_desc_sig_prefix "Tor onion service descriptor sig v3"
|
#define str_desc_sig_prefix "Tor onion service descriptor sig v3"
|
||||||
|
|
||||||
|
@ -56,7 +57,7 @@ static token_rule_t hs_desc_v3_token_table[] = {
|
||||||
T1(str_lifetime, R3_DESC_LIFETIME, EQ(1), NO_OBJ),
|
T1(str_lifetime, R3_DESC_LIFETIME, EQ(1), NO_OBJ),
|
||||||
T1(str_desc_cert, R3_DESC_SIGNING_CERT, NO_ARGS, NEED_OBJ),
|
T1(str_desc_cert, R3_DESC_SIGNING_CERT, NO_ARGS, NEED_OBJ),
|
||||||
T1(str_rev_counter, R3_REVISION_COUNTER, EQ(1), NO_OBJ),
|
T1(str_rev_counter, R3_REVISION_COUNTER, EQ(1), NO_OBJ),
|
||||||
T1(str_encrypted, R3_ENCRYPTED, NO_ARGS, NEED_OBJ),
|
T1(str_superencrypted, R3_SUPERENCRYPTED, NO_ARGS, NEED_OBJ),
|
||||||
T1_END(str_signature, R3_SIGNATURE, EQ(1), NO_OBJ),
|
T1_END(str_signature, R3_SIGNATURE, EQ(1), NO_OBJ),
|
||||||
END_OF_TABLE
|
END_OF_TABLE
|
||||||
};
|
};
|
||||||
|
@ -751,7 +752,7 @@ desc_encode_v3(const hs_descriptor_t *desc,
|
||||||
desc->plaintext_data.revision_counter);
|
desc->plaintext_data.revision_counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Build the encrypted data section. */
|
/* Build the superencrypted data section. */
|
||||||
{
|
{
|
||||||
char *enc_b64_blob=NULL;
|
char *enc_b64_blob=NULL;
|
||||||
if (encode_encrypted_data(desc, &enc_b64_blob) < 0) {
|
if (encode_encrypted_data(desc, &enc_b64_blob) < 0) {
|
||||||
|
@ -762,7 +763,7 @@ desc_encode_v3(const hs_descriptor_t *desc,
|
||||||
"-----BEGIN MESSAGE-----\n"
|
"-----BEGIN MESSAGE-----\n"
|
||||||
"%s"
|
"%s"
|
||||||
"-----END MESSAGE-----",
|
"-----END MESSAGE-----",
|
||||||
str_encrypted, enc_b64_blob);
|
str_superencrypted, enc_b64_blob);
|
||||||
tor_free(enc_b64_blob);
|
tor_free(enc_b64_blob);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1492,7 +1493,7 @@ desc_decode_plaintext_v3(smartlist_t *tokens,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Extract the encrypted data section. */
|
/* Extract the encrypted data section. */
|
||||||
tok = find_by_keyword(tokens, R3_ENCRYPTED);
|
tok = find_by_keyword(tokens, R3_SUPERENCRYPTED);
|
||||||
tor_assert(tok->object_body);
|
tor_assert(tok->object_body);
|
||||||
if (strcmp(tok->object_type, "MESSAGE") != 0) {
|
if (strcmp(tok->object_type, "MESSAGE") != 0) {
|
||||||
log_warn(LD_REND, "Service descriptor encrypted data section is invalid");
|
log_warn(LD_REND, "Service descriptor encrypted data section is invalid");
|
||||||
|
@ -1701,8 +1702,9 @@ hs_desc_decode_plaintext(const char *encoded,
|
||||||
tor_assert(encoded);
|
tor_assert(encoded);
|
||||||
tor_assert(plaintext);
|
tor_assert(plaintext);
|
||||||
|
|
||||||
|
/* Check that descriptor is within size limits. */
|
||||||
encoded_len = strlen(encoded);
|
encoded_len = strlen(encoded);
|
||||||
if (encoded_len >= HS_DESC_MAX_LEN) {
|
if (encoded_len >= hs_cache_get_max_descriptor_size()) {
|
||||||
log_warn(LD_REND, "Service descriptor is too big (%lu bytes)",
|
log_warn(LD_REND, "Service descriptor is too big (%lu bytes)",
|
||||||
(unsigned long) encoded_len);
|
(unsigned long) encoded_len);
|
||||||
goto err;
|
goto err;
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
HS_DESC_ENCRYPTED_SALT_LEN + \
|
HS_DESC_ENCRYPTED_SALT_LEN + \
|
||||||
HS_DESC_PLAINTEXT_PADDING_MULTIPLE + DIGEST256_LEN
|
HS_DESC_PLAINTEXT_PADDING_MULTIPLE + DIGEST256_LEN
|
||||||
/* Maximum length in bytes of a full hidden service descriptor. */
|
/* Maximum length in bytes of a full hidden service descriptor. */
|
||||||
#define HS_DESC_MAX_LEN 32768 // XXX justify
|
#define HS_DESC_MAX_LEN 50000 /* 50kb max size */
|
||||||
/* The minimum amount of fields a descriptor should contain. The parsing of
|
/* The minimum amount of fields a descriptor should contain. The parsing of
|
||||||
* the fields are version specific so the only required field, as a generic
|
* the fields are version specific so the only required field, as a generic
|
||||||
* view of a descriptor, is 1 that is the version field. */
|
* view of a descriptor, is 1 that is the version field. */
|
||||||
|
|
|
@ -154,7 +154,7 @@ typedef enum {
|
||||||
R3_DESC_LIFETIME,
|
R3_DESC_LIFETIME,
|
||||||
R3_DESC_SIGNING_CERT,
|
R3_DESC_SIGNING_CERT,
|
||||||
R3_REVISION_COUNTER,
|
R3_REVISION_COUNTER,
|
||||||
R3_ENCRYPTED,
|
R3_SUPERENCRYPTED,
|
||||||
R3_SIGNATURE,
|
R3_SIGNATURE,
|
||||||
R3_CREATE2_FORMATS,
|
R3_CREATE2_FORMATS,
|
||||||
R3_AUTHENTICATION_REQUIRED,
|
R3_AUTHENTICATION_REQUIRED,
|
||||||
|
|
Loading…
Add table
Reference in a new issue