]>
Commit | Line | Data |
---|---|---|
99400f97 JH |
1 | /** |
2 | * @file diffie_hellman.c | |
3 | * | |
78f837b0 | 4 | * @brief Implementation of diffie_hellman_t. |
99400f97 JH |
5 | * |
6 | */ | |
7 | ||
8 | /* | |
9 | * Copyright (C) 1998-2002 D. Hugh Redelmeier. | |
10 | * Copyright (C) 1999, 2000, 2001 Henry Spencer. | |
11 | * Copyright (C) 2005 Jan Hutter, Martin Willi | |
12 | * Hochschule fuer Technik Rapperswil | |
13 | * | |
14 | * This program is free software; you can redistribute it and/or modify it | |
15 | * under the terms of the GNU General Public License as published by the | |
16 | * Free Software Foundation; either version 2 of the License, or (at your | |
17 | * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. | |
18 | * | |
19 | * This program is distributed in the hope that it will be useful, but | |
20 | * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | |
21 | * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
22 | * for more details. | |
23 | */ | |
24 | ||
25 | #include <gmp.h> | |
6f17c7d6 | 26 | #include <stdio.h> |
99400f97 JH |
27 | |
28 | #include "diffie_hellman.h" | |
29 | ||
8ff8c33d | 30 | #include <daemon.h> |
021c2322 | 31 | #include <utils/randomizer.h> |
99400f97 JH |
32 | |
33 | ||
8277be60 | 34 | /** |
78f837b0 | 35 | * String mappings for diffie_hellman_group_t. |
8277be60 MW |
36 | */ |
37 | mapping_t diffie_hellman_group_m[] = { | |
38 | {MODP_UNDEFINED, "MODP_UNDEFINED"}, | |
39 | {MODP_768_BIT, "MODP_768_BIT"}, | |
40 | {MODP_1024_BIT, "MODP_1024_BIT"}, | |
41 | {MODP_1536_BIT, "MODP_1536_BIT"}, | |
42 | {MODP_2048_BIT, "MODP_2048_BIT"}, | |
43 | {MODP_3072_BIT, "MODP_3072_BIT"}, | |
44 | {MODP_4096_BIT, "MODP_4096_BIT"}, | |
45 | {MODP_6144_BIT, "MODP_6144_BIT"}, | |
46 | {MODP_8192_BIT, "MODP_8192_BIT"}, | |
47 | {MAPPING_END, NULL} | |
48 | }; | |
49 | ||
50 | ||
99400f97 | 51 | /** |
78f837b0 | 52 | * Modulus of Group 1 (MODP_768_BIT). |
99400f97 JH |
53 | */ |
54 | static u_int8_t group1_modulus[] = { | |
55 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, | |
56 | 0xC4,0xC6,0x62,0x8B,0x80 ,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, | |
57 | 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, | |
58 | 0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,0xF2,0x5F,0x14,0x37, | |
59 | 0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6, | |
60 | 0xF4,0x4C,0x42,0xE9,0xA6,0x3A,0x36,0x20,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF | |
61 | }; | |
62 | ||
6f17c7d6 | 63 | /** |
78f837b0 | 64 | * Modulus of Group 2 (MODP_1024_BIT). |
6f17c7d6 JH |
65 | */ |
66 | static u_int8_t group2_modulus[] = { | |
67 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, | |
68 | 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, | |
69 | 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, | |
70 | 0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,0xF2,0x5F,0x14,0x37, | |
71 | 0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6, | |
72 | 0xF4,0x4C,0x42,0xE9,0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED, | |
73 | 0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,0x7C,0x4B,0x1F,0xE6, | |
74 | 0x49,0x28,0x66,0x51,0xEC,0xE6,0x53,0x81,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF | |
75 | }; | |
76 | ||
77 | /** | |
78f837b0 | 78 | * Modulus of Group 5 (MODP_1536_BIT). |
6f17c7d6 JH |
79 | */ |
80 | static u_int8_t group5_modulus[] = { | |
81 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, | |
82 | 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, | |
83 | 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, | |
84 | 0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,0xF2,0x5F,0x14,0x37, | |
85 | 0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6, | |
86 | 0xF4,0x4C,0x42,0xE9,0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED, | |
87 | 0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,0x7C,0x4B,0x1F,0xE6, | |
88 | 0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D,0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05, | |
89 | 0x98,0xDA,0x48,0x36,0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F, | |
90 | 0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,0x20,0x85,0x52,0xBB, | |
91 | 0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04, | |
92 | 0xF1,0x74,0x6C,0x08,0xCA,0x23,0x73,0x27,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF | |
93 | }; | |
94 | /** | |
78f837b0 | 95 | * Modulus of Group 14 (MODP_2048_BIT). |
6f17c7d6 JH |
96 | */ |
97 | static u_int8_t group14_modulus[] = { | |
98 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, | |
99 | 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, | |
100 | 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, | |
101 | 0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,0xF2,0x5F,0x14,0x37, | |
102 | 0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6, | |
103 | 0xF4,0x4C,0x42,0xE9,0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED, | |
104 | 0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,0x7C,0x4B,0x1F,0xE6, | |
105 | 0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D,0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05, | |
106 | 0x98,0xDA,0x48,0x36,0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F, | |
107 | 0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,0x20,0x85,0x52,0xBB, | |
108 | 0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04, | |
109 | 0xF1,0x74,0x6C,0x08,0xCA,0x18,0x21,0x7C,0x32,0x90,0x5E,0x46,0x2E,0x36,0xCE,0x3B, | |
110 | 0xE3,0x9E,0x77,0x2C,0x18,0x0E,0x86,0x03,0x9B,0x27,0x83,0xA2,0xEC,0x07,0xA2,0x8F, | |
111 | 0xB5,0xC5,0x5D,0xF0,0x6F,0x4C,0x52,0xC9,0xDE,0x2B,0xCB,0xF6,0x95,0x58,0x17,0x18, | |
112 | 0x39,0x95,0x49,0x7C,0xEA,0x95,0x6A,0xE5,0x15,0xD2,0x26,0x18,0x98,0xFA,0x05,0x10, | |
113 | 0x15,0x72,0x8E,0x5A,0x8A,0xAC,0xAA,0x68,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF | |
114 | }; | |
115 | ||
116 | /** | |
78f837b0 | 117 | * Modulus of Group 15 (MODP_3072_BIT). |
6f17c7d6 JH |
118 | */ |
119 | static u_int8_t group15_modulus[] = { | |
120 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, | |
121 | 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, | |
122 | 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, | |
123 | 0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,0xF2,0x5F,0x14,0x37, | |
124 | 0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6, | |
125 | 0xF4,0x4C,0x42,0xE9,0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED, | |
126 | 0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,0x7C,0x4B,0x1F,0xE6, | |
127 | 0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D,0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05, | |
128 | 0x98,0xDA,0x48,0x36,0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F, | |
129 | 0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,0x20,0x85,0x52,0xBB, | |
130 | 0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04, | |
131 | 0xF1,0x74,0x6C,0x08,0xCA,0x18,0x21,0x7C,0x32,0x90,0x5E,0x46,0x2E,0x36,0xCE,0x3B, | |
132 | 0xE3,0x9E,0x77,0x2C,0x18,0x0E,0x86,0x03,0x9B,0x27,0x83,0xA2,0xEC,0x07,0xA2,0x8F, | |
133 | 0xB5,0xC5,0x5D,0xF0,0x6F,0x4C,0x52,0xC9,0xDE,0x2B,0xCB,0xF6,0x95,0x58,0x17,0x18, | |
134 | 0x39,0x95,0x49,0x7C,0xEA,0x95,0x6A,0xE5,0x15,0xD2,0x26,0x18,0x98,0xFA,0x05,0x10, | |
135 | 0x15,0x72,0x8E,0x5A,0x8A,0xAA,0xC4,0x2D,0xAD,0x33,0x17,0x0D,0x04,0x50,0x7A,0x33, | |
136 | 0xA8,0x55,0x21,0xAB,0xDF,0x1C,0xBA,0x64,0xEC,0xFB,0x85,0x04,0x58,0xDB,0xEF,0x0A, | |
137 | 0x8A,0xEA,0x71,0x57,0x5D,0x06,0x0C,0x7D,0xB3,0x97,0x0F,0x85,0xA6,0xE1,0xE4,0xC7, | |
138 | 0xAB,0xF5,0xAE,0x8C,0xDB,0x09,0x33,0xD7,0x1E,0x8C,0x94,0xE0,0x4A,0x25,0x61,0x9D, | |
139 | 0xCE,0xE3,0xD2,0x26,0x1A,0xD2,0xEE,0x6B,0xF1,0x2F,0xFA,0x06,0xD9,0x8A,0x08,0x64, | |
140 | 0xD8,0x76,0x02,0x73,0x3E,0xC8,0x6A,0x64,0x52,0x1F,0x2B,0x18,0x17,0x7B,0x20,0x0C, | |
141 | 0xBB,0xE1,0x17,0x57,0x7A,0x61,0x5D,0x6C,0x77,0x09,0x88,0xC0,0xBA,0xD9,0x46,0xE2, | |
142 | 0x08,0xE2,0x4F,0xA0,0x74,0xE5,0xAB,0x31,0x43,0xDB,0x5B,0xFC,0xE0,0xFD,0x10,0x8E, | |
143 | 0x4B,0x82,0xD1,0x20,0xA9,0x3A,0xD2,0xCA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF | |
144 | }; | |
145 | ||
146 | /** | |
78f837b0 | 147 | * Modulus of Group 16 (MODP_4096_BIT). |
6f17c7d6 JH |
148 | */ |
149 | static u_int8_t group16_modulus[] = { | |
150 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, | |
151 | 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, | |
152 | 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, | |
153 | 0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,0xF2,0x5F,0x14,0x37, | |
154 | 0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6, | |
155 | 0xF4,0x4C,0x42,0xE9,0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED, | |
156 | 0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,0x7C,0x4B,0x1F,0xE6, | |
157 | 0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D,0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05, | |
158 | 0x98,0xDA,0x48,0x36,0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F, | |
159 | 0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,0x20,0x85,0x52,0xBB, | |
160 | 0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04, | |
161 | 0xF1,0x74,0x6C,0x08,0xCA,0x18,0x21,0x7C,0x32,0x90,0x5E,0x46,0x2E,0x36,0xCE,0x3B, | |
162 | 0xE3,0x9E,0x77,0x2C,0x18,0x0E,0x86,0x03,0x9B,0x27,0x83,0xA2,0xEC,0x07,0xA2,0x8F, | |
163 | 0xB5,0xC5,0x5D,0xF0,0x6F,0x4C,0x52,0xC9,0xDE,0x2B,0xCB,0xF6,0x95,0x58,0x17,0x18, | |
164 | 0x39,0x95,0x49,0x7C,0xEA,0x95,0x6A,0xE5,0x15,0xD2,0x26,0x18,0x98,0xFA,0x05,0x10, | |
165 | 0x15,0x72,0x8E,0x5A,0x8A,0xAA,0xC4,0x2D,0xAD,0x33,0x17,0x0D,0x04,0x50,0x7A,0x33, | |
166 | 0xA8,0x55,0x21,0xAB,0xDF,0x1C,0xBA,0x64,0xEC,0xFB,0x85,0x04,0x58,0xDB,0xEF,0x0A, | |
167 | 0x8A,0xEA,0x71,0x57,0x5D,0x06,0x0C,0x7D,0xB3,0x97,0x0F,0x85,0xA6,0xE1,0xE4,0xC7, | |
168 | 0xAB,0xF5,0xAE,0x8C,0xDB,0x09,0x33,0xD7,0x1E,0x8C,0x94,0xE0,0x4A,0x25,0x61,0x9D, | |
169 | 0xCE,0xE3,0xD2,0x26,0x1A,0xD2,0xEE,0x6B,0xF1,0x2F,0xFA,0x06,0xD9,0x8A,0x08,0x64, | |
170 | 0xD8,0x76,0x02,0x73,0x3E,0xC8,0x6A,0x64,0x52,0x1F,0x2B,0x18,0x17,0x7B,0x20,0x0C, | |
171 | 0xBB,0xE1,0x17,0x57,0x7A,0x61,0x5D,0x6C,0x77,0x09,0x88,0xC0,0xBA,0xD9,0x46,0xE2, | |
172 | 0x08,0xE2,0x4F,0xA0,0x74,0xE5,0xAB,0x31,0x43,0xDB,0x5B,0xFC,0xE0,0xFD,0x10,0x8E, | |
173 | 0x4B,0x82,0xD1,0x20,0xA9,0x21,0x08,0x01,0x1A,0x72,0x3C,0x12,0xA7,0x87,0xE6,0xD7, | |
174 | 0x88,0x71,0x9A,0x10,0xBD,0xBA,0x5B,0x26,0x99,0xC3,0x27,0x18,0x6A,0xF4,0xE2,0x3C, | |
175 | 0x1A,0x94,0x68,0x34,0xB6,0x15,0x0B,0xDA,0x25,0x83,0xE9,0xCA,0x2A,0xD4,0x4C,0xE8, | |
176 | 0xDB,0xBB,0xC2,0xDB,0x04,0xDE,0x8E,0xF9,0x2E,0x8E,0xFC,0x14,0x1F,0xBE,0xCA,0xA6, | |
177 | 0x28,0x7C,0x59,0x47,0x4E,0x6B,0xC0,0x5D,0x99,0xB2,0x96,0x4F,0xA0,0x90,0xC3,0xA2, | |
178 | 0x23,0x3B,0xA1,0x86,0x51,0x5B,0xE7,0xED,0x1F,0x61,0x29,0x70,0xCE,0xE2,0xD7,0xAF, | |
179 | 0xB8,0x1B,0xDD,0x76,0x21,0x70,0x48,0x1C,0xD0,0x06,0x91,0x27,0xD5,0xB0,0x5A,0xA9, | |
180 | 0x93,0xB4,0xEA,0x98,0x8D,0x8F,0xDD,0xC1,0x86,0xFF,0xB7,0xDC,0x90,0xA6,0xC0,0x8F, | |
181 | 0x4D,0xF4,0x35,0xC9,0x34,0x06,0x31,0x99,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF | |
182 | }; | |
183 | ||
184 | /** | |
78f837b0 | 185 | * Modulus of Group 17 (MODP_6144_BIT). |
6f17c7d6 JH |
186 | */ |
187 | static u_int8_t group17_modulus[] = { | |
188 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, | |
189 | 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, | |
190 | 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, | |
191 | 0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,0xF2,0x5F,0x14,0x37, | |
192 | 0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6, | |
193 | 0xF4,0x4C,0x42,0xE9,0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED, | |
194 | 0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,0x7C,0x4B,0x1F,0xE6, | |
195 | 0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D,0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05, | |
196 | 0x98,0xDA,0x48,0x36,0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F, | |
197 | 0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,0x20,0x85,0x52,0xBB, | |
198 | 0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04, | |
199 | 0xF1,0x74,0x6C,0x08,0xCA,0x18,0x21,0x7C,0x32,0x90,0x5E,0x46,0x2E,0x36,0xCE,0x3B, | |
200 | 0xE3,0x9E,0x77,0x2C,0x18,0x0E,0x86,0x03,0x9B,0x27,0x83,0xA2,0xEC,0x07,0xA2,0x8F, | |
201 | 0xB5,0xC5,0x5D,0xF0,0x6F,0x4C,0x52,0xC9,0xDE,0x2B,0xCB,0xF6,0x95,0x58,0x17,0x18, | |
202 | 0x39,0x95,0x49,0x7C,0xEA,0x95,0x6A,0xE5,0x15,0xD2,0x26,0x18,0x98,0xFA,0x05,0x10, | |
203 | 0x15,0x72,0x8E,0x5A,0x8A,0xAA,0xC4,0x2D,0xAD,0x33,0x17,0x0D,0x04,0x50,0x7A,0x33, | |
204 | 0xA8,0x55,0x21,0xAB,0xDF,0x1C,0xBA,0x64,0xEC,0xFB,0x85,0x04,0x58,0xDB,0xEF,0x0A, | |
205 | 0x8A,0xEA,0x71,0x57,0x5D,0x06,0x0C,0x7D,0xB3,0x97,0x0F,0x85,0xA6,0xE1,0xE4,0xC7, | |
206 | 0xAB,0xF5,0xAE,0x8C,0xDB,0x09,0x33,0xD7,0x1E,0x8C,0x94,0xE0,0x4A,0x25,0x61,0x9D, | |
207 | 0xCE,0xE3,0xD2,0x26,0x1A,0xD2,0xEE,0x6B,0xF1,0x2F,0xFA,0x06,0xD9,0x8A,0x08,0x64, | |
208 | 0xD8,0x76,0x02,0x73,0x3E,0xC8,0x6A,0x64,0x52,0x1F,0x2B,0x18,0x17,0x7B,0x20,0x0C, | |
209 | 0xBB,0xE1,0x17,0x57,0x7A,0x61,0x5D,0x6C,0x77,0x09,0x88,0xC0,0xBA,0xD9,0x46,0xE2, | |
210 | 0x08,0xE2,0x4F,0xA0,0x74,0xE5,0xAB,0x31,0x43,0xDB,0x5B,0xFC,0xE0,0xFD,0x10,0x8E, | |
211 | 0x4B,0x82,0xD1,0x20,0xA9,0x21,0x08,0x01,0x1A,0x72,0x3C,0x12,0xA7,0x87,0xE6,0xD7, | |
212 | 0x88,0x71,0x9A,0x10,0xBD,0xBA,0x5B,0x26,0x99,0xC3,0x27,0x18,0x6A,0xF4,0xE2,0x3C, | |
213 | 0x1A,0x94,0x68,0x34,0xB6,0x15,0x0B,0xDA,0x25,0x83,0xE9,0xCA,0x2A,0xD4,0x4C,0xE8, | |
214 | 0xDB,0xBB,0xC2,0xDB,0x04,0xDE,0x8E,0xF9,0x2E,0x8E,0xFC,0x14,0x1F,0xBE,0xCA,0xA6, | |
215 | 0x28,0x7C,0x59,0x47,0x4E,0x6B,0xC0,0x5D,0x99,0xB2,0x96,0x4F,0xA0,0x90,0xC3,0xA2, | |
216 | 0x23,0x3B,0xA1,0x86,0x51,0x5B,0xE7,0xED,0x1F,0x61,0x29,0x70,0xCE,0xE2,0xD7,0xAF, | |
217 | 0xB8,0x1B,0xDD,0x76,0x21,0x70,0x48,0x1C,0xD0,0x06,0x91,0x27,0xD5,0xB0,0x5A,0xA9, | |
218 | 0x93,0xB4,0xEA,0x98,0x8D,0x8F,0xDD,0xC1,0x86,0xFF,0xB7,0xDC,0x90,0xA6,0xC0,0x8F, | |
219 | 0x4D,0xF4,0x35,0xC9,0x34,0x02,0x84,0x92,0x36,0xC3,0xFA,0xB4,0xD2,0x7C,0x70,0x26, | |
220 | 0xC1,0xD4,0xDC,0xB2,0x60,0x26,0x46,0xDE,0xC9,0x75,0x1E,0x76,0x3D,0xBA,0x37,0xBD, | |
221 | 0xF8,0xFF,0x94,0x06,0xAD,0x9E,0x53,0x0E,0xE5,0xDB,0x38,0x2F,0x41,0x30,0x01,0xAE, | |
222 | 0xB0,0x6A,0x53,0xED,0x90,0x27,0xD8,0x31,0x17,0x97,0x27,0xB0,0x86,0x5A,0x89,0x18, | |
223 | 0xDA,0x3E,0xDB,0xEB,0xCF,0x9B,0x14,0xED,0x44,0xCE,0x6C,0xBA,0xCE,0xD4,0xBB,0x1B, | |
224 | 0xDB,0x7F,0x14,0x47,0xE6,0xCC,0x25,0x4B,0x33,0x20,0x51,0x51,0x2B,0xD7,0xAF,0x42, | |
225 | 0x6F,0xB8,0xF4,0x01,0x37,0x8C,0xD2,0xBF,0x59,0x83,0xCA,0x01,0xC6,0x4B,0x92,0xEC, | |
226 | 0xF0,0x32,0xEA,0x15,0xD1,0x72,0x1D,0x03,0xF4,0x82,0xD7,0xCE,0x6E,0x74,0xFE,0xF6, | |
227 | 0xD5,0x5E,0x70,0x2F,0x46,0x98,0x0C,0x82,0xB5,0xA8,0x40,0x31,0x90,0x0B,0x1C,0x9E, | |
228 | 0x59,0xE7,0xC9,0x7F,0xBE,0xC7,0xE8,0xF3,0x23,0xA9,0x7A,0x7E,0x36,0xCC,0x88,0xBE, | |
229 | 0x0F,0x1D,0x45,0xB7,0xFF,0x58,0x5A,0xC5,0x4B,0xD4,0x07,0xB2,0x2B,0x41,0x54,0xAA, | |
230 | 0xCC,0x8F,0x6D,0x7E,0xBF,0x48,0xE1,0xD8,0x14,0xCC,0x5E,0xD2,0x0F,0x80,0x37,0xE0, | |
231 | 0xA7,0x97,0x15,0xEE,0xF2,0x9B,0xE3,0x28,0x06,0xA1,0xD5,0x8B,0xB7,0xC5,0xDA,0x76, | |
232 | 0xF5,0x50,0xAA,0x3D,0x8A,0x1F,0xBF,0xF0,0xEB,0x19,0xCC,0xB1,0xA3,0x13,0xD5,0x5C, | |
233 | 0xDA,0x56,0xC9,0xEC,0x2E,0xF2,0x96,0x32,0x38,0x7F,0xE8,0xD7,0x6E,0x3C,0x04,0x68, | |
234 | 0x04,0x3E,0x8F,0x66,0x3F,0x48,0x60,0xEE,0x12,0xBF,0x2D,0x5B,0x0B,0x74,0x74,0xD6, | |
235 | 0xE6,0x94,0xF9,0x1E,0x6D,0xCC,0x40,0x24,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF | |
236 | }; | |
237 | ||
238 | /** | |
78f837b0 | 239 | * Modulus of Group 18 (MODP_8192_BIT). |
6f17c7d6 JH |
240 | */ |
241 | static u_int8_t group18_modulus[] = { | |
242 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34, | |
243 | 0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74, | |
244 | 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, | |
245 | 0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D,0xF2,0x5F,0x14,0x37, | |
246 | 0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6, | |
247 | 0xF4,0x4C,0x42,0xE9,0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED, | |
248 | 0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11,0x7C,0x4B,0x1F,0xE6, | |
249 | 0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D,0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05, | |
250 | 0x98,0xDA,0x48,0x36,0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F, | |
251 | 0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56,0x20,0x85,0x52,0xBB, | |
252 | 0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D,0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04, | |
253 | 0xF1,0x74,0x6C,0x08,0xCA,0x18,0x21,0x7C,0x32,0x90,0x5E,0x46,0x2E,0x36,0xCE,0x3B, | |
254 | 0xE3,0x9E,0x77,0x2C,0x18,0x0E,0x86,0x03,0x9B,0x27,0x83,0xA2,0xEC,0x07,0xA2,0x8F, | |
255 | 0xB5,0xC5,0x5D,0xF0,0x6F,0x4C,0x52,0xC9,0xDE,0x2B,0xCB,0xF6,0x95,0x58,0x17,0x18, | |
256 | 0x39,0x95,0x49,0x7C,0xEA,0x95,0x6A,0xE5,0x15,0xD2,0x26,0x18,0x98,0xFA,0x05,0x10, | |
257 | 0x15,0x72,0x8E,0x5A,0x8A,0xAA,0xC4,0x2D,0xAD,0x33,0x17,0x0D,0x04,0x50,0x7A,0x33, | |
258 | 0xA8,0x55,0x21,0xAB,0xDF,0x1C,0xBA,0x64,0xEC,0xFB,0x85,0x04,0x58,0xDB,0xEF,0x0A, | |
259 | 0x8A,0xEA,0x71,0x57,0x5D,0x06,0x0C,0x7D,0xB3,0x97,0x0F,0x85,0xA6,0xE1,0xE4,0xC7, | |
260 | 0xAB,0xF5,0xAE,0x8C,0xDB,0x09,0x33,0xD7,0x1E,0x8C,0x94,0xE0,0x4A,0x25,0x61,0x9D, | |
261 | 0xCE,0xE3,0xD2,0x26,0x1A,0xD2,0xEE,0x6B,0xF1,0x2F,0xFA,0x06,0xD9,0x8A,0x08,0x64, | |
262 | 0xD8,0x76,0x02,0x73,0x3E,0xC8,0x6A,0x64,0x52,0x1F,0x2B,0x18,0x17,0x7B,0x20,0x0C, | |
263 | 0xBB,0xE1,0x17,0x57,0x7A,0x61,0x5D,0x6C,0x77,0x09,0x88,0xC0,0xBA,0xD9,0x46,0xE2, | |
264 | 0x08,0xE2,0x4F,0xA0,0x74,0xE5,0xAB,0x31,0x43,0xDB,0x5B,0xFC,0xE0,0xFD,0x10,0x8E, | |
265 | 0x4B,0x82,0xD1,0x20,0xA9,0x21,0x08,0x01,0x1A,0x72,0x3C,0x12,0xA7,0x87,0xE6,0xD7, | |
266 | 0x88,0x71,0x9A,0x10,0xBD,0xBA,0x5B,0x26,0x99,0xC3,0x27,0x18,0x6A,0xF4,0xE2,0x3C, | |
267 | 0x1A,0x94,0x68,0x34,0xB6,0x15,0x0B,0xDA,0x25,0x83,0xE9,0xCA,0x2A,0xD4,0x4C,0xE8, | |
268 | 0xDB,0xBB,0xC2,0xDB,0x04,0xDE,0x8E,0xF9,0x2E,0x8E,0xFC,0x14,0x1F,0xBE,0xCA,0xA6, | |
269 | 0x28,0x7C,0x59,0x47,0x4E,0x6B,0xC0,0x5D,0x99,0xB2,0x96,0x4F,0xA0,0x90,0xC3,0xA2, | |
270 | 0x23,0x3B,0xA1,0x86,0x51,0x5B,0xE7,0xED,0x1F,0x61,0x29,0x70,0xCE,0xE2,0xD7,0xAF, | |
271 | 0xB8,0x1B,0xDD,0x76,0x21,0x70,0x48,0x1C,0xD0,0x06,0x91,0x27,0xD5,0xB0,0x5A,0xA9, | |
272 | 0x93,0xB4,0xEA,0x98,0x8D,0x8F,0xDD,0xC1,0x86,0xFF,0xB7,0xDC,0x90,0xA6,0xC0,0x8F, | |
273 | 0x4D,0xF4,0x35,0xC9,0x34,0x02,0x84,0x92,0x36,0xC3,0xFA,0xB4,0xD2,0x7C,0x70,0x26, | |
274 | 0xC1,0xD4,0xDC,0xB2,0x60,0x26,0x46,0xDE,0xC9,0x75,0x1E,0x76,0x3D,0xBA,0x37,0xBD, | |
275 | 0xF8,0xFF,0x94,0x06,0xAD,0x9E,0x53,0x0E,0xE5,0xDB,0x38,0x2F,0x41,0x30,0x01,0xAE, | |
276 | 0xB0,0x6A,0x53,0xED,0x90,0x27,0xD8,0x31,0x17,0x97,0x27,0xB0,0x86,0x5A,0x89,0x18, | |
277 | 0xDA,0x3E,0xDB,0xEB,0xCF,0x9B,0x14,0xED,0x44,0xCE,0x6C,0xBA,0xCE,0xD4,0xBB,0x1B, | |
278 | 0xDB,0x7F,0x14,0x47,0xE6,0xCC,0x25,0x4B,0x33,0x20,0x51,0x51,0x2B,0xD7,0xAF,0x42, | |
279 | 0x6F,0xB8,0xF4,0x01,0x37,0x8C,0xD2,0xBF,0x59,0x83,0xCA,0x01,0xC6,0x4B,0x92,0xEC, | |
280 | 0xF0,0x32,0xEA,0x15,0xD1,0x72,0x1D,0x03,0xF4,0x82,0xD7,0xCE,0x6E,0x74,0xFE,0xF6, | |
281 | 0xD5,0x5E,0x70,0x2F,0x46,0x98,0x0C,0x82,0xB5,0xA8,0x40,0x31,0x90,0x0B,0x1C,0x9E, | |
282 | 0x59,0xE7,0xC9,0x7F,0xBE,0xC7,0xE8,0xF3,0x23,0xA9,0x7A,0x7E,0x36,0xCC,0x88,0xBE, | |
283 | 0x0F,0x1D,0x45,0xB7,0xFF,0x58,0x5A,0xC5,0x4B,0xD4,0x07,0xB2,0x2B,0x41,0x54,0xAA, | |
284 | 0xCC,0x8F,0x6D,0x7E,0xBF,0x48,0xE1,0xD8,0x14,0xCC,0x5E,0xD2,0x0F,0x80,0x37,0xE0, | |
285 | 0xA7,0x97,0x15,0xEE,0xF2,0x9B,0xE3,0x28,0x06,0xA1,0xD5,0x8B,0xB7,0xC5,0xDA,0x76, | |
286 | 0xF5,0x50,0xAA,0x3D,0x8A,0x1F,0xBF,0xF0,0xEB,0x19,0xCC,0xB1,0xA3,0x13,0xD5,0x5C, | |
287 | 0xDA,0x56,0xC9,0xEC,0x2E,0xF2,0x96,0x32,0x38,0x7F,0xE8,0xD7,0x6E,0x3C,0x04,0x68, | |
288 | 0x04,0x3E,0x8F,0x66,0x3F,0x48,0x60,0xEE,0x12,0xBF,0x2D,0x5B,0x0B,0x74,0x74,0xD6, | |
289 | 0xE6,0x94,0xF9,0x1E,0x6D,0xBE,0x11,0x59,0x74,0xA3,0x92,0x6F,0x12,0xFE,0xE5,0xE4, | |
290 | 0x38,0x77,0x7C,0xB6,0xA9,0x32,0xDF,0x8C,0xD8,0xBE,0xC4,0xD0,0x73,0xB9,0x31,0xBA, | |
291 | 0x3B,0xC8,0x32,0xB6,0x8D,0x9D,0xD3,0x00,0x74,0x1F,0xA7,0xBF,0x8A,0xFC,0x47,0xED, | |
292 | 0x25,0x76,0xF6,0x93,0x6B,0xA4,0x24,0x66,0x3A,0xAB,0x63,0x9C,0x5A,0xE4,0xF5,0x68, | |
293 | 0x34,0x23,0xB4,0x74,0x2B,0xF1,0xC9,0x78,0x23,0x8F,0x16,0xCB,0xE3,0x9D,0x65,0x2D, | |
294 | 0xE3,0xFD,0xB8,0xBE,0xFC,0x84,0x8A,0xD9,0x22,0x22,0x2E,0x04,0xA4,0x03,0x7C,0x07, | |
295 | 0x13,0xEB,0x57,0xA8,0x1A,0x23,0xF0,0xC7,0x34,0x73,0xFC,0x64,0x6C,0xEA,0x30,0x6B, | |
296 | 0x4B,0xCB,0xC8,0x86,0x2F,0x83,0x85,0xDD,0xFA,0x9D,0x4B,0x7F,0xA2,0xC0,0x87,0xE8, | |
297 | 0x79,0x68,0x33,0x03,0xED,0x5B,0xDD,0x3A,0x06,0x2B,0x3C,0xF5,0xB3,0xA2,0x78,0xA6, | |
298 | 0x6D,0x2A,0x13,0xF8,0x3F,0x44,0xF8,0x2D,0xDF,0x31,0x0E,0xE0,0x74,0xAB,0x6A,0x36, | |
299 | 0x45,0x97,0xE8,0x99,0xA0,0x25,0x5D,0xC1,0x64,0xF3,0x1C,0xC5,0x08,0x46,0x85,0x1D, | |
300 | 0xF9,0xAB,0x48,0x19,0x5D,0xED,0x7E,0xA1,0xB1,0xD5,0x10,0xBD,0x7E,0xE7,0x4D,0x73, | |
301 | 0xFA,0xF3,0x6B,0xC3,0x1E,0xCF,0xA2,0x68,0x35,0x90,0x46,0xF4,0xEB,0x87,0x9F,0x92, | |
302 | 0x40,0x09,0x43,0x8B,0x48,0x1C,0x6C,0xD7,0x88,0x9A,0x00,0x2E,0xD5,0xEE,0x38,0x2B, | |
303 | 0xC9,0x19,0x0D,0xA6,0xFC,0x02,0x6E,0x47,0x95,0x58,0xE4,0x47,0x56,0x77,0xE9,0xAA, | |
304 | 0x9E,0x30,0x50,0xE2,0x76,0x56,0x94,0xDF,0xC8,0x1F,0x56,0xE8,0x80,0xB9,0x6E,0x71, | |
305 | 0x60,0xC9,0x80,0xDD,0x98,0xED,0xD3,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, | |
306 | }; | |
99400f97 | 307 | |
5796aa16 MW |
308 | typedef struct modulus_info_entry_t modulus_info_entry_t; |
309 | ||
99400f97 | 310 | /** |
78f837b0 | 311 | * Entry of the modulus list. |
99400f97 | 312 | */ |
5796aa16 | 313 | struct modulus_info_entry_t { |
99400f97 | 314 | /** |
1e7d52a6 | 315 | * Group number as it is defined in file transform_substructure.h. |
99400f97 JH |
316 | */ |
317 | diffie_hellman_group_t group; | |
318 | ||
319 | /** | |
1e7d52a6 | 320 | * Pointer to first byte of modulus (network order). |
99400f97 JH |
321 | */ |
322 | u_int8_t *modulus; | |
323 | ||
324 | /* | |
78f837b0 | 325 | * Length of modulus in bytes. |
99400f97 JH |
326 | */ |
327 | size_t modulus_length; | |
328 | ||
329 | /* | |
78f837b0 | 330 | * Generator value. |
99400f97 JH |
331 | */ |
332 | u_int16_t generator; | |
333 | }; | |
334 | ||
335 | ||
78f837b0 JH |
336 | /** |
337 | * All supported modulus values. | |
338 | */ | |
99400f97 JH |
339 | static modulus_info_entry_t modulus_info_entries[] = { |
340 | {MODP_768_BIT,group1_modulus,sizeof(group1_modulus),2}, | |
6f17c7d6 JH |
341 | {MODP_1024_BIT,group2_modulus,sizeof(group2_modulus),2}, |
342 | {MODP_1536_BIT,group5_modulus,sizeof(group5_modulus),2}, | |
343 | {MODP_2048_BIT,group14_modulus,sizeof(group14_modulus),2}, | |
344 | {MODP_3072_BIT,group15_modulus,sizeof(group15_modulus),2}, | |
345 | {MODP_4096_BIT,group16_modulus,sizeof(group16_modulus),2}, | |
346 | {MODP_6144_BIT,group17_modulus,sizeof(group17_modulus),2}, | |
347 | {MODP_8192_BIT,group18_modulus,sizeof(group18_modulus),2}, | |
99400f97 JH |
348 | }; |
349 | ||
5796aa16 MW |
350 | typedef struct private_diffie_hellman_t private_diffie_hellman_t; |
351 | ||
99400f97 JH |
352 | /** |
353 | * Private data of an diffie_hellman_t object. | |
354 | * | |
355 | */ | |
5796aa16 | 356 | struct private_diffie_hellman_t { |
99400f97 | 357 | /** |
78f837b0 | 358 | * Public diffie_hellman_t interface. |
99400f97 JH |
359 | */ |
360 | diffie_hellman_t public; | |
361 | ||
362 | /** | |
78f837b0 | 363 | * Diffie Hellman group number. |
99400f97 JH |
364 | */ |
365 | u_int16_t dh_group_number; | |
366 | ||
367 | /** | |
78f837b0 | 368 | * Modulus. |
99400f97 JH |
369 | */ |
370 | mpz_t modulus; | |
371 | ||
372 | /** | |
78f837b0 | 373 | * Modulus length. |
99400f97 JH |
374 | */ |
375 | size_t modulus_length; | |
376 | ||
377 | /* | |
78f837b0 | 378 | * Generator value. |
99400f97 JH |
379 | */ |
380 | u_int16_t generator; | |
381 | ||
382 | /** | |
0d43ad12 | 383 | * My private value . |
99400f97 | 384 | */ |
0d43ad12 | 385 | mpz_t my_private_value; |
99400f97 JH |
386 | |
387 | /** | |
78f837b0 | 388 | * My public value. |
99400f97 JH |
389 | */ |
390 | mpz_t my_public_value; | |
391 | ||
392 | /** | |
78f837b0 | 393 | * Other public value. |
99400f97 JH |
394 | */ |
395 | mpz_t other_public_value; | |
396 | ||
397 | /** | |
78f837b0 | 398 | * Shared secret. |
99400f97 JH |
399 | */ |
400 | mpz_t shared_secret; | |
401 | ||
402 | /** | |
78f837b0 | 403 | * True if shared secret is computed and stored in my_public_value. |
99400f97 JH |
404 | */ |
405 | bool shared_secret_is_computed; | |
99400f97 JH |
406 | |
407 | /** | |
78f837b0 | 408 | * Sets the modulus for a specific diffie hellman group. |
99400f97 JH |
409 | * |
410 | * @param this calling object | |
411 | * @return | |
412 | * SUCCESS if modulus could be found | |
413 | * NOT_FOUND if modulus not supported | |
414 | */ | |
415 | status_t (*set_modulus) (private_diffie_hellman_t *this); | |
416 | ||
417 | /** | |
78f837b0 | 418 | * Makes sure my public value is computed. |
99400f97 JH |
419 | * |
420 | * @param this calling object | |
421 | */ | |
422 | void (*compute_public_value) (private_diffie_hellman_t *this); | |
423 | ||
424 | /** | |
78f837b0 | 425 | * Computes shared secret (other public value must be available). |
99400f97 JH |
426 | * |
427 | * @param this calling object | |
428 | */ | |
429 | void (*compute_shared_secret) (private_diffie_hellman_t *this); | |
430 | }; | |
431 | ||
99400f97 | 432 | /** |
78f837b0 | 433 | * Implementation of private_diffie_hellman_t.set_modulus. |
99400f97 JH |
434 | */ |
435 | static status_t set_modulus(private_diffie_hellman_t *this) | |
436 | { | |
437 | int i; | |
438 | status_t status = NOT_FOUND; | |
439 | ||
440 | for (i = 0; i < (sizeof(modulus_info_entries) / sizeof(modulus_info_entry_t)); i++) | |
441 | { | |
442 | if (modulus_info_entries[i].group == this->dh_group_number) | |
443 | { | |
444 | chunk_t modulus_chunk; | |
445 | modulus_chunk.ptr = modulus_info_entries[i].modulus; | |
446 | modulus_chunk.len = modulus_info_entries[i].modulus_length; | |
8ff8c33d | 447 | mpz_import(this->modulus, modulus_chunk.len, 1, 1, 1, 0, modulus_chunk.ptr); |
99400f97 JH |
448 | this->modulus_length = modulus_chunk.len; |
449 | this->generator = modulus_info_entries[i].generator; | |
450 | status = SUCCESS; | |
451 | break; | |
452 | } | |
453 | } | |
454 | return status; | |
455 | } | |
456 | ||
457 | /** | |
d048df5c | 458 | * Implementation of diffie_hellman_t.set_other_public_value. |
99400f97 | 459 | */ |
d048df5c | 460 | static void set_other_public_value(private_diffie_hellman_t *this,chunk_t public_value) |
99400f97 | 461 | { |
8ff8c33d | 462 | mpz_import(this->other_public_value, public_value.len, 1, 1, 1, 0, public_value.ptr); |
d048df5c | 463 | this->compute_shared_secret(this); |
99400f97 JH |
464 | } |
465 | ||
466 | /** | |
78f837b0 | 467 | * Implementation of diffie_hellman_t.get_other_public_value. |
99400f97 JH |
468 | */ |
469 | static status_t get_other_public_value(private_diffie_hellman_t *this,chunk_t *public_value) | |
470 | { | |
471 | if (!this->shared_secret_is_computed) | |
472 | { | |
473 | return FAILED; | |
474 | } | |
8ff8c33d MW |
475 | public_value->len = this->modulus_length; |
476 | public_value->ptr = mpz_export(NULL, NULL, 1, public_value->len, 1, 0, this->other_public_value); | |
d048df5c | 477 | return SUCCESS; |
99400f97 JH |
478 | } |
479 | ||
480 | /** | |
78f837b0 | 481 | * Implementation of private_diffie_hellman_t.compute_shared_secret. |
99400f97 JH |
482 | */ |
483 | static void compute_shared_secret (private_diffie_hellman_t *this) | |
484 | { | |
485 | /* initialize my public value */ | |
486 | mpz_init(this->shared_secret); | |
487 | /* calculate my public value */ | |
0d43ad12 | 488 | mpz_powm(this->shared_secret,this->other_public_value,this->my_private_value,this->modulus); |
d048df5c | 489 | |
99400f97 JH |
490 | this->shared_secret_is_computed = TRUE; |
491 | } | |
492 | ||
99400f97 | 493 | /** |
78f837b0 | 494 | * Implementation of private_diffie_hellman_t.compute_public_value. |
99400f97 JH |
495 | */ |
496 | static void compute_public_value (private_diffie_hellman_t *this) | |
497 | { | |
498 | mpz_t generator; | |
499 | /* initialize generator and set it*/ | |
500 | mpz_init_set_ui (generator,this->generator); | |
501 | /* initialize my public value */ | |
502 | mpz_init(this->my_public_value); | |
503 | /* calculate my public value */ | |
0d43ad12 | 504 | mpz_powm(this->my_public_value,generator,this->my_private_value,this->modulus); |
99400f97 JH |
505 | /* generator not used anymore */ |
506 | mpz_clear(generator); | |
99400f97 JH |
507 | } |
508 | ||
509 | /** | |
78f837b0 | 510 | * Implementation of diffie_hellman_t.get_my_public_value. |
99400f97 | 511 | */ |
78f837b0 | 512 | static void get_my_public_value(private_diffie_hellman_t *this,chunk_t *public_value) |
99400f97 | 513 | { |
8ff8c33d MW |
514 | public_value->len = this->modulus_length; |
515 | public_value->ptr = mpz_export(NULL, NULL, 1, public_value->len, 1, 0, this->my_public_value); | |
99400f97 JH |
516 | } |
517 | ||
518 | /** | |
78f837b0 | 519 | * Implementation of diffie_hellman_t.get_shared_secret. |
99400f97 JH |
520 | */ |
521 | static status_t get_shared_secret(private_diffie_hellman_t *this,chunk_t *secret) | |
522 | { | |
523 | if (!this->shared_secret_is_computed) | |
524 | { | |
525 | return FAILED; | |
526 | } | |
8ff8c33d MW |
527 | secret->len = this->modulus_length; |
528 | secret->ptr = mpz_export(NULL, NULL, 1, secret->len, 1, 0, this->shared_secret); | |
d048df5c | 529 | return SUCCESS; |
99400f97 JH |
530 | } |
531 | ||
ce461bbd MW |
532 | /** |
533 | * Implementation of diffie_hellman_t.get_dh_group. | |
534 | */ | |
535 | static diffie_hellman_group_t get_dh_group(private_diffie_hellman_t *this) | |
536 | { | |
537 | return this->dh_group_number; | |
538 | } | |
539 | ||
99400f97 | 540 | /** |
78f837b0 | 541 | * Implementation of diffie_hellman_t.destroy. |
99400f97 | 542 | */ |
d048df5c | 543 | static void destroy(private_diffie_hellman_t *this) |
99400f97 | 544 | { |
99400f97 | 545 | mpz_clear(this->modulus); |
0d43ad12 | 546 | mpz_clear(this->my_private_value); |
78f837b0 | 547 | mpz_clear(this->my_public_value); |
79b8aa19 | 548 | mpz_clear(this->other_public_value); |
78f837b0 | 549 | |
99400f97 JH |
550 | if (this->shared_secret_is_computed) |
551 | { | |
552 | /* other public value gets initialized together with shared secret */ | |
99400f97 JH |
553 | mpz_clear(this->shared_secret); |
554 | } | |
5113680f | 555 | free(this); |
99400f97 JH |
556 | } |
557 | ||
99400f97 | 558 | /* |
78f837b0 | 559 | * Described in header. |
99400f97 | 560 | */ |
bb9d77ce | 561 | diffie_hellman_t *diffie_hellman_create(diffie_hellman_group_t dh_group_number) |
99400f97 | 562 | { |
5113680f | 563 | private_diffie_hellman_t *this = malloc_thing(private_diffie_hellman_t); |
0d43ad12 JH |
564 | randomizer_t *randomizer; |
565 | chunk_t random_bytes; | |
d048df5c | 566 | |
99400f97 JH |
567 | /* public functions */ |
568 | this->public.get_shared_secret = (status_t (*)(diffie_hellman_t *, chunk_t *)) get_shared_secret; | |
d048df5c | 569 | this->public.set_other_public_value = (void (*)(diffie_hellman_t *, chunk_t )) set_other_public_value; |
99400f97 | 570 | this->public.get_other_public_value = (status_t (*)(diffie_hellman_t *, chunk_t *)) get_other_public_value; |
78f837b0 | 571 | this->public.get_my_public_value = (void (*)(diffie_hellman_t *, chunk_t *)) get_my_public_value; |
ce461bbd | 572 | this->public.get_dh_group = (diffie_hellman_group_t (*)(diffie_hellman_t *)) get_dh_group; |
d048df5c | 573 | this->public.destroy = (void (*)(diffie_hellman_t *)) destroy; |
99400f97 JH |
574 | |
575 | /* private functions */ | |
576 | this->set_modulus = set_modulus; | |
577 | this->compute_public_value = compute_public_value; | |
578 | this->compute_shared_secret = compute_shared_secret; | |
579 | ||
580 | /* private variables */ | |
581 | this->dh_group_number = dh_group_number; | |
79b8aa19 MW |
582 | mpz_init(this->modulus); |
583 | mpz_init(this->other_public_value); | |
0d43ad12 JH |
584 | mpz_init(this->my_private_value); |
585 | ||
99400f97 JH |
586 | /* set this->modulus */ |
587 | if (this->set_modulus(this) != SUCCESS) | |
588 | { | |
5113680f | 589 | free(this); |
99400f97 JH |
590 | return NULL; |
591 | } | |
0d43ad12 JH |
592 | randomizer = randomizer_create(); |
593 | if (randomizer == NULL) | |
594 | { | |
5113680f | 595 | free(this); |
0d43ad12 JH |
596 | return NULL; |
597 | } | |
68621281 MW |
598 | if (randomizer->allocate_pseudo_random_bytes(randomizer, this->modulus_length, &random_bytes) != SUCCESS) |
599 | { | |
600 | randomizer->destroy(randomizer); | |
5113680f | 601 | free(this); |
68621281 MW |
602 | return NULL; |
603 | } | |
0d43ad12 JH |
604 | |
605 | mpz_import(this->my_private_value, random_bytes.len, 1, 1, 1, 0, random_bytes.ptr); | |
5113680f | 606 | chunk_free(&random_bytes); |
d048df5c | 607 | |
0d43ad12 | 608 | randomizer->destroy(randomizer); |
d048df5c | 609 | |
78f837b0 JH |
610 | this->compute_public_value(this); |
611 | ||
99400f97 | 612 | this->shared_secret_is_computed = FALSE; |
99400f97 JH |
613 | |
614 | return &(this->public); | |
615 | } |