summaryrefslogtreecommitdiff
path: root/src/common.h
blob: 6fac0044ec7752818b2303b50d0ea38724975f91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*
 * Copyright (C) 2000-2012 Free Software Foundation, Inc.
 * Author: Nikos Mavrogiannopoulos
 *
 * This file is part of GnuTLS.
 *
 * GnuTLS is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * GnuTLS is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#ifndef GNUTLS_SRC_COMMON_H
# define GNUTLS_SRC_COMMON_H

# define SERVER "127.0.0.1"

# include <config.h>
# include <gnutls/gnutls.h>
# include <gnutls/pkcs11.h>
# include <certtool-common.h>
# include <c-ctype.h>
# include <string.h>
# include <sys/socket.h>
# include <netdb.h>
# include <unistd.h>
# ifndef _WIN32
#  include <netinet/in.h>
# endif

# include <signal.h>
# ifdef _WIN32
#  include <io.h>
#  include <winbase.h>
#  include <sys/select.h>
#  include "socket.h"
#  undef OCSP_RESPONSE
# endif

# ifndef __attribute__
#  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
#   define __attribute__(Spec)	/* empty */
#  endif
# endif

/* the number of elements in the priority structures.
 */
# define PRI_MAX 16

extern const char str_unknown[];

# define P_PRINT_CERT 1
# define P_WAIT_FOR_CERT (1<<1)
int print_info(gnutls_session_t state, int verbose, int flags);
void print_cert_info(gnutls_session_t, int flag, int print_cert);
void print_key_material(gnutls_session_t, const char *label, size_t size);

int log_msg(FILE * file, const char *message, ...)
    __attribute__((format(printf, 2, 3)));
void log_set(FILE * file);

void print_cert_info2(gnutls_session_t, int flag, FILE * fp, int print_cert);

void print_list(const char *priorities, int verbose);
int cert_verify(gnutls_session_t session, const char *hostname,
		const char *purpose);

int compress_cert_set_methods(gnutls_session_t session, const char **strings,
			      size_t n_strings);

const char *raw_to_string(const unsigned char *raw, size_t raw_size);
const char *raw_to_hex(const unsigned char *raw, size_t raw_size);
const char *raw_to_base64(const unsigned char *raw, size_t raw_size);
int check_command(gnutls_session_t session, const char *str,
		  unsigned no_cli_cert);

# define MAX_PIN_LEN GNUTLS_PKCS11_MAX_PIN_LEN
void getenv_copy(char *str, size_t max_str_size, const char *envvar);
void getpass_copy(char *pass, size_t max_pass_size, const char *prompt);

int
pin_callback(void *user, int attempt, const char *token_url,
	     const char *token_label, unsigned int flags, char *pin,
	     size_t pin_max);

void pkcs11_common(common_info_st * c);

inline static int is_ip(const char *hostname)
{
	int len = strlen(hostname);

	if (strchr(hostname, ':') != 0)
		return 1;
	else if (len > 2 && c_isdigit(hostname[0])
		 && c_isdigit(hostname[len - 1]))
		return 1;
	return 0;
}

void sockets_init(void);

# ifdef _WIN32
static int system_recv_timeout(gnutls_transport_ptr_t ptr, unsigned int ms)
{
	fd_set rfds;
	struct timeval tv;
	socket_st *hd = ptr;
	int fd = hd->fd;

	FD_ZERO(&rfds);
	FD_SET(fd, &rfds);

	tv.tv_sec = ms / 1000;
	tv.tv_usec = (ms % 1000) * 1000;

	return select(fd + 1, &rfds, NULL, NULL, &tv);
}

static ssize_t
system_write(gnutls_transport_ptr ptr, const void *data, size_t data_size)
{
	socket_st *hd = ptr;

	return send(hd->fd, data, data_size, 0);
}

static ssize_t
system_read(gnutls_transport_ptr_t ptr, void *data, size_t data_size)
{
	socket_st *hd = ptr;

	return recv(hd->fd, data, data_size, 0);
}

static
void set_read_funcs(gnutls_session_t session)
{
	gnutls_transport_set_push_function(session, system_write);
	gnutls_transport_set_pull_function(session, system_read);
	gnutls_transport_set_pull_timeout_function(session,
						   system_recv_timeout);
}
# else
#  define set_read_funcs(x)
# endif

# define SIMPLE_CTIME_BUF_SIZE 64
char *simple_ctime(const time_t * t, char buf[SIMPLE_CTIME_BUF_SIZE]);

#endif				/* GNUTLS_SRC_COMMON_H */