| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- package encryption
- import (
- "crypto/aes"
- "crypto/cipher"
- "crypto/rand"
- "encoding/hex"
- "errors"
- "io"
- )
- // This file is copied from: https://github.com/gtank/cryptopasta
- // NewEncryptionKey generates a random 256-bit key for Encrypt() and
- // Decrypt(). It panics if the source of randomness fails.
- func NewEncryptionKey() *[32]byte {
- key := [32]byte{}
- _, err := io.ReadFull(rand.Reader, key[:])
- if err != nil {
- panic(err)
- }
- return &key
- }
- // NewRandomString generates a random string.
- // It panics if the source of randomness fails.
- func GenerateRandomBytes(n int) (string, error) {
- b := make([]byte, n)
- _, err := rand.Read(b)
- if err != nil {
- return "", err
- }
- return hex.EncodeToString(b), nil
- }
- // Encrypt encrypts data using 256-bit AES-GCM. This both hides the content of
- // the data and provides a check that it hasn't been altered. Output takes the
- // form nonce|ciphertext|tag where '|' indicates concatenation.
- func Encrypt(plaintext []byte, key *[32]byte) (ciphertext []byte, err error) {
- block, err := aes.NewCipher(key[:])
- if err != nil {
- return nil, err
- }
- gcm, err := cipher.NewGCM(block)
- if err != nil {
- return nil, err
- }
- nonce := make([]byte, gcm.NonceSize())
- _, err = io.ReadFull(rand.Reader, nonce)
- if err != nil {
- return nil, err
- }
- return gcm.Seal(nonce, nonce, plaintext, nil), nil
- }
- // Decrypt decrypts data using 256-bit AES-GCM. This both hides the content of
- // the data and provides a check that it hasn't been altered. Expects input
- // form nonce|ciphertext|tag where '|' indicates concatenation.
- func Decrypt(ciphertext []byte, key *[32]byte) (plaintext []byte, err error) {
- block, err := aes.NewCipher(key[:])
- if err != nil {
- return nil, err
- }
- gcm, err := cipher.NewGCM(block)
- if err != nil {
- return nil, err
- }
- if len(ciphertext) < gcm.NonceSize() {
- return nil, errors.New("malformed ciphertext")
- }
- return gcm.Open(nil,
- ciphertext[:gcm.NonceSize()],
- ciphertext[gcm.NonceSize():],
- nil,
- )
- }
|