From 056263f8b92cb559c39364ece9e34b515ca61ce5 Mon Sep 17 00:00:00 2001 From: idk Date: Thu, 28 Mar 2019 23:00:48 -0400 Subject: [PATCH 01/14] Start attempting to support base32 for Encrypted Leaseset Version 2, aka base33. Not likely to work yet. --- transcoders.go | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/transcoders.go b/transcoders.go index cca2514..cb8d684 100644 --- a/transcoders.go +++ b/transcoders.go @@ -212,7 +212,7 @@ func onion3BtS(b []byte) (string, error) { return str, nil } -var TranscoderGarlic64 = NewTranscoderFromFunctions(garlic64StB, garlic64BtS, garlicValidate) +var TranscoderGarlic64 = NewTranscoderFromFunctions(garlic64StB, garlic64BtS, garlic64Validate) // i2p uses an alternate character set for base64 addresses. This returns an appropriate encoder. var garlicBase64Encoding = base64.NewEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-~") @@ -238,13 +238,50 @@ func garlic64BtS(b []byte) (string, error) { return addr, nil } -func garlicValidate(b []byte) error { +func garlic64Validate(b []byte) error { if len(b) < 386 { return fmt.Errorf("failed to validate garlic addr: %s not an i2p base64 address. len: %d\n", b, len(b)) } return nil } +var TranscoderGarlic32 = NewTranscoderFromFunctions(garlic32StB, garlic32BtS, garlic32Validate) + +var garlicBase32Encoding = base32.NewEncoding("abcdefghijklmnopqrstuvwxyz234567") + +func garlic32StB(s string) ([]byte, error) { + // garlic address without the ".b32.i2p" substring, with padding + if len(s) != 52 || len(s) < 55 || len(s) > 63 { + return nil, fmt.Errorf("failed to parse garlic addr: %s not a i2p base32 address. len: %d", s, len(s)) + } + garlicHostBytes := make([]byte, 37) + _, err := garlicBase32Encoding.Decode(garlicHostBytes, []byte(s)) + if err != nil { + return nil, fmt.Errorf("failed to decode base32 garlic addr: %s %s", s, err) + } + bytes := []byte{} + bytes = append(bytes, garlicHostBytes...) + + return bytes, nil + +} + +func garlic32BtS(b []byte) (string, error) { + if len(b) < 33 || len(b) > 37 { + return "", fmt.Errorf("failed to validate garlic addr: %s not an i2p base64 address. len: %d\n", b, len(b)) + } + addr := strings.Replace(strings.ToLower(garlicBase32Encoding.EncodeToString(b)), "=", "", -1) + return addr, nil +} + +func garlic32Validate(b []byte) error { + if len(b) < 33 || len(b) > 37 { + return fmt.Errorf("failed to validate garlic addr: %s not an i2p base64 address. len: %d\n", b, len(b)) + } + return nil +} + + var TranscoderP2P = NewTranscoderFromFunctions(p2pStB, p2pBtS, p2pVal) func p2pStB(s string) ([]byte, error) { From dfe50992926b99850f4a3a3d746deca8bafa8963 Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 29 Mar 2019 09:40:52 -0400 Subject: [PATCH 02/14] Fixed up validators and encoders --- transcoders.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/transcoders.go b/transcoders.go index cb8d684..ecf2a90 100644 --- a/transcoders.go +++ b/transcoders.go @@ -254,8 +254,7 @@ func garlic32StB(s string) ([]byte, error) { if len(s) != 52 || len(s) < 55 || len(s) > 63 { return nil, fmt.Errorf("failed to parse garlic addr: %s not a i2p base32 address. len: %d", s, len(s)) } - garlicHostBytes := make([]byte, 37) - _, err := garlicBase32Encoding.Decode(garlicHostBytes, []byte(s)) + garlicHostBytes, err := garlicBase32Encoding.Decode(s) if err != nil { return nil, fmt.Errorf("failed to decode base32 garlic addr: %s %s", s, err) } @@ -267,21 +266,20 @@ func garlic32StB(s string) ([]byte, error) { } func garlic32BtS(b []byte) (string, error) { - if len(b) < 33 || len(b) > 37 { - return "", fmt.Errorf("failed to validate garlic addr: %s not an i2p base64 address. len: %d\n", b, len(b)) + if len(b) != 32 || len(b) < 35 { + return "", fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) } addr := strings.Replace(strings.ToLower(garlicBase32Encoding.EncodeToString(b)), "=", "", -1) return addr, nil } func garlic32Validate(b []byte) error { - if len(b) < 33 || len(b) > 37 { - return fmt.Errorf("failed to validate garlic addr: %s not an i2p base64 address. len: %d\n", b, len(b)) + if len(b) != 32 || len(b) < 35 { + return fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) } return nil } - var TranscoderP2P = NewTranscoderFromFunctions(p2pStB, p2pBtS, p2pVal) func p2pStB(s string) ([]byte, error) { From d288e979d60477602b91622c514434425bc32fb3 Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 29 Mar 2019 14:52:24 -0400 Subject: [PATCH 03/14] variable-length garlic32 addresses --- multiaddr_test.go | 20 ++++++++++++++++++- protocols.go | 9 +++++++++ transcoders.go | 51 ++++++++++++++++++++++++++++++++--------------- 3 files changed, 63 insertions(+), 17 deletions(-) diff --git a/multiaddr_test.go b/multiaddr_test.go index f97f92c..3e5f4c5 100644 --- a/multiaddr_test.go +++ b/multiaddr_test.go @@ -54,6 +54,11 @@ func TestConstructFails(t *testing.T) { "/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA:0", "/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA:-1", "/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA@:666", + "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu", + "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu77", + "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu:80", + "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq:-1", + "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu@", "/udp/1234/sctp", "/udp/1234/udt/1234", "/udp/1234/utp/1234", @@ -97,6 +102,11 @@ func TestConstructSucceeds(t *testing.T) { "/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA/http", "/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA/udp/8080", "/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA/tcp/8080", + "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq", + "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuqzwas", + "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/http", + "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/tcp/8080", + "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/udp/8080", "/udp/0", "/tcp/0", "/sctp/0", @@ -181,13 +191,15 @@ func TestStringToBytes(t *testing.T) { t.Error("failed to decode hex", h) } + //t.Log("196", h, []byte(b1)) + b2, err := stringToBytes(s) if err != nil { t.Error("failed to convert", s, err) } if !bytes.Equal(b1, b2) { - t.Error("failed to convert \n", s, "to\n", b1, "got\n", b2) + t.Error("failed to convert \n", s, "to\n", hex.EncodeToString(b1), "got\n", hex.EncodeToString(b2)) } if err := validateBytes(b2); err != nil { @@ -202,6 +214,9 @@ func TestStringToBytes(t *testing.T) { testString("/onion3/vww6ybal4bd7szmgncyruucpgfkqahzddi37ktceo3ah7ngmcopnpyyd:1234", "bd03adadec040be047f9658668b11a504f3155001f231a37f54c4476c07fb4cc139ed7e30304d2") testString("/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA", "ca0383038d3fc8c976a86ae4e78ba378e75ec41bc9ab1542a9cb422581987e118f5cb0c024f3639d6ad9b3aff613672f07bfbbbfc2f920ef910534ecaa6ff9c03e0fa4872a764d2fce6d4cfc5a5a9800cd95944cc9ef0241f753fe71494a175f334b35682459acadc4076428ab49b5a83a49d2ea2366b06461e4a559b0111fa750e0de0c138a94d1231ed5979572ff53922905636221994bdabc44bd0c17fef11622b16432db3f193400af53cc61aa9bfc0c4c8d874b41a6e18732f0b60f5662ef1a89c80589dd8366c90bb58bb85ead56356aba2a244950ca170abbd01094539014f84bdd383e4a10e00cee63dfc3e809506e2d9b54edbdca1bace6eaa119e68573d30533791fba830f5d80be5c051a77c09415e3b8fe3139400848be5244b8ae96bb0c4a24f819cba0488f34985eac741d3359180bd72cafa1559e4c19f54ea8cedbb6a5afde4319396eb92aab340c60a50cc2284580cb3ad09017e8d9abc60269b3d8d687680bd86ce834412273d4f2e3bf68dd3d6fe87e2426ac658cd5c77fd5c0aa000000") + testString("/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq", + "cb0320efbcd45d0c5dc79781ac6f20ea5055a036afb48d45a52e7d68ec7d4338919e69") + } func TestBytesToString(t *testing.T) { @@ -219,6 +234,7 @@ func TestBytesToString(t *testing.T) { s2, err := bytesToString(b) if err != nil { + t.Log("236", s1, ":", string(h), ":", s2) t.Error("failed to convert", b, err) } @@ -234,6 +250,8 @@ func TestBytesToString(t *testing.T) { testString("/onion3/vww6ybal4bd7szmgncyruucpgfkqahzddi37ktceo3ah7ngmcopnpyyd:1234", "bd03adadec040be047f9658668b11a504f3155001f231a37f54c4476c07fb4cc139ed7e30304d2") testString("/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA", "ca0383038d3fc8c976a86ae4e78ba378e75ec41bc9ab1542a9cb422581987e118f5cb0c024f3639d6ad9b3aff613672f07bfbbbfc2f920ef910534ecaa6ff9c03e0fa4872a764d2fce6d4cfc5a5a9800cd95944cc9ef0241f753fe71494a175f334b35682459acadc4076428ab49b5a83a49d2ea2366b06461e4a559b0111fa750e0de0c138a94d1231ed5979572ff53922905636221994bdabc44bd0c17fef11622b16432db3f193400af53cc61aa9bfc0c4c8d874b41a6e18732f0b60f5662ef1a89c80589dd8366c90bb58bb85ead56356aba2a244950ca170abbd01094539014f84bdd383e4a10e00cee63dfc3e809506e2d9b54edbdca1bace6eaa119e68573d30533791fba830f5d80be5c051a77c09415e3b8fe3139400848be5244b8ae96bb0c4a24f819cba0488f34985eac741d3359180bd72cafa1559e4c19f54ea8cedbb6a5afde4319396eb92aab340c60a50cc2284580cb3ad09017e8d9abc60269b3d8d687680bd86ce834412273d4f2e3bf68dd3d6fe87e2426ac658cd5c77fd5c0aa000000") + testString("/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq", + "cb0320efbcd45d0c5dc79781ac6f20ea5055a036afb48d45a52e7d68ec7d4338919e69") } func TestBytesSplitAndJoin(t *testing.T) { diff --git a/protocols.go b/protocols.go index ea5d0bc..6a6bf47 100644 --- a/protocols.go +++ b/protocols.go @@ -21,6 +21,7 @@ const ( P_ONION = 0x01BC // also for backwards compatibility P_ONION3 = 0x01BD P_GARLIC64 = 0x01CA + P_GARLIC32 = 0x01CB P_P2P_WEBRTC_DIRECT = 0x0114 ) @@ -101,6 +102,13 @@ var ( Size: LengthPrefixedVarSize, Transcoder: TranscoderGarlic64, } + protoGARLIC32 = Protocol{ + Name: "garlic32", + Code: P_GARLIC32, + VCode: CodeToVarint(P_GARLIC32), + Size: LengthPrefixedVarSize, + Transcoder: TranscoderGarlic32, + } protoUTP = Protocol{ Name: "utp", Code: P_UTP, @@ -160,6 +168,7 @@ func init() { protoONION2, protoONION3, protoGARLIC64, + protoGARLIC32, protoUTP, protoUDT, protoQUIC, diff --git a/transcoders.go b/transcoders.go index ecf2a90..9ee0bdb 100644 --- a/transcoders.go +++ b/transcoders.go @@ -250,33 +250,52 @@ var TranscoderGarlic32 = NewTranscoderFromFunctions(garlic32StB, garlic32BtS, ga var garlicBase32Encoding = base32.NewEncoding("abcdefghijklmnopqrstuvwxyz234567") func garlic32StB(s string) ([]byte, error) { - // garlic address without the ".b32.i2p" substring, with padding - if len(s) != 52 || len(s) < 55 || len(s) > 63 { - return nil, fmt.Errorf("failed to parse garlic addr: %s not a i2p base32 address. len: %d", s, len(s)) + // garlic address without the ".b32.i2p" substring + if len(s) < 55 { + if len(s) != 52 { + return nil, fmt.Errorf("failed to parse garlic addr: %s not a i2p base32 address. len: %d", s, len(s)) + } } - garlicHostBytes, err := garlicBase32Encoding.Decode(s) + + padout := func(s2 string) string { + str := "" + for x := 0; x < 56; x++ { + if x < len(s) { + str += string(s[x]) + } else { + str += "=" + } + } + return str + } + + garlicHostBytes, err := garlicBase32Encoding.DecodeString(padout(s)) if err != nil { - return nil, fmt.Errorf("failed to decode base32 garlic addr: %s %s", s, err) + return nil, fmt.Errorf("failed to decode base32 garlic addr: %s err %s len %v", s, err, len(s)) } - bytes := []byte{} - bytes = append(bytes, garlicHostBytes...) - - return bytes, nil - + return garlicHostBytes, nil } func garlic32BtS(b []byte) (string, error) { - if len(b) != 32 || len(b) < 35 { - return "", fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) + if len(b) > 35 { + if len(b) < 32 { + return "", fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) + } } - addr := strings.Replace(strings.ToLower(garlicBase32Encoding.EncodeToString(b)), "=", "", -1) - return addr, nil + unpad := func(s2 string) string { + return strings.Replace(s2, "=", "", -1) + } + return unpad(garlicBase32Encoding.EncodeToString(b)), nil } func garlic32Validate(b []byte) error { - if len(b) != 32 || len(b) < 35 { - return fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) + if len(b) > 35 { + if len(b) < 32 { + return fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) + } } + str, _ := garlic32BtS(b) + fmt.Printf("%s, %d", str, len(b)) return nil } From fcee0ca9ec2c23f75794fd0f5b28fcc748894f9f Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 29 Mar 2019 14:54:08 -0400 Subject: [PATCH 04/14] remove thing from debugging --- transcoders.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/transcoders.go b/transcoders.go index 9ee0bdb..94f8742 100644 --- a/transcoders.go +++ b/transcoders.go @@ -294,8 +294,6 @@ func garlic32Validate(b []byte) error { return fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) } } - str, _ := garlic32BtS(b) - fmt.Printf("%s, %d", str, len(b)) return nil } From 4d3452bc2af1574106ac43dcab600699efd1d0fc Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 29 Mar 2019 16:36:23 -0400 Subject: [PATCH 05/14] tolerate .b32.i2p if present --- transcoders.go | 1 + 1 file changed, 1 insertion(+) diff --git a/transcoders.go b/transcoders.go index 94f8742..51c5e2b 100644 --- a/transcoders.go +++ b/transcoders.go @@ -250,6 +250,7 @@ var TranscoderGarlic32 = NewTranscoderFromFunctions(garlic32StB, garlic32BtS, ga var garlicBase32Encoding = base32.NewEncoding("abcdefghijklmnopqrstuvwxyz234567") func garlic32StB(s string) ([]byte, error) { + s = strings.Replace(s, ".b32.i2p", "", -1) // garlic address without the ".b32.i2p" substring if len(s) < 55 { if len(s) != 52 { From d75a9913ac39fe7de8ba034e0c80ed822e2d047b Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 29 Mar 2019 17:45:22 -0400 Subject: [PATCH 06/14] add a test for base32's longer than 56 chars --- multiaddr_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/multiaddr_test.go b/multiaddr_test.go index 3e5f4c5..d0d1e15 100644 --- a/multiaddr_test.go +++ b/multiaddr_test.go @@ -104,6 +104,7 @@ func TestConstructSucceeds(t *testing.T) { "/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA/tcp/8080", "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq", "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuqzwas", + "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuqzwasasw", "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/http", "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/tcp/8080", "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/udp/8080", From 71e227b59a65e7642900cc2cdeecd3773f779598 Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 5 Apr 2019 15:15:05 -0400 Subject: [PATCH 07/14] correct the protocol codes for garlic addresses --- multiaddr_test.go | 8 ++++---- protocols.go | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/multiaddr_test.go b/multiaddr_test.go index d0d1e15..c9e2143 100644 --- a/multiaddr_test.go +++ b/multiaddr_test.go @@ -214,9 +214,9 @@ func TestStringToBytes(t *testing.T) { testString("/onion/aaimaq4ygg2iegci:80", "bc030010c0439831b48218480050") testString("/onion3/vww6ybal4bd7szmgncyruucpgfkqahzddi37ktceo3ah7ngmcopnpyyd:1234", "bd03adadec040be047f9658668b11a504f3155001f231a37f54c4476c07fb4cc139ed7e30304d2") testString("/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA", - "ca0383038d3fc8c976a86ae4e78ba378e75ec41bc9ab1542a9cb422581987e118f5cb0c024f3639d6ad9b3aff613672f07bfbbbfc2f920ef910534ecaa6ff9c03e0fa4872a764d2fce6d4cfc5a5a9800cd95944cc9ef0241f753fe71494a175f334b35682459acadc4076428ab49b5a83a49d2ea2366b06461e4a559b0111fa750e0de0c138a94d1231ed5979572ff53922905636221994bdabc44bd0c17fef11622b16432db3f193400af53cc61aa9bfc0c4c8d874b41a6e18732f0b60f5662ef1a89c80589dd8366c90bb58bb85ead56356aba2a244950ca170abbd01094539014f84bdd383e4a10e00cee63dfc3e809506e2d9b54edbdca1bace6eaa119e68573d30533791fba830f5d80be5c051a77c09415e3b8fe3139400848be5244b8ae96bb0c4a24f819cba0488f34985eac741d3359180bd72cafa1559e4c19f54ea8cedbb6a5afde4319396eb92aab340c60a50cc2284580cb3ad09017e8d9abc60269b3d8d687680bd86ce834412273d4f2e3bf68dd3d6fe87e2426ac658cd5c77fd5c0aa000000") + "be0383038d3fc8c976a86ae4e78ba378e75ec41bc9ab1542a9cb422581987e118f5cb0c024f3639d6ad9b3aff613672f07bfbbbfc2f920ef910534ecaa6ff9c03e0fa4872a764d2fce6d4cfc5a5a9800cd95944cc9ef0241f753fe71494a175f334b35682459acadc4076428ab49b5a83a49d2ea2366b06461e4a559b0111fa750e0de0c138a94d1231ed5979572ff53922905636221994bdabc44bd0c17fef11622b16432db3f193400af53cc61aa9bfc0c4c8d874b41a6e18732f0b60f5662ef1a89c80589dd8366c90bb58bb85ead56356aba2a244950ca170abbd01094539014f84bdd383e4a10e00cee63dfc3e809506e2d9b54edbdca1bace6eaa119e68573d30533791fba830f5d80be5c051a77c09415e3b8fe3139400848be5244b8ae96bb0c4a24f819cba0488f34985eac741d3359180bd72cafa1559e4c19f54ea8cedbb6a5afde4319396eb92aab340c60a50cc2284580cb3ad09017e8d9abc60269b3d8d687680bd86ce834412273d4f2e3bf68dd3d6fe87e2426ac658cd5c77fd5c0aa000000") testString("/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq", - "cb0320efbcd45d0c5dc79781ac6f20ea5055a036afb48d45a52e7d68ec7d4338919e69") + "bf0320efbcd45d0c5dc79781ac6f20ea5055a036afb48d45a52e7d68ec7d4338919e69") } @@ -250,9 +250,9 @@ func TestBytesToString(t *testing.T) { testString("/onion/aaimaq4ygg2iegci:80", "bc030010c0439831b48218480050") testString("/onion3/vww6ybal4bd7szmgncyruucpgfkqahzddi37ktceo3ah7ngmcopnpyyd:1234", "bd03adadec040be047f9658668b11a504f3155001f231a37f54c4476c07fb4cc139ed7e30304d2") testString("/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA", - "ca0383038d3fc8c976a86ae4e78ba378e75ec41bc9ab1542a9cb422581987e118f5cb0c024f3639d6ad9b3aff613672f07bfbbbfc2f920ef910534ecaa6ff9c03e0fa4872a764d2fce6d4cfc5a5a9800cd95944cc9ef0241f753fe71494a175f334b35682459acadc4076428ab49b5a83a49d2ea2366b06461e4a559b0111fa750e0de0c138a94d1231ed5979572ff53922905636221994bdabc44bd0c17fef11622b16432db3f193400af53cc61aa9bfc0c4c8d874b41a6e18732f0b60f5662ef1a89c80589dd8366c90bb58bb85ead56356aba2a244950ca170abbd01094539014f84bdd383e4a10e00cee63dfc3e809506e2d9b54edbdca1bace6eaa119e68573d30533791fba830f5d80be5c051a77c09415e3b8fe3139400848be5244b8ae96bb0c4a24f819cba0488f34985eac741d3359180bd72cafa1559e4c19f54ea8cedbb6a5afde4319396eb92aab340c60a50cc2284580cb3ad09017e8d9abc60269b3d8d687680bd86ce834412273d4f2e3bf68dd3d6fe87e2426ac658cd5c77fd5c0aa000000") + "be0383038d3fc8c976a86ae4e78ba378e75ec41bc9ab1542a9cb422581987e118f5cb0c024f3639d6ad9b3aff613672f07bfbbbfc2f920ef910534ecaa6ff9c03e0fa4872a764d2fce6d4cfc5a5a9800cd95944cc9ef0241f753fe71494a175f334b35682459acadc4076428ab49b5a83a49d2ea2366b06461e4a559b0111fa750e0de0c138a94d1231ed5979572ff53922905636221994bdabc44bd0c17fef11622b16432db3f193400af53cc61aa9bfc0c4c8d874b41a6e18732f0b60f5662ef1a89c80589dd8366c90bb58bb85ead56356aba2a244950ca170abbd01094539014f84bdd383e4a10e00cee63dfc3e809506e2d9b54edbdca1bace6eaa119e68573d30533791fba830f5d80be5c051a77c09415e3b8fe3139400848be5244b8ae96bb0c4a24f819cba0488f34985eac741d3359180bd72cafa1559e4c19f54ea8cedbb6a5afde4319396eb92aab340c60a50cc2284580cb3ad09017e8d9abc60269b3d8d687680bd86ce834412273d4f2e3bf68dd3d6fe87e2426ac658cd5c77fd5c0aa000000") testString("/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq", - "cb0320efbcd45d0c5dc79781ac6f20ea5055a036afb48d45a52e7d68ec7d4338919e69") + "bf0320efbcd45d0c5dc79781ac6f20ea5055a036afb48d45a52e7d68ec7d4338919e69") } func TestBytesSplitAndJoin(t *testing.T) { diff --git a/protocols.go b/protocols.go index 6a6bf47..cb38a70 100644 --- a/protocols.go +++ b/protocols.go @@ -20,8 +20,8 @@ const ( P_HTTPS = 0x01BB P_ONION = 0x01BC // also for backwards compatibility P_ONION3 = 0x01BD - P_GARLIC64 = 0x01CA - P_GARLIC32 = 0x01CB + P_GARLIC64 = 0x01BE + P_GARLIC32 = 0x01BF P_P2P_WEBRTC_DIRECT = 0x0114 ) From 672c39fb9beee1138f2a65df92d8090271bb5573 Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 5 Apr 2019 20:51:42 -0400 Subject: [PATCH 08/14] add comments and don't repeat myself as much --- multiaddr_test.go | 2 +- transcoders.go | 40 +++++++++++++++++++--------------------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/multiaddr_test.go b/multiaddr_test.go index c9e2143..aef676a 100644 --- a/multiaddr_test.go +++ b/multiaddr_test.go @@ -104,7 +104,7 @@ func TestConstructSucceeds(t *testing.T) { "/garlic64/jT~IyXaoauTni6N4517EG8mrFUKpy0IlgZh-EY9csMAk82Odatmzr~YTZy8Hv7u~wvkg75EFNOyqb~nAPg-khyp2TS~ObUz8WlqYAM2VlEzJ7wJB91P-cUlKF18zSzVoJFmsrcQHZCirSbWoOknS6iNmsGRh5KVZsBEfp1Dg3gwTipTRIx7Vl5Vy~1OSKQVjYiGZS9q8RL0MF~7xFiKxZDLbPxk0AK9TzGGqm~wMTI2HS0Gm4Ycy8LYPVmLvGonIBYndg2bJC7WLuF6tVjVquiokSVDKFwq70BCUU5AU-EvdOD5KEOAM7mPfw-gJUG4tm1TtvcobrObqoRnmhXPTBTN5H7qDD12AvlwFGnfAlBXjuP4xOUAISL5SRLiulrsMSiT4GcugSI80mF6sdB0zWRgL1yyvoVWeTBn1TqjO27alr95DGTluuSqrNAxgpQzCKEWAyzrQkBfo2avGAmmz2NaHaAvYbOg0QSJz1PLjv2jdPW~ofiQmrGWM1cd~1cCqAAAA/tcp/8080", "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq", "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuqzwas", - "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuqzwasasw", + "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuqzwassw", "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/http", "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/tcp/8080", "/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/udp/8080", diff --git a/transcoders.go b/transcoders.go index 51c5e2b..a5953ff 100644 --- a/transcoders.go +++ b/transcoders.go @@ -250,47 +250,45 @@ var TranscoderGarlic32 = NewTranscoderFromFunctions(garlic32StB, garlic32BtS, ga var garlicBase32Encoding = base32.NewEncoding("abcdefghijklmnopqrstuvwxyz234567") func garlic32StB(s string) ([]byte, error) { - s = strings.Replace(s, ".b32.i2p", "", -1) + //s = strings.Replace(s, ".b32.i2p", "", -1) // garlic address without the ".b32.i2p" substring + + // an i2p base32 address with a length of greater than 55 characters is + // using an Encrypted Leaseset v2. if len(s) < 55 { if len(s) != 52 { + // all other base32 addresses will always be exactly 52 characters return nil, fmt.Errorf("failed to parse garlic addr: %s not a i2p base32 address. len: %d", s, len(s)) } } - padout := func(s2 string) string { - str := "" - for x := 0; x < 56; x++ { - if x < len(s) { - str += string(s[x]) - } else { - str += "=" - } - } - return str + for len(s) < 56 { + s += "=" } - garlicHostBytes, err := garlicBase32Encoding.DecodeString(padout(s)) + garlicHostBytes, err := garlicBase32Encoding.DecodeString(string(s)) if err != nil { - return nil, fmt.Errorf("failed to decode base32 garlic addr: %s err %s len %v", s, err, len(s)) + return nil, fmt.Errorf("failed to decode base32 garlic addr: %s, err: %v len: %v", + s, + err, + len(s), + ) } return garlicHostBytes, nil } func garlic32BtS(b []byte) (string, error) { - if len(b) > 35 { - if len(b) < 32 { - return "", fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) - } + if err := garlic32Validate(b); err != nil { + return "", err } - unpad := func(s2 string) string { - return strings.Replace(s2, "=", "", -1) - } - return unpad(garlicBase32Encoding.EncodeToString(b)), nil + return strings.TrimRight(garlicBase32Encoding.EncodeToString(b), "="), nil } func garlic32Validate(b []byte) error { + // an i2p base64 for an Encrypted Leaseset v2 will be at least 35 bytes + // long if len(b) > 35 { + // other than that, they will be at least 32 bytes if len(b) < 32 { return fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) } From 946a6f66c00c9ba06d9d4e16ff1e59389aaa271c Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 5 Apr 2019 20:52:08 -0400 Subject: [PATCH 09/14] add comments and don't repeat myself as much --- transcoders.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transcoders.go b/transcoders.go index a5953ff..0a705ab 100644 --- a/transcoders.go +++ b/transcoders.go @@ -266,7 +266,7 @@ func garlic32StB(s string) ([]byte, error) { s += "=" } - garlicHostBytes, err := garlicBase32Encoding.DecodeString(string(s)) + garlicHostBytes, err := garlicBase32Encoding.DecodeString(s) if err != nil { return nil, fmt.Errorf("failed to decode base32 garlic addr: %s, err: %v len: %v", s, From ae5c4f834cd654c89d8e056c0ffeb00d3da0ed79 Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 5 Apr 2019 21:06:30 -0400 Subject: [PATCH 10/14] fix how the padding is computed --- transcoders.go | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/transcoders.go b/transcoders.go index 0a705ab..b9347c2 100644 --- a/transcoders.go +++ b/transcoders.go @@ -261,18 +261,14 @@ func garlic32StB(s string) ([]byte, error) { return nil, fmt.Errorf("failed to parse garlic addr: %s not a i2p base32 address. len: %d", s, len(s)) } } - - for len(s) < 56 { + //compute the length to pad the address to, usually 56 or 64 + x := int((len(s)/8)+1) * 8 + for len(s) < x { s += "=" } - - garlicHostBytes, err := garlicBase32Encoding.DecodeString(s) + garlicHostBytes, err := garlicBase32Encoding.DecodeString(s[0:56]) if err != nil { - return nil, fmt.Errorf("failed to decode base32 garlic addr: %s, err: %v len: %v", - s, - err, - len(s), - ) + return nil, fmt.Errorf("failed to decode base32 garlic addr: %s, err: %v len: %v", s, err, len(s)) } return garlicHostBytes, nil } From 42839924e7502b5c8dd1eb67c26241abad51a470 Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 5 Apr 2019 21:09:48 -0400 Subject: [PATCH 11/14] Improve the validator --- transcoders.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/transcoders.go b/transcoders.go index b9347c2..448d643 100644 --- a/transcoders.go +++ b/transcoders.go @@ -283,9 +283,9 @@ func garlic32BtS(b []byte) (string, error) { func garlic32Validate(b []byte) error { // an i2p base64 for an Encrypted Leaseset v2 will be at least 35 bytes // long - if len(b) > 35 { - // other than that, they will be at least 32 bytes - if len(b) < 32 { + if len(b) < 35 { + // other than that, they will be exactly 32 bytes + if len(b) != 32 { return fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) } } From ebd6de6a8bc4f73394cdb6f83d2f31cef7255df6 Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 5 Apr 2019 21:26:31 -0400 Subject: [PATCH 12/14] fix the padding --- transcoders.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/transcoders.go b/transcoders.go index 448d643..704dab9 100644 --- a/transcoders.go +++ b/transcoders.go @@ -262,11 +262,18 @@ func garlic32StB(s string) ([]byte, error) { } } //compute the length to pad the address to, usually 56 or 64 - x := int((len(s)/8)+1) * 8 - for len(s) < x { - s += "=" + padout := func(s string) string { + if len(s)%8 == 0 { + return s + } + x := int((len(s)/8)+1) * 8 + for len(s) < x { + s += "=" + } + return s } - garlicHostBytes, err := garlicBase32Encoding.DecodeString(s[0:56]) + + garlicHostBytes, err := garlicBase32Encoding.DecodeString(padout(s)) if err != nil { return nil, fmt.Errorf("failed to decode base32 garlic addr: %s, err: %v len: %v", s, err, len(s)) } From 477514c81206d0c661df8ffced616ecfe1323e20 Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 5 Apr 2019 21:40:25 -0400 Subject: [PATCH 13/14] Add comments to garlic64 addresses and use the validator --- transcoders.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/transcoders.go b/transcoders.go index 704dab9..2017b41 100644 --- a/transcoders.go +++ b/transcoders.go @@ -218,7 +218,8 @@ var TranscoderGarlic64 = NewTranscoderFromFunctions(garlic64StB, garlic64BtS, ga var garlicBase64Encoding = base64.NewEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-~") func garlic64StB(s string) ([]byte, error) { - // i2p base64 address + // i2p base64 address will be between 516 and 616 characters long, depending on + // certificate type if len(s) < 516 || len(s) > 616 { return nil, fmt.Errorf("failed to parse garlic addr: %s not an i2p base64 address. len: %d\n", s, len(s)) } @@ -231,14 +232,15 @@ func garlic64StB(s string) ([]byte, error) { } func garlic64BtS(b []byte) (string, error) { - if len(b) < 386 { - return "", fmt.Errorf("failed to validate garlic addr: %s not an i2p base64 address. len: %d\n", b, len(b)) + if err := garlic64Validate(b); err != nil { + return "", err } addr := garlicBase64Encoding.EncodeToString(b) return addr, nil } func garlic64Validate(b []byte) error { + // A garlic64 address will always be greater than 386 bytes long when encoded. if len(b) < 386 { return fmt.Errorf("failed to validate garlic addr: %s not an i2p base64 address. len: %d\n", b, len(b)) } From 84811f919b4db9aa9b5d36916ce589d05137fe07 Mon Sep 17 00:00:00 2001 From: idk Date: Fri, 5 Apr 2019 23:41:37 -0400 Subject: [PATCH 14/14] don't use a function to guarantee correct padding --- transcoders.go | 37 ++++++++++--------------------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/transcoders.go b/transcoders.go index 2017b41..77908b7 100644 --- a/transcoders.go +++ b/transcoders.go @@ -252,30 +252,16 @@ var TranscoderGarlic32 = NewTranscoderFromFunctions(garlic32StB, garlic32BtS, ga var garlicBase32Encoding = base32.NewEncoding("abcdefghijklmnopqrstuvwxyz234567") func garlic32StB(s string) ([]byte, error) { - //s = strings.Replace(s, ".b32.i2p", "", -1) - // garlic address without the ".b32.i2p" substring - // an i2p base32 address with a length of greater than 55 characters is - // using an Encrypted Leaseset v2. - if len(s) < 55 { - if len(s) != 52 { - // all other base32 addresses will always be exactly 52 characters - return nil, fmt.Errorf("failed to parse garlic addr: %s not a i2p base32 address. len: %d", s, len(s)) - } + // using an Encrypted Leaseset v2. all other base32 addresses will always be + // exactly 52 characters + if len(s) < 55 && len(s) != 52 { + return nil, fmt.Errorf("failed to parse garlic addr: %s not a i2p base32 address. len: %d", s, len(s)) } - //compute the length to pad the address to, usually 56 or 64 - padout := func(s string) string { - if len(s)%8 == 0 { - return s - } - x := int((len(s)/8)+1) * 8 - for len(s) < x { - s += "=" - } - return s + for len(s)%8 != 0 { + s += "=" } - - garlicHostBytes, err := garlicBase32Encoding.DecodeString(padout(s)) + garlicHostBytes, err := garlicBase32Encoding.DecodeString(s) if err != nil { return nil, fmt.Errorf("failed to decode base32 garlic addr: %s, err: %v len: %v", s, err, len(s)) } @@ -291,12 +277,9 @@ func garlic32BtS(b []byte) (string, error) { func garlic32Validate(b []byte) error { // an i2p base64 for an Encrypted Leaseset v2 will be at least 35 bytes - // long - if len(b) < 35 { - // other than that, they will be exactly 32 bytes - if len(b) != 32 { - return fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) - } + // long other than that, they will be exactly 32 bytes + if len(b) < 35 && len(b) != 32 { + return fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) } return nil }