ricochet-go/core/utils/misc.go

62 lines
1.5 KiB
Go

package utils
import (
"crypto/rsa"
"errors"
"github.com/yawning/bulb/utils/pkcs1"
"strings"
)
// Take a string containing substrings separated by sep, and
// return a slice of substrings as in strings.Split. Double quotes
// are stripped from the output, and separator characters within
// double quotes are included in the substring verbatim. Quotes and
// escape characters can be escaped with a preceding backslash, which
// is stripped from the output.
func UnquoteStringSplit(s string, sep rune) []string {
var re []string
var quoted bool
var escaped bool
var current string
for _, c := range s {
if c == '"' && !escaped {
quoted = !quoted
} else if c == '\\' && !escaped {
escaped = true
} else if c == sep && !quoted && !escaped {
re = append(re, current)
current = ""
} else {
current += string(c)
escaped = false
}
}
return append(re, current)
}
func RicochetAddressFromKey(key *rsa.PublicKey) (string, error) {
addr, err := pkcs1.OnionAddr(key)
if err != nil {
return "", err
} else if addr == "" {
return "", errors.New("Invalid key")
}
return "ricochet:" + addr, nil
}
func RicochetAddressFromOnion(onion string) (string, error) {
if len(onion) != 23 || !strings.HasSuffix(onion, ".onion") {
return "", errors.New("Invalid onion address")
}
return "ricochet:" + onion[:16], nil
}
func OnionFromRicochetAddress(address string) (string, error) {
if len(address) != 25 || !strings.HasPrefix(address, "ricochet:") {
return "", errors.New("Invalid ricochet address")
}
return address[9:] + ".onion", nil
}