...

Source file src/edge-infra.dev/pkg/lib/crypto/randomizer/randomizer.go

Documentation: edge-infra.dev/pkg/lib/crypto/randomizer

     1  package randomizer
     2  
     3  import (
     4  	"crypto/rand"
     5  	"math/big"
     6  )
     7  
     8  var (
     9  	ValidChars      = []rune("$~!@#%^&*_-+=`|(){}[]:;'<>,.?0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
    10  	validSaltChars  = []rune("./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
    11  	ActivationChars = []rune("23456789ABCDEFGHJKLMNPQRSTUVWXYZ")
    12  )
    13  
    14  // Generate a cryptographically secure random salt
    15  func GenerateRandomSalt(length int) (string, error) {
    16  	salt := make([]rune, length)
    17  	for i := 0; i < length; i++ {
    18  		letterIndex, err := rand.Int(rand.Reader, big.NewInt(int64(len(validSaltChars))))
    19  		if err != nil {
    20  			return "", err
    21  		}
    22  		salt[i] = validSaltChars[letterIndex.Int64()]
    23  	}
    24  	return string(salt), nil
    25  }
    26  
    27  func GenerateRandomBytes(n int) ([]byte, error) {
    28  	b := make([]byte, n)
    29  	if _, err := rand.Read(b); err != nil {
    30  		return nil, err
    31  	}
    32  	return b, nil
    33  }
    34  
    35  // Create random plain text password
    36  func GenerateRandomPlainPwd(pwdLength int) (string, error) {
    37  	return generateRandomPhrase(ValidChars, pwdLength)
    38  }
    39  
    40  // Generate password of random length between bounds
    41  func RandomPassLength(minLength, maxLength int) (int, error) {
    42  	pwdLen, err := rand.Int(rand.Reader, big.NewInt(int64(maxLength-minLength)))
    43  	if err != nil {
    44  		return -1, err
    45  	}
    46  	return int(pwdLen.Int64()) + maxLength, nil
    47  }
    48  
    49  // Create random plain text password
    50  func GenerateRandomActivationCode(length int) (string, error) {
    51  	return generateRandomPhrase(ActivationChars, length)
    52  }
    53  
    54  func generateRandomPhrase(letters []rune, phraseLength int) (string, error) {
    55  	length := int64(len(letters))
    56  	chars := make([]rune, phraseLength)
    57  	for i := range chars {
    58  		letterIndex, err := rand.Int(rand.Reader, big.NewInt(length))
    59  		if err != nil {
    60  			return "", err
    61  		}
    62  		chars[i] = letters[letterIndex.Int64()]
    63  	}
    64  	return string(chars), nil
    65  }
    66  

View as plain text