auth/internal/random/random.go

49 lines
989 B
Go

package random
import (
"crypto/rand"
"fmt"
"math/big"
"strings"
)
const (
Uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Lowercase = "abcdefghijklmnopqrstuvwxyz"
Alphabetic = Uppercase + Lowercase
Numeric = "0123456789"
Alphanumeric = Alphabetic + Numeric
Symbols = "`" + `~!@#$%^&*()-_+={}[]|\;:"<>,./?`
Hex = Numeric + "abcdef"
)
func Bytes(length int) ([]byte, error) {
bytes := make([]byte, length)
if _, err := rand.Read(bytes); err != nil {
return nil, fmt.Errorf("cannot read bytes: %w", err)
}
return bytes, nil
}
func String(length int, charsets ...string) (string, error) {
charset := strings.Join(charsets, "")
if charset == "" {
charset = Alphabetic
}
bytes := make([]byte, length)
for i := range bytes {
n, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))
if err != nil {
return "", fmt.Errorf("failed to randomize bytes: %w", err)
}
bytes[i] = charset[n.Int64()]
}
return string(bytes), nil
}