Example #1
0
static int
init_gnutls_functions (Lisp_Object libraries)
{
  HMODULE library;
  int max_log_level = 1;

  if (!(library = w32_delayed_load (libraries, Qgnutls_dll)))
    {
      GNUTLS_LOG (1, max_log_level, "GnuTLS library not found");
      return 0;
    }

  LOAD_GNUTLS_FN (library, gnutls_alert_get);
  LOAD_GNUTLS_FN (library, gnutls_alert_get_name);
  LOAD_GNUTLS_FN (library, gnutls_alert_send_appropriate);
  LOAD_GNUTLS_FN (library, gnutls_anon_allocate_client_credentials);
  LOAD_GNUTLS_FN (library, gnutls_anon_free_client_credentials);
  LOAD_GNUTLS_FN (library, gnutls_bye);
  LOAD_GNUTLS_FN (library, gnutls_certificate_allocate_credentials);
  LOAD_GNUTLS_FN (library, gnutls_certificate_free_credentials);
  LOAD_GNUTLS_FN (library, gnutls_certificate_get_peers);
  LOAD_GNUTLS_FN (library, gnutls_certificate_set_verify_flags);
  LOAD_GNUTLS_FN (library, gnutls_certificate_set_x509_crl_file);
  LOAD_GNUTLS_FN (library, gnutls_certificate_set_x509_key_file);
  LOAD_GNUTLS_FN (library, gnutls_certificate_set_x509_trust_file);
  LOAD_GNUTLS_FN (library, gnutls_certificate_type_get);
  LOAD_GNUTLS_FN (library, gnutls_certificate_verify_peers2);
  LOAD_GNUTLS_FN (library, gnutls_credentials_set);
  LOAD_GNUTLS_FN (library, gnutls_deinit);
  LOAD_GNUTLS_FN (library, gnutls_dh_set_prime_bits);
  LOAD_GNUTLS_FN (library, gnutls_error_is_fatal);
  LOAD_GNUTLS_FN (library, gnutls_global_init);
  LOAD_GNUTLS_FN (library, gnutls_global_set_log_function);
  LOAD_GNUTLS_FN (library, gnutls_global_set_log_level);
  LOAD_GNUTLS_FN (library, gnutls_global_set_mem_functions);
  LOAD_GNUTLS_FN (library, gnutls_handshake);
  LOAD_GNUTLS_FN (library, gnutls_init);
  LOAD_GNUTLS_FN (library, gnutls_priority_set_direct);
  LOAD_GNUTLS_FN (library, gnutls_record_check_pending);
  LOAD_GNUTLS_FN (library, gnutls_record_recv);
  LOAD_GNUTLS_FN (library, gnutls_record_send);
  LOAD_GNUTLS_FN (library, gnutls_strerror);
  LOAD_GNUTLS_FN (library, gnutls_transport_set_errno);
  LOAD_GNUTLS_FN (library, gnutls_transport_set_lowat);
  LOAD_GNUTLS_FN (library, gnutls_transport_set_ptr2);
  LOAD_GNUTLS_FN (library, gnutls_transport_set_pull_function);
  LOAD_GNUTLS_FN (library, gnutls_transport_set_push_function);
  LOAD_GNUTLS_FN (library, gnutls_x509_crt_check_hostname);
  LOAD_GNUTLS_FN (library, gnutls_x509_crt_deinit);
  LOAD_GNUTLS_FN (library, gnutls_x509_crt_import);
  LOAD_GNUTLS_FN (library, gnutls_x509_crt_init);

  max_log_level = global_gnutls_log_level;

  GNUTLS_LOG2 (1, max_log_level, "GnuTLS library loaded:",
	       SDATA (Fget (Qgnutls_dll, QCloaded_from)));
  return 1;
}
Example #2
0
Lisp_Object
emacs_gnutls_deinit (Lisp_Object proc)
{
  int log_level;

  CHECK_PROCESS (proc);

  if (XPROCESS (proc)->gnutls_p == 0)
    return Qnil;

  log_level = XPROCESS (proc)->gnutls_log_level;

  if (XPROCESS (proc)->gnutls_x509_cred)
    {
      GNUTLS_LOG (2, log_level, "Deallocating x509 credentials");
      fn_gnutls_certificate_free_credentials (XPROCESS (proc)->gnutls_x509_cred);
      XPROCESS (proc)->gnutls_x509_cred = NULL;
    }

  if (XPROCESS (proc)->gnutls_anon_cred)
    {
      GNUTLS_LOG (2, log_level, "Deallocating anon credentials");
      fn_gnutls_anon_free_client_credentials (XPROCESS (proc)->gnutls_anon_cred);
      XPROCESS (proc)->gnutls_anon_cred = NULL;
    }

  if (XPROCESS (proc)->gnutls_state)
    {
      fn_gnutls_deinit (XPROCESS (proc)->gnutls_state);
      XPROCESS (proc)->gnutls_state = NULL;
      if (GNUTLS_INITSTAGE (proc) >= GNUTLS_STAGE_INIT)
	GNUTLS_INITSTAGE (proc) = GNUTLS_STAGE_INIT - 1;
    }

  XPROCESS (proc)->gnutls_p = 0;
  return Qt;
}
Example #3
0
EMACS_INT
emacs_gnutls_read (struct Lisp_Process *proc, char *buf, EMACS_INT nbyte)
{
  ssize_t rtnval;
  gnutls_session_t state = proc->gnutls_state;

  int log_level = proc->gnutls_log_level;

  if (proc->gnutls_initstage != GNUTLS_STAGE_READY)
    {
      /* If the handshake count is under the limit, try the handshake
         again and increment the handshake count.  This count is kept
         per process (connection), not globally.  */
      if (proc->gnutls_handshakes_tried < GNUTLS_EMACS_HANDSHAKES_LIMIT)
        {
          proc->gnutls_handshakes_tried++;
          emacs_gnutls_handshake (proc);
          GNUTLS_LOG2i (5, log_level, "Retried handshake", 
                        proc->gnutls_handshakes_tried);
          return -1;
        }

      GNUTLS_LOG (2, log_level, "Giving up on handshake; resetting retries");
      proc->gnutls_handshakes_tried = 0;
      return 0;
    }
  rtnval = fn_gnutls_record_recv (state, buf, nbyte);
  if (rtnval >= 0)
    return rtnval;
  else if (rtnval == GNUTLS_E_UNEXPECTED_PACKET_LENGTH)
    /* The peer closed the connection. */
    return 0;
  else if (emacs_gnutls_handle_error (state, rtnval) == 0)
    /* non-fatal error */
    return -1;
  else {
    /* a fatal error occurred */
    return 0;
  }
}
Example #4
0
static int
init_gnutls_functions (Lisp_Object libraries)
{
    HMODULE library;
    int max_log_level = 1;

    if (!(library = w32_delayed_load (libraries, Qgnutls_dll)))
    {
        GNUTLS_LOG (1, max_log_level, "GnuTLS library not found");
        return 0;
    }

    LOAD_GNUTLS_FN (library, gnutls_alert_get);
    LOAD_GNUTLS_FN (library, gnutls_alert_get_name);
    LOAD_GNUTLS_FN (library, gnutls_alert_send_appropriate);
    LOAD_GNUTLS_FN (library, gnutls_anon_allocate_client_credentials);
    LOAD_GNUTLS_FN (library, gnutls_anon_free_client_credentials);
    LOAD_GNUTLS_FN (library, gnutls_bye);
    LOAD_GNUTLS_FN (library, gnutls_certificate_allocate_credentials);
    LOAD_GNUTLS_FN (library, gnutls_certificate_free_credentials);
    LOAD_GNUTLS_FN (library, gnutls_certificate_get_peers);
    LOAD_GNUTLS_FN (library, gnutls_certificate_set_verify_flags);
    LOAD_GNUTLS_FN (library, gnutls_certificate_set_x509_crl_file);
    LOAD_GNUTLS_FN (library, gnutls_certificate_set_x509_key_file);
    LOAD_GNUTLS_FN (library, gnutls_certificate_set_x509_trust_file);
    LOAD_GNUTLS_FN (library, gnutls_certificate_type_get);
    LOAD_GNUTLS_FN (library, gnutls_certificate_verify_peers2);
    LOAD_GNUTLS_FN (library, gnutls_credentials_set);
    LOAD_GNUTLS_FN (library, gnutls_deinit);
    LOAD_GNUTLS_FN (library, gnutls_dh_set_prime_bits);
    LOAD_GNUTLS_FN (library, gnutls_error_is_fatal);
    LOAD_GNUTLS_FN (library, gnutls_global_init);
    LOAD_GNUTLS_FN (library, gnutls_global_set_log_function);
    LOAD_GNUTLS_FN (library, gnutls_global_set_log_level);
    LOAD_GNUTLS_FN (library, gnutls_global_set_mem_functions);
    LOAD_GNUTLS_FN (library, gnutls_handshake);
    LOAD_GNUTLS_FN (library, gnutls_init);
    LOAD_GNUTLS_FN (library, gnutls_priority_set_direct);
    LOAD_GNUTLS_FN (library, gnutls_record_check_pending);
    LOAD_GNUTLS_FN (library, gnutls_record_recv);
    LOAD_GNUTLS_FN (library, gnutls_record_send);
    LOAD_GNUTLS_FN (library, gnutls_strerror);
    LOAD_GNUTLS_FN (library, gnutls_transport_set_errno);
    LOAD_GNUTLS_FN (library, gnutls_check_version);
    /* We don't need to call gnutls_transport_set_lowat in GnuTLS 2.11.1
       and later, and the function was removed entirely in 3.0.0.  */
    if (!fn_gnutls_check_version ("2.11.1"))
        LOAD_GNUTLS_FN (library, gnutls_transport_set_lowat);
    LOAD_GNUTLS_FN (library, gnutls_transport_set_ptr2);
    LOAD_GNUTLS_FN (library, gnutls_transport_set_pull_function);
    LOAD_GNUTLS_FN (library, gnutls_transport_set_push_function);
    LOAD_GNUTLS_FN (library, gnutls_x509_crt_check_hostname);
    LOAD_GNUTLS_FN (library, gnutls_x509_crt_deinit);
    LOAD_GNUTLS_FN (library, gnutls_x509_crt_import);
    LOAD_GNUTLS_FN (library, gnutls_x509_crt_init);

    max_log_level = global_gnutls_log_level;

    {
        Lisp_Object name = CAR_SAFE (Fget (Qgnutls_dll, QCloaded_from));
        GNUTLS_LOG2 (1, max_log_level, "GnuTLS library loaded:",
                     STRINGP (name) ? (const char *) SDATA (name) : "unknown");
    }

    return 1;
}