diff options
author | Adam Langley <agl@golang.org> | 2010-12-27 12:55:49 -0500 |
---|---|---|
committer | Adam Langley <agl@golang.org> | 2010-12-27 12:55:49 -0500 |
commit | 994a703f947c691839cd65ed0f71cba107f97983 (patch) | |
tree | 420a6133626c4547a4a5d6c6a89fed182f5300cb | |
parent | 3c543bed832759e053774c93fe59ffbe95a63393 (diff) | |
download | go-994a703f947c691839cd65ed0f71cba107f97983.tar.gz |
crypto/cipher: fix OCFB
I messed up when reading the OCFB spec.
TBR=rsc
R=rsc
CC=golang-dev
http://codereview.appspot.com/3739042
-rw-r--r-- | src/pkg/crypto/cipher/ocfb.go | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/src/pkg/crypto/cipher/ocfb.go b/src/pkg/crypto/cipher/ocfb.go index 08565dc5f..43cb5a531 100644 --- a/src/pkg/crypto/cipher/ocfb.go +++ b/src/pkg/crypto/cipher/ocfb.go @@ -6,7 +6,7 @@ package cipher -type ocfb struct { +type ocfbEncrypter struct { b Block fre []byte outUsed int @@ -22,7 +22,7 @@ func NewOCFBEncrypter(block Block, randData []byte) (Stream, []byte) { return nil, nil } - x := &ocfb{ + x := &ocfbEncrypter{ b: block, fre: make([]byte, blockSize), outUsed: 0, @@ -42,6 +42,25 @@ func NewOCFBEncrypter(block Block, randData []byte) (Stream, []byte) { return x, prefix } +func (x *ocfbEncrypter) XORKeyStream(dst, src []byte) { + for i := 0; i < len(src); i++ { + if x.outUsed == len(x.fre) { + x.b.Encrypt(x.fre, x.fre) + x.outUsed = 0 + } + + x.fre[x.outUsed] ^= src[i] + dst[i] = x.fre[x.outUsed] + x.outUsed++ + } +} + +type ocfbDecrypter struct { + b Block + fre []byte + outUsed int +} + // NewOCFBDecrypter returns a Stream which decrypts data with OpenPGP's cipher // feedback mode using the given Block. Prefix must be the first blockSize + 2 // bytes of the ciphertext, where blockSize is the Block's block size. If an @@ -52,7 +71,7 @@ func NewOCFBDecrypter(block Block, prefix []byte) Stream { return nil } - x := &ocfb{ + x := &ocfbDecrypter{ b: block, fre: make([]byte, blockSize), outUsed: 0, @@ -78,14 +97,16 @@ func NewOCFBDecrypter(block Block, prefix []byte) Stream { return x } -func (x *ocfb) XORKeyStream(dst, src []byte) { +func (x *ocfbDecrypter) XORKeyStream(dst, src []byte) { for i := 0; i < len(src); i++ { if x.outUsed == len(x.fre) { x.b.Encrypt(x.fre, x.fre) x.outUsed = 0 } + c := src[i] dst[i] = x.fre[x.outUsed] ^ src[i] + x.fre[x.outUsed] = c x.outUsed++ } } |