dh_groups.c revision c5ec7f57ead87efa365800228aa0b09a12d9e6c4
18d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/*
28d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko * Diffie-Hellman groups
38d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko * Copyright (c) 2007, Jouni Malinen <j@w1.fi>
48d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko *
58d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko * This software may be distributed under the terms of the BSD license.
68d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko * See README for more details.
78d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko */
88d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
98d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "includes.h"
108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "common.h"
128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "crypto.h"
138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "random.h"
148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "dh_groups.h"
158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1730a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#ifdef ALL_DH_GROUPS
18a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/* RFC 4306, B.1. Group 1 - 768 Bit MODP
208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko * Generator: 2
2196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko * Prime: 2^768 - 2 ^704 - 1 + 2^64 * { [2^638 pi] + 149686 }
2230a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth */
238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkostatic const u8 dh_group1_generator[1] = { 0x02 };
248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkostatic const u8 dh_group1_prime[96] = {
258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
26a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
27a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
281952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
29a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
31aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
34da5922f4864b5da254c6676af8833c42adaa6d86Dmitri Gribenko	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
35da5922f4864b5da254c6676af8833c42adaa6d86Dmitri Gribenko	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x3A, 0x36, 0x20,
366f36366c85dc81d67d70efdeeea4cfc382053febDmitri Gribenko	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
37a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko};
388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/* RFC 4306, B.2. Group 2 - 1024 Bit MODP
40a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko * Generator: 2
41a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko * Prime: 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 }
42a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko */
43a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkostatic const u8 dh_group2_generator[1] = { 0x02 };
44a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkostatic const u8 dh_group2_prime[128] = {
45e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
46aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
471952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
481952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
491ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
501ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
518487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
5296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
5396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
5496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
551ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
5696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
5796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
589443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
599443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81,
609443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
61f843a580c4a54ca147f22422ee8ccfd2347784fcFariborz Jahanian};
62f843a580c4a54ca147f22422ee8ccfd2347784fcFariborz Jahanian
639443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko#endif /* ALL_DH_GROUPS */
64a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
65a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko/* RFC 3526, 2. Group 5 - 1536 Bit MODP
66a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko * Generator: 2
67a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko * Prime: 2^1536 - 2^1472 - 1 + 2^64 * { [2^1406 pi] + 741804 }
68a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko */
69a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkostatic const u8 dh_group5_generator[1] = { 0x02 };
703f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenkostatic const u8 dh_group5_prime[192] = {
71a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
73a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
741952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
751952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
76a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
77a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
7996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
8096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
8196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
8296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
8396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
8496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
8596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
8696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
8996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
9096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x23, 0x73, 0x27,
948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko};
968536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian
97808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko#ifdef ALL_DH_GROUPS
988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
997d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko/* RFC 3526, 3. Group 14 - 2048 Bit MODP
1007d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko * Generator: 2
1018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko * Prime: 2^2048 - 2^1984 - 1 + 2^64 * { [2^1918 pi] + 124476 }
1027d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko */
1037d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenkostatic const u8 dh_group14_generator[1] = { 0x02 };
1048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkostatic const u8 dh_group14_prime[256] = {
1058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
1078536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
108808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
1098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
1107d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
1117d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
1127d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
1137d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
114a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
1157d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
1167d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
1177d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
1187d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
1198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
1207d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
1217d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
1228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
12396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
12496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
1258536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
126808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
12796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
1287d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
1297d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
1307d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
1317d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
13296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
1337d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
1347d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
13596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68,
1368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
1378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko};
138e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
1398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/* RFC 3526, 4. Group 15 - 3072 Bit MODP
1408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko * Generator: 2
1418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko * Prime: 2^3072 - 2^3008 - 1 + 2^64 * { [2^2942 pi] + 1690314 }
142e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko */
1438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkostatic const u8 dh_group15_generator[1] = { 0x02 };
1448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkostatic const u8 dh_group15_prime[384] = {
1458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
1478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
1488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
149b0b8a96df25660cbdbf35d23c3ff5887c33f82f9Dmitri Gribenko	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
150b0b8a96df25660cbdbf35d23c3ff5887c33f82f9Dmitri Gribenko	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
151b0b8a96df25660cbdbf35d23c3ff5887c33f82f9Dmitri Gribenko	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
152b0b8a96df25660cbdbf35d23c3ff5887c33f82f9Dmitri Gribenko	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
153b0b8a96df25660cbdbf35d23c3ff5887c33f82f9Dmitri Gribenko	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
1548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
1558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
1568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
1578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
1588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
1598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
160e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
1618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
1628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
1638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
1648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
1657d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
1667d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
1677d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
1687d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
1698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
1708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
171e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
1728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
1738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
1748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
1753f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
1763f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko	0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
1778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
1787d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
1797d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
1807d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
1817d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko	0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
1828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
1833f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko	0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
1843f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko	0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
1853f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko	0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
1868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
1878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
1888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
189a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
190a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
19189ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko	0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x3A, 0xD2, 0xCA,
19289ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
1939443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko};
1949443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko
1959443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko/* RFC 3526, 5. Group 16 - 4096 Bit MODP
1969443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko * Generator: 2
1970bd9838751384181ff387f2fb346896792b89617Dmitri Gribenko * Prime: 2^4096 - 2^4032 - 1 + 2^64 * { [2^3966 pi] + 240904 }
1982a268f2629b49958427e8eb02f2c3d565be71accFariborz Jahanian */
1992a268f2629b49958427e8eb02f2c3d565be71accFariborz Jahanianstatic const u8 dh_group16_generator[1] = { 0x02 };
20028c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanianstatic const u8 dh_group16_prime[512] = {
20128c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
20228c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
20328c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
2040bd9838751384181ff387f2fb346896792b89617Dmitri Gribenko	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
2059edd2c8a2ff6c6326ff2d5b081929e4baaa798edDmitri Gribenko	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
2069edd2c8a2ff6c6326ff2d5b081929e4baaa798edDmitri Gribenko	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
2079edd2c8a2ff6c6326ff2d5b081929e4baaa798edDmitri Gribenko	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
2089edd2c8a2ff6c6326ff2d5b081929e4baaa798edDmitri Gribenko	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
2098487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
210eb8f69f094e95d0132e4a6817a2111ad188ab087Fariborz Jahanian	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
211a558d2e29817e36798875c96efb62251e53ff024Dmitri Gribenko	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
212a558d2e29817e36798875c96efb62251e53ff024Dmitri Gribenko	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
213a558d2e29817e36798875c96efb62251e53ff024Dmitri Gribenko	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
21499a7057098c56211e641705e1ff38d4b7c8b309dFariborz Jahanian	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
215c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
21699a7057098c56211e641705e1ff38d4b7c8b309dFariborz Jahanian	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
217664e860beb2550bef24fb8946192f61648a71d7fFariborz Jahanian	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
21804bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
219b421b56d5a83c5bcae576b714ebd9df7b745368dFariborz Jahanian	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
220b421b56d5a83c5bcae576b714ebd9df7b745368dFariborz Jahanian	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
22128c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
22228c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
22328c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
2242d588b4bc7127adf1a1c621002dfe452a99fef6fFariborz Jahanian	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
2252d588b4bc7127adf1a1c621002dfe452a99fef6fFariborz Jahanian	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
22696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
2278487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
2288487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
2291ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
2301ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
2318487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
2328487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko	0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
233a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
234a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
2358487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko	0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
236a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
237a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
238a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
239a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
2408487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko	0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
241a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko	0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
24296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
24396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
24496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
24596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
24696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
24796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
24896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
24996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko	0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
2502d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko	0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
2512d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko	0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
2528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
2538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
2548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
2558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
2568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
2578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
2588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko	0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
259	0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
260	0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
261	0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
262	0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
263	0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99,
264	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
265};
266
267/* RFC 3526, 6. Group 17 - 6144 Bit MODP
268 * Generator: 2
269 * Prime: 2^6144 - 2^6080 - 1 + 2^64 * { [2^6014 pi] + 929484 }
270 */
271static const u8 dh_group17_generator[1] = { 0x02 };
272static const u8 dh_group17_prime[768] = {
273	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
274	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
275	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
276	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
277	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
278	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
279	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
280	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
281	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
282	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
283	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
284	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
285	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
286	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
287	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
288	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
289	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
290	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
291	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
292	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
293	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
294	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
295	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
296	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
297	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
298	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
299	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
300	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
301	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
302	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
303	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
304	0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
305	0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
306	0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
307	0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
308	0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
309	0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
310	0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
311	0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
312	0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
313	0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
314	0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
315	0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
316	0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
317	0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
318	0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
319	0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
320	0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
321	0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
322	0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
323	0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
324	0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
325	0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
326	0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
327	0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
328	0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
329	0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
330	0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
331	0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
332	0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
333	0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
334	0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
335	0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92,
336	0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26,
337	0xC1, 0xD4, 0xDC, 0xB2, 0x60, 0x26, 0x46, 0xDE,
338	0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD,
339	0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E,
340	0xE5, 0xDB, 0x38, 0x2F, 0x41, 0x30, 0x01, 0xAE,
341	0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31,
342	0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18,
343	0xDA, 0x3E, 0xDB, 0xEB, 0xCF, 0x9B, 0x14, 0xED,
344	0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B,
345	0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B,
346	0x33, 0x20, 0x51, 0x51, 0x2B, 0xD7, 0xAF, 0x42,
347	0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF,
348	0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC,
349	0xF0, 0x32, 0xEA, 0x15, 0xD1, 0x72, 0x1D, 0x03,
350	0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6,
351	0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82,
352	0xB5, 0xA8, 0x40, 0x31, 0x90, 0x0B, 0x1C, 0x9E,
353	0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3,
354	0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE,
355	0x0F, 0x1D, 0x45, 0xB7, 0xFF, 0x58, 0x5A, 0xC5,
356	0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA,
357	0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8,
358	0x14, 0xCC, 0x5E, 0xD2, 0x0F, 0x80, 0x37, 0xE0,
359	0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28,
360	0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76,
361	0xF5, 0x50, 0xAA, 0x3D, 0x8A, 0x1F, 0xBF, 0xF0,
362	0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C,
363	0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32,
364	0x38, 0x7F, 0xE8, 0xD7, 0x6E, 0x3C, 0x04, 0x68,
365	0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE,
366	0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6,
367	0xE6, 0x94, 0xF9, 0x1E, 0x6D, 0xCC, 0x40, 0x24,
368	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
369};
370
371/* RFC 3526, 7. Group 18 - 8192 Bit MODP
372 * Generator: 2
373 * Prime: 2^8192 - 2^8128 - 1 + 2^64 * { [2^8062 pi] + 4743158 }
374 */
375static const u8 dh_group18_generator[1] = { 0x02 };
376static const u8 dh_group18_prime[1024] = {
377	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
378	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
379	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
380	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
381	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
382	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
383	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
384	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
385	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
386	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
387	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
388	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
389	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
390	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
391	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
392	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
393	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
394	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
395	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
396	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
397	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
398	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
399	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
400	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
401	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
402	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
403	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
404	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
405	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
406	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
407	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
408	0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
409	0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
410	0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
411	0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
412	0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
413	0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
414	0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
415	0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
416	0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
417	0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
418	0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
419	0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
420	0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
421	0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
422	0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
423	0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
424	0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
425	0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
426	0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
427	0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
428	0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
429	0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
430	0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
431	0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
432	0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
433	0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
434	0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
435	0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
436	0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
437	0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
438	0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
439	0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92,
440	0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26,
441	0xC1, 0xD4, 0xDC, 0xB2, 0x60, 0x26, 0x46, 0xDE,
442	0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD,
443	0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E,
444	0xE5, 0xDB, 0x38, 0x2F, 0x41, 0x30, 0x01, 0xAE,
445	0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31,
446	0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18,
447	0xDA, 0x3E, 0xDB, 0xEB, 0xCF, 0x9B, 0x14, 0xED,
448	0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B,
449	0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B,
450	0x33, 0x20, 0x51, 0x51, 0x2B, 0xD7, 0xAF, 0x42,
451	0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF,
452	0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC,
453	0xF0, 0x32, 0xEA, 0x15, 0xD1, 0x72, 0x1D, 0x03,
454	0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6,
455	0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82,
456	0xB5, 0xA8, 0x40, 0x31, 0x90, 0x0B, 0x1C, 0x9E,
457	0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3,
458	0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE,
459	0x0F, 0x1D, 0x45, 0xB7, 0xFF, 0x58, 0x5A, 0xC5,
460	0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA,
461	0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8,
462	0x14, 0xCC, 0x5E, 0xD2, 0x0F, 0x80, 0x37, 0xE0,
463	0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28,
464	0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76,
465	0xF5, 0x50, 0xAA, 0x3D, 0x8A, 0x1F, 0xBF, 0xF0,
466	0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C,
467	0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32,
468	0x38, 0x7F, 0xE8, 0xD7, 0x6E, 0x3C, 0x04, 0x68,
469	0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE,
470	0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6,
471	0xE6, 0x94, 0xF9, 0x1E, 0x6D, 0xBE, 0x11, 0x59,
472	0x74, 0xA3, 0x92, 0x6F, 0x12, 0xFE, 0xE5, 0xE4,
473	0x38, 0x77, 0x7C, 0xB6, 0xA9, 0x32, 0xDF, 0x8C,
474	0xD8, 0xBE, 0xC4, 0xD0, 0x73, 0xB9, 0x31, 0xBA,
475	0x3B, 0xC8, 0x32, 0xB6, 0x8D, 0x9D, 0xD3, 0x00,
476	0x74, 0x1F, 0xA7, 0xBF, 0x8A, 0xFC, 0x47, 0xED,
477	0x25, 0x76, 0xF6, 0x93, 0x6B, 0xA4, 0x24, 0x66,
478	0x3A, 0xAB, 0x63, 0x9C, 0x5A, 0xE4, 0xF5, 0x68,
479	0x34, 0x23, 0xB4, 0x74, 0x2B, 0xF1, 0xC9, 0x78,
480	0x23, 0x8F, 0x16, 0xCB, 0xE3, 0x9D, 0x65, 0x2D,
481	0xE3, 0xFD, 0xB8, 0xBE, 0xFC, 0x84, 0x8A, 0xD9,
482	0x22, 0x22, 0x2E, 0x04, 0xA4, 0x03, 0x7C, 0x07,
483	0x13, 0xEB, 0x57, 0xA8, 0x1A, 0x23, 0xF0, 0xC7,
484	0x34, 0x73, 0xFC, 0x64, 0x6C, 0xEA, 0x30, 0x6B,
485	0x4B, 0xCB, 0xC8, 0x86, 0x2F, 0x83, 0x85, 0xDD,
486	0xFA, 0x9D, 0x4B, 0x7F, 0xA2, 0xC0, 0x87, 0xE8,
487	0x79, 0x68, 0x33, 0x03, 0xED, 0x5B, 0xDD, 0x3A,
488	0x06, 0x2B, 0x3C, 0xF5, 0xB3, 0xA2, 0x78, 0xA6,
489	0x6D, 0x2A, 0x13, 0xF8, 0x3F, 0x44, 0xF8, 0x2D,
490	0xDF, 0x31, 0x0E, 0xE0, 0x74, 0xAB, 0x6A, 0x36,
491	0x45, 0x97, 0xE8, 0x99, 0xA0, 0x25, 0x5D, 0xC1,
492	0x64, 0xF3, 0x1C, 0xC5, 0x08, 0x46, 0x85, 0x1D,
493	0xF9, 0xAB, 0x48, 0x19, 0x5D, 0xED, 0x7E, 0xA1,
494	0xB1, 0xD5, 0x10, 0xBD, 0x7E, 0xE7, 0x4D, 0x73,
495	0xFA, 0xF3, 0x6B, 0xC3, 0x1E, 0xCF, 0xA2, 0x68,
496	0x35, 0x90, 0x46, 0xF4, 0xEB, 0x87, 0x9F, 0x92,
497	0x40, 0x09, 0x43, 0x8B, 0x48, 0x1C, 0x6C, 0xD7,
498	0x88, 0x9A, 0x00, 0x2E, 0xD5, 0xEE, 0x38, 0x2B,
499	0xC9, 0x19, 0x0D, 0xA6, 0xFC, 0x02, 0x6E, 0x47,
500	0x95, 0x58, 0xE4, 0x47, 0x56, 0x77, 0xE9, 0xAA,
501	0x9E, 0x30, 0x50, 0xE2, 0x76, 0x56, 0x94, 0xDF,
502	0xC8, 0x1F, 0x56, 0xE8, 0x80, 0xB9, 0x6E, 0x71,
503	0x60, 0xC9, 0x80, 0xDD, 0x98, 0xED, 0xD3, 0xDF,
504	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
505};
506
507#endif /* ALL_DH_GROUPS */
508
509
510#define DH_GROUP(id) \
511{ id, dh_group ## id ## _generator, sizeof(dh_group ## id ## _generator), \
512dh_group ## id ## _prime, sizeof(dh_group ## id ## _prime) }
513
514
515static struct dh_group dh_groups[] = {
516	DH_GROUP(5),
517#ifdef ALL_DH_GROUPS
518	DH_GROUP(1),
519	DH_GROUP(2),
520	DH_GROUP(14),
521	DH_GROUP(15),
522	DH_GROUP(16),
523	DH_GROUP(17),
524	DH_GROUP(18)
525#endif /* ALL_DH_GROUPS */
526};
527
528#define NUM_DH_GROUPS (sizeof(dh_groups) / sizeof(dh_groups[0]))
529
530
531const struct dh_group * dh_groups_get(int id)
532{
533	size_t i;
534
535	for (i = 0; i < NUM_DH_GROUPS; i++) {
536		if (dh_groups[i].id == id)
537			return &dh_groups[i];
538	}
539	return NULL;
540}
541
542
543/**
544 * dh_init - Initialize Diffie-Hellman handshake
545 * @dh: Selected Diffie-Hellman group
546 * @priv: Pointer for returning Diffie-Hellman private key
547 * Returns: Diffie-Hellman public value
548 */
549struct wpabuf * dh_init(const struct dh_group *dh, struct wpabuf **priv)
550{
551	struct wpabuf *pv;
552	size_t pv_len;
553
554	if (dh == NULL)
555		return NULL;
556
557	wpabuf_free(*priv);
558	*priv = wpabuf_alloc(dh->prime_len);
559	if (*priv == NULL)
560		return NULL;
561
562	if (random_get_bytes(wpabuf_put(*priv, dh->prime_len), dh->prime_len))
563	{
564		wpabuf_free(*priv);
565		*priv = NULL;
566		return NULL;
567	}
568
569	if (os_memcmp(wpabuf_head(*priv), dh->prime, dh->prime_len) > 0) {
570		/* Make sure private value is smaller than prime */
571		*(wpabuf_mhead_u8(*priv)) = 0;
572	}
573	wpa_hexdump_buf_key(MSG_DEBUG, "DH: private value", *priv);
574
575	pv_len = dh->prime_len;
576	pv = wpabuf_alloc(pv_len);
577	if (pv == NULL)
578		return NULL;
579	if (crypto_mod_exp(dh->generator, dh->generator_len,
580			   wpabuf_head(*priv), wpabuf_len(*priv),
581			   dh->prime, dh->prime_len, wpabuf_mhead(pv),
582			   &pv_len) < 0) {
583		wpabuf_free(pv);
584		wpa_printf(MSG_INFO, "DH: crypto_mod_exp failed");
585		return NULL;
586	}
587	wpabuf_put(pv, pv_len);
588	wpa_hexdump_buf(MSG_DEBUG, "DH: public value", pv);
589
590	return pv;
591}
592
593
594/**
595 * dh_derive_shared - Derive shared Diffie-Hellman key
596 * @peer_public: Diffie-Hellman public value from peer
597 * @own_private: Diffie-Hellman private key from dh_init()
598 * @dh: Selected Diffie-Hellman group
599 * Returns: Diffie-Hellman shared key
600 */
601struct wpabuf * dh_derive_shared(const struct wpabuf *peer_public,
602				 const struct wpabuf *own_private,
603				 const struct dh_group *dh)
604{
605	struct wpabuf *shared;
606	size_t shared_len;
607
608	if (dh == NULL || peer_public == NULL || own_private == NULL)
609		return NULL;
610
611	shared_len = dh->prime_len;
612	shared = wpabuf_alloc(shared_len);
613	if (shared == NULL)
614		return NULL;
615	if (crypto_mod_exp(wpabuf_head(peer_public), wpabuf_len(peer_public),
616			   wpabuf_head(own_private), wpabuf_len(own_private),
617			   dh->prime, dh->prime_len,
618			   wpabuf_mhead(shared), &shared_len) < 0) {
619		wpabuf_free(shared);
620		wpa_printf(MSG_INFO, "DH: crypto_mod_exp failed");
621		return NULL;
622	}
623	wpabuf_put(shared, shared_len);
624	wpa_hexdump_buf_key(MSG_DEBUG, "DH: shared key", shared);
625
626	return shared;
627}
628