     case FailedToDeriveSecret
     case FailedToCreateConfirmation
     case FailedToVerifySecret
+
+    public var description: String {
+        switch self {
+            case .FailedToInitializeEcJPake : return "Unable to initialize EC-JPake"
+            case .FailedToCreateRoundOne : return "Unable to create handshake local round 1 data"
+            case .FailedToCreateRoundTwo : return "Unable to create handshake local round 2 data"
+            case .FailedToReadRoundOne : return "Unable to read handshake remote round 1 data"
+            case .FailedToReadRoundTwo : return "Unable to read handshake remote round 2 data"
+            case .FailedToDeriveSecret : return "Unable to derive secret"
+            case .FailedToCreateConfirmation : return "Unable to create confirmation data"
+            case .FailedToVerifySecret : return "Unable to verify secret"
+        }
+    }
 }
 
 enum HandshakeState: Int {

    private func getComputedHash() -> Data? {
        let hash = Sha256Wrapper()
        if hash == nil {
            handshakeState = .failed
            delegate?.handshakeDidFail(sender: self, error: .FailedToCreateConfirmation)
            return nil;
        } else {
            var data = Data()

            handshakeState = .roundTwoRead
            sendRoundTwo()
        } else {
            fail(withReason: .FailedToReadRoundTwo)
        }
    }


    private func sendRoundTwo() {
        log("Handshake: sendRoundTwo")
        let data = ecJPakeWrapper.writeRoundTwo()

        if let data = data {
