package ixee.cryptopals.utils.crypto import javax.crypto.Cipher class CBCCipher(cipher: Cipher, init: Seq[Byte]) { var state: Seq[Byte] = init var leftover: Seq[Byte] = Seq() def enc(data: Seq[Byte]): Seq[Byte] = { (blocks, leftover) = blockized(leftover append data) blocks.map(encBlock).reduce(_ append _) } def encBlock(data: Seq[Byte]): Seq[Byte] = { state = cipher.doFinal((data xor state).toArray) state } def blockized(data: Seq[Byte])(size: Int): (Seq[Seq[Byte]], Seq[Byte]) = data.splitAt(data.length - (data.length % size)) }