1 /*
2   Copyright (C) 2006, 2013 Werner Dittmann
3 
4   This program is free software: you can redistribute it and/or modify
5   it under the terms of the GNU Lesser 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 <zrtp/crypto/zrtpDH.h>
25 #include <zrtp/libzrtpcpp/ZrtpTextData.h>
26 #include <sstream>
27 
28 struct gcryptCtx {
29     gcry_mpi_t privKey;
30     gcry_mpi_t pubKey;
31 //    int32_t pLength;
32 };
33 
34 extern void initializeGcrypt();
35 
36 static gcry_mpi_t bnP2048 = NULL;
37 static gcry_mpi_t bnP3072 = NULL;
38 // static gcry_mpi_t bnP4096 = NULL;
39 static gcry_mpi_t two = NULL;
40 static gcry_mpi_t bnP2048MinusOne = NULL;
41 static gcry_mpi_t bnP3072MinusOne = NULL;
42 // static gcry_mpi_t bnP4096MinusOne = NULL;
43 
44 static uint8_t dhinit = 0;
45 
randomZRTP(uint8_t * buf,int32_t length)46 void randomZRTP(uint8_t *buf, int32_t length) {
47     initializeGcrypt();
48     gcry_randomize(buf, length, GCRY_STRONG_RANDOM);
49 }
50 
51 static 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 
77 static 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     /* *************
114 static 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
ZrtpDH(const char * type)163 ZrtpDH::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 
~ZrtpDH()213 ZrtpDH::~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 
computeSecretKey(uint8_t * pubKeyBytes,uint8_t * secret)226 int32_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 
generatePublicKey()254 int32_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 
getPubKeyBytes(uint8_t * buf) const272 int32_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 
getDhSize() const287 int32_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 
getPubKeySize() const300 int32_t ZrtpDH::getPubKeySize() const
301 {
302     return ((gcry_mpi_get_nbits(static_cast<gcryptCtx*>(ctx)->pubKey) + 7) / 8);
303 }
304 
checkPubKey(uint8_t * pubKeyBytes) const305 int32_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 
getDHtype()330 const 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  */
350