1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // Output feedback (OFB) mode.
7 // OFB converts a block cipher into a stream cipher by
8 // repeatedly encrypting an initialization vector and
9 // xoring the resulting stream of data with the input.
11 // See NIST SP 800-38A, pp 13-15
20 type ofbStream
struct {
25 func newOFBStream(c Cipher
, iv
[]byte) *ofbStream
{
29 if n
!= c
.BlockSize() {
30 panic(fmt
.Sprintln("crypto/block: newOFBStream: invalid iv size", n
, "!=", c
.BlockSize()))
36 func (x
*ofbStream
) Next() []byte {
37 x
.c
.Encrypt(x
.iv
, x
.iv
)
41 // NewOFBReader returns a reader that reads data from r, decrypts (or encrypts)
42 // it using c in output feedback (OFB) mode with the initialization vector iv.
43 // The returned Reader does not buffer and has no block size.
44 // In OFB mode, encryption and decryption are the same operation:
45 // an OFB reader applied to an encrypted stream produces a decrypted
46 // stream and vice versa.
47 func NewOFBReader(c Cipher
, iv
[]byte, r io
.Reader
) io
.Reader
{
48 return newXorReader(newOFBStream(c
, iv
), r
)
51 // NewOFBWriter returns a writer that encrypts (or decrypts) data using c
52 // in cipher feedback (OFB) mode with the initialization vector iv
53 // and writes the encrypted data to w.
54 // The returned Writer does not buffer and has no block size.
55 // In OFB mode, encryption and decryption are the same operation:
56 // an OFB writer applied to an decrypted stream produces an encrypted
57 // stream and vice versa.
58 func NewOFBWriter(c Cipher
, iv
[]byte, w io
.Writer
) io
.Writer
{
59 return newXorWriter(newOFBStream(c
, iv
), w
)