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>