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>