/* * SPDX-FileCopyrightText: © Hypermode Inc. * SPDX-License-Identifier: Apache-2.0 */ package y import ( "bytes" "crypto/aes" "crypto/cipher" "crypto/rand" "io" ) // XORBlock encrypts the given data with AES and XOR's with IV. // Can be used for both encryption and decryption. IV is of // AES block size. func XORBlock(dst, src, key, iv []byte) error { block, err := aes.NewCipher(key) if err != nil { return err } stream := cipher.NewCTR(block, iv) stream.XORKeyStream(dst, src) return nil } func XORBlockAllocate(src, key, iv []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } stream := cipher.NewCTR(block, iv) dst := make([]byte, len(src)) stream.XORKeyStream(dst, src) return dst, nil } func XORBlockStream(w io.Writer, src, key, iv []byte) error { block, err := aes.NewCipher(key) if err != nil { return err } stream := cipher.NewCTR(block, iv) sw := cipher.StreamWriter{S: stream, W: w} _, err = io.Copy(sw, bytes.NewReader(src)) return Wrapf(err, "XORBlockStream") } // GenerateIV generates IV. func GenerateIV() ([]byte, error) { iv := make([]byte, aes.BlockSize) _, err := rand.Read(iv) return iv, err }