Update changes file and submitted to OBS
[framework/connectivity/wpasupplicant.git] / src / crypto / dh_groups.c
1 /*
2  * Diffie-Hellman groups
3  * Copyright (c) 2007, Jouni Malinen <j@w1.fi>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  *
9  * Alternatively, this software may be distributed under the terms of BSD
10  * license.
11  *
12  * See README and COPYING for more details.
13  */
14
15 #include "includes.h"
16
17 #include "common.h"
18 #include "crypto.h"
19 #include "random.h"
20 #include "dh_groups.h"
21
22
23 #ifdef ALL_DH_GROUPS
24
25 /* RFC 4306, B.1. Group 1 - 768 Bit MODP
26  * Generator: 2
27  * Prime: 2^768 - 2 ^704 - 1 + 2^64 * { [2^638 pi] + 149686 }
28  */
29 static const u8 dh_group1_generator[1] = { 0x02 };
30 static const u8 dh_group1_prime[96] = {
31         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
32         0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
33         0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
34         0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
35         0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
36         0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
37         0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
38         0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
39         0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
40         0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
41         0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x3A, 0x36, 0x20,
42         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
43 };
44
45 /* RFC 4306, B.2. Group 2 - 1024 Bit MODP
46  * Generator: 2
47  * Prime: 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 }
48  */
49 static const u8 dh_group2_generator[1] = { 0x02 };
50 static const u8 dh_group2_prime[128] = {
51         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
52         0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
53         0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
54         0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
55         0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
56         0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
57         0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
58         0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
59         0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
60         0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
61         0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
62         0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
63         0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
64         0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
65         0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81,
66         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
67 };
68
69 #endif /* ALL_DH_GROUPS */
70
71 /* RFC 3526, 2. Group 5 - 1536 Bit MODP
72  * Generator: 2
73  * Prime: 2^1536 - 2^1472 - 1 + 2^64 * { [2^1406 pi] + 741804 }
74  */
75 static const u8 dh_group5_generator[1] = { 0x02 };
76 static const u8 dh_group5_prime[192] = {
77         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
78         0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
79         0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
80         0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
81         0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
82         0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
83         0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
84         0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
85         0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
86         0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
87         0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
88         0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
89         0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
90         0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
91         0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
92         0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
93         0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
94         0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
95         0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
96         0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
97         0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
98         0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
99         0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x23, 0x73, 0x27,
100         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
101 };
102
103 #ifdef ALL_DH_GROUPS
104
105 /* RFC 3526, 3. Group 14 - 2048 Bit MODP
106  * Generator: 2
107  * Prime: 2^2048 - 2^1984 - 1 + 2^64 * { [2^1918 pi] + 124476 }
108  */
109 static const u8 dh_group14_generator[1] = { 0x02 };
110 static const u8 dh_group14_prime[256] = {
111         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
112         0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
113         0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
114         0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
115         0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
116         0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
117         0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
118         0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
119         0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
120         0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
121         0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
122         0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
123         0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
124         0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
125         0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
126         0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
127         0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
128         0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
129         0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
130         0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
131         0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
132         0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
133         0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
134         0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
135         0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
136         0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
137         0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
138         0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
139         0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
140         0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
141         0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68,
142         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
143 };
144
145 /* RFC 3526, 4. Group 15 - 3072 Bit MODP
146  * Generator: 2
147  * Prime: 2^3072 - 2^3008 - 1 + 2^64 * { [2^2942 pi] + 1690314 }
148  */
149 static const u8 dh_group15_generator[1] = { 0x02 };
150 static const u8 dh_group15_prime[384] = {
151         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
152         0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
153         0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
154         0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
155         0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
156         0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
157         0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
158         0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
159         0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
160         0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
161         0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
162         0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
163         0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
164         0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
165         0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
166         0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
167         0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
168         0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
169         0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
170         0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
171         0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
172         0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
173         0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
174         0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
175         0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
176         0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
177         0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
178         0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
179         0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
180         0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
181         0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
182         0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
183         0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
184         0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
185         0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
186         0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
187         0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
188         0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
189         0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
190         0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
191         0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
192         0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
193         0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
194         0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
195         0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
196         0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
197         0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x3A, 0xD2, 0xCA,
198         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
199 };
200
201 /* RFC 3526, 5. Group 16 - 4096 Bit MODP
202  * Generator: 2
203  * Prime: 2^4096 - 2^4032 - 1 + 2^64 * { [2^3966 pi] + 240904 }
204  */
205 static const u8 dh_group16_generator[1] = { 0x02 };
206 static const u8 dh_group16_prime[512] = {
207         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
208         0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
209         0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
210         0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
211         0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
212         0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
213         0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
214         0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
215         0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
216         0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
217         0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
218         0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
219         0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
220         0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
221         0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
222         0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
223         0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
224         0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
225         0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
226         0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
227         0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
228         0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
229         0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
230         0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
231         0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
232         0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
233         0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
234         0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
235         0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
236         0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
237         0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
238         0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
239         0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
240         0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
241         0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
242         0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
243         0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
244         0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
245         0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
246         0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
247         0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
248         0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
249         0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
250         0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
251         0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
252         0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
253         0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
254         0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
255         0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
256         0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
257         0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
258         0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
259         0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
260         0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
261         0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
262         0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
263         0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
264         0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
265         0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
266         0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
267         0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
268         0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
269         0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99,
270         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
271 };
272
273 /* RFC 3526, 6. Group 17 - 6144 Bit MODP
274  * Generator: 2
275  * Prime: 2^6144 - 2^6080 - 1 + 2^64 * { [2^6014 pi] + 929484 }
276  */
277 static const u8 dh_group17_generator[1] = { 0x02 };
278 static const u8 dh_group17_prime[768] = {
279         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
280         0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
281         0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
282         0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
283         0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
284         0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
285         0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
286         0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
287         0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
288         0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
289         0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
290         0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
291         0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
292         0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
293         0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
294         0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
295         0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
296         0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
297         0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
298         0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
299         0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
300         0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
301         0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
302         0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
303         0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
304         0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
305         0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
306         0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
307         0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
308         0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
309         0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
310         0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
311         0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
312         0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
313         0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
314         0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
315         0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
316         0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
317         0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
318         0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
319         0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
320         0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
321         0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
322         0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
323         0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
324         0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
325         0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
326         0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
327         0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
328         0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
329         0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
330         0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
331         0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
332         0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
333         0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
334         0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
335         0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
336         0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
337         0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
338         0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
339         0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
340         0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
341         0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92,
342         0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26,
343         0xC1, 0xD4, 0xDC, 0xB2, 0x60, 0x26, 0x46, 0xDE,
344         0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD,
345         0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E,
346         0xE5, 0xDB, 0x38, 0x2F, 0x41, 0x30, 0x01, 0xAE,
347         0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31,
348         0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18,
349         0xDA, 0x3E, 0xDB, 0xEB, 0xCF, 0x9B, 0x14, 0xED,
350         0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B,
351         0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B,
352         0x33, 0x20, 0x51, 0x51, 0x2B, 0xD7, 0xAF, 0x42,
353         0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF,
354         0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC,
355         0xF0, 0x32, 0xEA, 0x15, 0xD1, 0x72, 0x1D, 0x03,
356         0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6,
357         0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82,
358         0xB5, 0xA8, 0x40, 0x31, 0x90, 0x0B, 0x1C, 0x9E,
359         0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3,
360         0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE,
361         0x0F, 0x1D, 0x45, 0xB7, 0xFF, 0x58, 0x5A, 0xC5,
362         0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA,
363         0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8,
364         0x14, 0xCC, 0x5E, 0xD2, 0x0F, 0x80, 0x37, 0xE0,
365         0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28,
366         0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76,
367         0xF5, 0x50, 0xAA, 0x3D, 0x8A, 0x1F, 0xBF, 0xF0,
368         0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C,
369         0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32,
370         0x38, 0x7F, 0xE8, 0xD7, 0x6E, 0x3C, 0x04, 0x68,
371         0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE,
372         0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6,
373         0xE6, 0x94, 0xF9, 0x1E, 0x6D, 0xCC, 0x40, 0x24,
374         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
375 };
376
377 /* RFC 3526, 7. Group 18 - 8192 Bit MODP
378  * Generator: 2
379  * Prime: 2^8192 - 2^8128 - 1 + 2^64 * { [2^8062 pi] + 4743158 }
380  */
381 static const u8 dh_group18_generator[1] = { 0x02 };
382 static const u8 dh_group18_prime[1024] = {
383         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
384         0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
385         0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
386         0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
387         0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
388         0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
389         0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
390         0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
391         0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
392         0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
393         0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
394         0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
395         0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
396         0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
397         0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
398         0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
399         0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
400         0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
401         0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
402         0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
403         0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
404         0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
405         0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
406         0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
407         0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
408         0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
409         0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
410         0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
411         0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
412         0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
413         0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
414         0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
415         0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
416         0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
417         0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
418         0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
419         0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
420         0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
421         0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
422         0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
423         0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
424         0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
425         0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
426         0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
427         0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
428         0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
429         0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
430         0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
431         0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
432         0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
433         0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
434         0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
435         0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
436         0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
437         0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
438         0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
439         0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
440         0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
441         0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
442         0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
443         0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
444         0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
445         0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92,
446         0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26,
447         0xC1, 0xD4, 0xDC, 0xB2, 0x60, 0x26, 0x46, 0xDE,
448         0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD,
449         0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E,
450         0xE5, 0xDB, 0x38, 0x2F, 0x41, 0x30, 0x01, 0xAE,
451         0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31,
452         0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18,
453         0xDA, 0x3E, 0xDB, 0xEB, 0xCF, 0x9B, 0x14, 0xED,
454         0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B,
455         0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B,
456         0x33, 0x20, 0x51, 0x51, 0x2B, 0xD7, 0xAF, 0x42,
457         0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF,
458         0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC,
459         0xF0, 0x32, 0xEA, 0x15, 0xD1, 0x72, 0x1D, 0x03,
460         0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6,
461         0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82,
462         0xB5, 0xA8, 0x40, 0x31, 0x90, 0x0B, 0x1C, 0x9E,
463         0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3,
464         0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE,
465         0x0F, 0x1D, 0x45, 0xB7, 0xFF, 0x58, 0x5A, 0xC5,
466         0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA,
467         0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8,
468         0x14, 0xCC, 0x5E, 0xD2, 0x0F, 0x80, 0x37, 0xE0,
469         0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28,
470         0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76,
471         0xF5, 0x50, 0xAA, 0x3D, 0x8A, 0x1F, 0xBF, 0xF0,
472         0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C,
473         0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32,
474         0x38, 0x7F, 0xE8, 0xD7, 0x6E, 0x3C, 0x04, 0x68,
475         0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE,
476         0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6,
477         0xE6, 0x94, 0xF9, 0x1E, 0x6D, 0xBE, 0x11, 0x59,
478         0x74, 0xA3, 0x92, 0x6F, 0x12, 0xFE, 0xE5, 0xE4,
479         0x38, 0x77, 0x7C, 0xB6, 0xA9, 0x32, 0xDF, 0x8C,
480         0xD8, 0xBE, 0xC4, 0xD0, 0x73, 0xB9, 0x31, 0xBA,
481         0x3B, 0xC8, 0x32, 0xB6, 0x8D, 0x9D, 0xD3, 0x00,
482         0x74, 0x1F, 0xA7, 0xBF, 0x8A, 0xFC, 0x47, 0xED,
483         0x25, 0x76, 0xF6, 0x93, 0x6B, 0xA4, 0x24, 0x66,
484         0x3A, 0xAB, 0x63, 0x9C, 0x5A, 0xE4, 0xF5, 0x68,
485         0x34, 0x23, 0xB4, 0x74, 0x2B, 0xF1, 0xC9, 0x78,
486         0x23, 0x8F, 0x16, 0xCB, 0xE3, 0x9D, 0x65, 0x2D,
487         0xE3, 0xFD, 0xB8, 0xBE, 0xFC, 0x84, 0x8A, 0xD9,
488         0x22, 0x22, 0x2E, 0x04, 0xA4, 0x03, 0x7C, 0x07,
489         0x13, 0xEB, 0x57, 0xA8, 0x1A, 0x23, 0xF0, 0xC7,
490         0x34, 0x73, 0xFC, 0x64, 0x6C, 0xEA, 0x30, 0x6B,
491         0x4B, 0xCB, 0xC8, 0x86, 0x2F, 0x83, 0x85, 0xDD,
492         0xFA, 0x9D, 0x4B, 0x7F, 0xA2, 0xC0, 0x87, 0xE8,
493         0x79, 0x68, 0x33, 0x03, 0xED, 0x5B, 0xDD, 0x3A,
494         0x06, 0x2B, 0x3C, 0xF5, 0xB3, 0xA2, 0x78, 0xA6,
495         0x6D, 0x2A, 0x13, 0xF8, 0x3F, 0x44, 0xF8, 0x2D,
496         0xDF, 0x31, 0x0E, 0xE0, 0x74, 0xAB, 0x6A, 0x36,
497         0x45, 0x97, 0xE8, 0x99, 0xA0, 0x25, 0x5D, 0xC1,
498         0x64, 0xF3, 0x1C, 0xC5, 0x08, 0x46, 0x85, 0x1D,
499         0xF9, 0xAB, 0x48, 0x19, 0x5D, 0xED, 0x7E, 0xA1,
500         0xB1, 0xD5, 0x10, 0xBD, 0x7E, 0xE7, 0x4D, 0x73,
501         0xFA, 0xF3, 0x6B, 0xC3, 0x1E, 0xCF, 0xA2, 0x68,
502         0x35, 0x90, 0x46, 0xF4, 0xEB, 0x87, 0x9F, 0x92,
503         0x40, 0x09, 0x43, 0x8B, 0x48, 0x1C, 0x6C, 0xD7,
504         0x88, 0x9A, 0x00, 0x2E, 0xD5, 0xEE, 0x38, 0x2B,
505         0xC9, 0x19, 0x0D, 0xA6, 0xFC, 0x02, 0x6E, 0x47,
506         0x95, 0x58, 0xE4, 0x47, 0x56, 0x77, 0xE9, 0xAA,
507         0x9E, 0x30, 0x50, 0xE2, 0x76, 0x56, 0x94, 0xDF,
508         0xC8, 0x1F, 0x56, 0xE8, 0x80, 0xB9, 0x6E, 0x71,
509         0x60, 0xC9, 0x80, 0xDD, 0x98, 0xED, 0xD3, 0xDF,
510         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
511 };
512
513 #endif /* ALL_DH_GROUPS */
514
515
516 #define DH_GROUP(id) \
517 { id, dh_group ## id ## _generator, sizeof(dh_group ## id ## _generator), \
518 dh_group ## id ## _prime, sizeof(dh_group ## id ## _prime) }
519                 
520
521 static struct dh_group dh_groups[] = {
522         DH_GROUP(5),
523 #ifdef ALL_DH_GROUPS
524         DH_GROUP(1),
525         DH_GROUP(2),
526         DH_GROUP(14),
527         DH_GROUP(15),
528         DH_GROUP(16),
529         DH_GROUP(17),
530         DH_GROUP(18)
531 #endif /* ALL_DH_GROUPS */
532 };
533
534 #define NUM_DH_GROUPS (sizeof(dh_groups) / sizeof(dh_groups[0]))
535
536
537 const struct dh_group * dh_groups_get(int id)
538 {
539         size_t i;
540
541         for (i = 0; i < NUM_DH_GROUPS; i++) {
542                 if (dh_groups[i].id == id)
543                         return &dh_groups[i];
544         }
545         return NULL;
546 }
547
548
549 /**
550  * dh_init - Initialize Diffie-Hellman handshake
551  * @dh: Selected Diffie-Hellman group
552  * @priv: Pointer for returning Diffie-Hellman private key
553  * Returns: Diffie-Hellman public value
554  */
555 struct wpabuf * dh_init(const struct dh_group *dh, struct wpabuf **priv)
556 {
557         struct wpabuf *pv;
558         size_t pv_len;
559
560         if (dh == NULL)
561                 return NULL;
562
563         wpabuf_free(*priv);
564         *priv = wpabuf_alloc(dh->prime_len);
565         if (*priv == NULL)
566                 return NULL;
567
568         if (random_get_bytes(wpabuf_put(*priv, dh->prime_len), dh->prime_len))
569         {
570                 wpabuf_free(*priv);
571                 *priv = NULL;
572                 return NULL;
573         }
574
575         if (os_memcmp(wpabuf_head(*priv), dh->prime, dh->prime_len) > 0) {
576                 /* Make sure private value is smaller than prime */
577                 *(wpabuf_mhead_u8(*priv)) = 0;
578         }
579         wpa_hexdump_buf_key(MSG_DEBUG, "DH: private value", *priv);
580
581         pv_len = dh->prime_len;
582         pv = wpabuf_alloc(pv_len);
583         if (pv == NULL)
584                 return NULL;
585         if (crypto_mod_exp(dh->generator, dh->generator_len,
586                            wpabuf_head(*priv), wpabuf_len(*priv),
587                            dh->prime, dh->prime_len, wpabuf_mhead(pv),
588                            &pv_len) < 0) {
589                 wpabuf_free(pv);
590                 wpa_printf(MSG_INFO, "DH: crypto_mod_exp failed");
591                 return NULL;
592         }
593         wpabuf_put(pv, pv_len);
594         wpa_hexdump_buf(MSG_DEBUG, "DH: public value", pv);
595
596         return pv;
597 }
598
599
600 /**
601  * dh_derive_shared - Derive shared Diffie-Hellman key
602  * @peer_public: Diffie-Hellman public value from peer
603  * @own_private: Diffie-Hellman private key from dh_init()
604  * @dh: Selected Diffie-Hellman group
605  * Returns: Diffie-Hellman shared key
606  */
607 struct wpabuf * dh_derive_shared(const struct wpabuf *peer_public,
608                                  const struct wpabuf *own_private,
609                                  const struct dh_group *dh)
610 {
611         struct wpabuf *shared;
612         size_t shared_len;
613
614         if (dh == NULL || peer_public == NULL || own_private == NULL)
615                 return NULL;
616
617         shared_len = dh->prime_len;
618         shared = wpabuf_alloc(shared_len);
619         if (shared == NULL)
620                 return NULL;
621         if (crypto_mod_exp(wpabuf_head(peer_public), wpabuf_len(peer_public),
622                            wpabuf_head(own_private), wpabuf_len(own_private),
623                            dh->prime, dh->prime_len,
624                            wpabuf_mhead(shared), &shared_len) < 0) {
625                 wpabuf_free(shared);
626                 wpa_printf(MSG_INFO, "DH: crypto_mod_exp failed");
627                 return NULL;
628         }
629         wpabuf_put(shared, shared_len);
630         wpa_hexdump_buf_key(MSG_DEBUG, "DH: shared key", shared);
631
632         return shared;
633 }