package cipher
import (
"crypto/internal/alias"
"crypto/subtle"
)
type ofb struct {
b Block
cipher []byte
out []byte
outUsed int
}
func NewOFB (b Block , iv []byte ) Stream {
blockSize := b .BlockSize ()
if len (iv ) != blockSize {
panic ("cipher.NewOFB: IV length must equal block size" )
}
bufSize := streamBufferSize
if bufSize < blockSize {
bufSize = blockSize
}
x := &ofb {
b : b ,
cipher : make ([]byte , blockSize ),
out : make ([]byte , 0 , bufSize ),
outUsed : 0 ,
}
copy (x .cipher , iv )
return x
}
func (x *ofb ) refill () {
bs := x .b .BlockSize ()
remain := len (x .out ) - x .outUsed
if remain > x .outUsed {
return
}
copy (x .out , x .out [x .outUsed :])
x .out = x .out [:cap (x .out )]
for remain < len (x .out )-bs {
x .b .Encrypt (x .cipher , x .cipher )
copy (x .out [remain :], x .cipher )
remain += bs
}
x .out = x .out [:remain ]
x .outUsed = 0
}
func (x *ofb ) XORKeyStream (dst , src []byte ) {
if len (dst ) < len (src ) {
panic ("crypto/cipher: output smaller than input" )
}
if alias .InexactOverlap (dst [:len (src )], src ) {
panic ("crypto/cipher: invalid buffer overlap" )
}
for len (src ) > 0 {
if x .outUsed >= len (x .out )-x .b .BlockSize () {
x .refill ()
}
n := subtle .XORBytes (dst , src , x .out [x .outUsed :])
dst = dst [n :]
src = src [n :]
x .outUsed += n
}
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .