encrypt.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /*
  2. * SPDX-FileCopyrightText: © Hypermode Inc. <hello@hypermode.com>
  3. * SPDX-License-Identifier: Apache-2.0
  4. */
  5. package y
  6. import (
  7. "bytes"
  8. "crypto/aes"
  9. "crypto/cipher"
  10. "crypto/rand"
  11. "io"
  12. )
  13. // XORBlock encrypts the given data with AES and XOR's with IV.
  14. // Can be used for both encryption and decryption. IV is of
  15. // AES block size.
  16. func XORBlock(dst, src, key, iv []byte) error {
  17. block, err := aes.NewCipher(key)
  18. if err != nil {
  19. return err
  20. }
  21. stream := cipher.NewCTR(block, iv)
  22. stream.XORKeyStream(dst, src)
  23. return nil
  24. }
  25. func XORBlockAllocate(src, key, iv []byte) ([]byte, error) {
  26. block, err := aes.NewCipher(key)
  27. if err != nil {
  28. return nil, err
  29. }
  30. stream := cipher.NewCTR(block, iv)
  31. dst := make([]byte, len(src))
  32. stream.XORKeyStream(dst, src)
  33. return dst, nil
  34. }
  35. func XORBlockStream(w io.Writer, src, key, iv []byte) error {
  36. block, err := aes.NewCipher(key)
  37. if err != nil {
  38. return err
  39. }
  40. stream := cipher.NewCTR(block, iv)
  41. sw := cipher.StreamWriter{S: stream, W: w}
  42. _, err = io.Copy(sw, bytes.NewReader(src))
  43. return Wrapf(err, "XORBlockStream")
  44. }
  45. // GenerateIV generates IV.
  46. func GenerateIV() ([]byte, error) {
  47. iv := make([]byte, aes.BlockSize)
  48. _, err := rand.Read(iv)
  49. return iv, err
  50. }