Merge remote-tracking branch 'dgoulet/ticket21980_031_01'

This commit is contained in:
Nick Mathewson 2017-04-24 12:42:11 -04:00
commit 4cefda85e4
3 changed files with 107 additions and 1 deletions

View file

@ -9,6 +9,8 @@
* protocol.
**/
#define HS_COMMON_PRIVATE
#include "or.h"
#include "config.h"
@ -50,6 +52,46 @@ hs_check_service_private_dir(const char *username, const char *path,
return 0;
}
/** Get the default HS time period length in minutes from the consensus. */
STATIC uint64_t
get_time_period_length(void)
{
int32_t time_period_length = networkstatus_get_param(NULL, "hsdir-interval",
HS_TIME_PERIOD_LENGTH_DEFAULT,
HS_TIME_PERIOD_LENGTH_MIN,
HS_TIME_PERIOD_LENGTH_MAX);
/* Make sure it's a positive value. */
tor_assert(time_period_length >= 0);
/* uint64_t will always be able to contain a int32_t */
return (uint64_t) time_period_length;
}
/** Get the HS time period number at time <b>now</b> */
STATIC uint64_t
get_time_period_num(time_t now)
{
uint64_t time_period_num;
uint64_t time_period_length = get_time_period_length();
uint64_t minutes_since_epoch = now / 60;
/* Now subtract half a day to fit the prop224 time period schedule (see
* section [TIME-PERIODS]). */
tor_assert(minutes_since_epoch > HS_TIME_PERIOD_ROTATION_OFFSET);
minutes_since_epoch -= HS_TIME_PERIOD_ROTATION_OFFSET;
/* Calculate the time period */
time_period_num = minutes_since_epoch / time_period_length;
return time_period_num;
}
/** Get the number of the _upcoming_ HS time period, given that the current
* time is <b>now</b>. */
uint64_t
hs_get_next_time_period_num(time_t now)
{
return get_time_period_num(now) + 1;
}
/* Create a new rend_data_t for a specific given <b>version</b>.
* Return a pointer to the newly allocated data structure. */
static rend_data_t *

View file

@ -40,6 +40,15 @@
/* String prefix for the signature of ESTABLISH_INTRO */
#define ESTABLISH_INTRO_SIG_PREFIX "Tor establish-intro cell v1"
/* The default HS time period length */
#define HS_TIME_PERIOD_LENGTH_DEFAULT 1440 /* 1440 minutes == one day */
/* The minimum time period length as seen in prop224 section [TIME-PERIODS] */
#define HS_TIME_PERIOD_LENGTH_MIN 30 /* minutes */
/* The minimum time period length as seen in prop224 section [TIME-PERIODS] */
#define HS_TIME_PERIOD_LENGTH_MAX (60 * 24 * 10) /* 10 days or 14400 minutes */
/* The time period rotation offset as seen in prop224 section [TIME-PERIODS] */
#define HS_TIME_PERIOD_ROTATION_OFFSET (12 * 60) /* minutes */
int hs_check_service_private_dir(const char *username, const char *path,
unsigned int dir_group_readable,
unsigned int create);
@ -60,5 +69,18 @@ const char *rend_data_get_desc_id(const rend_data_t *rend_data,
const uint8_t *rend_data_get_pk_digest(const rend_data_t *rend_data,
size_t *len_out);
uint64_t hs_get_next_time_period_num(time_t now);
#ifdef HS_COMMON_PRIVATE
#ifdef TOR_UNIT_TESTS
STATIC uint64_t get_time_period_length(void);
STATIC uint64_t get_time_period_num(time_t now);
#endif /* TOR_UNIT_TESTS */
#endif /* HS_COMMON_PRIVATE */
#endif /* TOR_HS_COMMON_H */

View file

@ -6,6 +6,7 @@
* \brief Test hidden service functionality.
*/
#define HS_COMMON_PRIVATE
#define HS_SERVICE_PRIVATE
#define HS_INTROPOINT_PRIVATE
@ -14,6 +15,7 @@
#include "crypto.h"
#include "hs/cell_establish_intro.h"
#include "hs_common.h"
#include "hs_service.h"
#include "hs_intropoint.h"
@ -196,12 +198,52 @@ test_hs_ntor(void *arg)
;
}
/** Test that our HS time period calculation functions work properly */
static void
test_time_period(void *arg)
{
(void) arg;
unsigned int tn;
int retval;
time_t fake_time;
/* Let's do the example in prop224 section [TIME-PERIODS] */
retval = parse_rfc1123_time("Wed, 13 Apr 2016 11:00:00 UTC",
&fake_time);
tt_int_op(retval, ==, 0);
/* Check that the time period number is right */
tn = get_time_period_num(fake_time);
tt_int_op(tn, ==, 16903);
/* Increase current time to 11:59:59 UTC and check that the time period
number is still the same */
fake_time += 3599;
tn = get_time_period_num(fake_time);
tt_int_op(tn, ==, 16903);
/* Now take time to 12:00:00 UTC and check that the time period rotated */
fake_time += 1;
tn = get_time_period_num(fake_time);
tt_int_op(tn, ==, 16904);
/* Now also check our hs_get_next_time_period_num() function */
tn = hs_get_next_time_period_num(fake_time);
tt_int_op(tn, ==, 16905);
done:
;
}
struct testcase_t hs_service_tests[] = {
{ "gen_establish_intro_cell", test_gen_establish_intro_cell, TT_FORK,
NULL, NULL },
{ "gen_establish_intro_cell_bad", test_gen_establish_intro_cell_bad, TT_FORK,
NULL, NULL },
{ "hs_ntor", test_hs_ntor, TT_FORK, NULL, NULL },
{ "hs_ntor", test_hs_ntor, TT_FORK,
NULL, NULL },
{ "time_period", test_time_period, TT_FORK,
NULL, NULL },
END_OF_TESTCASES
};