dh_groups.c revision 209158
1189251Ssam/*
2189251Ssam * Diffie-Hellman groups
3189251Ssam * Copyright (c) 2007, Jouni Malinen <j@w1.fi>
4189251Ssam *
5189251Ssam * This program is free software; you can redistribute it and/or modify
6189251Ssam * it under the terms of the GNU General Public License version 2 as
7189251Ssam * published by the Free Software Foundation.
8189251Ssam *
9189251Ssam * Alternatively, this software may be distributed under the terms of BSD
10189251Ssam * license.
11189251Ssam *
12189251Ssam * See README and COPYING for more details.
13189251Ssam */
14189251Ssam
15189251Ssam#include "includes.h"
16189251Ssam
17189251Ssam#include "common.h"
18189251Ssam#include "crypto.h"
19189251Ssam#include "dh_groups.h"
20189251Ssam
21189251Ssam
22209158Srpaulo#ifdef ALL_DH_GROUPS
23209158Srpaulo
24189251Ssam/* RFC 4306, B.1. Group 1 - 768 Bit MODP
25189251Ssam * Generator: 2
26189251Ssam * Prime: 2^768 - 2 ^704 - 1 + 2^64 * { [2^638 pi] + 149686 }
27189251Ssam */
28189251Ssamstatic const u8 dh_group1_generator[1] = { 0x02 };
29189251Ssamstatic const u8 dh_group1_prime[96] = {
30189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
31189251Ssam	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
32189251Ssam	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
33189251Ssam	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
34189251Ssam	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
35189251Ssam	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
36189251Ssam	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
37189251Ssam	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
38189251Ssam	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
39189251Ssam	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
40189251Ssam	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x3A, 0x36, 0x20,
41189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
42189251Ssam};
43189251Ssam
44189251Ssam/* RFC 4306, B.2. Group 2 - 1024 Bit MODP
45189251Ssam * Generator: 2
46189251Ssam * Prime: 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 }
47189251Ssam */
48189251Ssamstatic const u8 dh_group2_generator[1] = { 0x02 };
49189251Ssamstatic const u8 dh_group2_prime[128] = {
50189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
51189251Ssam	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
52189251Ssam	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
53189251Ssam	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
54189251Ssam	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
55189251Ssam	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
56189251Ssam	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
57189251Ssam	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
58189251Ssam	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
59189251Ssam	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
60189251Ssam	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
61189251Ssam	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
62189251Ssam	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
63189251Ssam	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
64189251Ssam	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81,
65189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
66189251Ssam};
67189251Ssam
68209158Srpaulo#endif /* ALL_DH_GROUPS */
69209158Srpaulo
70189251Ssam/* RFC 3526, 2. Group 5 - 1536 Bit MODP
71189251Ssam * Generator: 2
72189251Ssam * Prime: 2^1536 - 2^1472 - 1 + 2^64 * { [2^1406 pi] + 741804 }
73189251Ssam */
74189251Ssamstatic const u8 dh_group5_generator[1] = { 0x02 };
75189251Ssamstatic const u8 dh_group5_prime[192] = {
76189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
77189251Ssam	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
78189251Ssam	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
79189251Ssam	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
80189251Ssam	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
81189251Ssam	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
82189251Ssam	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
83189251Ssam	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
84189251Ssam	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
85189251Ssam	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
86189251Ssam	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
87189251Ssam	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
88189251Ssam	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
89189251Ssam	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
90189251Ssam	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
91189251Ssam	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
92189251Ssam	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
93189251Ssam	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
94189251Ssam	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
95189251Ssam	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
96189251Ssam	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
97189251Ssam	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
98189251Ssam	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x23, 0x73, 0x27,
99189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
100189251Ssam};
101189251Ssam
102209158Srpaulo#ifdef ALL_DH_GROUPS
103209158Srpaulo
104189251Ssam/* RFC 3526, 3. Group 14 - 2048 Bit MODP
105189251Ssam * Generator: 2
106189251Ssam * Prime: 2^2048 - 2^1984 - 1 + 2^64 * { [2^1918 pi] + 124476 }
107189251Ssam */
108189251Ssamstatic const u8 dh_group14_generator[1] = { 0x02 };
109189251Ssamstatic const u8 dh_group14_prime[256] = {
110189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
111189251Ssam	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
112189251Ssam	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
113189251Ssam	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
114189251Ssam	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
115189251Ssam	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
116189251Ssam	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
117189251Ssam	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
118189251Ssam	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
119189251Ssam	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
120189251Ssam	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
121189251Ssam	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
122189251Ssam	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
123189251Ssam	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
124189251Ssam	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
125189251Ssam	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
126189251Ssam	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
127189251Ssam	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
128189251Ssam	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
129189251Ssam	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
130189251Ssam	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
131189251Ssam	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
132189251Ssam	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
133189251Ssam	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
134189251Ssam	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
135189251Ssam	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
136189251Ssam	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
137189251Ssam	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
138189251Ssam	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
139189251Ssam	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
140189251Ssam	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68,
141189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
142189251Ssam};
143189251Ssam
144189251Ssam/* RFC 3526, 4. Group 15 - 3072 Bit MODP
145189251Ssam * Generator: 2
146189251Ssam * Prime: 2^3072 - 2^3008 - 1 + 2^64 * { [2^2942 pi] + 1690314 }
147189251Ssam */
148189251Ssamstatic const u8 dh_group15_generator[1] = { 0x02 };
149189251Ssamstatic const u8 dh_group15_prime[384] = {
150189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
151189251Ssam	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
152189251Ssam	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
153189251Ssam	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
154189251Ssam	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
155189251Ssam	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
156189251Ssam	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
157189251Ssam	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
158189251Ssam	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
159189251Ssam	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
160189251Ssam	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
161189251Ssam	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
162189251Ssam	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
163189251Ssam	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
164189251Ssam	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
165189251Ssam	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
166189251Ssam	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
167189251Ssam	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
168189251Ssam	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
169189251Ssam	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
170189251Ssam	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
171189251Ssam	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
172189251Ssam	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
173189251Ssam	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
174189251Ssam	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
175189251Ssam	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
176189251Ssam	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
177189251Ssam	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
178189251Ssam	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
179189251Ssam	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
180189251Ssam	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
181189251Ssam	0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
182189251Ssam	0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
183189251Ssam	0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
184189251Ssam	0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
185189251Ssam	0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
186189251Ssam	0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
187189251Ssam	0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
188189251Ssam	0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
189189251Ssam	0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
190189251Ssam	0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
191189251Ssam	0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
192189251Ssam	0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
193189251Ssam	0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
194189251Ssam	0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
195189251Ssam	0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
196189251Ssam	0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x3A, 0xD2, 0xCA,
197189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
198189251Ssam};
199189251Ssam
200189251Ssam/* RFC 3526, 5. Group 16 - 4096 Bit MODP
201189251Ssam * Generator: 2
202189251Ssam * Prime: 2^4096 - 2^4032 - 1 + 2^64 * { [2^3966 pi] + 240904 }
203189251Ssam */
204189251Ssamstatic const u8 dh_group16_generator[1] = { 0x02 };
205189251Ssamstatic const u8 dh_group16_prime[512] = {
206189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
207189251Ssam	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
208189251Ssam	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
209189251Ssam	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
210189251Ssam	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
211189251Ssam	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
212189251Ssam	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
213189251Ssam	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
214189251Ssam	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
215189251Ssam	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
216189251Ssam	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
217189251Ssam	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
218189251Ssam	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
219189251Ssam	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
220189251Ssam	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
221189251Ssam	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
222189251Ssam	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
223189251Ssam	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
224189251Ssam	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
225189251Ssam	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
226189251Ssam	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
227189251Ssam	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
228189251Ssam	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
229189251Ssam	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
230189251Ssam	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
231189251Ssam	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
232189251Ssam	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
233189251Ssam	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
234189251Ssam	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
235189251Ssam	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
236189251Ssam	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
237189251Ssam	0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
238189251Ssam	0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
239189251Ssam	0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
240189251Ssam	0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
241189251Ssam	0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
242189251Ssam	0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
243189251Ssam	0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
244189251Ssam	0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
245189251Ssam	0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
246189251Ssam	0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
247189251Ssam	0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
248189251Ssam	0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
249189251Ssam	0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
250189251Ssam	0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
251189251Ssam	0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
252189251Ssam	0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
253189251Ssam	0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
254189251Ssam	0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
255189251Ssam	0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
256189251Ssam	0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
257189251Ssam	0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
258189251Ssam	0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
259189251Ssam	0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
260189251Ssam	0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
261189251Ssam	0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
262189251Ssam	0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
263189251Ssam	0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
264189251Ssam	0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
265189251Ssam	0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
266189251Ssam	0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
267189251Ssam	0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
268189251Ssam	0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99,
269189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
270189251Ssam};
271189251Ssam
272189251Ssam/* RFC 3526, 6. Group 17 - 6144 Bit MODP
273189251Ssam * Generator: 2
274189251Ssam * Prime: 2^6144 - 2^6080 - 1 + 2^64 * { [2^6014 pi] + 929484 }
275189251Ssam */
276189251Ssamstatic const u8 dh_group17_generator[1] = { 0x02 };
277189251Ssamstatic const u8 dh_group17_prime[768] = {
278189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
279189251Ssam	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
280189251Ssam	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
281189251Ssam	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
282189251Ssam	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
283189251Ssam	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
284189251Ssam	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
285189251Ssam	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
286189251Ssam	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
287189251Ssam	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
288189251Ssam	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
289189251Ssam	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
290189251Ssam	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
291189251Ssam	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
292189251Ssam	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
293189251Ssam	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
294189251Ssam	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
295189251Ssam	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
296189251Ssam	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
297189251Ssam	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
298189251Ssam	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
299189251Ssam	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
300189251Ssam	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
301189251Ssam	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
302189251Ssam	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
303189251Ssam	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
304189251Ssam	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
305189251Ssam	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
306189251Ssam	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
307189251Ssam	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
308189251Ssam	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
309189251Ssam	0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
310189251Ssam	0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
311189251Ssam	0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
312189251Ssam	0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
313189251Ssam	0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
314189251Ssam	0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
315189251Ssam	0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
316189251Ssam	0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
317189251Ssam	0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
318189251Ssam	0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
319189251Ssam	0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
320189251Ssam	0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
321189251Ssam	0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
322189251Ssam	0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
323189251Ssam	0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
324189251Ssam	0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
325189251Ssam	0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
326189251Ssam	0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
327189251Ssam	0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
328189251Ssam	0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
329189251Ssam	0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
330189251Ssam	0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
331189251Ssam	0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
332189251Ssam	0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
333189251Ssam	0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
334189251Ssam	0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
335189251Ssam	0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
336189251Ssam	0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
337189251Ssam	0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
338189251Ssam	0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
339189251Ssam	0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
340189251Ssam	0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92,
341189251Ssam	0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26,
342189251Ssam	0xC1, 0xD4, 0xDC, 0xB2, 0x60, 0x26, 0x46, 0xDE,
343189251Ssam	0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD,
344189251Ssam	0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E,
345189251Ssam	0xE5, 0xDB, 0x38, 0x2F, 0x41, 0x30, 0x01, 0xAE,
346189251Ssam	0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31,
347189251Ssam	0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18,
348189251Ssam	0xDA, 0x3E, 0xDB, 0xEB, 0xCF, 0x9B, 0x14, 0xED,
349189251Ssam	0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B,
350189251Ssam	0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B,
351189251Ssam	0x33, 0x20, 0x51, 0x51, 0x2B, 0xD7, 0xAF, 0x42,
352189251Ssam	0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF,
353189251Ssam	0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC,
354189251Ssam	0xF0, 0x32, 0xEA, 0x15, 0xD1, 0x72, 0x1D, 0x03,
355189251Ssam	0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6,
356189251Ssam	0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82,
357189251Ssam	0xB5, 0xA8, 0x40, 0x31, 0x90, 0x0B, 0x1C, 0x9E,
358189251Ssam	0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3,
359189251Ssam	0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE,
360189251Ssam	0x0F, 0x1D, 0x45, 0xB7, 0xFF, 0x58, 0x5A, 0xC5,
361189251Ssam	0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA,
362189251Ssam	0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8,
363189251Ssam	0x14, 0xCC, 0x5E, 0xD2, 0x0F, 0x80, 0x37, 0xE0,
364189251Ssam	0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28,
365189251Ssam	0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76,
366189251Ssam	0xF5, 0x50, 0xAA, 0x3D, 0x8A, 0x1F, 0xBF, 0xF0,
367189251Ssam	0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C,
368189251Ssam	0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32,
369189251Ssam	0x38, 0x7F, 0xE8, 0xD7, 0x6E, 0x3C, 0x04, 0x68,
370189251Ssam	0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE,
371189251Ssam	0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6,
372189251Ssam	0xE6, 0x94, 0xF9, 0x1E, 0x6D, 0xCC, 0x40, 0x24,
373189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
374189251Ssam};
375189251Ssam
376189251Ssam/* RFC 3526, 7. Group 18 - 8192 Bit MODP
377189251Ssam * Generator: 2
378189251Ssam * Prime: 2^8192 - 2^8128 - 1 + 2^64 * { [2^8062 pi] + 4743158 }
379189251Ssam */
380189251Ssamstatic const u8 dh_group18_generator[1] = { 0x02 };
381189251Ssamstatic const u8 dh_group18_prime[1024] = {
382189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
383189251Ssam	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
384189251Ssam	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
385189251Ssam	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
386189251Ssam	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
387189251Ssam	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
388189251Ssam	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
389189251Ssam	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
390189251Ssam	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
391189251Ssam	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
392189251Ssam	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
393189251Ssam	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
394189251Ssam	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
395189251Ssam	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
396189251Ssam	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
397189251Ssam	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
398189251Ssam	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
399189251Ssam	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
400189251Ssam	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
401189251Ssam	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
402189251Ssam	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
403189251Ssam	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
404189251Ssam	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
405189251Ssam	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
406189251Ssam	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
407189251Ssam	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
408189251Ssam	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
409189251Ssam	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
410189251Ssam	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
411189251Ssam	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
412189251Ssam	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
413189251Ssam	0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
414189251Ssam	0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
415189251Ssam	0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
416189251Ssam	0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
417189251Ssam	0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
418189251Ssam	0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
419189251Ssam	0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
420189251Ssam	0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
421189251Ssam	0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
422189251Ssam	0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
423189251Ssam	0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
424189251Ssam	0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
425189251Ssam	0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
426189251Ssam	0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
427189251Ssam	0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
428189251Ssam	0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
429189251Ssam	0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
430189251Ssam	0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
431189251Ssam	0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
432189251Ssam	0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
433189251Ssam	0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
434189251Ssam	0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
435189251Ssam	0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
436189251Ssam	0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
437189251Ssam	0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
438189251Ssam	0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
439189251Ssam	0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
440189251Ssam	0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
441189251Ssam	0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
442189251Ssam	0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
443189251Ssam	0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
444189251Ssam	0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92,
445189251Ssam	0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26,
446189251Ssam	0xC1, 0xD4, 0xDC, 0xB2, 0x60, 0x26, 0x46, 0xDE,
447189251Ssam	0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD,
448189251Ssam	0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E,
449189251Ssam	0xE5, 0xDB, 0x38, 0x2F, 0x41, 0x30, 0x01, 0xAE,
450189251Ssam	0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31,
451189251Ssam	0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18,
452189251Ssam	0xDA, 0x3E, 0xDB, 0xEB, 0xCF, 0x9B, 0x14, 0xED,
453189251Ssam	0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B,
454189251Ssam	0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B,
455189251Ssam	0x33, 0x20, 0x51, 0x51, 0x2B, 0xD7, 0xAF, 0x42,
456189251Ssam	0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF,
457189251Ssam	0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC,
458189251Ssam	0xF0, 0x32, 0xEA, 0x15, 0xD1, 0x72, 0x1D, 0x03,
459189251Ssam	0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6,
460189251Ssam	0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82,
461189251Ssam	0xB5, 0xA8, 0x40, 0x31, 0x90, 0x0B, 0x1C, 0x9E,
462189251Ssam	0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3,
463189251Ssam	0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE,
464189251Ssam	0x0F, 0x1D, 0x45, 0xB7, 0xFF, 0x58, 0x5A, 0xC5,
465189251Ssam	0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA,
466189251Ssam	0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8,
467189251Ssam	0x14, 0xCC, 0x5E, 0xD2, 0x0F, 0x80, 0x37, 0xE0,
468189251Ssam	0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28,
469189251Ssam	0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76,
470189251Ssam	0xF5, 0x50, 0xAA, 0x3D, 0x8A, 0x1F, 0xBF, 0xF0,
471189251Ssam	0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C,
472189251Ssam	0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32,
473189251Ssam	0x38, 0x7F, 0xE8, 0xD7, 0x6E, 0x3C, 0x04, 0x68,
474189251Ssam	0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE,
475189251Ssam	0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6,
476189251Ssam	0xE6, 0x94, 0xF9, 0x1E, 0x6D, 0xBE, 0x11, 0x59,
477189251Ssam	0x74, 0xA3, 0x92, 0x6F, 0x12, 0xFE, 0xE5, 0xE4,
478189251Ssam	0x38, 0x77, 0x7C, 0xB6, 0xA9, 0x32, 0xDF, 0x8C,
479189251Ssam	0xD8, 0xBE, 0xC4, 0xD0, 0x73, 0xB9, 0x31, 0xBA,
480189251Ssam	0x3B, 0xC8, 0x32, 0xB6, 0x8D, 0x9D, 0xD3, 0x00,
481189251Ssam	0x74, 0x1F, 0xA7, 0xBF, 0x8A, 0xFC, 0x47, 0xED,
482189251Ssam	0x25, 0x76, 0xF6, 0x93, 0x6B, 0xA4, 0x24, 0x66,
483189251Ssam	0x3A, 0xAB, 0x63, 0x9C, 0x5A, 0xE4, 0xF5, 0x68,
484189251Ssam	0x34, 0x23, 0xB4, 0x74, 0x2B, 0xF1, 0xC9, 0x78,
485189251Ssam	0x23, 0x8F, 0x16, 0xCB, 0xE3, 0x9D, 0x65, 0x2D,
486189251Ssam	0xE3, 0xFD, 0xB8, 0xBE, 0xFC, 0x84, 0x8A, 0xD9,
487189251Ssam	0x22, 0x22, 0x2E, 0x04, 0xA4, 0x03, 0x7C, 0x07,
488189251Ssam	0x13, 0xEB, 0x57, 0xA8, 0x1A, 0x23, 0xF0, 0xC7,
489189251Ssam	0x34, 0x73, 0xFC, 0x64, 0x6C, 0xEA, 0x30, 0x6B,
490189251Ssam	0x4B, 0xCB, 0xC8, 0x86, 0x2F, 0x83, 0x85, 0xDD,
491189251Ssam	0xFA, 0x9D, 0x4B, 0x7F, 0xA2, 0xC0, 0x87, 0xE8,
492189251Ssam	0x79, 0x68, 0x33, 0x03, 0xED, 0x5B, 0xDD, 0x3A,
493189251Ssam	0x06, 0x2B, 0x3C, 0xF5, 0xB3, 0xA2, 0x78, 0xA6,
494189251Ssam	0x6D, 0x2A, 0x13, 0xF8, 0x3F, 0x44, 0xF8, 0x2D,
495189251Ssam	0xDF, 0x31, 0x0E, 0xE0, 0x74, 0xAB, 0x6A, 0x36,
496189251Ssam	0x45, 0x97, 0xE8, 0x99, 0xA0, 0x25, 0x5D, 0xC1,
497189251Ssam	0x64, 0xF3, 0x1C, 0xC5, 0x08, 0x46, 0x85, 0x1D,
498189251Ssam	0xF9, 0xAB, 0x48, 0x19, 0x5D, 0xED, 0x7E, 0xA1,
499189251Ssam	0xB1, 0xD5, 0x10, 0xBD, 0x7E, 0xE7, 0x4D, 0x73,
500189251Ssam	0xFA, 0xF3, 0x6B, 0xC3, 0x1E, 0xCF, 0xA2, 0x68,
501189251Ssam	0x35, 0x90, 0x46, 0xF4, 0xEB, 0x87, 0x9F, 0x92,
502189251Ssam	0x40, 0x09, 0x43, 0x8B, 0x48, 0x1C, 0x6C, 0xD7,
503189251Ssam	0x88, 0x9A, 0x00, 0x2E, 0xD5, 0xEE, 0x38, 0x2B,
504189251Ssam	0xC9, 0x19, 0x0D, 0xA6, 0xFC, 0x02, 0x6E, 0x47,
505189251Ssam	0x95, 0x58, 0xE4, 0x47, 0x56, 0x77, 0xE9, 0xAA,
506189251Ssam	0x9E, 0x30, 0x50, 0xE2, 0x76, 0x56, 0x94, 0xDF,
507189251Ssam	0xC8, 0x1F, 0x56, 0xE8, 0x80, 0xB9, 0x6E, 0x71,
508189251Ssam	0x60, 0xC9, 0x80, 0xDD, 0x98, 0xED, 0xD3, 0xDF,
509189251Ssam	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
510189251Ssam};
511189251Ssam
512209158Srpaulo#endif /* ALL_DH_GROUPS */
513189251Ssam
514209158Srpaulo
515189251Ssam#define DH_GROUP(id) \
516189251Ssam{ id, dh_group ## id ## _generator, sizeof(dh_group ## id ## _generator), \
517189251Ssamdh_group ## id ## _prime, sizeof(dh_group ## id ## _prime) }
518189251Ssam
519189251Ssam
520189251Ssamstatic struct dh_group dh_groups[] = {
521209158Srpaulo	DH_GROUP(5),
522209158Srpaulo#ifdef ALL_DH_GROUPS
523189251Ssam	DH_GROUP(1),
524189251Ssam	DH_GROUP(2),
525189251Ssam	DH_GROUP(14),
526189251Ssam	DH_GROUP(15),
527189251Ssam	DH_GROUP(16),
528189251Ssam	DH_GROUP(17),
529189251Ssam	DH_GROUP(18)
530209158Srpaulo#endif /* ALL_DH_GROUPS */
531189251Ssam};
532189251Ssam
533189251Ssam#define NUM_DH_GROUPS (sizeof(dh_groups) / sizeof(dh_groups[0]))
534189251Ssam
535189251Ssam
536189251Ssamconst struct dh_group * dh_groups_get(int id)
537189251Ssam{
538189251Ssam	size_t i;
539189251Ssam
540189251Ssam	for (i = 0; i < NUM_DH_GROUPS; i++) {
541189251Ssam		if (dh_groups[i].id == id)
542189251Ssam			return &dh_groups[i];
543189251Ssam	}
544189251Ssam	return NULL;
545189251Ssam}
546189251Ssam
547189251Ssam
548189251Ssam/**
549189251Ssam * dh_init - Initialize Diffie-Hellman handshake
550189251Ssam * @dh: Selected Diffie-Hellman group
551189251Ssam * @priv: Pointer for returning Diffie-Hellman private key
552189251Ssam * Returns: Diffie-Hellman public value
553189251Ssam */
554189251Ssamstruct wpabuf * dh_init(const struct dh_group *dh, struct wpabuf **priv)
555189251Ssam{
556189251Ssam	struct wpabuf *pv;
557189251Ssam	size_t pv_len;
558189251Ssam
559189251Ssam	if (dh == NULL)
560189251Ssam		return NULL;
561189251Ssam
562189251Ssam	wpabuf_free(*priv);
563189251Ssam	*priv = wpabuf_alloc(dh->prime_len);
564189251Ssam	if (*priv == NULL)
565189251Ssam		return NULL;
566189251Ssam
567189251Ssam	if (os_get_random(wpabuf_put(*priv, dh->prime_len), dh->prime_len)) {
568189251Ssam		wpabuf_free(*priv);
569189251Ssam		*priv = NULL;
570189251Ssam		return NULL;
571189251Ssam	}
572189251Ssam
573189251Ssam	if (os_memcmp(wpabuf_head(*priv), dh->prime, dh->prime_len) > 0) {
574189251Ssam		/* Make sure private value is smaller than prime */
575189251Ssam		*(wpabuf_mhead_u8(*priv)) = 0;
576189251Ssam	}
577189251Ssam	wpa_hexdump_buf_key(MSG_DEBUG, "DH: private value", *priv);
578189251Ssam
579189251Ssam	pv_len = dh->prime_len;
580189251Ssam	pv = wpabuf_alloc(pv_len);
581189251Ssam	if (pv == NULL)
582189251Ssam		return NULL;
583189251Ssam	if (crypto_mod_exp(dh->generator, dh->generator_len,
584189251Ssam			   wpabuf_head(*priv), wpabuf_len(*priv),
585189251Ssam			   dh->prime, dh->prime_len, wpabuf_mhead(pv),
586189251Ssam			   &pv_len) < 0) {
587189251Ssam		wpabuf_free(pv);
588189251Ssam		wpa_printf(MSG_INFO, "DH: crypto_mod_exp failed");
589189251Ssam		return NULL;
590189251Ssam	}
591189251Ssam	wpabuf_put(pv, pv_len);
592189251Ssam	wpa_hexdump_buf(MSG_DEBUG, "DH: public value", pv);
593189251Ssam
594189251Ssam	return pv;
595189251Ssam}
596189251Ssam
597189251Ssam
598189251Ssam/**
599189251Ssam * dh_derive_shared - Derive shared Diffie-Hellman key
600189251Ssam * @peer_public: Diffie-Hellman public value from peer
601189251Ssam * @own_private: Diffie-Hellman private key from dh_init()
602189251Ssam * @dh: Selected Diffie-Hellman group
603189251Ssam * Returns: Diffie-Hellman shared key
604189251Ssam */
605189251Ssamstruct wpabuf * dh_derive_shared(const struct wpabuf *peer_public,
606189251Ssam				 const struct wpabuf *own_private,
607189251Ssam				 const struct dh_group *dh)
608189251Ssam{
609189251Ssam	struct wpabuf *shared;
610189251Ssam	size_t shared_len;
611189251Ssam
612189251Ssam	if (dh == NULL || peer_public == NULL || own_private == NULL)
613189251Ssam		return NULL;
614189251Ssam
615189251Ssam	shared_len = dh->prime_len;
616189251Ssam	shared = wpabuf_alloc(shared_len);
617189251Ssam	if (shared == NULL)
618189251Ssam		return NULL;
619189251Ssam	if (crypto_mod_exp(wpabuf_head(peer_public), wpabuf_len(peer_public),
620189251Ssam			   wpabuf_head(own_private), wpabuf_len(own_private),
621189251Ssam			   dh->prime, dh->prime_len,
622189251Ssam			   wpabuf_put(shared, shared_len), &shared_len) < 0) {
623189251Ssam		wpabuf_free(shared);
624189251Ssam		wpa_printf(MSG_INFO, "DH: crypto_mod_exp failed");
625189251Ssam		return NULL;
626189251Ssam	}
627189251Ssam	wpa_hexdump_buf_key(MSG_DEBUG, "DH: shared key", shared);
628189251Ssam
629189251Ssam	return shared;
630189251Ssam}
631