Store DH generator in a chunk, hide non-public data in a private struct

This commit is contained in:
Martin Willi
2010-04-08 15:08:35 +02:00
parent 6c1dc87551
commit b34b93dbf7
5 changed files with 305 additions and 313 deletions
+71 -73
View File
@@ -1,6 +1,6 @@
/* /*
* Copyright (C) 2010 Tobias Brunner * Copyright (C) 2010 Tobias Brunner
* Copyright (C) 2005-2008 Martin Willi * Copyright (C) 2005-2010 Martin Willi
* Copyright (C) 2005 Jan Hutter * Copyright (C) 2005 Jan Hutter
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
* *
@@ -41,21 +41,31 @@ ENUM_END(diffie_hellman_group_names, MODP_NULL);
/** /**
* Modulus of Group 1 (MODP_768_BIT). * List of known diffie hellman group parameters.
*/ */
static const u_int8_t group1_modulus[] = { static struct {
/* Public part of the struct */
diffie_hellman_params_t public;
/* The group identifier as specified in IKEv2 */
diffie_hellman_group_t group;
/* Optimal length of the exponent (in bytes), as specified in RFC 3526. */
size_t opt_exp;
} dh_params[] = {
{
.group = MODP_768_BIT, .opt_exp = 32, .public = {
.generator = chunk_from_chars(0x02),
.prime = chunk_from_chars(
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34,
0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,
0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,0xF2,0x5F,0x14,0x37, 0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,0xF2,0x5F,0x14,0x37,
0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6, 0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6,
0xF4,0x4C,0x42,0xE9,0xA6,0x3A,0x36,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF 0xF4,0x4C,0x42,0xE9,0xA6,0x3A,0x36,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF)
}; },
},{
/** .group = MODP_1024_BIT, .opt_exp = 32, .public = {
* Modulus of Group 2 (MODP_1024_BIT). .generator = chunk_from_chars(0x02),
*/ .prime = chunk_from_chars(
static const u_int8_t group2_modulus[] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34,
0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,
0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
@@ -63,13 +73,12 @@ static const u_int8_t group2_modulus[] = {
0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6, 0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6,
0xF4,0x4C,0x42,0xE9,0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED, 0xF4,0x4C,0x42,0xE9,0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED,
0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,0x7C,0x4B,0x1F,0xE6, 0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,0x7C,0x4B,0x1F,0xE6,
0x49,0x28,0x66,0x51,0xEC,0xE6,0x53,0x81,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF 0x49,0x28,0x66,0x51,0xEC,0xE6,0x53,0x81,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF)
}; },
},{
/** .group = MODP_1536_BIT, .opt_exp = 32, .public = {
* Modulus of Group 5 (MODP_1536_BIT). .generator = chunk_from_chars(0x02),
*/ .prime = chunk_from_chars(
static const u_int8_t group5_modulus[] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34,
0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,
0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
@@ -81,12 +90,12 @@ static const u_int8_t group5_modulus[] = {
0x98,0xDA,0x48,0x36,0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F, 0x98,0xDA,0x48,0x36,0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F,
0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,0x20,0x85,0x52,0xBB, 0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,0x20,0x85,0x52,0xBB,
0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04, 0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04,
0xF1,0x74,0x6C,0x08,0xCA,0x23,0x73,0x27,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF 0xF1,0x74,0x6C,0x08,0xCA,0x23,0x73,0x27,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF)
}; },
/** },{
* Modulus of Group 14 (MODP_2048_BIT). .group = MODP_2048_BIT, .opt_exp = 48, .public = {
*/ .generator = chunk_from_chars(0x02),
static const u_int8_t group14_modulus[] = { .prime = chunk_from_chars(
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34,
0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,
0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
@@ -102,13 +111,12 @@ static const u_int8_t group14_modulus[] = {
0xE3,0x9E,0x77,0x2C,0x18,0x0E,0x86,0x03,0x9B,0x27,0x83,0xA2,0xEC,0x07,0xA2,0x8F, 0xE3,0x9E,0x77,0x2C,0x18,0x0E,0x86,0x03,0x9B,0x27,0x83,0xA2,0xEC,0x07,0xA2,0x8F,
0xB5,0xC5,0x5D,0xF0,0x6F,0x4C,0x52,0xC9,0xDE,0x2B,0xCB,0xF6,0x95,0x58,0x17,0x18, 0xB5,0xC5,0x5D,0xF0,0x6F,0x4C,0x52,0xC9,0xDE,0x2B,0xCB,0xF6,0x95,0x58,0x17,0x18,
0x39,0x95,0x49,0x7C,0xEA,0x95,0x6A,0xE5,0x15,0xD2,0x26,0x18,0x98,0xFA,0x05,0x10, 0x39,0x95,0x49,0x7C,0xEA,0x95,0x6A,0xE5,0x15,0xD2,0x26,0x18,0x98,0xFA,0x05,0x10,
0x15,0x72,0x8E,0x5A,0x8A,0xAC,0xAA,0x68,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF 0x15,0x72,0x8E,0x5A,0x8A,0xAC,0xAA,0x68,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF)
}; },
},{
/** .group = MODP_3072_BIT, .opt_exp = 48, .public = {
* Modulus of Group 15 (MODP_3072_BIT). .generator = chunk_from_chars(0x02),
*/ .prime = chunk_from_chars(
static const u_int8_t group15_modulus[] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34,
0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,
0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
@@ -132,13 +140,12 @@ static const u_int8_t group15_modulus[] = {
0xD8,0x76,0x02,0x73,0x3E,0xC8,0x6A,0x64,0x52,0x1F,0x2B,0x18,0x17,0x7B,0x20,0x0C, 0xD8,0x76,0x02,0x73,0x3E,0xC8,0x6A,0x64,0x52,0x1F,0x2B,0x18,0x17,0x7B,0x20,0x0C,
0xBB,0xE1,0x17,0x57,0x7A,0x61,0x5D,0x6C,0x77,0x09,0x88,0xC0,0xBA,0xD9,0x46,0xE2, 0xBB,0xE1,0x17,0x57,0x7A,0x61,0x5D,0x6C,0x77,0x09,0x88,0xC0,0xBA,0xD9,0x46,0xE2,
0x08,0xE2,0x4F,0xA0,0x74,0xE5,0xAB,0x31,0x43,0xDB,0x5B,0xFC,0xE0,0xFD,0x10,0x8E, 0x08,0xE2,0x4F,0xA0,0x74,0xE5,0xAB,0x31,0x43,0xDB,0x5B,0xFC,0xE0,0xFD,0x10,0x8E,
0x4B,0x82,0xD1,0x20,0xA9,0x3A,0xD2,0xCA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF 0x4B,0x82,0xD1,0x20,0xA9,0x3A,0xD2,0xCA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF)
}; },
},{
/** .group = MODP_4096_BIT, .opt_exp = 64, .public = {
* Modulus of Group 16 (MODP_4096_BIT). .generator = chunk_from_chars(0x02),
*/ .prime = chunk_from_chars(
static const u_int8_t group16_modulus[] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34,
0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,
0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
@@ -170,13 +177,12 @@ static const u_int8_t group16_modulus[] = {
0x23,0x3B,0xA1,0x86,0x51,0x5B,0xE7,0xED,0x1F,0x61,0x29,0x70,0xCE,0xE2,0xD7,0xAF, 0x23,0x3B,0xA1,0x86,0x51,0x5B,0xE7,0xED,0x1F,0x61,0x29,0x70,0xCE,0xE2,0xD7,0xAF,
0xB8,0x1B,0xDD,0x76,0x21,0x70,0x48,0x1C,0xD0,0x06,0x91,0x27,0xD5,0xB0,0x5A,0xA9, 0xB8,0x1B,0xDD,0x76,0x21,0x70,0x48,0x1C,0xD0,0x06,0x91,0x27,0xD5,0xB0,0x5A,0xA9,
0x93,0xB4,0xEA,0x98,0x8D,0x8F,0xDD,0xC1,0x86,0xFF,0xB7,0xDC,0x90,0xA6,0xC0,0x8F, 0x93,0xB4,0xEA,0x98,0x8D,0x8F,0xDD,0xC1,0x86,0xFF,0xB7,0xDC,0x90,0xA6,0xC0,0x8F,
0x4D,0xF4,0x35,0xC9,0x34,0x06,0x31,0x99,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF 0x4D,0xF4,0x35,0xC9,0x34,0x06,0x31,0x99,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF)
}; },
},{
/** .group = MODP_6144_BIT, .opt_exp = 64, .public = {
* Modulus of Group 17 (MODP_6144_BIT). .generator = chunk_from_chars(0x02),
*/ .prime = chunk_from_chars(
static const u_int8_t group17_modulus[] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34,
0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,
0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
@@ -224,13 +230,12 @@ static const u_int8_t group17_modulus[] = {
0xF5,0x50,0xAA,0x3D,0x8A,0x1F,0xBF,0xF0,0xEB,0x19,0xCC,0xB1,0xA3,0x13,0xD5,0x5C, 0xF5,0x50,0xAA,0x3D,0x8A,0x1F,0xBF,0xF0,0xEB,0x19,0xCC,0xB1,0xA3,0x13,0xD5,0x5C,
0xDA,0x56,0xC9,0xEC,0x2E,0xF2,0x96,0x32,0x38,0x7F,0xE8,0xD7,0x6E,0x3C,0x04,0x68, 0xDA,0x56,0xC9,0xEC,0x2E,0xF2,0x96,0x32,0x38,0x7F,0xE8,0xD7,0x6E,0x3C,0x04,0x68,
0x04,0x3E,0x8F,0x66,0x3F,0x48,0x60,0xEE,0x12,0xBF,0x2D,0x5B,0x0B,0x74,0x74,0xD6, 0x04,0x3E,0x8F,0x66,0x3F,0x48,0x60,0xEE,0x12,0xBF,0x2D,0x5B,0x0B,0x74,0x74,0xD6,
0xE6,0x94,0xF9,0x1E,0x6D,0xCC,0x40,0x24,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF 0xE6,0x94,0xF9,0x1E,0x6D,0xCC,0x40,0x24,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF)
}; },
},{
/** .group = MODP_8192_BIT, .opt_exp = 64, .public = {
* Modulus of Group 18 (MODP_8192_BIT). .generator = chunk_from_chars(0x02),
*/ .prime = chunk_from_chars(
static const u_int8_t group18_modulus[] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34,
0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,
0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD,
@@ -294,22 +299,9 @@ static const u_int8_t group18_modulus[] = {
0x40,0x09,0x43,0x8B,0x48,0x1C,0x6C,0xD7,0x88,0x9A,0x00,0x2E,0xD5,0xEE,0x38,0x2B, 0x40,0x09,0x43,0x8B,0x48,0x1C,0x6C,0xD7,0x88,0x9A,0x00,0x2E,0xD5,0xEE,0x38,0x2B,
0xC9,0x19,0x0D,0xA6,0xFC,0x02,0x6E,0x47,0x95,0x58,0xE4,0x47,0x56,0x77,0xE9,0xAA, 0xC9,0x19,0x0D,0xA6,0xFC,0x02,0x6E,0x47,0x95,0x58,0xE4,0x47,0x56,0x77,0xE9,0xAA,
0x9E,0x30,0x50,0xE2,0x76,0x56,0x94,0xDF,0xC8,0x1F,0x56,0xE8,0x80,0xB9,0x6E,0x71, 0x9E,0x30,0x50,0xE2,0x76,0x56,0x94,0xDF,0xC8,0x1F,0x56,0xE8,0x80,0xB9,0x6E,0x71,
0x60,0xC9,0x80,0xDD,0x98,0xED,0xD3,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0x60,0xC9,0x80,0xDD,0x98,0xED,0xD3,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF)
}; },
},
/**
* All supported diffie hellman groups.
* Optimum exponent size according to RFC 3526.
*/
static diffie_hellman_params_t dh_params[] = {
{MODP_768_BIT, group1_modulus, sizeof(group1_modulus), 32, 0, 2},
{MODP_1024_BIT, group2_modulus, sizeof(group2_modulus), 32, 0, 2},
{MODP_1536_BIT, group5_modulus, sizeof(group5_modulus), 32, 0, 2},
{MODP_2048_BIT, group14_modulus, sizeof(group14_modulus), 48, 0, 2},
{MODP_3072_BIT, group15_modulus, sizeof(group15_modulus), 48, 0, 2},
{MODP_4096_BIT, group16_modulus, sizeof(group16_modulus), 64, 0, 2},
{MODP_6144_BIT, group17_modulus, sizeof(group17_modulus), 64, 0, 2},
{MODP_8192_BIT, group18_modulus, sizeof(group18_modulus), 64, 0, 2},
}; };
/** /**
@@ -318,18 +310,24 @@ static diffie_hellman_params_t dh_params[] = {
diffie_hellman_params_t *diffie_hellman_get_params(diffie_hellman_group_t group) diffie_hellman_params_t *diffie_hellman_get_params(diffie_hellman_group_t group)
{ {
int i; int i;
for (i = 0; i < countof(dh_params); i++) for (i = 0; i < countof(dh_params); i++)
{ {
if (dh_params[i].group == group) if (dh_params[i].group == group)
{ {
if (!dh_params[i].exp_len) if (!dh_params[i].public.exp_len)
{ {
bool ansi_x9_42 = lib->settings->get_int(lib->settings, if (lib->settings->get_int(lib->settings,
"libstrongswan.dh_exponent_ansi_x9_42", TRUE); "libstrongswan.dh_exponent_ansi_x9_42", TRUE))
dh_params[i].exp_len = ansi_x9_42 ? dh_params[i].prime_len {
: dh_params[i].opt_exp_len; dh_params[i].public.exp_len = dh_params[i].public.prime.len;
} }
return &dh_params[i]; else
{
dh_params[i].public.exp_len = dh_params[i].opt_exp;
}
}
return &dh_params[i].public;
} }
} }
return NULL; return NULL;
+5 -20
View File
@@ -112,36 +112,21 @@ struct diffie_hellman_t {
* Parameters for a specific diffie hellman group. * Parameters for a specific diffie hellman group.
*/ */
struct diffie_hellman_params_t { struct diffie_hellman_params_t {
/**
* DH group.
*/
diffie_hellman_group_t group;
/** /**
* The prime as byte array. * The prime of the group
*/ */
const u_int8_t *prime; const chunk_t prime;
/** /**
* Length of the prime (in bytes). * Generator of the group
*/ */
size_t prime_len; const chunk_t generator;
/** /**
* Optimal length of the exponent (in bytes), as specified in RFC 3526. * Exponent length to use
*/
size_t opt_exp_len;
/**
* Length of the exponent (in bytes) that should be used, depending on
* the dh_exponent_ansi_x9_42 setting in strongswan.conf.
*/ */
size_t exp_len; size_t exp_len;
/**
* Generator.
*/
u_int16_t generator;
}; };
/** /**
+12 -3
View File
@@ -203,15 +203,24 @@ gcrypt_dh_t *gcrypt_dh_create(diffie_hellman_group_t group)
this->public.dh.destroy = (void (*)(diffie_hellman_t *)) destroy; this->public.dh.destroy = (void (*)(diffie_hellman_t *)) destroy;
this->group = group; this->group = group;
this->p_len = params->prime_len; this->p_len = params->prime.len;
err = gcry_mpi_scan(&this->p, GCRYMPI_FMT_USG, err = gcry_mpi_scan(&this->p, GCRYMPI_FMT_USG,
params->prime, params->prime_len, NULL); params->prime.ptr, params->prime.len, NULL);
if (err) if (err)
{ {
DBG1(DBG_LIB, "importing mpi modulus failed: %s", gpg_strerror(err)); DBG1(DBG_LIB, "importing mpi modulus failed: %s", gpg_strerror(err));
free(this); free(this);
return NULL; return NULL;
} }
err = gcry_mpi_scan(&this->g, GCRYMPI_FMT_USG,
params->generator.ptr, params->generator.len, NULL);
if (err)
{
DBG1(DBG_LIB, "importing mpi generator failed: %s", gpg_strerror(err));
gcry_mpi_release(this->p);
free(this);
return NULL;
}
rng = lib->crypto->create_rng(lib->crypto, RNG_STRONG); rng = lib->crypto->create_rng(lib->crypto, RNG_STRONG);
if (rng) if (rng)
@@ -225,6 +234,7 @@ gcrypt_dh_t *gcrypt_dh_create(diffie_hellman_group_t group)
{ {
DBG1(DBG_LIB, "importing mpi xa failed: %s", gpg_strerror(err)); DBG1(DBG_LIB, "importing mpi xa failed: %s", gpg_strerror(err));
gcry_mpi_release(this->p); gcry_mpi_release(this->p);
gcry_mpi_release(this->g);
free(this); free(this);
return NULL; return NULL;
} }
@@ -240,7 +250,6 @@ gcrypt_dh_t *gcrypt_dh_create(diffie_hellman_group_t group)
gcry_mpi_clear_bit(this->xa, params->exp_len * 8 - 1); gcry_mpi_clear_bit(this->xa, params->exp_len * 8 - 1);
} }
this->g = gcry_mpi_set_ui(NULL, params->generator);
this->ya = gcry_mpi_new(this->p_len * 8); this->ya = gcry_mpi_new(this->p_len * 8);
this->yb = NULL; this->yb = NULL;
this->zz = NULL; this->zz = NULL;
@@ -194,11 +194,19 @@ static void destroy(private_gmp_diffie_hellman_t *this)
*/ */
gmp_diffie_hellman_t *gmp_diffie_hellman_create(diffie_hellman_group_t group) gmp_diffie_hellman_t *gmp_diffie_hellman_create(diffie_hellman_group_t group)
{ {
private_gmp_diffie_hellman_t *this = malloc_thing(private_gmp_diffie_hellman_t); private_gmp_diffie_hellman_t *this;
diffie_hellman_params_t *params; diffie_hellman_params_t *params;
rng_t *rng; rng_t *rng;
chunk_t random; chunk_t random;
params = diffie_hellman_get_params(group);
if (!params)
{
return NULL;
}
this = malloc_thing(private_gmp_diffie_hellman_t);
/* public functions */ /* public functions */
this->public.dh.get_shared_secret = (status_t (*)(diffie_hellman_t *, chunk_t *)) get_shared_secret; this->public.dh.get_shared_secret = (status_t (*)(diffie_hellman_t *, chunk_t *)) get_shared_secret;
this->public.dh.set_other_public_value = (void (*)(diffie_hellman_t *, chunk_t )) set_other_public_value; this->public.dh.set_other_public_value = (void (*)(diffie_hellman_t *, chunk_t )) set_other_public_value;
@@ -216,16 +224,9 @@ gmp_diffie_hellman_t *gmp_diffie_hellman_create(diffie_hellman_group_t group)
mpz_init(this->g); mpz_init(this->g);
this->computed = FALSE; this->computed = FALSE;
this->p_len = params->prime.len;
params = diffie_hellman_get_params(this->group); mpz_import(this->p, params->prime.len, 1, 1, 1, 0, params->prime.ptr);
if (!params) mpz_import(this->g, params->generator.len, 1, 1, 1, 0, params->generator.ptr);
{
destroy(this);
return NULL;
}
mpz_import(this->p, params->prime_len, 1, 1, 1, 0, params->prime);
this->p_len = params->prime_len;
mpz_set_ui(this->g, params->generator);
rng = lib->crypto->create_rng(lib->crypto, RNG_STRONG); rng = lib->crypto->create_rng(lib->crypto, RNG_STRONG);
if (!rng) if (!rng)
@@ -128,10 +128,9 @@ static status_t set_modulus(private_openssl_diffie_hellman_t *this)
{ {
return NOT_FOUND; return NOT_FOUND;
} }
this->dh->p = BN_bin2bn(params->prime, params->prime_len, NULL); this->dh->p = BN_bin2bn(params->prime.ptr, params->prime.len, NULL);
this->dh->g = BN_new(); this->dh->g = BN_bin2bn(params->generator.ptr, params->generator.len, NULL);
BN_set_word(this->dh->g, params->generator); if (params->exp_len != params->prime.len)
if (params->exp_len != params->prime_len)
{ {
this->dh->length = params->exp_len * 8; this->dh->length = params->exp_len * 8;
} }