2022-04-01 11:47:50 +03:00
// Copyright 2022 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2022-04-01 11:47:50 +03:00
package util
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"errors"
2022-04-01 19:34:57 +03:00
"io"
"os"
2022-04-01 11:47:50 +03:00
)
// CopyFile copies file from source to target path.
func CopyFile ( src , dest string ) error {
2022-04-01 19:34:57 +03:00
si , err := os . Lstat ( src )
if err != nil {
return err
}
sr , err := os . Open ( src )
if err != nil {
return err
}
defer sr . Close ( )
dw , err := os . Create ( dest )
if err != nil {
return err
}
defer dw . Close ( )
if _ , err = io . Copy ( dw , sr ) ; err != nil {
return err
}
if err = os . Chtimes ( dest , si . ModTime ( ) , si . ModTime ( ) ) ; err != nil {
return err
}
return os . Chmod ( dest , si . Mode ( ) )
2022-04-01 11:47:50 +03:00
}
// AESGCMEncrypt (from legacy package): encrypts plaintext with the given key using AES in GCM mode. should be replaced.
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 (from legacy package): decrypts ciphertext with the given key using AES in GCM mode. should be replaced.
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 : ]
plainText , err := gcm . Open ( nil , nonce , ciphertext , nil )
if err != nil {
return nil , err
}
return plainText , nil
}