// // CFB.swift // CryptoSwift // // Copyright (C) 2014-2017 Marcin Krzyżanowski // This software is provided 'as-is', without any express or implied warranty. // // In no event will the authors be held liable for any damages arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: // // - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. // - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. // - This notice may not be removed or altered from any source or binary distribution. // // Cipher feedback (CFB) // struct CFBModeWorker: BlockModeWorker { let cipherOperation: CipherOperationOnBlock private let iv: ArraySlice private var prev: ArraySlice? init(iv: ArraySlice, cipherOperation: @escaping CipherOperationOnBlock) { self.iv = iv self.cipherOperation = cipherOperation } mutating func encrypt(_ plaintext: ArraySlice) -> Array { guard let ciphertext = cipherOperation(prev ?? iv) else { return Array(plaintext) } prev = xor(plaintext, ciphertext.slice) return Array(prev ?? []) } mutating func decrypt(_ ciphertext: ArraySlice) -> Array { guard let plaintext = cipherOperation(prev ?? iv) else { return Array(ciphertext) } let result: Array = xor(plaintext, ciphertext) prev = ciphertext return result } }