38 lines
		
	
	
		
			955 B
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			955 B
		
	
	
	
		
			Go
		
	
	
	
| package encryption
 | |
| 
 | |
| import (
 | |
| 	"crypto/hmac"
 | |
| 	"crypto/rand"
 | |
| 	"encoding/base64"
 | |
| 
 | |
| 	"golang.org/x/crypto/blake2b"
 | |
| )
 | |
| 
 | |
| // Nonce generates a random n-byte slice
 | |
| func Nonce(length int) ([]byte, error) {
 | |
| 	b := make([]byte, length)
 | |
| 	_, err := rand.Read(b)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	return b, nil
 | |
| }
 | |
| 
 | |
| // HashNonce returns the BLAKE2b 256-bit hash of a nonce
 | |
| // NOTE: Error checking (G104) is purposefully skipped:
 | |
| // - `blake2b.New256` has no error path with a nil signing key
 | |
| // - `hash.Hash` interface's `Write` has an error signature, but
 | |
| //   `blake2b.digest.Write` does not use it.
 | |
| /* #nosec G104 */
 | |
| func HashNonce(nonce []byte) string {
 | |
| 	hasher, _ := blake2b.New256(nil)
 | |
| 	hasher.Write(nonce)
 | |
| 	sum := hasher.Sum(nil)
 | |
| 	return base64.RawURLEncoding.EncodeToString(sum)
 | |
| }
 | |
| 
 | |
| // CheckNonce tests if a nonce matches the hashed version of it
 | |
| func CheckNonce(nonce []byte, hashed string) bool {
 | |
| 	return hmac.Equal([]byte(HashNonce(nonce)), []byte(hashed))
 | |
| }
 |