// IDB58Decode returns a b58-decoded Peer func IDB58Decode(s string) (ID, error) { m, err := mh.FromB58String(s) if err != nil { return "", err } return ID(m), err }
func addressStringToBytes(p Protocol, s string) ([]byte, error) { switch p.Code { case P_IP4: // ipv4 i := net.ParseIP(s).To4() if i == nil { return nil, fmt.Errorf("failed to parse ip4 addr: %s", s) } return i, nil case P_IP6: // ipv6 i := net.ParseIP(s).To16() if i == nil { return nil, fmt.Errorf("failed to parse ip6 addr: %s", s) } return i, nil // tcp udp dccp sctp case P_TCP, P_UDP, P_DCCP, P_SCTP: i, err := strconv.Atoi(s) if err != nil { return nil, fmt.Errorf("failed to parse %s addr: %s", p.Name, err) } if i >= 65536 { return nil, fmt.Errorf("failed to parse %s addr: %s", p.Name, "greater than 65536") } b := make([]byte, 2) binary.BigEndian.PutUint16(b, uint16(i)) return b, nil case P_ONION: addr := strings.Split(s, ":") if len(addr) != 2 { return nil, fmt.Errorf("failed to parse %s addr: %s does not contain a port number.", p.Name, s) } // onion address without the ".onion" substring if len(addr[0]) != 16 { return nil, fmt.Errorf("failed to parse %s addr: %s not a Tor onion address.", p.Name, s) } onionHostBytes, err := base32.StdEncoding.DecodeString(strings.ToUpper(addr[0])) if err != nil { return nil, fmt.Errorf("failed to decode base32 %s addr: %s %s", p.Name, s, err) } // onion port number i, err := strconv.Atoi(addr[1]) if err != nil { return nil, fmt.Errorf("failed to parse %s addr: %s", p.Name, err) } if i >= 65536 { return nil, fmt.Errorf("failed to parse %s addr: %s", p.Name, "port greater than 65536") } if i < 1 { return nil, fmt.Errorf("failed to parse %s addr: %s", p.Name, "port less than 1") } onionPortBytes := make([]byte, 2) binary.BigEndian.PutUint16(onionPortBytes, uint16(i)) bytes := []byte{} bytes = append(bytes, onionHostBytes...) bytes = append(bytes, onionPortBytes...) return bytes, nil case P_IPFS: // ipfs // the address is a varint prefixed multihash string representation m, err := mh.FromB58String(s) if err != nil { return nil, fmt.Errorf("failed to parse ipfs addr: %s %s", s, err) } size := CodeToVarint(len(m)) b := append(size, m...) return b, nil } return []byte{}, fmt.Errorf("failed to parse %s addr: unknown", p.Name) }