Annotation of embedaddon/strongswan/src/libimcv/pts/pts_dh_group.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2011 Sansar Choinyambuu
        !             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_dh_group.h"
        !            17: 
        !            18: #include <utils/debug.h>
        !            19: 
        !            20: /**
        !            21:  * Described in header.
        !            22:  */
        !            23: bool pts_dh_group_probe(pts_dh_group_t *dh_groups, bool mandatory_dh_groups)
        !            24: {
        !            25:        enumerator_t *enumerator;
        !            26:        diffie_hellman_group_t dh_group;
        !            27:        const char *plugin_name;
        !            28:        char format1[] = "  %s PTS DH group %N[%s] available";
        !            29:        char format2[] = "  %s PTS DH group %N not available";
        !            30: 
        !            31:        *dh_groups = PTS_DH_GROUP_NONE;
        !            32: 
        !            33:        enumerator = lib->crypto->create_dh_enumerator(lib->crypto);
        !            34:        while (enumerator->enumerate(enumerator, &dh_group, &plugin_name))
        !            35:        {
        !            36:                if (dh_group == MODP_1024_BIT)
        !            37:                {
        !            38:                        *dh_groups |= PTS_DH_GROUP_IKE2;
        !            39:                        DBG2(DBG_PTS, format1, "optional ", diffie_hellman_group_names,
        !            40:                                                                        dh_group, plugin_name);
        !            41:                }
        !            42:                else if (dh_group == MODP_1536_BIT)
        !            43:                {
        !            44:                        *dh_groups |= PTS_DH_GROUP_IKE5;
        !            45:                        DBG2(DBG_PTS, format1, "optional ", diffie_hellman_group_names,
        !            46:                                                                        dh_group, plugin_name);
        !            47:                }
        !            48:                else if (dh_group == MODP_2048_BIT)
        !            49:                {
        !            50:                        *dh_groups |= PTS_DH_GROUP_IKE14;
        !            51:                        DBG2(DBG_PTS, format1, "optional ", diffie_hellman_group_names,
        !            52:                                                                        dh_group, plugin_name);
        !            53:                }
        !            54:                else if (dh_group == ECP_256_BIT)
        !            55:                {
        !            56:                        *dh_groups |= PTS_DH_GROUP_IKE19;
        !            57:                        DBG2(DBG_PTS, format1, "mandatory", diffie_hellman_group_names,
        !            58:                                                                        dh_group, plugin_name);
        !            59:                }
        !            60:                else if (dh_group == ECP_384_BIT)
        !            61:                {
        !            62:                        *dh_groups |= PTS_DH_GROUP_IKE20;
        !            63:                        DBG2(DBG_PTS, format1, "optional ", diffie_hellman_group_names,
        !            64:                                                                        dh_group, plugin_name);
        !            65:                }
        !            66:        }
        !            67:        enumerator->destroy(enumerator);
        !            68: 
        !            69:        if (*dh_groups & PTS_DH_GROUP_IKE19)
        !            70:        {
        !            71:                /* mandatory PTS DH group is available */
        !            72:                return TRUE;
        !            73:        }
        !            74:        if (*dh_groups == PTS_DH_GROUP_NONE)
        !            75:        {
        !            76:                DBG1(DBG_PTS, "no PTS DH group available");
        !            77:                return FALSE;
        !            78:        }
        !            79:        if (mandatory_dh_groups)
        !            80:        {
        !            81:                DBG1(DBG_PTS, format2, "mandatory", diffie_hellman_group_names,
        !            82:                                                                                        ECP_256_BIT);
        !            83:                return FALSE;
        !            84:        }
        !            85: 
        !            86:        /* at least one optional PTS DH group is available */
        !            87:        return TRUE;
        !            88: }
        !            89: 
        !            90: /**
        !            91:  * Described in header.
        !            92:  */
        !            93: bool pts_dh_group_update(char *dh_group, pts_dh_group_t *dh_groups)
        !            94: {
        !            95:        if (strcaseeq(dh_group, "ecp384"))
        !            96:        {
        !            97:                /* nothing to update, all groups are supported */
        !            98:                return TRUE;
        !            99:        }
        !           100:        if (strcaseeq(dh_group, "ecp256"))
        !           101:        {
        !           102:                /* remove DH group 20 */
        !           103:                *dh_groups &= ~PTS_DH_GROUP_IKE20;
        !           104:                return TRUE;
        !           105:        }
        !           106:        if (strcaseeq(dh_group, "modp2048"))
        !           107:        {
        !           108:                /* remove DH groups 19 and 20 */
        !           109:                *dh_groups &= ~(PTS_DH_GROUP_IKE20 | PTS_DH_GROUP_IKE19);
        !           110:                return TRUE;
        !           111:        }
        !           112:        if (strcaseeq(dh_group, "modp1536"))
        !           113:        {
        !           114:                /* remove DH groups 14, 19 and 20 */
        !           115:                *dh_groups &= ~(PTS_DH_GROUP_IKE20 | PTS_DH_GROUP_IKE19 |
        !           116:                                                PTS_DH_GROUP_IKE14);
        !           117:                return TRUE;
        !           118:        }
        !           119:        if (strcaseeq(dh_group, "modp1024"))
        !           120:        {
        !           121:                /* remove DH groups 5, 14, 19 and 20 */
        !           122:                *dh_groups &= ~(PTS_DH_GROUP_IKE20 | PTS_DH_GROUP_IKE19 |
        !           123:                                                PTS_DH_GROUP_IKE14 | PTS_DH_GROUP_IKE5);
        !           124:                return TRUE;
        !           125:        }
        !           126:        DBG1(DBG_PTS, "unknown DH group '%s' configured", dh_group);
        !           127:        return FALSE;
        !           128: }
        !           129: 
        !           130: /**
        !           131:  * Described in header.
        !           132:  */
        !           133: pts_dh_group_t pts_dh_group_select(pts_dh_group_t supported_dh_groups,
        !           134:                                                                   pts_dh_group_t offered_dh_groups)
        !           135: {
        !           136:        if ((supported_dh_groups & PTS_DH_GROUP_IKE20) &&
        !           137:                (offered_dh_groups   & PTS_DH_GROUP_IKE20))
        !           138:        {
        !           139:                return PTS_DH_GROUP_IKE20;
        !           140:        }
        !           141:        if ((supported_dh_groups & PTS_DH_GROUP_IKE19) &&
        !           142:                (offered_dh_groups   & PTS_DH_GROUP_IKE19))
        !           143:        {
        !           144:                return PTS_DH_GROUP_IKE19;
        !           145:        }
        !           146:        if ((supported_dh_groups & PTS_DH_GROUP_IKE14) &&
        !           147:                (offered_dh_groups   & PTS_DH_GROUP_IKE14))
        !           148:        {
        !           149:                return PTS_DH_GROUP_IKE14;
        !           150:        }
        !           151:        if ((supported_dh_groups & PTS_DH_GROUP_IKE5) &&
        !           152:                (offered_dh_groups   & PTS_DH_GROUP_IKE5))
        !           153:        {
        !           154:                return PTS_DH_GROUP_IKE5;
        !           155:        }
        !           156:        if ((supported_dh_groups & PTS_DH_GROUP_IKE2) &&
        !           157:                (offered_dh_groups   & PTS_DH_GROUP_IKE2))
        !           158:        {
        !           159:                return PTS_DH_GROUP_IKE2;
        !           160:        }
        !           161:        return PTS_DH_GROUP_NONE;
        !           162: }
        !           163: 
        !           164: /**
        !           165:  * Described in header.
        !           166:  */
        !           167: diffie_hellman_group_t pts_dh_group_to_ike(pts_dh_group_t dh_group)
        !           168: {
        !           169:        switch (dh_group)
        !           170:        {
        !           171:                case PTS_DH_GROUP_IKE2:
        !           172:                        return MODP_1024_BIT;
        !           173:                case PTS_DH_GROUP_IKE5:
        !           174:                        return MODP_1536_BIT;
        !           175:                case PTS_DH_GROUP_IKE14:
        !           176:                        return MODP_2048_BIT;
        !           177:                case PTS_DH_GROUP_IKE19:
        !           178:                        return ECP_256_BIT;
        !           179:                case PTS_DH_GROUP_IKE20:
        !           180:                        return ECP_384_BIT;
        !           181:                default:
        !           182:                        return MODP_NONE;
        !           183:        }
        !           184: }

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