@@ -212,7 +212,7 @@ func onion3BtS(b []byte) (string, error) {
212
212
return str , nil
213
213
}
214
214
215
- var TranscoderGarlic64 = NewTranscoderFromFunctions (garlic64StB , garlic64BtS , garlicValidate )
215
+ var TranscoderGarlic64 = NewTranscoderFromFunctions (garlic64StB , garlic64BtS , garlic64Validate )
216
216
217
217
// i2p uses an alternate character set for base64 addresses. This returns an appropriate encoder.
218
218
var garlicBase64Encoding = base64 .NewEncoding ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-~" )
@@ -238,13 +238,50 @@ func garlic64BtS(b []byte) (string, error) {
238
238
return addr , nil
239
239
}
240
240
241
- func garlicValidate (b []byte ) error {
241
+ func garlic64Validate (b []byte ) error {
242
242
if len (b ) < 386 {
243
243
return fmt .Errorf ("failed to validate garlic addr: %s not an i2p base64 address. len: %d\n " , b , len (b ))
244
244
}
245
245
return nil
246
246
}
247
247
248
+ var TranscoderGarlic32 = NewTranscoderFromFunctions (garlic32StB , garlic32BtS , garlic32Validate )
249
+
250
+ var garlicBase32Encoding = base32 .NewEncoding ("abcdefghijklmnopqrstuvwxyz234567" )
251
+
252
+ func garlic32StB (s string ) ([]byte , error ) {
253
+ // garlic address without the ".b32.i2p" substring, with padding
254
+ if len (s ) != 52 || len (s ) < 55 || len (s ) > 63 {
255
+ return nil , fmt .Errorf ("failed to parse garlic addr: %s not a i2p base32 address. len: %d" , s , len (s ))
256
+ }
257
+ garlicHostBytes := make ([]byte , 37 )
258
+ _ , err := garlicBase32Encoding .Decode (garlicHostBytes , []byte (s ))
259
+ if err != nil {
260
+ return nil , fmt .Errorf ("failed to decode base32 garlic addr: %s %s" , s , err )
261
+ }
262
+ bytes := []byte {}
263
+ bytes = append (bytes , garlicHostBytes ... )
264
+
265
+ return bytes , nil
266
+
267
+ }
268
+
269
+ func garlic32BtS (b []byte ) (string , error ) {
270
+ if len (b ) < 33 || len (b ) > 37 {
271
+ return "" , fmt .Errorf ("failed to validate garlic addr: %s not an i2p base64 address. len: %d\n " , b , len (b ))
272
+ }
273
+ addr := strings .Replace (strings .ToLower (garlicBase32Encoding .EncodeToString (b )), "=" , "" , - 1 )
274
+ return addr , nil
275
+ }
276
+
277
+ func garlic32Validate (b []byte ) error {
278
+ if len (b ) < 33 || len (b ) > 37 {
279
+ return fmt .Errorf ("failed to validate garlic addr: %s not an i2p base64 address. len: %d\n " , b , len (b ))
280
+ }
281
+ return nil
282
+ }
283
+
284
+
248
285
var TranscoderP2P = NewTranscoderFromFunctions (p2pStB , p2pBtS , p2pVal )
249
286
250
287
func p2pStB (s string ) ([]byte , error ) {
0 commit comments