// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Cipher block chaining (CBC) mode.

// CBC provides confidentiality by xoring (chaining) each plaintext block
// with the previous ciphertext block before applying the block cipher.

// See NIST SP 800-38A, pp 10-11

package block

import (
	"io"
)

type cbcCipher struct {
	c         Cipher
	blockSize int
	iv        []byte
	tmp       []byte
}

func newCBC(c Cipher, iv []byte) *cbcCipher {
	n := c.BlockSize()
	x := new(cbcCipher)
	x.c = c
	x.blockSize = n
	x.iv = copy(iv)
	x.tmp = make([]byte, n)
	return x
}

func (x *cbcCipher) BlockSize() int { return x.blockSize }

func (x *cbcCipher) Encrypt(src, dst []byte) {
	for i := 0; i < x.blockSize; i++ {
		x.iv[i] ^= src[i]
	}
	x.c.Encrypt(x.iv, x.iv)
	for i := 0; i < x.blockSize; i++ {
		dst[i] = x.iv[i]
	}
}

func (x *cbcCipher) Decrypt(src, dst []byte) {
	x.c.Decrypt(src, x.tmp)
	for i := 0; i < x.blockSize; i++ {
		x.tmp[i] ^= x.iv[i]
		x.iv[i] = src[i]
		dst[i] = x.tmp[i]
	}
}

// NewCBCDecrypter returns a reader that reads data from r and decrypts it using c
// in cipher block chaining (CBC) mode with the initialization vector iv.
// The returned Reader does not buffer or read ahead except
// as required by the cipher's block size.
func NewCBCDecrypter(c Cipher, iv []byte, r io.Reader) io.Reader {
	return NewECBDecrypter(newCBC(c, iv), r)
}

// NewCBCEncrypter returns a writer that encrypts data using c
// in cipher block chaining (CBC) mode with the initialization vector iv
// and writes the encrypted data to w.
// The returned Writer does no buffering except as required
// by the cipher's block size, so there is no need for a Flush method.
func NewCBCEncrypter(c Cipher, iv []byte, w io.Writer) io.Writer {
	return NewECBEncrypter(newCBC(c, iv), w)
}
