package ixee.cryptopals.utils.crypto import javax.crypto.Cipher sealed trait CipherGenerator { def encrypt: IxeeCipher // feels kinda gross to type this def decrypt: IxeeCipher // writing crypto feels wrong } case class EcbBuilder(primitives: SchemeBuilder) extends CipherGenerator { // lol def encrypt = ??? def decrypt = ??? } case class CbcBuilder(primitives: SchemeBuilder, iv: Seq[Byte]) extends CipherGenerator { def encrypt = setup(Cipher.ENCRYPT_MODE) def decrypt = setup(Cipher.DECRYPT_MODE) private[this] def setup(cipherMode: Int) = { val cipher = primitives.cipher cipher.init(cipherMode, primitives.key) new CBCCipher(cipher, iv, cipherMode) } }