18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Diffie-Hellman groups
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2007, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h"
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "crypto.h"
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "random.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dh_groups.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ALL_DH_GROUPS
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* RFC 4306, B.1. Group 1 - 768 Bit MODP
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generator: 2
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prime: 2^768 - 2 ^704 - 1 + 2^64 * { [2^638 pi] + 149686 }
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group1_generator[1] = { 0x02 };
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group1_prime[96] = {
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x3A, 0x36, 0x20,
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* RFC 4306, B.2. Group 2 - 1024 Bit MODP
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generator: 2
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prime: 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 }
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group2_generator[1] = { 0x02 };
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group2_prime[128] = {
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81,
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ALL_DH_GROUPS */
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* RFC 3526, 2. Group 5 - 1536 Bit MODP
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generator: 2
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prime: 2^1536 - 2^1472 - 1 + 2^64 * { [2^1406 pi] + 741804 }
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group5_generator[1] = { 0x02 };
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group5_prime[192] = {
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x23, 0x73, 0x27,
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ALL_DH_GROUPS
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* RFC 3526, 3. Group 14 - 2048 Bit MODP
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generator: 2
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prime: 2^2048 - 2^1984 - 1 + 2^64 * { [2^1918 pi] + 124476 }
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group14_generator[1] = { 0x02 };
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group14_prime[256] = {
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68,
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* RFC 3526, 4. Group 15 - 3072 Bit MODP
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generator: 2
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prime: 2^3072 - 2^3008 - 1 + 2^64 * { [2^2942 pi] + 1690314 }
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group15_generator[1] = { 0x02 };
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group15_prime[384] = {
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x3A, 0xD2, 0xCA,
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* RFC 3526, 5. Group 16 - 4096 Bit MODP
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generator: 2
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prime: 2^4096 - 2^4032 - 1 + 2^64 * { [2^3966 pi] + 240904 }
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group16_generator[1] = { 0x02 };
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group16_prime[512] = {
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99,
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* RFC 3526, 6. Group 17 - 6144 Bit MODP
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generator: 2
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prime: 2^6144 - 2^6080 - 1 + 2^64 * { [2^6014 pi] + 929484 }
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group17_generator[1] = { 0x02 };
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group17_prime[768] = {
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92,
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26,
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC1, 0xD4, 0xDC, 0xB2, 0x60, 0x26, 0x46, 0xDE,
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD,
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E,
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE5, 0xDB, 0x38, 0x2F, 0x41, 0x30, 0x01, 0xAE,
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31,
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18,
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDA, 0x3E, 0xDB, 0xEB, 0xCF, 0x9B, 0x14, 0xED,
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B,
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B,
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x33, 0x20, 0x51, 0x51, 0x2B, 0xD7, 0xAF, 0x42,
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF,
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC,
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF0, 0x32, 0xEA, 0x15, 0xD1, 0x72, 0x1D, 0x03,
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6,
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82,
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB5, 0xA8, 0x40, 0x31, 0x90, 0x0B, 0x1C, 0x9E,
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3,
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE,
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x0F, 0x1D, 0x45, 0xB7, 0xFF, 0x58, 0x5A, 0xC5,
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA,
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8,
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x14, 0xCC, 0x5E, 0xD2, 0x0F, 0x80, 0x37, 0xE0,
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28,
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76,
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF5, 0x50, 0xAA, 0x3D, 0x8A, 0x1F, 0xBF, 0xF0,
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C,
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32,
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x38, 0x7F, 0xE8, 0xD7, 0x6E, 0x3C, 0x04, 0x68,
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE,
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6,
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE6, 0x94, 0xF9, 0x1E, 0x6D, 0xCC, 0x40, 0x24,
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* RFC 3526, 7. Group 18 - 8192 Bit MODP
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generator: 2
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prime: 2^8192 - 2^8128 - 1 + 2^64 * { [2^8062 pi] + 4743158 }
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group18_generator[1] = { 0x02 };
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 dh_group18_prime[1024] = {
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92,
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26,
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC1, 0xD4, 0xDC, 0xB2, 0x60, 0x26, 0x46, 0xDE,
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD,
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E,
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE5, 0xDB, 0x38, 0x2F, 0x41, 0x30, 0x01, 0xAE,
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31,
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18,
4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDA, 0x3E, 0xDB, 0xEB, 0xCF, 0x9B, 0x14, 0xED,
4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B,
4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B,
4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x33, 0x20, 0x51, 0x51, 0x2B, 0xD7, 0xAF, 0x42,
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF,
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC,
4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF0, 0x32, 0xEA, 0x15, 0xD1, 0x72, 0x1D, 0x03,
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6,
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82,
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB5, 0xA8, 0x40, 0x31, 0x90, 0x0B, 0x1C, 0x9E,
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3,
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE,
4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x0F, 0x1D, 0x45, 0xB7, 0xFF, 0x58, 0x5A, 0xC5,
4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA,
4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8,
4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x14, 0xCC, 0x5E, 0xD2, 0x0F, 0x80, 0x37, 0xE0,
4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28,
4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76,
4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF5, 0x50, 0xAA, 0x3D, 0x8A, 0x1F, 0xBF, 0xF0,
4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C,
4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32,
4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x38, 0x7F, 0xE8, 0xD7, 0x6E, 0x3C, 0x04, 0x68,
4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE,
4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6,
4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE6, 0x94, 0xF9, 0x1E, 0x6D, 0xBE, 0x11, 0x59,
4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x74, 0xA3, 0x92, 0x6F, 0x12, 0xFE, 0xE5, 0xE4,
4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x38, 0x77, 0x7C, 0xB6, 0xA9, 0x32, 0xDF, 0x8C,
4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xD8, 0xBE, 0xC4, 0xD0, 0x73, 0xB9, 0x31, 0xBA,
4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x3B, 0xC8, 0x32, 0xB6, 0x8D, 0x9D, 0xD3, 0x00,
4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x74, 0x1F, 0xA7, 0xBF, 0x8A, 0xFC, 0x47, 0xED,
4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x25, 0x76, 0xF6, 0x93, 0x6B, 0xA4, 0x24, 0x66,
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x3A, 0xAB, 0x63, 0x9C, 0x5A, 0xE4, 0xF5, 0x68,
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x34, 0x23, 0xB4, 0x74, 0x2B, 0xF1, 0xC9, 0x78,
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x23, 0x8F, 0x16, 0xCB, 0xE3, 0x9D, 0x65, 0x2D,
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xE3, 0xFD, 0xB8, 0xBE, 0xFC, 0x84, 0x8A, 0xD9,
4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x22, 0x22, 0x2E, 0x04, 0xA4, 0x03, 0x7C, 0x07,
4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x13, 0xEB, 0x57, 0xA8, 0x1A, 0x23, 0xF0, 0xC7,
4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x34, 0x73, 0xFC, 0x64, 0x6C, 0xEA, 0x30, 0x6B,
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x4B, 0xCB, 0xC8, 0x86, 0x2F, 0x83, 0x85, 0xDD,
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFA, 0x9D, 0x4B, 0x7F, 0xA2, 0xC0, 0x87, 0xE8,
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x79, 0x68, 0x33, 0x03, 0xED, 0x5B, 0xDD, 0x3A,
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x06, 0x2B, 0x3C, 0xF5, 0xB3, 0xA2, 0x78, 0xA6,
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x6D, 0x2A, 0x13, 0xF8, 0x3F, 0x44, 0xF8, 0x2D,
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xDF, 0x31, 0x0E, 0xE0, 0x74, 0xAB, 0x6A, 0x36,
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x45, 0x97, 0xE8, 0x99, 0xA0, 0x25, 0x5D, 0xC1,
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x64, 0xF3, 0x1C, 0xC5, 0x08, 0x46, 0x85, 0x1D,
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xF9, 0xAB, 0x48, 0x19, 0x5D, 0xED, 0x7E, 0xA1,
4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xB1, 0xD5, 0x10, 0xBD, 0x7E, 0xE7, 0x4D, 0x73,
4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFA, 0xF3, 0x6B, 0xC3, 0x1E, 0xCF, 0xA2, 0x68,
4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x35, 0x90, 0x46, 0xF4, 0xEB, 0x87, 0x9F, 0x92,
4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x40, 0x09, 0x43, 0x8B, 0x48, 0x1C, 0x6C, 0xD7,
4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x88, 0x9A, 0x00, 0x2E, 0xD5, 0xEE, 0x38, 0x2B,
4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC9, 0x19, 0x0D, 0xA6, 0xFC, 0x02, 0x6E, 0x47,
5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x95, 0x58, 0xE4, 0x47, 0x56, 0x77, 0xE9, 0xAA,
5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x9E, 0x30, 0x50, 0xE2, 0x76, 0x56, 0x94, 0xDF,
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xC8, 0x1F, 0x56, 0xE8, 0x80, 0xB9, 0x6E, 0x71,
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x60, 0xC9, 0x80, 0xDD, 0x98, 0xED, 0xD3, 0xDF,
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ALL_DH_GROUPS */
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define DH_GROUP(id) \
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ id, dh_group ## id ## _generator, sizeof(dh_group ## id ## _generator), \
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtdh_group ## id ## _prime, sizeof(dh_group ## id ## _prime) }
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct dh_group dh_groups[] = {
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DH_GROUP(5),
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ALL_DH_GROUPS
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DH_GROUP(1),
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DH_GROUP(2),
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DH_GROUP(14),
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DH_GROUP(15),
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DH_GROUP(16),
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DH_GROUP(17),
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DH_GROUP(18)
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ALL_DH_GROUPS */
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define NUM_DH_GROUPS (sizeof(dh_groups) / sizeof(dh_groups[0]))
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst struct dh_group * dh_groups_get(int id)
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t i;
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < NUM_DH_GROUPS; i++) {
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dh_groups[i].id == id)
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return &dh_groups[i];
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * dh_init - Initialize Diffie-Hellman handshake
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @dh: Selected Diffie-Hellman group
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @priv: Pointer for returning Diffie-Hellman private key
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Diffie-Hellman public value
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * dh_init(const struct dh_group *dh, struct wpabuf **priv)
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpabuf *pv;
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t pv_len;
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dh == NULL)
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpabuf_free(*priv);
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*priv = wpabuf_alloc(dh->prime_len);
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (*priv == NULL)
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (random_get_bytes(wpabuf_put(*priv, dh->prime_len), dh->prime_len))
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpabuf_free(*priv);
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*priv = NULL;
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (os_memcmp(wpabuf_head(*priv), dh->prime, dh->prime_len) > 0) {
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Make sure private value is smaller than prime */
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*(wpabuf_mhead_u8(*priv)) = 0;
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_hexdump_buf_key(MSG_DEBUG, "DH: private value", *priv);
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pv_len = dh->prime_len;
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pv = wpabuf_alloc(pv_len);
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (pv == NULL)
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (crypto_mod_exp(dh->generator, dh->generator_len,
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   wpabuf_head(*priv), wpabuf_len(*priv),
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   dh->prime, dh->prime_len, wpabuf_mhead(pv),
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   &pv_len) < 0) {
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpabuf_free(pv);
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_INFO, "DH: crypto_mod_exp failed");
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpabuf_put(pv, pv_len);
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_hexdump_buf(MSG_DEBUG, "DH: public value", pv);
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return pv;
5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * dh_derive_shared - Derive shared Diffie-Hellman key
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @peer_public: Diffie-Hellman public value from peer
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @own_private: Diffie-Hellman private key from dh_init()
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @dh: Selected Diffie-Hellman group
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Diffie-Hellman shared key
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpabuf * dh_derive_shared(const struct wpabuf *peer_public,
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 const struct wpabuf *own_private,
6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 const struct dh_group *dh)
6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpabuf *shared;
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t shared_len;
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dh == NULL || peer_public == NULL || own_private == NULL)
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	shared_len = dh->prime_len;
6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	shared = wpabuf_alloc(shared_len);
6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (shared == NULL)
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (crypto_mod_exp(wpabuf_head(peer_public), wpabuf_len(peer_public),
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   wpabuf_head(own_private), wpabuf_len(own_private),
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   dh->prime, dh->prime_len,
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   wpabuf_mhead(shared), &shared_len) < 0) {
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpabuf_free(shared);
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_INFO, "DH: crypto_mod_exp failed");
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpabuf_put(shared, shared_len);
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_hexdump_buf_key(MSG_DEBUG, "DH: shared key", shared);
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return shared;
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
628