Annotation of embedaddon/strongswan/src/libcharon/plugins/eap_simaka_sql/eap_simaka_sql_card.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2010 Martin Willi
        !             3:  * Copyright (C) 2010 revosec AG
        !             4:  *
        !             5:  * Copyright (C) 2017 Andreas Steffen
        !             6:  * HSR Hochschule fuer Technik Rapperswil
        !             7:  *
        !             8:  * This program is free software; you can redistribute it and/or modify it
        !             9:  * under the terms of the GNU General Public License as published by the
        !            10:  * Free Software Foundation; either version 2 of the License, or (at your
        !            11:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
        !            12:  *
        !            13:  * This program is distributed in the hope that it will be useful, but
        !            14:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            15:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            16:  * for more details.
        !            17:  */
        !            18: 
        !            19: #include "eap_simaka_sql_card.h"
        !            20: 
        !            21: #include <time.h>
        !            22: 
        !            23: #include <daemon.h>
        !            24: 
        !            25: typedef struct private_eap_simaka_sql_card_t private_eap_simaka_sql_card_t;
        !            26: 
        !            27: /**
        !            28:  * Private data of an eap_simaka_sql_card_t object.
        !            29:  */
        !            30: struct private_eap_simaka_sql_card_t {
        !            31: 
        !            32:        /**
        !            33:         * Public eap_simaka_sql_card_t interface.
        !            34:         */
        !            35:        eap_simaka_sql_card_t public;
        !            36: 
        !            37:        /**
        !            38:         * Triplet/quintuplet database
        !            39:         */
        !            40:        database_t *db;
        !            41: 
        !            42:        /**
        !            43:         * Remove used triplets/quintuplets from database
        !            44:         */
        !            45:        bool remove_used;
        !            46: };
        !            47: 
        !            48: METHOD(simaka_card_t, get_triplet, bool,
        !            49:        private_eap_simaka_sql_card_t *this, identification_t *id,
        !            50:        char rand[SIM_RAND_LEN], char sres[SIM_SRES_LEN], char kc[SIM_KC_LEN])
        !            51: {
        !            52:        chunk_t sres_chunk, kc_chunk;
        !            53:        enumerator_t *query;
        !            54:        bool found = FALSE;
        !            55:        char buf[128];
        !            56: 
        !            57:        snprintf(buf, sizeof(buf), "%Y", id);
        !            58:        query = this->db->query(this->db,
        !            59:                                "select sres, kc from triplets where rand = ? and id = ? "
        !            60:                                "order by used limit 1",
        !            61:                                DB_BLOB, chunk_create(rand, SIM_RAND_LEN), DB_TEXT, buf,
        !            62:                                DB_BLOB, DB_BLOB);
        !            63:        if (query)
        !            64:        {
        !            65:                if (query->enumerate(query, &sres_chunk, &kc_chunk))
        !            66:                {
        !            67:                        if (sres_chunk.len == SIM_SRES_LEN &&
        !            68:                                kc_chunk.len == SIM_KC_LEN)
        !            69:                        {
        !            70:                                memcpy(sres, sres_chunk.ptr, SIM_SRES_LEN);
        !            71:                                memcpy(kc, kc_chunk.ptr, SIM_KC_LEN);
        !            72:                                found = TRUE;
        !            73:                        }
        !            74:                }
        !            75:                query->destroy(query);
        !            76:        }
        !            77:        if (found)
        !            78:        {
        !            79:                if (this->remove_used)
        !            80:                {
        !            81:                        this->db->execute(this->db, NULL,
        !            82:                                        "delete from triplets where id = ? and rand = ?",
        !            83:                                        DB_TEXT, buf, DB_BLOB, chunk_create(rand, SIM_RAND_LEN));
        !            84:                }
        !            85:                else
        !            86:                {
        !            87:                        this->db->execute(this->db, NULL,
        !            88:                                        "update triplets set used = ? where id = ? and rand = ?",
        !            89:                                        DB_UINT, time(NULL), DB_TEXT, buf,
        !            90:                                        DB_BLOB, chunk_create(rand, SIM_RAND_LEN));
        !            91:                }
        !            92:        }
        !            93:        return found;
        !            94: }
        !            95: 
        !            96: METHOD(simaka_card_t, get_quintuplet, status_t,
        !            97:        private_eap_simaka_sql_card_t *this, identification_t *id,
        !            98:        char rand[AKA_RAND_LEN], char autn[AKA_AUTN_LEN], char ck[AKA_CK_LEN],
        !            99:        char ik[AKA_IK_LEN], char res[AKA_RES_MAX], int *res_len)
        !           100: {
        !           101:        chunk_t ck_chunk, ik_chunk, res_chunk;
        !           102:        enumerator_t *query;
        !           103:        status_t found = FAILED;
        !           104:        char buf[128];
        !           105: 
        !           106:        snprintf(buf, sizeof(buf), "%Y", id);
        !           107:        query = this->db->query(this->db, "select ck, ik, res from quintuplets "
        !           108:                                "where rand = ? and autn = ? and id = ? order by used limit 1",
        !           109:                                DB_BLOB, chunk_create(rand, AKA_RAND_LEN),
        !           110:                                DB_BLOB, chunk_create(autn, AKA_AUTN_LEN), DB_TEXT, buf,
        !           111:                                DB_BLOB, DB_BLOB, DB_BLOB);
        !           112:        if (query)
        !           113:        {
        !           114:                if (query->enumerate(query, &ck_chunk, &ik_chunk, &res_chunk))
        !           115:                {
        !           116:                        if (ck_chunk.len == AKA_CK_LEN &&
        !           117:                                ik_chunk.len == AKA_IK_LEN &&
        !           118:                                res_chunk.len <= AKA_RES_MAX)
        !           119:                        {
        !           120:                                memcpy(ck, ck_chunk.ptr, AKA_CK_LEN);
        !           121:                                memcpy(ik, ik_chunk.ptr, AKA_IK_LEN);
        !           122:                                memcpy(res, res_chunk.ptr, res_chunk.len);
        !           123:                                *res_len = res_chunk.len;
        !           124:                                found = SUCCESS;
        !           125:                        }
        !           126:                }
        !           127:                query->destroy(query);
        !           128:        }
        !           129:        if (found == SUCCESS)
        !           130:        {
        !           131:                if (this->remove_used)
        !           132:                {
        !           133:                        this->db->execute(this->db, NULL,
        !           134:                                        "delete from quintuplets where id = ? and rand = ?",
        !           135:                                        DB_TEXT, buf, DB_BLOB, chunk_create(rand, SIM_RAND_LEN));
        !           136:                }
        !           137:                else
        !           138:                {
        !           139:                        this->db->execute(this->db, NULL,
        !           140:                                        "update quintuplets set used = ? where id = ? and rand = ?",
        !           141:                                        DB_UINT, time(NULL), DB_TEXT, buf,
        !           142:                                        DB_BLOB, chunk_create(rand, AKA_RAND_LEN));
        !           143:                }
        !           144:        }
        !           145:        return found;
        !           146: }
        !           147: 
        !           148: METHOD(eap_simaka_sql_card_t, destroy, void,
        !           149:        private_eap_simaka_sql_card_t *this)
        !           150: {
        !           151:        free(this);
        !           152: }
        !           153: 
        !           154: /**
        !           155:  * See header
        !           156:  */
        !           157: eap_simaka_sql_card_t *eap_simaka_sql_card_create(database_t *db,
        !           158:                                                                                                  bool remove_used)
        !           159: {
        !           160:        private_eap_simaka_sql_card_t *this;
        !           161: 
        !           162:        INIT(this,
        !           163:                .public = {
        !           164:                        .card = {
        !           165:                                .get_triplet = _get_triplet,
        !           166:                                .get_quintuplet = _get_quintuplet,
        !           167:                                .resync = (void*)return_false,
        !           168:                                .get_pseudonym = (void*)return_null,
        !           169:                                .set_pseudonym = (void*)nop,
        !           170:                                .get_reauth = (void*)return_null,
        !           171:                                .set_reauth = (void*)nop,
        !           172:                        },
        !           173:                        .destroy = _destroy,
        !           174:                },
        !           175:                .db = db,
        !           176:                .remove_used = remove_used,
        !           177:        );
        !           178: 
        !           179:        return &this->public;
        !           180: }

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