Skip to content

Commit 6702eb5

Browse files
committed
Update test vectors and fix ipfs/p2p parsing
Add ipv6zone, ipv6cidr, p2p-webrtc, tls, noise, webtransport, certhash
1 parent 73a45f4 commit 6702eb5

File tree

2 files changed

+90
-10
lines changed

2 files changed

+90
-10
lines changed

src/main/java/io/ipfs/multiaddr/Protocol.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@ enum Type {
1616
TCP(6, 16, "tcp"),
1717
DCCP(33, 16, "dccp"),
1818
IP6(41, 128, "ip6"),
19+
IP6ZONE(42, LENGTH_PREFIXED_VAR_SIZE, "ip6zone"),
20+
IPCIDR(43, 8, "ipcidr"),
1921
DNS(53, LENGTH_PREFIXED_VAR_SIZE, "dns"),
2022
DNS4(54, LENGTH_PREFIXED_VAR_SIZE, "dns4"),
2123
DNS6(55, LENGTH_PREFIXED_VAR_SIZE, "dns6"),
2224
DNSADDR(56, LENGTH_PREFIXED_VAR_SIZE, "dnsaddr"),
2325
SCTP(132, 16, "sctp"),
2426
UDP(273, 16, "udp"),
27+
P2PWEBRTC(276, 0, "p2p-webrtc-direct"),
2528
UTP(301, 0, "utp"),
2629
UDT(302, 0, "udt"),
2730
UNIX(400, LENGTH_PREFIXED_VAR_SIZE, "unix"),
@@ -32,7 +35,11 @@ enum Type {
3235
ONION3(445, 296, "onion3"),
3336
GARLIC64(446, LENGTH_PREFIXED_VAR_SIZE, "garlic64"),
3437
GARLIC32(447, LENGTH_PREFIXED_VAR_SIZE, "garlic32"),
38+
TLS(448, 0, "tls"),
39+
NOISE(454, 0, "noise"),
3540
QUIC(460, 0, "quic"),
41+
WEBTRANSPORT(465, 0, "webtransport"),
42+
CERTHASH(466, LENGTH_PREFIXED_VAR_SIZE, "certhash"),
3643
WS(477, 0, "ws"),
3744
WSS(478, 0, "wss"),
3845
P2PCIRCUIT(290, 0, "p2p-circuit"),
@@ -96,6 +103,14 @@ public byte[] addressToBytes(String addr) {
96103
return Inet4Address.getByName(addr).getAddress();
97104
case IP6:
98105
return Inet6Address.getByName(addr).getAddress();
106+
case IPCIDR:
107+
return new byte[] {Byte.parseByte(addr)};
108+
case IP6ZONE:
109+
if (addr.isEmpty())
110+
throw new IllegalStateException("Empty IPv6 zone!");
111+
if (addr.contains("/"))
112+
throw new IllegalStateException("IPv6 zone ID contains '/'");
113+
return addr.getBytes();
99114
case TCP:
100115
case UDP:
101116
case DCCP:
@@ -106,7 +121,15 @@ public byte[] addressToBytes(String addr) {
106121
return new byte[]{(byte)(x >>8), (byte)x};
107122
case P2P:
108123
case IPFS: {
109-
Multihash hash = Cid.decode(addr);
124+
Multihash hash;
125+
if (addr.startsWith("Qm") || addr.startsWith("1"))
126+
hash = Multihash.fromBase58(addr);
127+
else {
128+
Cid cid = Cid.decode(addr);
129+
if (cid.codec != Cid.Codec.Libp2pKey)
130+
throw new IllegalStateException("failed to parse p2p addr: " + addr + " has the invalid codec " + cid.codec);
131+
hash = new Multihash(cid.getType(), cid.getHash());
132+
}
110133
ByteArrayOutputStream bout = new ByteArrayOutputStream();
111134
byte[] hashBytes = hash.toBytes();
112135
byte[] varint = new byte[(32 - Integer.numberOfLeadingZeros(hashBytes.length) + 6) / 7];
@@ -115,6 +138,10 @@ public byte[] addressToBytes(String addr) {
115138
bout.write(hashBytes);
116139
return bout.toByteArray();
117140
}
141+
case CERTHASH:
142+
byte[] raw = Multibase.decode(addr);
143+
Multihash.deserialize(raw);
144+
return raw;
118145
case ONION: {
119146
String[] split = addr.split(":");
120147
if (split.length != 2)
@@ -242,6 +269,12 @@ public String readAddress(InputStream in) throws IOException {
242269
buf = new byte[sizeForAddress];
243270
read(in, buf);
244271
return Inet6Address.getByAddress(buf).toString().substring(1);
272+
case IPCIDR:
273+
return Integer.toString(in.read());
274+
case IP6ZONE:
275+
buf = new byte[sizeForAddress];
276+
read(in, buf);
277+
return new String(buf);
245278
case TCP:
246279
case UDP:
247280
case DCCP:
@@ -250,7 +283,11 @@ public String readAddress(InputStream in) throws IOException {
250283
case IPFS:
251284
buf = new byte[sizeForAddress];
252285
read(in, buf);
253-
return Cid.cast(buf).toString();
286+
return Multihash.deserialize(buf).toString();
287+
case CERTHASH:
288+
buf = new byte[sizeForAddress];
289+
read(in, buf);
290+
return Multibase.encode(Multibase.Base.Base64, buf);
254291
case ONION: {
255292
byte[] host = new byte[10];
256293
read(in, host);

src/test/java/io/ipfs/api/MultiAddressTest.java

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,43 +78,86 @@ public void succeeds() {
7878
List<String> failed = Stream.of(
7979
"/ip4/1.2.3.4",
8080
"/ip4/0.0.0.0",
81+
"/ip4/192.0.2.0/ipcidr/24",
8182
"/ip6/::1",
8283
"/ip6/2601:9:4f81:9700:803e:ca65:66e8:c21",
84+
"/ip6/2601:9:4f81:9700:803e:ca65:66e8:c21/udp/1234/quic",
85+
"/ip6/2001:db8::/ipcidr/32",
86+
"/ip6zone/x/ip6/fe80::1",
87+
"/ip6zone/x%y/ip6/fe80::1",
88+
"/ip6zone/x%y/ip6/::",
89+
"/ip6zone/x/ip6/fe80::1/udp/1234/quic",
8390
"/onion/timaq4ygg2iegci7:1234",
8491
"/onion/timaq4ygg2iegci7:80/http",
92+
"/onion3/vww6ybal4bd7szmgncyruucpgfkqahzddi37ktceo3ah7ngmcopnpyyd:1234",
93+
"/onion3/vww6ybal4bd7szmgncyruucpgfkqahzddi37ktceo3ah7ngmcopnpyyd:80/http",
94+
"/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA",
95+
"/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA/http",
96+
"/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA/udp/8080",
97+
"/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA/tcp/8080",
98+
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq",
99+
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuqzwas",
100+
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuqzwassw",
101+
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/http",
102+
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/tcp/8080",
103+
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/udp/8080",
85104
"/udp/0",
86105
"/tcp/0",
87106
"/sctp/0",
88107
"/udp/1234",
89108
"/tcp/1234",
90-
"/dns4/ipfs.io",
91-
"/dns6/ipfs.io",
92-
"/dnsaddr/ipfs.io",
93109
"/sctp/1234",
94110
"/udp/65535",
95111
"/tcp/65535",
96112
"/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC",
97-
"/ipfs/zdpuAnNyxJR8tigBDe5FM2PfMq1u7fKSCsTmb4m3iJZcCq8yB",
98-
"/ipfs/zdpuAnNyxJR8tigBDe5FM2PfMq1u7fKSCsTmb4m3iJZcCq8yB/p2p-circuit",
113+
"/ipfs/k2k4r8oqamigqdo6o7hsbfwd45y70oyynp98usk7zmyfrzpqxh1pohl7",
114+
"/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC",
115+
"/p2p/k2k4r8oqamigqdo6o7hsbfwd45y70oyynp98usk7zmyfrzpqxh1pohl7",
116+
"/p2p/bafzbeigvf25ytwc3akrijfecaotc74udrhcxzh2cx3we5qqnw5vgrei4bm",
117+
"/p2p/12D3KooWCryG7Mon9orvQxcS1rYZjotPgpwoJNHHKcLLfE4Hf5mV",
118+
"/p2p/k51qzi5uqu5dhb6l8spkdx7yxafegfkee5by8h7lmjh2ehc2sgg34z7c15vzqs",
119+
"/p2p/bafzaajaiaejcalj543iwv2d7pkjt7ykvefrkfu7qjfi6sduakhso4lay6abn2d5u",
99120
"/udp/1234/sctp/1234",
100121
"/udp/1234/udt",
101122
"/udp/1234/utp",
102123
"/tcp/1234/http",
124+
"/tcp/1234/tls/http",
103125
"/tcp/1234/https",
104-
"/tcp/1234/ws",
105126
"/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC/tcp/1234",
127+
"/ipfs/k2k4r8oqamigqdo6o7hsbfwd45y70oyynp98usk7zmyfrzpqxh1pohl7/tcp/1234",
106128
"/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC/tcp/1234",
129+
"/p2p/k2k4r8oqamigqdo6o7hsbfwd45y70oyynp98usk7zmyfrzpqxh1pohl7/tcp/1234",
107130
"/ip4/127.0.0.1/udp/1234",
108-
"/ip4/127.0.0.1/udp/1234/quic",
109131
"/ip4/127.0.0.1/udp/0",
110132
"/ip4/127.0.0.1/tcp/1234",
111133
"/ip4/127.0.0.1/tcp/1234/",
134+
"/ip4/127.0.0.1/udp/1234/quic",
135+
"/ip4/127.0.0.1/udp/1234/quic/webtransport",
136+
"/ip4/127.0.0.1/udp/1234/quic/webtransport/certhash/b2uaraocy6yrdblb4sfptaddgimjmmpy",
137+
"/ip4/127.0.0.1/udp/1234/quic/webtransport/certhash/b2uaraocy6yrdblb4sfptaddgimjmmpy/certhash/zQmbWTwYGcmdyK9CYfNBcfs9nhZs17a6FQ4Y8oea278xx41",
112138
"/ip4/127.0.0.1/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC",
113139
"/ip4/127.0.0.1/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC/tcp/1234",
140+
"/ip4/127.0.0.1/ipfs/k2k4r8oqamigqdo6o7hsbfwd45y70oyynp98usk7zmyfrzpqxh1pohl7",
141+
"/ip4/127.0.0.1/ipfs/k2k4r8oqamigqdo6o7hsbfwd45y70oyynp98usk7zmyfrzpqxh1pohl7/tcp/1234",
142+
"/ip4/127.0.0.1/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC",
143+
"/ip4/127.0.0.1/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC/tcp/1234",
144+
"/ip4/127.0.0.1/p2p/k2k4r8oqamigqdo6o7hsbfwd45y70oyynp98usk7zmyfrzpqxh1pohl7",
145+
"/ip4/127.0.0.1/p2p/k2k4r8oqamigqdo6o7hsbfwd45y70oyynp98usk7zmyfrzpqxh1pohl7/tcp/1234",
114146
"/unix/a/b/c/d/e",
115147
"/unix/stdio",
116148
"/ip4/1.2.3.4/tcp/80/unix/a/b/c/d/e/f",
117-
"/ip4/127.0.0.1/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC/tcp/1234/unix/stdio"
149+
"/ip4/127.0.0.1/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC/tcp/1234/unix/stdio",
150+
"/ip4/127.0.0.1/ipfs/k2k4r8oqamigqdo6o7hsbfwd45y70oyynp98usk7zmyfrzpqxh1pohl7/tcp/1234/unix/stdio",
151+
"/ip4/127.0.0.1/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC/tcp/1234/unix/stdio",
152+
"/ip4/127.0.0.1/p2p/k2k4r8oqamigqdo6o7hsbfwd45y70oyynp98usk7zmyfrzpqxh1pohl7/tcp/1234/unix/stdio",
153+
"/ip4/127.0.0.1/tcp/9090/http/p2p-webrtc-direct",
154+
"/ip4/127.0.0.1/tcp/127/ws",
155+
"/ip4/127.0.0.1/tcp/127/ws",
156+
"/ip4/127.0.0.1/tcp/127/tls",
157+
"/ip4/127.0.0.1/tcp/127/tls/ws",
158+
"/ip4/127.0.0.1/tcp/127/noise",
159+
"/ip4/127.0.0.1/tcp/127/wss",
160+
"/ip4/127.0.0.1/tcp/127/wss"
118161
).flatMap(s -> {
119162
try {
120163
new MultiAddress(s);

0 commit comments

Comments
 (0)