|
@@ -332,50 +332,10 @@ encode_link_specifiers(const smartlist_t *specs)
|
|
|
|
|
|
SMARTLIST_FOREACH_BEGIN(specs, const hs_desc_link_specifier_t *,
|
|
|
spec) {
|
|
|
- link_specifier_t *ls = link_specifier_new();
|
|
|
- link_specifier_set_ls_type(ls, spec->type);
|
|
|
-
|
|
|
- switch (spec->type) {
|
|
|
- case LS_IPV4:
|
|
|
- link_specifier_set_un_ipv4_addr(ls,
|
|
|
- tor_addr_to_ipv4h(&spec->u.ap.addr));
|
|
|
- link_specifier_set_un_ipv4_port(ls, spec->u.ap.port);
|
|
|
- /* Four bytes IPv4 and two bytes port. */
|
|
|
- link_specifier_set_ls_len(ls, sizeof(spec->u.ap.addr.addr.in_addr) +
|
|
|
- sizeof(spec->u.ap.port));
|
|
|
- break;
|
|
|
- case LS_IPV6:
|
|
|
- {
|
|
|
- size_t addr_len = link_specifier_getlen_un_ipv6_addr(ls);
|
|
|
- const uint8_t *in6_addr = tor_addr_to_in6_addr8(&spec->u.ap.addr);
|
|
|
- uint8_t *ipv6_array = link_specifier_getarray_un_ipv6_addr(ls);
|
|
|
- memcpy(ipv6_array, in6_addr, addr_len);
|
|
|
- link_specifier_set_un_ipv6_port(ls, spec->u.ap.port);
|
|
|
- /* Sixteen bytes IPv6 and two bytes port. */
|
|
|
- link_specifier_set_ls_len(ls, addr_len + sizeof(spec->u.ap.port));
|
|
|
- break;
|
|
|
+ link_specifier_t *ls = hs_desc_encode_lspec(spec);
|
|
|
+ if (ls) {
|
|
|
+ link_specifier_list_add_spec(lslist, ls);
|
|
|
}
|
|
|
- case LS_LEGACY_ID:
|
|
|
- {
|
|
|
- size_t legacy_id_len = link_specifier_getlen_un_legacy_id(ls);
|
|
|
- uint8_t *legacy_id_array = link_specifier_getarray_un_legacy_id(ls);
|
|
|
- memcpy(legacy_id_array, spec->u.legacy_id, legacy_id_len);
|
|
|
- link_specifier_set_ls_len(ls, legacy_id_len);
|
|
|
- break;
|
|
|
- }
|
|
|
- case LS_ED25519_ID:
|
|
|
- {
|
|
|
- size_t ed25519_id_len = link_specifier_getlen_un_ed25519_id(ls);
|
|
|
- uint8_t *ed25519_id_array = link_specifier_getarray_un_ed25519_id(ls);
|
|
|
- memcpy(ed25519_id_array, spec->u.ed25519_id, ed25519_id_len);
|
|
|
- link_specifier_set_ls_len(ls, ed25519_id_len);
|
|
|
- break;
|
|
|
- }
|
|
|
- default:
|
|
|
- tor_assert(0);
|
|
|
- }
|
|
|
-
|
|
|
- link_specifier_list_add_spec(lslist, ls);
|
|
|
} SMARTLIST_FOREACH_END(spec);
|
|
|
|
|
|
{
|
|
@@ -2575,3 +2535,59 @@ hs_descriptor_clear_intro_points(hs_descriptor_t *desc)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/* From a descriptor link specifier object spec, returned a newly allocated
|
|
|
+ * link specifier object that is the encoded representation of spec. Return
|
|
|
+ * NULL on error. */
|
|
|
+link_specifier_t *
|
|
|
+hs_desc_encode_lspec(const hs_desc_link_specifier_t *spec)
|
|
|
+{
|
|
|
+ tor_assert(spec);
|
|
|
+
|
|
|
+ link_specifier_t *ls = link_specifier_new();
|
|
|
+ link_specifier_set_ls_type(ls, spec->type);
|
|
|
+
|
|
|
+ switch (spec->type) {
|
|
|
+ case LS_IPV4:
|
|
|
+ link_specifier_set_un_ipv4_addr(ls,
|
|
|
+ tor_addr_to_ipv4h(&spec->u.ap.addr));
|
|
|
+ link_specifier_set_un_ipv4_port(ls, spec->u.ap.port);
|
|
|
+ /* Four bytes IPv4 and two bytes port. */
|
|
|
+ link_specifier_set_ls_len(ls, sizeof(spec->u.ap.addr.addr.in_addr) +
|
|
|
+ sizeof(spec->u.ap.port));
|
|
|
+ break;
|
|
|
+ case LS_IPV6:
|
|
|
+ {
|
|
|
+ size_t addr_len = link_specifier_getlen_un_ipv6_addr(ls);
|
|
|
+ const uint8_t *in6_addr = tor_addr_to_in6_addr8(&spec->u.ap.addr);
|
|
|
+ uint8_t *ipv6_array = link_specifier_getarray_un_ipv6_addr(ls);
|
|
|
+ memcpy(ipv6_array, in6_addr, addr_len);
|
|
|
+ link_specifier_set_un_ipv6_port(ls, spec->u.ap.port);
|
|
|
+ /* Sixteen bytes IPv6 and two bytes port. */
|
|
|
+ link_specifier_set_ls_len(ls, addr_len + sizeof(spec->u.ap.port));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case LS_LEGACY_ID:
|
|
|
+ {
|
|
|
+ size_t legacy_id_len = link_specifier_getlen_un_legacy_id(ls);
|
|
|
+ uint8_t *legacy_id_array = link_specifier_getarray_un_legacy_id(ls);
|
|
|
+ memcpy(legacy_id_array, spec->u.legacy_id, legacy_id_len);
|
|
|
+ link_specifier_set_ls_len(ls, legacy_id_len);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case LS_ED25519_ID:
|
|
|
+ {
|
|
|
+ size_t ed25519_id_len = link_specifier_getlen_un_ed25519_id(ls);
|
|
|
+ uint8_t *ed25519_id_array = link_specifier_getarray_un_ed25519_id(ls);
|
|
|
+ memcpy(ed25519_id_array, spec->u.ed25519_id, ed25519_id_len);
|
|
|
+ link_specifier_set_ls_len(ls, ed25519_id_len);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ tor_assert_nonfatal_unreached();
|
|
|
+ link_specifier_free(ls);
|
|
|
+ ls = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ls;
|
|
|
+}
|
|
|
+
|