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 | 03e259664f778ca55fe348afb5e6a43459ffbcce (patch) | |
tree | a2ba479f3fd209467a82cb01fa08db366fc3db8d | |
parent | 784788ba44a94df0da922a46c694b6646132ed4e (diff) | |
download | go-03e259664f778ca55fe348afb5e6a43459ffbcce.tar.gz go-03e259664f778ca55fe348afb5e6a43459ffbcce.zip |
crypto/cipher: fix OCFB
I messed up when reading the OCFB spec.
TBR=rsc
R=rsc
CC=golang-dev
https://golang.org/cl/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 08565dc5f8..43cb5a5310 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++ } } |