Index: libgo/go/crypto/cipher/ofb.go |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/libgo/go/crypto/cipher/ofb.go |
@@ -0,0 +1,44 @@ |
+// Copyright 2011 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. |
+ |
+// OFB (Output Feedback) Mode. |
+ |
+package cipher |
+ |
+type ofb struct { |
+ b Block |
+ out []byte |
+ outUsed int |
+} |
+ |
+// NewOFB returns a Stream that encrypts or decrypts using the block cipher b |
+// in output feedback mode. The initialization vector iv's length must be equal |
+// to b's block size. |
+func NewOFB(b Block, iv []byte) Stream { |
+ blockSize := b.BlockSize() |
+ if len(iv) != blockSize { |
+ return nil |
+ } |
+ |
+ x := &ofb{ |
+ b: b, |
+ out: make([]byte, blockSize), |
+ outUsed: 0, |
+ } |
+ b.Encrypt(x.out, iv) |
+ |
+ return x |
+} |
+ |
+func (x *ofb) XORKeyStream(dst, src []byte) { |
+ for i, s := range src { |
+ if x.outUsed == len(x.out) { |
+ x.b.Encrypt(x.out, x.out) |
+ x.outUsed = 0 |
+ } |
+ |
+ dst[i] = s ^ x.out[x.outUsed] |
+ x.outUsed++ |
+ } |
+} |