commit 0b7b6bb7a7d1b5daa5ca26c8339d9cb6b3f3d518 Author: Damian Johnson atagar@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):