Ejemplo n.º 1
0
static void
do_ssl_stuff(	TH_ARGS*	args)
{
	const char*	s = "Huhuhuhuuu";
	Vio*		server_vio;
	int		err;
        unsigned long   ssl_error;
	DBUG_ENTER("do_ssl_stuff");

	server_vio = vio_new(args->sd, VIO_TYPE_TCPIP, TRUE);

	/* ----------------------------------------------- */
	/* TCP connection is ready. Do server side SSL. */

	err = write(server_vio->sd,(uchar*)s, strlen(s));
	sslaccept(args->ssl_acceptor,server_vio,60L,&ssl_error);
	err = server_vio->write(server_vio,(uchar*)s, strlen(s));
	DBUG_VOID_RETURN;
}
Ejemplo n.º 2
0
int main() {
    char buf[16];
    SSLSERVER_p_st ss = malloc(sizeof(SSLSERVER_st));
    ss->method = NULL;
    ss->addr = iplocal(NULL, 5555, 0);
    ss->cert_file = "./tests/cert.pem";
    ss->key_file = "./tests/key.pem";
    sslsock ls = ssllisten(ss, 10);
    assert(ls);

    go(client(5555));

    sslsock as = sslaccept(ls, -1);

    /* Test port. */
    assert(sslport(as) != 5555);

    /* Test deadline. */
    int64_t deadline = now() + 30;
    size_t sz = sslrecv(as, buf, sizeof(buf), deadline);
    assert(sz == 0 && errno == ETIMEDOUT);
    int64_t diff = now() - deadline;
    assert(diff > -20 && diff < 20);

    sz = sslsend(as, "ABC", 3, -1);
    assert(sz == 3 && errno == 0);
    sslflush(as, -1);
    assert(errno == 0);

    /* Test sslrecvuntil. */
    sz = sslrecvuntil(as, buf, sizeof(buf), "\n", 1, -1);
    assert(sz == 4);
    assert(buf[0] == '1' && buf[1] == '2' && buf[2] == '3' && buf[3] == '\n');
    sz = sslrecvuntil(as, buf, sizeof(buf), "\n", 1, -1);
    assert(sz == 3);
    assert(buf[0] == '4' && buf[1] == '5' && buf[2] == '\n');
    sz = sslrecvuntil(as, buf, 3, "\n", 1, -1);
    assert(sz == 3);
    assert(buf[0] == '6' && buf[1] == '7' && buf[2] == '8');

    sslclose(as);
    sslclose(ls);

    /* Test whether libmill performs correctly when faced with TCP pushback. */
    ss->method = NULL;
    ss->addr = iplocal(NULL, 5555, 0);
    ss->cert_file ="./tests/cert.pem";
    ss->key_file ="./tests/key.pem";
    ls = ssllisten(ss, 10);

    go(client2(5555));
    as = sslaccept(ls, -1);
    assert(as);
    char buffer[2048];
    while(1) {
        size_t sz = sslsend(as, buffer, 2048, -1);
        if(errno == ECONNRESET)
            break;
        if(errno != 0) {
            fprintf(stderr, "errno=%d\n", errno);
            assert(0);
        }
        sslflush(as, -1);
        if(errno == ECONNRESET)
            break;
        if(errno != 0) {
            fprintf(stderr, "errno=%d\n", errno);
            assert(0);
        }
        assert(errno == 0);
    }
    sslclose(as);
    sslclose(ls);
    free(ss);
    return 0;
}
Ejemplo n.º 3
0
int
main(int argc, char**	argv)
{
  char*	server_key = 0,	*server_cert = 0;
  char*	client_key = 0,	*client_cert = 0;
  char*	ca_file = 0,	*ca_path = 0;
  char*	cipher=0;
  int	child_pid,sv[2];
  my_bool unused;
  struct st_VioSSLFd* ssl_acceptor= 0;
  struct st_VioSSLFd* ssl_connector= 0;
  Vio* client_vio=0, *server_vio=0;
  enum enum_ssl_init_error ssl_init_error;
  unsigned long ssl_error;

  MY_INIT(argv[0]);
  DBUG_PROCESS(argv[0]);
  DBUG_PUSH(default_dbug_option);

  if (argc<5)
  {
    print_usage();
    return 1;
  }

  server_key = argv[1];
  server_cert = argv[2];
  client_key = argv[3];
  client_cert = argv[4];
  if (argc>5)
    ca_file = argv[5];
  if (argc>6)
    ca_path = argv[6];
  printf("Server key/cert : %s/%s\n", server_key, server_cert);
  printf("Client key/cert : %s/%s\n", client_key, client_cert);
  if (ca_file!=0)
    printf("CAfile          : %s\n", ca_file);
  if (ca_path!=0)
    printf("CApath          : %s\n", ca_path);


  if (socketpair(PF_UNIX, SOCK_STREAM, IPPROTO_IP, sv)==-1)
    fatal_error("socketpair");

  ssl_acceptor = new_VioSSLAcceptorFd(server_key, server_cert, ca_file,
				      ca_path, cipher);
  ssl_connector = new_VioSSLConnectorFd(client_key, client_cert, ca_file,
					ca_path, cipher, &ssl_init_error);

  client_vio = (struct st_vio*)my_malloc(sizeof(struct st_vio),MYF(0));
  client_vio->sd = sv[0];
  client_vio->vioblocking(client_vio, 0, &unused);
  sslconnect(ssl_connector,client_vio,60L,&ssl_error);
  server_vio = (struct st_vio*)my_malloc(sizeof(struct st_vio),MYF(0));
  server_vio->sd = sv[1];
  server_vio->vioblocking(client_vio, 0, &unused);
  sslaccept(ssl_acceptor,server_vio,60L, &ssl_error);

  printf("Socketpair: %d , %d\n", client_vio->sd, server_vio->sd);

  child_pid = fork();
  if (child_pid==-1) {
    my_free(ssl_acceptor);
    my_free(ssl_connector);
    fatal_error("fork");
  }
  if (child_pid==0)
  {
    /* child, therefore, client */
    char	xbuf[100];
    int	r = vio_read(client_vio,xbuf, sizeof(xbuf));
    if (r<=0) {
      my_free(ssl_acceptor);
      my_free(ssl_connector);
      fatal_error("client:SSL_read");
    }
    xbuf[r] = 0;
    printf("client:got %s\n", xbuf);
    my_free(client_vio);
    my_free(ssl_acceptor);
    my_free(ssl_connector);
  }
  else
  {
    const char*	s = "Huhuhuh";
    int		r = vio_write(server_vio,(uchar*)s, strlen(s));
    if (r<=0) {
      my_free(ssl_acceptor);
      my_free(ssl_connector);
      fatal_error("server:SSL_write");
    }
    my_free(server_vio);
    my_free(ssl_acceptor);
    my_free(ssl_connector);
  }
  return 0;
}