Annotation of embedaddon/strongswan/src/libimcv/pts/pts_dh_group.c, revision 1.1.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>