コード例 #1
0
static void openssl_poll(ErDtlsConnection *self)
{
    int ret;
    char buf[512];
    int error;

    log_state(self, "poll: before handshake");

    ret = SSL_do_handshake(self->priv->ssl);

    log_state(self, "poll: after handshake");

    if (ret == 1) {
        if (!self->priv->keys_exported) {
            LOG_INFO(self, "handshake just completed successfully, exporting keys");
            export_srtp_keys(self);
        } else {
            LOG_INFO(self, "handshake is completed");
        }
        return;
    } else {
        if (ret == 0) {
            LOG_DEBUG(self, "do_handshake encountered EOF");
        } else if (ret == -1) {
            LOG_WARNING(self, "do_handshake encountered BIO error");
        } else {
            LOG_DEBUG(self, "do_handshake returned %d", ret);
        }
    }

    error = SSL_get_error(self->priv->ssl, ret);

    switch (error) {
    case SSL_ERROR_NONE:
        LOG_WARNING(self, "no error, handshake should be done");
        break;
    case SSL_ERROR_SSL:
        LOG_LOG(self, "SSL error %d: %s", error, ERR_error_string(ERR_get_error(), buf));
        break;
    case SSL_ERROR_WANT_READ:
        LOG_LOG(self, "SSL wants read");
        break;
    case SSL_ERROR_WANT_WRITE:
        LOG_LOG(self, "SSL wants write");
        break;
    case SSL_ERROR_SYSCALL: {
        LOG_LOG(self, "SSL syscall (error) : %lu", ERR_get_error());
        break;
    }
    default:
        LOG_WARNING(self, "Unknown SSL error: %d, ret: %d", error, ret);
    }
}
コード例 #2
0
static void
openssl_poll (GstDtlsConnection * self)
{
  int ret;
  int error;

  log_state (self, "poll: before handshake");

  ERR_clear_error ();
  ret = SSL_do_handshake (self->priv->ssl);

  log_state (self, "poll: after handshake");

  switch (ret) {
    case 1:
      if (!self->priv->keys_exported) {
        GST_INFO_OBJECT (self,
            "handshake just completed successfully, exporting keys");
        export_srtp_keys (self);
      } else {
        GST_INFO_OBJECT (self, "handshake is completed");
      }
      return;
    case 0:
      GST_DEBUG_OBJECT (self, "do_handshake encountered EOF");
      break;
    case -1:
      GST_DEBUG_OBJECT (self, "do_handshake encountered BIO error");
      break;
    default:
      GST_DEBUG_OBJECT (self, "do_handshake returned %d", ret);
  }

  error = SSL_get_error (self->priv->ssl, ret);

  switch (error) {
    case SSL_ERROR_NONE:
      GST_WARNING_OBJECT (self, "no error, handshake should be done");
      break;
    case SSL_ERROR_SSL:
      GST_ERROR_OBJECT (self, "SSL error");
      ERR_print_errors_cb (ssl_err_cb, self);
      return;
    case SSL_ERROR_WANT_READ:
      GST_LOG_OBJECT (self, "SSL wants read");
      break;
    case SSL_ERROR_WANT_WRITE:
      GST_LOG_OBJECT (self, "SSL wants write");
      break;
    case SSL_ERROR_SYSCALL:{
      gchar message[1024] = "<unknown>";
      gint syserror;
#ifdef G_OS_WIN32
      syserror = WSAGetLastError ();
      FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, syserror, 0, message,
          sizeof message, NULL);
#else
      syserror = errno;
      strerror_r (syserror, message, sizeof message);
#endif
      GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT,
          syserror != 0 ? GST_LEVEL_WARNING : GST_LEVEL_LOG,
          self, "SSL syscall error: errno %d: %s", syserror, message);
      break;
    }
    default:
      GST_WARNING_OBJECT (self, "Unknown SSL error: %d, ret: %d", error, ret);
  }

  ERR_print_errors_cb (ssl_warn_cb, self);
}