// 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.

// Output feedback (OFB) mode.

// OFB converts a block cipher into a stream cipher by
// repeatedly encrypting an initialization vector and
// xoring the resulting stream of data with the input.

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

package block

import (
	"fmt"
	"io"
)

type ofbStream struct {
	c  Cipher
	iv []byte
}

func newOFBStream(c Cipher, iv []byte) *ofbStream {
	x := new(ofbStream)
	x.c = c
	n := len(iv)
	if n != c.BlockSize() {
		panic(fmt.Sprintln("crypto/block: newOFBStream: invalid iv size", n, "!=", c.BlockSize()))
	}
	x.iv = copy(iv)
	return x
}

func (x *ofbStream) Next() []byte {
	x.c.Encrypt(x.iv, x.iv)
	return x.iv
}

// NewOFBReader returns a reader that reads data from r, decrypts (or encrypts)
// it using c in output feedback (OFB) mode with the initialization vector iv.
// The returned Reader does not buffer and has no block size.
// In OFB mode, encryption and decryption are the same operation:
// an OFB reader applied to an encrypted stream produces a decrypted
// stream and vice versa.
func NewOFBReader(c Cipher, iv []byte, r io.Reader) io.Reader {
	return newXorReader(newOFBStream(c, iv), r)
}

// NewOFBWriter returns a writer that encrypts (or decrypts) data using c
// in cipher feedback (OFB) mode with the initialization vector iv
// and writes the encrypted data to w.
// The returned Writer does not buffer and has no block size.
// In OFB mode, encryption and decryption are the same operation:
// an OFB writer applied to an decrypted stream produces an encrypted
// stream and vice versa.
func NewOFBWriter(c Cipher, iv []byte, w io.Writer) io.Writer {
	return newXorWriter(newOFBStream(c, iv), w)
}
