Skip to content

Commit 4697a18

Browse files
committed
Implement garlic 32
1 parent 95a80cb commit 4697a18

2 files changed

Lines changed: 37 additions & 10 deletions

File tree

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,26 @@ public byte[] addressToBytes(String addr) {
165165
dout.writeShort(port);
166166
dout.flush();
167167
return b.toByteArray();
168-
}
169-
case UNIX: {
168+
} case GARLIC32: {
169+
// an i2p base32 address with a length of greater than 55 characters is
170+
// using an Encrypted Leaseset v2. all other base32 addresses will always be
171+
// exactly 52 characters
172+
if (addr.length() < 55 && addr.length() != 52 || addr.contains(":")) {
173+
throw new IllegalStateException(String.format("Invalid garlic addr: %s not a i2p base32 address. len: %d", addr, addr.length()));
174+
}
175+
176+
while (addr.length() % 8 != 0) {
177+
addr += "=";
178+
}
179+
180+
ByteArrayOutputStream bout = new ByteArrayOutputStream();
181+
byte[] hashBytes = Multibase.decode(Multibase.Base.Base32.prefix + addr);;
182+
byte[] varint = new byte[(32 - Integer.numberOfLeadingZeros(hashBytes.length) + 6) / 7];
183+
putUvarint(varint, hashBytes.length);
184+
bout.write(varint);
185+
bout.write(hashBytes);
186+
return bout.toByteArray();
187+
} case UNIX: {
170188
if (addr.startsWith("/"))
171189
addr = addr.substring(1);
172190
byte[] path = addr.getBytes();
@@ -229,6 +247,15 @@ public String readAddress(InputStream in) throws IOException {
229247
read(in, host);
230248
String port = Integer.toString((in.read() << 8) | (in.read()));
231249
return Multibase.encode(Multibase.Base.Base32, host).substring(1) + ":" + port;
250+
} case GARLIC32: {
251+
buf = new byte[sizeForAddress];
252+
read(in, buf);
253+
// an i2p base64 for an Encrypted Leaseset v2 will be at least 35 bytes
254+
// long other than that, they will be exactly 32 bytes
255+
if (buf.length < 35 && buf.length != 32) {
256+
throw new IllegalStateException("Invalid garlic addr length: " + buf.length);
257+
}
258+
return Multibase.encode(Multibase.Base.Base32, buf).substring(1);
232259
} case UNIX:
233260
buf = new byte[sizeForAddress];
234261
read(in, buf);

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ public void fails() {
4545
// "/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA:0",
4646
// "/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA:-1",
4747
// "/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA@:666",
48-
// "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu",
49-
// "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu77",
50-
// "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu:80",
51-
// "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq:-1",
52-
// "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu@",
48+
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu",
49+
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu77",
50+
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu:80",
51+
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq:-1",
52+
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu@",
5353
"/udp/1234/sctp",
5454
"/udp/1234/udt/1234",
5555
"/udp/1234/utp/1234",
@@ -162,7 +162,7 @@ public void conversion() {
162162
if (!s.equals(new MultiAddress(fromHex(h)).toString()))
163163
throw new IllegalStateException(s + " != " + new MultiAddress(fromHex(h)));
164164
if (! Arrays.equals(new MultiAddress(s).getBytes(), fromHex(h)))
165-
throw new IllegalStateException("bytes for " + s + " != " + new MultiAddress(fromHex(h)));
165+
throw new IllegalStateException("bytes for " + s + " != " + fromHex(h));
166166
};
167167

168168
test.accept("/ip4/159.89.141.29/udp/5491/quic", "049f598d1d91021573cc03");
@@ -186,8 +186,8 @@ public void conversion() {
186186
// "e3139400848be5244b8ae96bb0c4a24f819cba0488f34985eac741d3359180bd72cafa1559e4c19f54ea8cedbb6a" +
187187
// "5afde4319396eb92aab340c60a50cc2284580cb3ad09017e8d9abc60269b3d8d687680bd86ce834412273d4f2e3b" +
188188
// "f68dd3d6fe87e2426ac658cd5c77fd5c0aa000000");
189-
// test.accept("/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq",
190-
// "bf0320efbcd45d0c5dc79781ac6f20ea5055a036afb48d45a52e7d68ec7d4338919e69");
189+
test.accept("/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq",
190+
"bf0320efbcd45d0c5dc79781ac6f20ea5055a036afb48d45a52e7d68ec7d4338919e69");
191191
}
192192

193193
@Test

0 commit comments

Comments
 (0)