Can't we encode cipher suite specific information in the model in another way than just implying some invariants between the parameters?

E.g.
```scala
sealed trait CipherConfiguration {
  def cipherName: String
}
case object NullCipher extends CipherConfiguration {
  def cipherName = ...
}
case class KerberosConfiguration(cipherName: String, localCertificates: Seq[Certificate]) extends CipherConfiguration
case class Other(...) extends CipherConfiguration
case class SSLSessionEstablished(
   cipher: CipherConfiguration,
   localPrincipal: Principal,
   peerPrincipal: Principal) extends Event
```

or something along those lines (it still seems to miss part of the invariants).

Do we understand all of those invariants?
  * are principals always available?
  * what's the relation between principals and certificates? I'd say certificates provide evidence for the identity of a principal, right?
  * do we know which cipher suites provide principals and certificates apart from Kerberos?