Annotation of embedaddon/strongswan/src/libcharon/sa/ikev1/tasks/isakmp_cert_pre.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2011 Martin Willi
        !             3:  * Copyright (C) 2011 revosec AG
        !             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: /*
        !            17:  * Copyright (C) 2013 Volker RĂ¼melin
        !            18:  *
        !            19:  * Permission is hereby granted, free of charge, to any person obtaining a copy
        !            20:  * of this software and associated documentation files (the "Software"), to deal
        !            21:  * in the Software without restriction, including without limitation the rights
        !            22:  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        !            23:  * copies of the Software, and to permit persons to whom the Software is
        !            24:  * furnished to do so, subject to the following conditions:
        !            25:  *
        !            26:  * The above copyright notice and this permission notice shall be included in
        !            27:  * all copies or substantial portions of the Software.
        !            28:  *
        !            29:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        !            30:  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        !            31:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        !            32:  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        !            33:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        !            34:  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
        !            35:  * THE SOFTWARE.
        !            36:  */
        !            37: 
        !            38: #include "isakmp_cert_pre.h"
        !            39: 
        !            40: #include <daemon.h>
        !            41: #include <sa/ike_sa.h>
        !            42: #include <encoding/payloads/cert_payload.h>
        !            43: #include <encoding/payloads/sa_payload.h>
        !            44: #include <encoding/payloads/certreq_payload.h>
        !            45: #include <credentials/certificates/x509.h>
        !            46: #include <credentials/containers/pkcs7.h>
        !            47: 
        !            48: 
        !            49: typedef struct private_isakmp_cert_pre_t private_isakmp_cert_pre_t;
        !            50: 
        !            51: /**
        !            52:  * Private members of a isakmp_cert_pre_t task.
        !            53:  */
        !            54: struct private_isakmp_cert_pre_t {
        !            55: 
        !            56:        /**
        !            57:         * Public methods and task_t interface.
        !            58:         */
        !            59:        isakmp_cert_pre_t public;
        !            60: 
        !            61:        /**
        !            62:         * Assigned IKE_SA.
        !            63:         */
        !            64:        ike_sa_t *ike_sa;
        !            65: 
        !            66:        /**
        !            67:         * Are we the initiator?
        !            68:         */
        !            69:        bool initiator;
        !            70: 
        !            71:        /**
        !            72:         * Send certificate requests?
        !            73:         */
        !            74:        bool send_req;
        !            75: 
        !            76:        /** next message we expect */
        !            77:        enum {
        !            78:                CR_SA,
        !            79:                CR_KE,
        !            80:                CR_AUTH,
        !            81:        } state;
        !            82: };
        !            83: 
        !            84: /**
        !            85:  * Find the CA certificate for a given certreq payload
        !            86:  */
        !            87: static certificate_t* find_certificate(private_isakmp_cert_pre_t *this,
        !            88:                                                                           certreq_payload_t *certreq)
        !            89: {
        !            90:        identification_t *id;
        !            91:        certificate_t *cert;
        !            92: 
        !            93:        if (certreq->get_cert_type(certreq) != CERT_X509)
        !            94:        {
        !            95:                DBG1(DBG_IKE, "%N CERTREQ not supported - ignored",
        !            96:                         certificate_type_names, certreq->get_cert_type(certreq));
        !            97:                return NULL;
        !            98:        }
        !            99:        id = certreq->get_dn(certreq);
        !           100:        if (!id)
        !           101:        {
        !           102:                DBG1(DBG_IKE, "ignoring certificate request without data",
        !           103:                         certificate_type_names, certreq->get_cert_type(certreq));
        !           104:                return NULL;
        !           105:        }
        !           106:        cert = lib->credmgr->get_cert(lib->credmgr, CERT_X509, KEY_ANY, id, TRUE);
        !           107:        if (cert)
        !           108:        {
        !           109:                DBG1(DBG_IKE, "received cert request for '%Y'",
        !           110:                         cert->get_subject(cert));
        !           111:        }
        !           112:        else
        !           113:        {
        !           114:                DBG1(DBG_IKE, "received cert request for unknown ca '%Y'", id);
        !           115:        }
        !           116:        id->destroy(id);
        !           117: 
        !           118:        return cert;
        !           119: }
        !           120: 
        !           121: /**
        !           122:  * read certificate requests
        !           123:  */
        !           124: static void process_certreqs(private_isakmp_cert_pre_t *this, message_t *message)
        !           125: {
        !           126:        enumerator_t *enumerator;
        !           127:        payload_t *payload;
        !           128:        auth_cfg_t *auth;
        !           129: 
        !           130:        auth = this->ike_sa->get_auth_cfg(this->ike_sa, TRUE);
        !           131: 
        !           132:        enumerator = message->create_payload_enumerator(message);
        !           133:        while (enumerator->enumerate(enumerator, &payload))
        !           134:        {
        !           135:                switch (payload->get_type(payload))
        !           136:                {
        !           137:                        case PLV1_CERTREQ:
        !           138:                        {
        !           139:                                certificate_t *cert;
        !           140: 
        !           141:                                this->ike_sa->set_condition(this->ike_sa,
        !           142:                                                                                        COND_CERTREQ_SEEN, TRUE);
        !           143:                                cert = find_certificate(this, (certreq_payload_t*)payload);
        !           144:                                if (cert)
        !           145:                                {
        !           146:                                        auth->add(auth, AUTH_RULE_CA_CERT, cert);
        !           147:                                }
        !           148:                                break;
        !           149:                        }
        !           150:                        default:
        !           151:                                break;
        !           152:                }
        !           153:        }
        !           154:        enumerator->destroy(enumerator);
        !           155: }
        !           156: 
        !           157: /**
        !           158:  * Process an X509 certificate payload
        !           159:  */
        !           160: static void process_x509(cert_payload_t *payload, auth_cfg_t *auth, bool *first)
        !           161: {
        !           162:        certificate_t *cert;
        !           163: 
        !           164:        cert = payload->get_cert(payload);
        !           165:        if (cert)
        !           166:        {
        !           167:                if (*first)
        !           168:                {       /* the first is an end entity certificate */
        !           169:                        DBG1(DBG_IKE, "received end entity cert \"%Y\"",
        !           170:                                 cert->get_subject(cert));
        !           171:                        auth->add(auth, AUTH_HELPER_SUBJECT_CERT, cert);
        !           172:                        *first = FALSE;
        !           173:                }
        !           174:                else
        !           175:                {
        !           176:                        DBG1(DBG_IKE, "received issuer cert \"%Y\"",
        !           177:                                 cert->get_subject(cert));
        !           178:                        auth->add(auth, AUTH_HELPER_IM_CERT, cert);
        !           179:                }
        !           180:        }
        !           181: }
        !           182: 
        !           183: /**
        !           184:  * Process a CRL certificate payload
        !           185:  */
        !           186: static void process_crl(cert_payload_t *payload, auth_cfg_t *auth)
        !           187: {
        !           188:        certificate_t *cert;
        !           189: 
        !           190:        cert = payload->get_cert(payload);
        !           191:        if (cert)
        !           192:        {
        !           193:                DBG1(DBG_IKE, "received CRL \"%Y\"", cert->get_subject(cert));
        !           194:                auth->add(auth, AUTH_HELPER_REVOCATION_CERT, cert);
        !           195:        }
        !           196: }
        !           197: 
        !           198: /**
        !           199:  * Process a PKCS7 certificate payload
        !           200:  */
        !           201: static void process_pkcs7(cert_payload_t *payload, auth_cfg_t *auth)
        !           202: {
        !           203:        enumerator_t *enumerator;
        !           204:        container_t *container;
        !           205:        certificate_t *cert;
        !           206:        pkcs7_t *pkcs7;
        !           207: 
        !           208:        container = payload->get_container(payload);
        !           209:        if (!container)
        !           210:        {
        !           211:                return;
        !           212:        }
        !           213:        switch (container->get_type(container))
        !           214:        {
        !           215:                case CONTAINER_PKCS7_DATA:
        !           216:                case CONTAINER_PKCS7_SIGNED_DATA:
        !           217:                case CONTAINER_PKCS7_ENVELOPED_DATA:
        !           218:                        break;
        !           219:                default:
        !           220:                        container->destroy(container);
        !           221:                        return;
        !           222:        }
        !           223: 
        !           224:        pkcs7 = (pkcs7_t *)container;
        !           225:        enumerator = pkcs7->create_cert_enumerator(pkcs7);
        !           226:        while (enumerator->enumerate(enumerator, &cert))
        !           227:        {
        !           228:                if (cert->get_type(cert) == CERT_X509)
        !           229:                {
        !           230:                        x509_t *x509 = (x509_t*)cert;
        !           231: 
        !           232:                        if (x509->get_flags(x509) & X509_CA)
        !           233:                        {
        !           234:                                DBG1(DBG_IKE, "received issuer cert \"%Y\"",
        !           235:                                         cert->get_subject(cert));
        !           236:                                auth->add(auth, AUTH_HELPER_IM_CERT, cert->get_ref(cert));
        !           237:                        }
        !           238:                        else
        !           239:                        {
        !           240:                                DBG1(DBG_IKE, "received end entity cert \"%Y\"",
        !           241:                                         cert->get_subject(cert));
        !           242:                                auth->add(auth, AUTH_HELPER_SUBJECT_CERT, cert->get_ref(cert));
        !           243:                        }
        !           244:                }
        !           245:                else
        !           246:                {
        !           247:                        DBG1(DBG_IKE, "received unsupported cert type %N",
        !           248:                                 certificate_type_names, cert->get_type(cert));
        !           249:                }
        !           250:        }
        !           251:        enumerator->destroy(enumerator);
        !           252: 
        !           253:        container->destroy(container);
        !           254: }
        !           255: 
        !           256: /**
        !           257:  * Import received certificates
        !           258:  */
        !           259: static void process_certs(private_isakmp_cert_pre_t *this, message_t *message)
        !           260: {
        !           261:        enumerator_t *enumerator;
        !           262:        payload_t *payload;
        !           263:        auth_cfg_t *auth;
        !           264:        bool first = TRUE;
        !           265: 
        !           266:        auth = this->ike_sa->get_auth_cfg(this->ike_sa, FALSE);
        !           267: 
        !           268:        enumerator = message->create_payload_enumerator(message);
        !           269:        while (enumerator->enumerate(enumerator, &payload))
        !           270:        {
        !           271:                if (payload->get_type(payload) == PLV1_CERTIFICATE)
        !           272:                {
        !           273:                        cert_payload_t *cert_payload;
        !           274:                        cert_encoding_t encoding;
        !           275: 
        !           276:                        cert_payload = (cert_payload_t*)payload;
        !           277:                        encoding = cert_payload->get_cert_encoding(cert_payload);
        !           278: 
        !           279:                        switch (encoding)
        !           280:                        {
        !           281:                                case ENC_X509_SIGNATURE:
        !           282:                                        process_x509(cert_payload, auth, &first);
        !           283:                                        break;
        !           284:                                case ENC_CRL:
        !           285:                                        process_crl(cert_payload, auth);
        !           286:                                        break;
        !           287:                                case ENC_PKCS7_WRAPPED_X509:
        !           288:                                        process_pkcs7(cert_payload, auth);
        !           289:                                        break;
        !           290:                                case ENC_PGP:
        !           291:                                case ENC_DNS_SIGNED_KEY:
        !           292:                                case ENC_KERBEROS_TOKEN:
        !           293:                                case ENC_ARL:
        !           294:                                case ENC_SPKI:
        !           295:                                case ENC_X509_ATTRIBUTE:
        !           296:                                case ENC_RAW_RSA_KEY:
        !           297:                                case ENC_X509_HASH_AND_URL_BUNDLE:
        !           298:                                case ENC_OCSP_CONTENT:
        !           299:                                default:
        !           300:                                        DBG1(DBG_ENC, "certificate encoding %N not supported",
        !           301:                                                 cert_encoding_names, encoding);
        !           302:                        }
        !           303:                }
        !           304:        }
        !           305:        enumerator->destroy(enumerator);
        !           306: }
        !           307: 
        !           308: /**
        !           309:  * Add the subject of a CA certificate a message
        !           310:  */
        !           311: static void add_certreq(private_isakmp_cert_pre_t *this, message_t *message,
        !           312:                                                certificate_t *cert)
        !           313: {
        !           314:        if (cert->get_type(cert) == CERT_X509)
        !           315:        {
        !           316:                x509_t *x509 = (x509_t*)cert;
        !           317: 
        !           318:                if (x509->get_flags(x509) & X509_CA)
        !           319:                {
        !           320:                        DBG1(DBG_IKE, "sending cert request for \"%Y\"",
        !           321:                                 cert->get_subject(cert));
        !           322:                        message->add_payload(message, (payload_t*)
        !           323:                                                        certreq_payload_create_dn(cert->get_subject(cert)));
        !           324:                }
        !           325:        }
        !           326: }
        !           327: 
        !           328: /**
        !           329:  * Add auth_cfg's CA certificates to the certificate request
        !           330:  */
        !           331: static void add_certreqs(private_isakmp_cert_pre_t *this,
        !           332:                                                 auth_cfg_t *auth, message_t *message)
        !           333: {
        !           334:        enumerator_t *enumerator;
        !           335:        auth_rule_t type;
        !           336:        void *value;
        !           337: 
        !           338:        enumerator = auth->create_enumerator(auth);
        !           339:        while (enumerator->enumerate(enumerator, &type, &value))
        !           340:        {
        !           341:                switch (type)
        !           342:                {
        !           343:                        case AUTH_RULE_CA_CERT:
        !           344:                                add_certreq(this, message, (certificate_t*)value);
        !           345:                                break;
        !           346:                        default:
        !           347:                                break;
        !           348:                }
        !           349:        }
        !           350:        enumerator->destroy(enumerator);
        !           351: }
        !           352: 
        !           353: /**
        !           354:  * Build certificate requests
        !           355:  */
        !           356: static void build_certreqs(private_isakmp_cert_pre_t *this, message_t *message)
        !           357: {
        !           358:        enumerator_t *enumerator;
        !           359:        ike_cfg_t *ike_cfg;
        !           360:        peer_cfg_t *peer_cfg;
        !           361:        certificate_t *cert;
        !           362:        auth_cfg_t *auth;
        !           363: 
        !           364:        ike_cfg = this->ike_sa->get_ike_cfg(this->ike_sa);
        !           365:        if (!ike_cfg->send_certreq(ike_cfg))
        !           366:        {
        !           367:                return;
        !           368:        }
        !           369:        /* check if we require a specific CA for that peer */
        !           370:        peer_cfg = this->ike_sa->get_peer_cfg(this->ike_sa);
        !           371:        if (peer_cfg)
        !           372:        {
        !           373:                enumerator = peer_cfg->create_auth_cfg_enumerator(peer_cfg, FALSE);
        !           374:                if (enumerator->enumerate(enumerator, &auth))
        !           375:                {
        !           376:                        add_certreqs(this, auth, message);
        !           377:                }
        !           378:                enumerator->destroy(enumerator);
        !           379:        }
        !           380:        if (!message->get_payload(message, PLV1_CERTREQ))
        !           381:        {
        !           382:                /* otherwise add all trusted CA certificates */
        !           383:                enumerator = lib->credmgr->create_cert_enumerator(lib->credmgr,
        !           384:                                                                                                CERT_ANY, KEY_ANY, NULL, TRUE);
        !           385:                while (enumerator->enumerate(enumerator, &cert))
        !           386:                {
        !           387:                        add_certreq(this, message, cert);
        !           388:                }
        !           389:                enumerator->destroy(enumerator);
        !           390:        }
        !           391: }
        !           392: 
        !           393: /**
        !           394:  * Check if we actually use certificates for authentication
        !           395:  */
        !           396: static bool use_certs(private_isakmp_cert_pre_t *this, message_t *message)
        !           397: {
        !           398:        enumerator_t *enumerator;
        !           399:        payload_t *payload;
        !           400:        bool use = FALSE;
        !           401: 
        !           402:        enumerator = message->create_payload_enumerator(message);
        !           403:        while (enumerator->enumerate(enumerator, &payload))
        !           404:        {
        !           405:                if (payload->get_type(payload) == PLV1_SECURITY_ASSOCIATION)
        !           406:                {
        !           407:                        sa_payload_t *sa_payload = (sa_payload_t*)payload;
        !           408: 
        !           409:                        switch (sa_payload->get_auth_method(sa_payload))
        !           410:                        {
        !           411:                                case AUTH_HYBRID_INIT_RSA:
        !           412:                                case AUTH_HYBRID_RESP_RSA:
        !           413:                                        if (!this->initiator)
        !           414:                                        {
        !           415:                                                this->send_req = FALSE;
        !           416:                                        }
        !           417:                                        /* FALL */
        !           418:                                case AUTH_RSA:
        !           419:                                case AUTH_ECDSA_256:
        !           420:                                case AUTH_ECDSA_384:
        !           421:                                case AUTH_ECDSA_521:
        !           422:                                case AUTH_XAUTH_INIT_RSA:
        !           423:                                case AUTH_XAUTH_RESP_RSA:
        !           424:                                        use = TRUE;
        !           425:                                        break;
        !           426:                                default:
        !           427:                                        break;
        !           428:                        }
        !           429:                        break;
        !           430:                }
        !           431:        }
        !           432:        enumerator->destroy(enumerator);
        !           433: 
        !           434:        return use;
        !           435: }
        !           436: 
        !           437: /**
        !           438:  * Check if we should send a certificate request
        !           439:  */
        !           440: static bool send_certreq(private_isakmp_cert_pre_t *this)
        !           441: {
        !           442:        enumerator_t *enumerator;
        !           443:        peer_cfg_t *peer_cfg;
        !           444:        auth_cfg_t *auth;
        !           445:        bool req = FALSE;
        !           446:        auth_class_t class;
        !           447: 
        !           448:        peer_cfg = this->ike_sa->get_peer_cfg(this->ike_sa);
        !           449:        if (peer_cfg)
        !           450:        {
        !           451:                enumerator = peer_cfg->create_auth_cfg_enumerator(peer_cfg, FALSE);
        !           452:                if (enumerator->enumerate(enumerator, &auth))
        !           453:                {
        !           454:                        class = (intptr_t)auth->get(auth, AUTH_RULE_AUTH_CLASS);
        !           455:                        if (class == AUTH_CLASS_PUBKEY)
        !           456:                        {
        !           457:                                req = TRUE;
        !           458:                        }
        !           459:                }
        !           460:                enumerator->destroy(enumerator);
        !           461:        }
        !           462:        return req;
        !           463: }
        !           464: 
        !           465: METHOD(task_t, build_i, status_t,
        !           466:        private_isakmp_cert_pre_t *this, message_t *message)
        !           467: {
        !           468:        switch (message->get_exchange_type(message))
        !           469:        {
        !           470:                case ID_PROT:
        !           471:                        if (this->state == CR_AUTH)
        !           472:                        {
        !           473:                                build_certreqs(this, message);
        !           474:                        }
        !           475:                        return NEED_MORE;
        !           476:                case AGGRESSIVE:
        !           477:                        if (this->state == CR_SA)
        !           478:                        {
        !           479:                                if (send_certreq(this))
        !           480:                                {
        !           481:                                        build_certreqs(this, message);
        !           482:                                }
        !           483:                        }
        !           484:                        return NEED_MORE;
        !           485:                default:
        !           486:                        return FAILED;
        !           487:        }
        !           488: }
        !           489: 
        !           490: METHOD(task_t, process_r, status_t,
        !           491:        private_isakmp_cert_pre_t *this, message_t *message)
        !           492: {
        !           493:        switch (message->get_exchange_type(message))
        !           494:        {
        !           495:                case ID_PROT:
        !           496:                {
        !           497:                        switch (this->state)
        !           498:                        {
        !           499:                                case CR_SA:
        !           500:                                        if (!use_certs(this, message))
        !           501:                                        {
        !           502:                                                return SUCCESS;
        !           503:                                        }
        !           504:                                        return NEED_MORE;
        !           505:                                case CR_KE:
        !           506:                                        process_certreqs(this, message);
        !           507:                                        return NEED_MORE;
        !           508:                                case CR_AUTH:
        !           509:                                        process_certreqs(this, message);
        !           510:                                        process_certs(this, message);
        !           511:                                        return SUCCESS;
        !           512:                                default:
        !           513:                                        return FAILED;
        !           514:                        }
        !           515:                }
        !           516:                case AGGRESSIVE:
        !           517:                {
        !           518:                        switch (this->state)
        !           519:                        {
        !           520:                                case CR_SA:
        !           521:                                        if (!use_certs(this, message))
        !           522:                                        {
        !           523:                                                return SUCCESS;
        !           524:                                        }
        !           525:                                        process_certreqs(this, message);
        !           526:                                        return NEED_MORE;
        !           527:                                case CR_AUTH:
        !           528:                                        process_certs(this, message);
        !           529:                                        return SUCCESS;
        !           530:                                default:
        !           531:                                        return FAILED;
        !           532:                        }
        !           533:                }
        !           534:                default:
        !           535:                        return FAILED;
        !           536:        }
        !           537: }
        !           538: 
        !           539: METHOD(task_t, build_r, status_t,
        !           540:        private_isakmp_cert_pre_t *this, message_t *message)
        !           541: {
        !           542:        switch (message->get_exchange_type(message))
        !           543:        {
        !           544:                case ID_PROT:
        !           545:                        switch (this->state)
        !           546:                        {
        !           547:                                case CR_SA:
        !           548:                                        this->state = CR_KE;
        !           549:                                        return NEED_MORE;
        !           550:                                case CR_KE:
        !           551:                                        if (this->send_req)
        !           552:                                        {
        !           553:                                                build_certreqs(this, message);
        !           554:                                        }
        !           555:                                        this->state = CR_AUTH;
        !           556:                                        return NEED_MORE;
        !           557:                                case CR_AUTH:
        !           558:                                        return NEED_MORE;
        !           559:                                default:
        !           560:                                        return FAILED;
        !           561:                        }
        !           562:                case AGGRESSIVE:
        !           563:                        switch (this->state)
        !           564:                        {
        !           565:                                case CR_SA:
        !           566:                                        if (this->send_req)
        !           567:                                        {
        !           568:                                                build_certreqs(this, message);
        !           569:                                        }
        !           570:                                        this->state = CR_AUTH;
        !           571:                                        return NEED_MORE;
        !           572:                                case CR_AUTH:
        !           573:                                        return SUCCESS;
        !           574:                                default:
        !           575:                                        return FAILED;
        !           576:                        }
        !           577:                default:
        !           578:                        return FAILED;
        !           579:        }
        !           580: }
        !           581: 
        !           582: METHOD(task_t, process_i, status_t,
        !           583:        private_isakmp_cert_pre_t *this, message_t *message)
        !           584: {
        !           585:        switch (message->get_exchange_type(message))
        !           586:        {
        !           587:                case ID_PROT:
        !           588:                {
        !           589:                        switch (this->state)
        !           590:                        {
        !           591:                                case CR_SA:
        !           592:                                        if (!use_certs(this, message))
        !           593:                                        {
        !           594:                                                return SUCCESS;
        !           595:                                        }
        !           596:                                        this->state = CR_KE;
        !           597:                                        return NEED_MORE;
        !           598:                                case CR_KE:
        !           599:                                        process_certreqs(this, message);
        !           600:                                        this->state = CR_AUTH;
        !           601:                                        return NEED_MORE;
        !           602:                                case CR_AUTH:
        !           603:                                        process_certs(this, message);
        !           604:                                        return SUCCESS;
        !           605:                                default:
        !           606:                                        return FAILED;
        !           607:                        }
        !           608:                }
        !           609:                case AGGRESSIVE:
        !           610:                {
        !           611:                        if (!use_certs(this, message))
        !           612:                        {
        !           613:                                return SUCCESS;
        !           614:                        }
        !           615:                        process_certreqs(this, message);
        !           616:                        process_certs(this, message);
        !           617:                        this->state = CR_AUTH;
        !           618:                        return SUCCESS;
        !           619:                }
        !           620:                default:
        !           621:                        return FAILED;
        !           622:        }
        !           623: }
        !           624: 
        !           625: METHOD(task_t, get_type, task_type_t,
        !           626:        private_isakmp_cert_pre_t *this)
        !           627: {
        !           628:        return TASK_ISAKMP_CERT_PRE;
        !           629: }
        !           630: 
        !           631: METHOD(task_t, migrate, void,
        !           632:        private_isakmp_cert_pre_t *this, ike_sa_t *ike_sa)
        !           633: {
        !           634:        this->ike_sa = ike_sa;
        !           635:        this->state = CR_SA;
        !           636:        this->send_req = TRUE;
        !           637: }
        !           638: 
        !           639: METHOD(task_t, destroy, void,
        !           640:        private_isakmp_cert_pre_t *this)
        !           641: {
        !           642:        free(this);
        !           643: }
        !           644: 
        !           645: /*
        !           646:  * Described in header.
        !           647:  */
        !           648: isakmp_cert_pre_t *isakmp_cert_pre_create(ike_sa_t *ike_sa, bool initiator)
        !           649: {
        !           650:        private_isakmp_cert_pre_t *this;
        !           651: 
        !           652:        INIT(this,
        !           653:                .public = {
        !           654:                        .task = {
        !           655:                                .get_type = _get_type,
        !           656:                                .migrate = _migrate,
        !           657:                                .destroy = _destroy,
        !           658:                        },
        !           659:                },
        !           660:                .ike_sa = ike_sa,
        !           661:                .initiator = initiator,
        !           662:                .state = CR_SA,
        !           663:                .send_req = TRUE,
        !           664:        );
        !           665:        if (initiator)
        !           666:        {
        !           667:                this->public.task.build = _build_i;
        !           668:                this->public.task.process = _process_i;
        !           669:        }
        !           670:        else
        !           671:        {
        !           672:                this->public.task.build = _build_r;
        !           673:                this->public.task.process = _process_r;
        !           674:        }
        !           675:        return &this->public;
        !           676: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>