// Copyright 2010 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.// CFB (Cipher Feedback) Mode.package cipherimport ()type cfb struct { b Block next []byte out []byte outUsed int decrypt bool}func ( *cfb) (, []byte) {iflen() < len() {panic("crypto/cipher: output smaller than input") }ifalias.InexactOverlap([:len()], ) {panic("crypto/cipher: invalid buffer overlap") }forlen() > 0 {if .outUsed == len(.out) { .b.Encrypt(.out, .next) .outUsed = 0 }if .decrypt {// We can precompute a larger segment of the // keystream on decryption. This will allow // larger batches for xor, and we should be // able to match CTR/OFB performance.copy(.next[.outUsed:], ) } := subtle.XORBytes(, , .out[.outUsed:])if !.decrypt {copy(.next[.outUsed:], ) } = [:] = [:] .outUsed += }}// NewCFBEncrypter returns a [Stream] which encrypts with cipher feedback mode,// using the given [Block]. The iv must be the same length as the [Block]'s block// size.func ( Block, []byte) Stream {returnnewCFB(, , false)}// NewCFBDecrypter returns a [Stream] which decrypts with cipher feedback mode,// using the given [Block]. The iv must be the same length as the [Block]'s block// size.func ( Block, []byte) Stream {returnnewCFB(, , true)}func newCFB( Block, []byte, bool) Stream { := .BlockSize()iflen() != {// stack trace will indicate whether it was de or encryptionpanic("cipher.newCFB: IV length must equal block size") } := &cfb{b: ,out: make([]byte, ),next: make([]byte, ),outUsed: ,decrypt: , }copy(.next, )return}
The pages are generated with Goldsv0.7.0-preview. (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 @zigo_101 (reachable from the left QR code) to get the latest news of Golds.