| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 | // Copyright 2020 The Gogs Authors. All rights reserved.// Use of this source code is governed by a MIT-style// license that can be found in the LICENSE file.package cryptoutilimport (	"crypto/aes"	"crypto/cipher"	"crypto/rand"	"errors")// AESGCMEncrypt encrypts plaintext with the given key using AES in GCM mode.func AESGCMEncrypt(key, plaintext []byte) ([]byte, 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())	if _, err := rand.Read(nonce); err != nil {		return nil, err	}	ciphertext := gcm.Seal(nil, nonce, plaintext, nil)	return append(nonce, ciphertext...), nil}// AESGCMDecrypt decrypts ciphertext with the given key using AES in GCM mode.func AESGCMDecrypt(key, ciphertext []byte) ([]byte, error) {	block, err := aes.NewCipher(key)	if err != nil {		return nil, err	}	gcm, err := cipher.NewGCM(block)	if err != nil {		return nil, err	}	size := gcm.NonceSize()	if len(ciphertext)-size <= 0 {		return nil, errors.New("ciphertext is empty")	}	nonce := ciphertext[:size]	ciphertext = ciphertext[size:]	return gcm.Open(nil, nonce, ciphertext, nil)}
 |