package codes import ( "crypto/rand" "encoding/base64" "math/big" "strings" ) const codeLen = 32 func NewCode(email string) string { charset := "abcdefghijklmnopqrztuvwxyz" charset += strings.ToUpper(charset) charset += "0123456789" charset += "`~!@#$%^&*()-=_+[]{}|;:,./<>?" code := []byte{} max := big.NewInt(int64(len(charset))) for len(code) < codeLen { ix, err := rand.Int(rand.Reader, max) if err != nil { // TODO this is bad but I'm just kind of hoping it doesn't happen...often panic(err) } code = append(code, charset[ix.Int64()]) } code = append(code, ' ') eb := []byte(email) for x := 0; x < len(eb); x++ { code = append(code, eb[x]) } return base64.StdEncoding.EncodeToString(code) } func Decode(code string) ([]string, error) { decoded, err := base64.StdEncoding.DecodeString(code) if err != nil { return nil, err } return strings.Split(string(decoded), " "), nil }