5 Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
7 Copyright (C) 2000 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
22 #include "silcincludes.h"
23 #include "groups_internal.h"
25 /* Fixed and public Diffie Hellman Groups defined by the SKE
26 protocol. These are equivalent to the OAKLEY Key Determination
27 protocol groups (taken from RFC 2412). */
28 const struct SilcSKEDiffieHellmanGroupDefStruct silc_ske_groups[] =
30 /* 1024 bits modulus (Mandatory group) */
31 { 1, "diffie-hellman-group1",
33 "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1"
34 "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD"
35 "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245"
36 "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED"
37 "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381"
40 "7FFFFFFF FFFFFFFF E487ED51 10B4611A 62633145 C06E0E68"
41 "94812704 4533E63A 0105DF53 1D89CD91 28A5043C C71A026E"
42 "F7CA8CD9 E69D218D 98158536 F92F8A1B A7F09AB6 B6A8E122"
43 "F242DABB 312F3F63 7A262174 D31BF6B5 85FFAE5B 7A035BF6"
44 "F71C35FD AD44CFD2 D74F9208 BE258FF3 24943328 F67329C0"
48 /* 1536 bits modulus (Optional group) */
49 { 2, "diffie-hellman-group2",
51 "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1"
52 "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD"
53 "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245"
54 "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED"
55 "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D"
56 "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F"
57 "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D"
58 "670C354E 4ABC9804 F1746C08 CA237327 FFFFFFFF FFFFFFFF",
60 "7FFFFFFF FFFFFFFF E487ED51 10B4611A 62633145 C06E0E68"
61 "94812704 4533E63A 0105DF53 1D89CD91 28A5043C C71A026E"
62 "F7CA8CD9 E69D218D 98158536 F92F8A1B A7F09AB6 B6A8E122"
63 "F242DABB 312F3F63 7A262174 D31BF6B5 85FFAE5B 7A035BF6"
64 "F71C35FD AD44CFD2 D74F9208 BE258FF3 24943328 F6722D9E"
65 "E1003E5C 50B1DF82 CC6D241B 0E2AE9CD 348B1FD4 7E9267AF"
66 "C1B2AE91 EE51D6CB 0E3179AB 1042A95D CF6A9483 B84B4B36"
67 "B3861AA7 255E4C02 78BA3604 6511B993 FFFFFFFF FFFFFFFF",
70 { 0, NULL, NULL, NULL }
73 /* Returns Diffie Hellman group by group number */
75 SilcSKEStatus silc_ske_get_group_by_number(int number,
76 SilcSKEDiffieHellmanGroup *ret)
79 SilcSKEDiffieHellmanGroup group;
81 for (i = 0; silc_ske_groups[i].name; i++) {
82 if (silc_ske_groups[i].number == number)
86 if (silc_ske_groups[i].name == NULL)
87 return SILC_SKE_STATUS_UNKNOWN_GROUP;
89 /* Return the group */
91 group = silc_calloc(1, sizeof(*group));
92 group->number = number;
93 group->name = silc_ske_groups[i].name;
94 silc_mp_init(&group->group);
95 silc_mp_init(&group->group_order);
96 silc_mp_init(&group->generator);
97 silc_mp_set_str(&group->group, silc_ske_groups[i].group, 0);
98 silc_mp_set_str(&group->group_order, silc_ske_groups[i].group_order, 0);
99 silc_mp_set_str(&group->generator, silc_ske_groups[i].generator, 0);
104 return SILC_SKE_STATUS_OK;
107 /* Returns Diffie Hellman group by name */
109 SilcSKEStatus silc_ske_get_group_by_name(const char *name,
110 SilcSKEDiffieHellmanGroup *ret)
113 SilcSKEDiffieHellmanGroup group;
115 for (i = 0; silc_ske_groups[i].name; i++) {
116 if (!strcmp(silc_ske_groups[i].name, name))
120 if (silc_ske_groups[i].name == NULL)
121 return SILC_SKE_STATUS_UNKNOWN_GROUP;
123 /* Return the group */
125 group = silc_calloc(1, sizeof(*group));
126 group->number = silc_ske_groups[i].number;
127 group->name = silc_ske_groups[i].name;
128 silc_mp_init(&group->group);
129 silc_mp_init(&group->group_order);
130 silc_mp_init(&group->generator);
131 silc_mp_set_str(&group->group, silc_ske_groups[i].group, 0);
132 silc_mp_set_str(&group->group_order, silc_ske_groups[i].group_order, 0);
133 silc_mp_set_str(&group->generator, silc_ske_groups[i].generator, 0);
138 return SILC_SKE_STATUS_OK;
141 /* Returns comma separated list of supported groups */
143 char *silc_ske_get_supported_groups()
149 for (i = 0; silc_ske_groups[i].name; i++) {
150 len += strlen(silc_ske_groups[i].name);
151 list = silc_realloc(list, len + 1);
153 memcpy(list + (len - strlen(silc_ske_groups[i].name)),
154 silc_ske_groups[i].name, strlen(silc_ske_groups[i].name));
155 memcpy(list + len, ",", 1);