public void CanParseSpecialAddresses() { var addr = new NetworkAddress(); // TORv2 Assert.True(addr.SetSpecial("6hzph5hv6337r6p2.onion")); Assert.True(addr.AddressType == NetworkAddressType.Onion); Assert.True(addr.IsAddrV1Compatible); Assert.Equal("6hzph5hv6337r6p2.onion", addr.ToAddressString()); // TORv3 var torv3_addr = "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion"; Assert.True(addr.SetSpecial(torv3_addr)); Assert.True(addr.AddressType == NetworkAddressType.Onion); Assert.False(addr.IsAddrV1Compatible); Assert.Equal(addr.ToAddressString(), torv3_addr); // TORv3, broken, with wrong checksum Assert.False(addr.SetSpecial("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscsad.onion")); // TORv3, broken, with wrong version Assert.False(addr.SetSpecial("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscrye.onion")); // TORv3, malicious Assert.False(addr.SetSpecial("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd\0wtf.onion")); // TOR, bogus length Assert.False(addr.SetSpecial("mfrggzak.onion")); // TOR, invalid base32 Assert.False(addr.SetSpecial("mf*g zak.onion")); // I2P var i2p_addr = "udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p"; Assert.True(addr.SetSpecial(i2p_addr)); Assert.True(addr.AddressType == NetworkAddressType.I2P); Assert.False(addr.IsAddrV1Compatible); Assert.Equal(addr.ToAddressString(), i2p_addr); // I2P, malicious Assert.False(addr.SetSpecial("udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna\0wtf.b32.i2p")); // I2P, valid but unsupported Assert.False(addr.SetSpecial("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscsad.b32.i2p")); // I2P, invalid base32 Assert.False(addr.SetSpecial("tp*szydbh4dp.b32.i2p")); // General validations Assert.False(addr.SetSpecial(".onion")); Assert.False(addr.SetSpecial("")); }