code.gitea.io/gitea@v1.19.3/modules/util/legacy.go (about)

     1  // Copyright 2022 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package util
     5  
     6  import (
     7  	"crypto/aes"
     8  	"crypto/cipher"
     9  	"crypto/rand"
    10  	"errors"
    11  	"io"
    12  	"os"
    13  )
    14  
    15  // CopyFile copies file from source to target path.
    16  func CopyFile(src, dest string) error {
    17  	si, err := os.Lstat(src)
    18  	if err != nil {
    19  		return err
    20  	}
    21  
    22  	sr, err := os.Open(src)
    23  	if err != nil {
    24  		return err
    25  	}
    26  	defer sr.Close()
    27  
    28  	dw, err := os.Create(dest)
    29  	if err != nil {
    30  		return err
    31  	}
    32  	defer dw.Close()
    33  
    34  	if _, err = io.Copy(dw, sr); err != nil {
    35  		return err
    36  	}
    37  
    38  	if err = os.Chtimes(dest, si.ModTime(), si.ModTime()); err != nil {
    39  		return err
    40  	}
    41  	return os.Chmod(dest, si.Mode())
    42  }
    43  
    44  // AESGCMEncrypt (from legacy package): encrypts plaintext with the given key using AES in GCM mode. should be replaced.
    45  func AESGCMEncrypt(key, plaintext []byte) ([]byte, error) {
    46  	block, err := aes.NewCipher(key)
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  
    51  	gcm, err := cipher.NewGCM(block)
    52  	if err != nil {
    53  		return nil, err
    54  	}
    55  
    56  	nonce := make([]byte, gcm.NonceSize())
    57  	if _, err := rand.Read(nonce); err != nil {
    58  		return nil, err
    59  	}
    60  
    61  	ciphertext := gcm.Seal(nil, nonce, plaintext, nil)
    62  	return append(nonce, ciphertext...), nil
    63  }
    64  
    65  // AESGCMDecrypt (from legacy package): decrypts ciphertext with the given key using AES in GCM mode. should be replaced.
    66  func AESGCMDecrypt(key, ciphertext []byte) ([]byte, error) {
    67  	block, err := aes.NewCipher(key)
    68  	if err != nil {
    69  		return nil, err
    70  	}
    71  
    72  	gcm, err := cipher.NewGCM(block)
    73  	if err != nil {
    74  		return nil, err
    75  	}
    76  
    77  	size := gcm.NonceSize()
    78  	if len(ciphertext)-size <= 0 {
    79  		return nil, errors.New("ciphertext is empty")
    80  	}
    81  
    82  	nonce := ciphertext[:size]
    83  	ciphertext = ciphertext[size:]
    84  
    85  	plainText, err := gcm.Open(nil, nonce, ciphertext, nil)
    86  	if err != nil {
    87  		return nil, err
    88  	}
    89  
    90  	return plainText, nil
    91  }