// 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 feedback (CFB) mode.

// CFB provides confidentiality by feeding a fraction of
// the previous ciphertext in as the plaintext for the next
// block operation.

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

package block

import (
	"io";
)

type cfbCipher struct {
	c		Cipher;
	blockSize	int;	// our block size (s/8)
	cipherSize	int;	// underlying cipher block size
	iv		[]byte;
	tmp		[]byte;
}

func newCFB(c Cipher, s int, iv []byte) *cfbCipher {
	if s == 0 || s%8 != 0 {
		panicln("crypto/block: invalid CFB mode", s)
	}
	b := c.BlockSize();
	x := new(cfbCipher);
	x.c = c;
	x.blockSize = s / 8;
	x.cipherSize = b;
	x.iv = copy(iv);
	x.tmp = make([]byte, b);
	return x;
}

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

func (x *cfbCipher) Encrypt(src, dst []byte) {
	// Encrypt old IV and xor prefix with src to make dst.
	x.c.Encrypt(x.iv, x.tmp);
	for i := 0; i < x.blockSize; i++ {
		dst[i] = src[i] ^ x.tmp[i]
	}

	// Slide unused IV pieces down and insert dst at end.
	for i := 0; i < x.cipherSize-x.blockSize; i++ {
		x.iv[i] = x.iv[i+x.blockSize]
	}
	off := x.cipherSize - x.blockSize;
	for i := off; i < x.cipherSize; i++ {
		x.iv[i] = dst[i-off]
	}
}

func (x *cfbCipher) Decrypt(src, dst []byte) {
	// Encrypt [sic] old IV and xor prefix with src to make dst.
	x.c.Encrypt(x.iv, x.tmp);
	for i := 0; i < x.blockSize; i++ {
		dst[i] = src[i] ^ x.tmp[i]
	}

	// Slide unused IV pieces down and insert src at top.
	for i := 0; i < x.cipherSize-x.blockSize; i++ {
		x.iv[i] = x.iv[i+x.blockSize]
	}
	off := x.cipherSize - x.blockSize;
	for i := off; i < x.cipherSize; i++ {
		// Reconstruct src = dst ^ x.tmp
		// in case we overwrote src (src == dst).
		x.iv[i] = dst[i-off] ^ x.tmp[i-off]
	}
}

// NewCFBDecrypter returns a reader that reads data from r and decrypts it using c
// in s-bit cipher feedback (CFB) mode with the initialization vector iv.
// The returned Reader does not buffer or read ahead except
// as required by the cipher's block size.
// Modes for s not a multiple of 8 are unimplemented.
func NewCFBDecrypter(c Cipher, s int, iv []byte, r io.Reader) io.Reader {
	return NewECBDecrypter(newCFB(c, s, iv), r)
}

// NewCFBEncrypter returns a writer that encrypts data using c
// in s-bit cipher feedback (CFB) 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.
// Modes for s not a multiple of 8 are unimplemented.
func NewCFBEncrypter(c Cipher, s int, iv []byte, w io.Writer) io.Writer {
	return NewECBEncrypter(newCFB(c, s, iv), w)
}
