Annotation of embedaddon/strongswan/src/libimcv/pts/pts_creds.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2011 Andreas Steffen
3: * HSR Hochschule fuer Technik Rapperswil
4: *
5: * This program is free software; you can redistribute it and/or modify it
6: * under the terms of the GNU General Public License as published by the
7: * Free Software Foundation; either version 2 of the License, or (at your
8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9: *
10: * This program is distributed in the hope that it will be useful, but
11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13: * for more details.
14: */
15:
16: #include "pts_creds.h"
17:
18: #include <utils/debug.h>
19: #include <credentials/certificates/x509.h>
20: #include <credentials/sets/mem_cred.h>
21:
22: #include <sys/stat.h>
23:
24: typedef struct private_pts_creds_t private_pts_creds_t;
25:
26: /**
27: * Private data of a pts_creds_t object.
28: *
29: */
30: struct private_pts_creds_t {
31:
32: /**
33: * Public pts_creds_t interface.
34: */
35: pts_creds_t public;
36:
37: /**
38: * Credential set
39: */
40: mem_cred_t *creds;
41:
42: };
43:
44: METHOD(pts_creds_t, get_set, credential_set_t*,
45: private_pts_creds_t *this)
46: {
47: return &this->creds->set;
48: }
49:
50:
51: METHOD(pts_creds_t, destroy, void,
52: private_pts_creds_t *this)
53: {
54: this->creds->destroy(this->creds);
55: free(this);
56: }
57:
58: /**
59: * Load trusted PTS CA certificates from a directory
60: */
61: static void load_cacerts(private_pts_creds_t *this, char *path)
62: {
63: enumerator_t *enumerator;
64: struct stat st;
65: char *file;
66:
67: DBG1(DBG_PTS, "loading PTS ca certificates from '%s'", path);
68:
69: enumerator = enumerator_create_directory(path);
70: if (!enumerator)
71: {
72: return;
73: }
74:
75: while (enumerator->enumerate(enumerator, NULL, &file, &st))
76: {
77: certificate_t *cert;
78:
79: if (!S_ISREG(st.st_mode))
80: {
81: /* skip special file */
82: continue;
83: }
84: cert = lib->creds->create(lib->creds, CRED_CERTIFICATE, CERT_X509,
85: BUILD_FROM_FILE, file, BUILD_END);
86: if (cert)
87: {
88: x509_t *x509 = (x509_t*)cert;
89:
90: if (!(x509->get_flags(x509) & X509_CA))
91: {
92: DBG1(DBG_PTS, " ca certificate \"%Y\" lacks ca basic constraint"
93: ", discarded", cert->get_subject(cert));
94: cert->destroy(cert);
95: }
96: else
97: {
98: DBG1(DBG_PTS, " loaded ca certificate \"%Y\" from '%s'",
99: cert->get_subject(cert), file);
100: this->creds->add_cert(this->creds, TRUE, cert);
101: }
102: }
103: else
104: {
105: DBG1(DBG_PTS, " loading ca certificate from '%s' failed", file);
106: }
107: }
108: enumerator->destroy(enumerator);
109: }
110:
111: /**
112: * See header
113: */
114: pts_creds_t *pts_creds_create(char *path)
115: {
116: private_pts_creds_t *this;
117:
118: if (!path)
119: {
120: DBG1(DBG_PTS, "no PTS cacerts directory defined");
121: return NULL;
122: }
123:
124: INIT(this,
125: .public = {
126: .get_set = _get_set,
127: .destroy = _destroy,
128: },
129: .creds = mem_cred_create(),
130: );
131:
132: load_cacerts(this, path);
133:
134: return &this->public;
135: }
136:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>