62 lines
1.5 KiB
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
|
|
}
|