[tor-commits] [stem/master] HSv3 introductory point encoding

atagar at torproject.org atagar at torproject.org
Sun Nov 17 23:40:39 UTC 2019


commit 0b7b6bb7a7d1b5daa5ca26c8339d9cb6b3f3d518
Author: Damian Johnson <atagar at torproject.org>
Date:   Wed Oct 30 15:55:03 2019 -0700

    HSv3 introductory point encoding
    
    Now that we have the building blocks it's a simple matter for us to encode HSv3
    introductory points back into strings.
---
 stem/descriptor/hidden_service.py         | 33 ++++++++++++++++++++++++++++++-
 test/unit/descriptor/hidden_service_v3.py |  8 ++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/stem/descriptor/hidden_service.py b/stem/descriptor/hidden_service.py
index 72fc9b2b..09030ca5 100644
--- a/stem/descriptor/hidden_service.py
+++ b/stem/descriptor/hidden_service.py
@@ -163,7 +163,7 @@ class IntroductionPointV3(collections.namedtuple('IntroductionPointV3', ['link_s
   :var str enc_key_raw: base64 introduction request encryption key
   :var stem.certificate.Ed25519Certificate enc_key_cert: cross-certifier of the signing key by the encryption key
   :var str legacy_key_raw: base64 legacy introduction point RSA public key
-  :var str legacy_key_cert: cross-certifier of the signing key by the legacy key
+  :var str legacy_key_cert: base64 cross-certifier of the signing key by the legacy key
   """
 
   @staticmethod
@@ -204,6 +204,37 @@ class IntroductionPointV3(collections.namedtuple('IntroductionPointV3', ['link_s
 
     return IntroductionPointV3(link_specifiers, onion_key, auth_key_cert, enc_key, enc_key_cert, legacy_key, legacy_key_cert)
 
+  def encode(self):
+    """
+    Descriptor representation of this introduction point.
+
+    :returns: **str** for our descriptor representation
+    """
+
+    lines = []
+
+    link_count = stem.client.datatype.Size.CHAR.pack(len(self.link_specifiers))
+    link_specifiers = link_count + ''.join([l.pack() for l in self.link_specifiers])
+    lines.append('introduction-point %s' % base64.b64encode(link_specifiers))
+
+    if self.onion_key_raw:
+      lines.append('onion-key ntor %s' % self.onion_key_raw)
+
+    lines.append('auth-key\n' + self.auth_key_cert.to_base64(pem = True))
+
+    if self.enc_key_raw:
+      lines.append('enc-key ntor %s' % self.enc_key_raw)
+
+    lines.append('enc-key-cert\n' + self.enc_key_cert.to_base64(pem = True))
+
+    if self.legacy_key_raw:
+      lines.append('legacy-key\n' + self.legacy_key_raw)
+
+    if self.legacy_key_cert:
+      lines.append('legacy-key-cert\n' + self.legacy_key_cert)
+
+    return '\n'.join(lines)
+
   def onion_key(self):
     """
     Provides our ntor introduction point public key.
diff --git a/test/unit/descriptor/hidden_service_v3.py b/test/unit/descriptor/hidden_service_v3.py
index 6f8ba69e..fb190211 100644
--- a/test/unit/descriptor/hidden_service_v3.py
+++ b/test/unit/descriptor/hidden_service_v3.py
@@ -284,6 +284,14 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
     self.assertTrue('JAoGBAMO3' in intro_point.legacy_key_raw)
     self.assertTrue('Ln1ITJ0qP' in intro_point.legacy_key_cert)
 
+  def test_intro_point_encode(self):
+    """
+    Encode an introduction point back into a string.
+    """
+
+    intro_point = IntroductionPointV3.parse(INTRO_POINT_STR)
+    self.assertEqual(INTRO_POINT_STR.rstrip(), intro_point.encode())
+
   @require_x25519
   @test.require.ed25519_support
   def test_intro_point_crypto(self):





More information about the tor-commits mailing list