File: verify.c

package info (click to toggle)
gnutls28 3.8.11-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 82,372 kB
  • sloc: ansic: 391,853; asm: 117,804; sh: 18,780; makefile: 6,801; yacc: 1,858; python: 1,399; cpp: 1,243; perl: 995; sed: 39
file content (62 lines) | stat: -rw-r--r-- 1,550 bytes parent folder | download | duplicates (2)
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
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gnutls/gnutls.h>
#include <gnutls/x509.h>

#include "examples.h"

/* The example below demonstrates the usage of the more powerful
 * gnutls_certificate_verify_peers() which can be used to check
 * the hostname, as well as the key purpose OID of the peer's
 * certificate. */
int verify_certificate_callback(gnutls_session_t session)
{
	unsigned int status;
	int ret, type;
	const char *hostname;
	gnutls_datum_t out;
	gnutls_typed_vdata_st data[2];

	/* read hostname */
	hostname = gnutls_session_get_ptr(session);

	/* This verification function uses the trusted CAs in the credentials
	 * structure. So you must have installed one or more CA certificates.
	 */
	data[0].type = GNUTLS_DT_DNS_HOSTNAME;
	data[0].data = (void *)hostname;
	data[0].size = 0;

	data[1].type = GNUTLS_DT_KEY_PURPOSE_OID;
	data[1].data = (void *)GNUTLS_KP_TLS_WWW_SERVER;
	data[1].size = 0;
	ret = gnutls_certificate_verify_peers(session, data, 2, &status);
	if (ret < 0) {
		printf("Error\n");
		return GNUTLS_E_CERTIFICATE_ERROR;
	}

	type = gnutls_certificate_type_get(session);

	ret = gnutls_certificate_verification_status_print(status, type, &out,
							   0);
	if (ret < 0) {
		printf("Error\n");
		return GNUTLS_E_CERTIFICATE_ERROR;
	}

	printf("%s", out.data);

	gnutls_free(out.data);

	if (status != 0) /* Certificate is not trusted */
		return GNUTLS_E_CERTIFICATE_ERROR;

	/* notify gnutls to continue handshake normally */
	return 0;
}