blob: 1aba680237f1e0e7806411060f279425c9377885 [file] [log] [blame]
Alexandre Lision51140e12013-12-02 10:54:09 -05001/*
2 Copyright (C) 2006, 2009 Werner Dittmann
3
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18/** Copyright (C) 2006, 2009
19 *
20 * @author Werner Dittmann <Werner.Dittmann@t-online.de>
21 */
22
23#include <gcrypt.h>
24#include <libzrtpcpp/crypto/ZrtpDH.h>
25#include <libzrtpcpp/ZrtpTextData.h>
26#include <sstream>
27
28struct gcryptCtx {
29 gcry_mpi_t privKey;
30 gcry_mpi_t pubKey;
31// int32_t pLength;
32};
33
34extern void initializeGcrypt();
35
36static gcry_mpi_t bnP2048 = NULL;
37static gcry_mpi_t bnP3072 = NULL;
38// static gcry_mpi_t bnP4096 = NULL;
39static gcry_mpi_t two = NULL;
40static gcry_mpi_t bnP2048MinusOne = NULL;
41static gcry_mpi_t bnP3072MinusOne = NULL;
42// static gcry_mpi_t bnP4096MinusOne = NULL;
43
44static uint8_t dhinit = 0;
45
46void randomZRTP(uint8_t *buf, int32_t length) {
47 initializeGcrypt();
48 gcry_randomize(buf, length, GCRY_STRONG_RANDOM);
49}
50
51static const uint8_t P2048[] =
52{
53 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2,
54 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
55 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6,
56 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
57 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,
58 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
59 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9,
60 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
61 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11,
62 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
63 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36,
64 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
65 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56,
66 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
67 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08,
68 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
69 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2,
70 0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
71 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C,
72 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
73 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68, 0xFF, 0xFF, 0xFF, 0xFF,
74 0xFF, 0xFF, 0xFF, 0xFF
75};
76
77static const uint8_t P3072[] =
78 {
79 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2,
80 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
81 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6,
82 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
83 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,
84 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
85 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9,
86 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,
88 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
89 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36,
90 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
91 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56,
92 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
93 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08,
94 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
95 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2,
96 0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
97 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C,
98 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
99 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D,
100 0x04, 0x50, 0x7A, 0x33, 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
101 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 0x8A, 0xEA, 0x71, 0x57,
102 0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
103 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0,
104 0x4A, 0x25, 0x61, 0x9D, 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
105 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 0xD8, 0x76, 0x02, 0x73,
106 0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
107 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0,
108 0xBA, 0xD9, 0x46, 0xE2, 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
109 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 0x4B, 0x82, 0xD1, 0x20,
110 0xA9, 0x3A, 0xD2, 0xCA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
111 };
112
113 /* *************
114static const uint8_t P4096[] =
115{
116 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2,
117 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
118 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6,
119 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
120 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,
121 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
122 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9,
123 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
124 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11,
125 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
126 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36,
127 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
128 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56,
129 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
130 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08,
131 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,
133 0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
134 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C,
135 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
136 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D,
137 0x04, 0x50, 0x7A, 0x33, 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
138 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 0x8A, 0xEA, 0x71, 0x57,
139 0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
140 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0,
141 0x4A, 0x25, 0x61, 0x9D, 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
142 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 0xD8, 0x76, 0x02, 0x73,
143 0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
144 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0,
145 0xBA, 0xD9, 0x46, 0xE2, 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
146 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 0x4B, 0x82, 0xD1, 0x20,
147 0xA9, 0x21, 0x08, 0x01, 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
148 0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, 0x99, 0xC3, 0x27, 0x18,
149 0x6A, 0xF4, 0xE2, 0x3C, 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
150 0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, 0xDB, 0xBB, 0xC2, 0xDB,
151 0x04, 0xDE, 0x8E, 0xF9, 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
152 0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, 0x99, 0xB2, 0x96, 0x4F,
153 0xA0, 0x90, 0xC3, 0xA2, 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
154 0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, 0xB8, 0x1B, 0xDD, 0x76,
155 0x21, 0x70, 0x48, 0x1C, 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
156 0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, 0x86, 0xFF, 0xB7, 0xDC,
157 0x90, 0xA6, 0xC0, 0x8F, 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99,
158 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
159};
160 *************** */
161#define DH3K 1
162#define DH2K 0
163ZrtpDH::ZrtpDH(const char* type){
164
165 // Well - the algo type is only 4 char thus cast to int32 and compare
166 if (*(int32_t*)type == *(int32_t*)dh2k) {
167 pkType = DH2K;
168 }
169 else if (*(int32_t*)type == *(int32_t*)dh3k) {
170 pkType = DH3K;
171 }
172 else {
173 fprintf(stderr, "Unknown pubkey algo: %d\n", pkType);
174 }
175 ctx = static_cast<void*>(new gcryptCtx);
176 gcryptCtx* tmpCtx = static_cast<gcryptCtx*>(ctx);
177 tmpCtx->privKey = NULL;
178 tmpCtx->pubKey = NULL;
179
180 initializeGcrypt();
181
182 if (!dhinit) {
183 gcry_mpi_scan(&bnP2048, GCRYMPI_FMT_USG, P2048, sizeof(P2048), NULL);
184 gcry_mpi_scan(&bnP3072, GCRYMPI_FMT_USG, P3072, sizeof(P3072), NULL);
185// gcry_mpi_scan(&bnP4096, GCRYMPI_FMT_USG, P4096, sizeof(P4096), NULL);
186 two = gcry_mpi_set_ui(NULL, 2);
187
188 bnP2048MinusOne = gcry_mpi_new(sizeof(P2048)*8);
189 gcry_mpi_sub_ui(bnP2048MinusOne, bnP2048, 1);
190
191 bnP3072MinusOne = gcry_mpi_new(sizeof(P3072)*8);
192 gcry_mpi_sub_ui(bnP3072MinusOne, bnP3072, 1);
193
194// bnP4096MinusOne = gcry_mpi_new(sizeof(P4096)*8);
195// gcry_mpi_sub_ui(bnP4096MinusOne, bnP4096, 1);
196 dhinit = 1;
197 }
198
199 if (pkType == DH3K) {
200 tmpCtx->privKey = gcry_mpi_new(256);
201 gcry_mpi_randomize(tmpCtx->privKey, 256, GCRY_STRONG_RANDOM);
202 }
203 else if (pkType == DH2K) {
204 tmpCtx->privKey = gcry_mpi_new(512);
205 gcry_mpi_randomize(tmpCtx->privKey, 512, GCRY_STRONG_RANDOM);
206 }
207// else {
208// tmpCtx->privKey = gcry_mpi_new(512);
209// gcry_mpi_randomize(tmpCtx->privKey, 512, GCRY_STRONG_RANDOM);
210// }
211}
212
213ZrtpDH::~ZrtpDH() {
214 gcryptCtx* tmpCtx = static_cast<gcryptCtx*>(ctx);
215
216 if (tmpCtx != NULL) {
217 gcry_mpi_release(tmpCtx->privKey);
218 tmpCtx->privKey = NULL;
219 gcry_mpi_release(tmpCtx->pubKey);
220 tmpCtx->pubKey = NULL;
221 delete tmpCtx;
222 ctx = NULL;
223 }
224}
225
226int32_t ZrtpDH::computeSecretKey(uint8_t *pubKeyBytes, uint8_t *secret) {
227
228 int32_t length = getDhSize();
229 gcryptCtx* tmpCtx = static_cast<gcryptCtx*>(ctx);
230
231 gcry_mpi_t pubKeyOther;
232 gcry_mpi_t sec = gcry_mpi_new(0);
233 gcry_mpi_scan(&pubKeyOther, GCRYMPI_FMT_USG, pubKeyBytes, length, NULL);
234
235 if (pkType == DH2K) {
236 gcry_mpi_powm(sec, pubKeyOther, tmpCtx->privKey, bnP2048);
237 }
238 else if (pkType == DH3K) {
239 gcry_mpi_powm(sec, pubKeyOther, tmpCtx->privKey, bnP3072);
240 }
241 else {
242// gcry_mpi_powm(sec, pubKeyOther, tmpCtx->privKey, bnP4096);
243 return 0;
244 }
245 gcry_mpi_release(pubKeyOther);
246
247 size_t result;
248 gcry_mpi_print(GCRYMPI_FMT_USG, secret, length, &result, sec);
249 gcry_mpi_release(sec);
250
251 return result;
252}
253
254int32_t ZrtpDH::generatePublicKey()
255{
256 gcryptCtx* tmpCtx = static_cast<gcryptCtx*>(ctx);
257
258 tmpCtx->pubKey = gcry_mpi_new(0);
259 if (pkType == DH2K) {
260 gcry_mpi_powm(tmpCtx->pubKey, two, tmpCtx->privKey, bnP2048);
261 }
262 else if (pkType == DH3K) {
263 gcry_mpi_powm(tmpCtx->pubKey, two, tmpCtx->privKey, bnP3072);
264 }
265 else {
266// gcry_mpi_powm(tmpCtx->pubKey, two, tmpCtx->privKey, bnP4096);
267 return 0;
268 }
269 return 1;
270}
271
272int32_t ZrtpDH::getPubKeyBytes(uint8_t *buf) const
273{
274 gcryptCtx* tmpCtx = static_cast<gcryptCtx*>(ctx);
275 int32_t len = getPubKeySize();
276
277 // get length of Dh in bytes, prepend buffer with zeros if necessary
278 int32_t prepend = getDhSize() - getPubKeySize();
279 if (prepend > 0) {
280 memset(buf, 0, prepend);
281 }
282 size_t i = 0;
283 gcry_mpi_print(GCRYMPI_FMT_USG, buf + prepend, len, &i, tmpCtx->pubKey);
284 return i;
285}
286
287int32_t ZrtpDH::getDhSize() const
288{
289 switch (pkType) {
290 case DH2K:
291 return 2048/8;
292 break;
293 case DH3K:
294 return 3072/8;
295 break;
296 }
297 return 0;
298}
299
300int32_t ZrtpDH::getPubKeySize() const
301{
302 return ((gcry_mpi_get_nbits(static_cast<gcryptCtx*>(ctx)->pubKey) + 7) / 8);
303}
304
305int32_t ZrtpDH::checkPubKey(uint8_t *pubKeyBytes) const
306{
307 gcry_mpi_t pubKeyOther = NULL;
308 gcry_mpi_scan(&pubKeyOther, GCRYMPI_FMT_USG, pubKeyBytes, getDhSize(), NULL);
309
310 if (pkType == DH2K) {
311 if (gcry_mpi_cmp(bnP2048MinusOne, pubKeyOther) == 0)
312 return 0;
313 }
314 else if (pkType == DH3K) {
315 if (gcry_mpi_cmp(bnP3072MinusOne, pubKeyOther) == 0)
316 return 0;
317 }
318 else {
319// if (gcry_mpi_cmp(bnP4096MinusOne, pubKeyOther) == 0)
320 return 0;
321 }
322 if (gcry_mpi_cmp_ui(pubKeyOther, 1) == 0) {
323 return 0;
324 }
325
326 gcry_mpi_release(pubKeyOther);
327 return 1;
328}
329
330const char* ZrtpDH::getDHtype()
331{
332 switch (pkType) {
333 case DH2K:
334 return dh2k;
335 break;
336 case DH3K:
337 return dh3k;
338 break;
339 }
340 return NULL;
341}
342
343/** EMACS **
344 * Local variables:
345 * mode: c++
346 * c-default-style: ellemtel
347 * c-basic-offset: 4
348 * End:
349 */