You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

legacy.go 1.8KB

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