gwenhywfar 5.12.0
cryptmgrkeys.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Mon Dec 01 2008
3 copyright : (C) 2008 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10
11#ifdef HAVE_CONFIG_H
12# include <config.h>
13#endif
14
15#define DISABLE_DEBUGLOG
16
17
18#include "cryptmgrkeys_p.h"
19#include "i18n_l.h"
20#include <gwenhywfar/misc.h>
21#include <gwenhywfar/debug.h>
22#include <gwenhywfar/mdigest.h>
23#include <gwenhywfar/padd.h>
24#include <gwenhywfar/crypthead.h>
25#include <gwenhywfar/text.h>
26
27
28
29GWEN_INHERIT(GWEN_CRYPTMGR, GWEN_CRYPTMGR_KEYS);
30
31
32
33GWEN_CRYPTMGR *GWEN_CryptMgrKeys_new(const char *localName,
34 GWEN_CRYPT_KEY *localKey,
35 const char *peerName,
36 GWEN_CRYPT_KEY *peerKey,
37 int ownKeys)
38{
39 GWEN_CRYPTMGR *cm;
40 GWEN_CRYPTMGR_KEYS *xcm;
41
43 GWEN_NEW_OBJECT(GWEN_CRYPTMGR_KEYS, xcm);
44 GWEN_INHERIT_SETDATA(GWEN_CRYPTMGR, GWEN_CRYPTMGR_KEYS, cm, xcm,
46
47 if (localKey) {
48 xcm->localKey=localKey;
51 xcm->ownLocalKey=ownKeys;
52 }
53 else
54 xcm->ownLocalKey=0;
55
56 if (peerKey) {
57 xcm->peerKey=peerKey;
60 xcm->ownPeerKey=ownKeys;
61 }
62 else
63 xcm->ownPeerKey=0;
64
65 if (localName)
66 GWEN_CryptMgr_SetLocalKeyName(cm, localName);
67
68 if (peerName)
69 GWEN_CryptMgr_SetPeerKeyName(cm, peerName);
70
75
76 return cm;
77}
78
79
80
83{
84 GWEN_CRYPTMGR_KEYS *xcm;
85
86 xcm=(GWEN_CRYPTMGR_KEYS *) p;
87
88 if (xcm->ownLocalKey)
89 GWEN_Crypt_Key_free(xcm->localKey);
90 if (xcm->ownPeerKey)
91 GWEN_Crypt_Key_free(xcm->peerKey);
92}
93
94
95
97 GWEN_CRYPT_KEY *peerKey,
98 int ownKey)
99{
100 GWEN_CRYPTMGR_KEYS *xcm;
101
102 assert(cm);
103 xcm=GWEN_INHERIT_GETDATA(GWEN_CRYPTMGR, GWEN_CRYPTMGR_KEYS, cm);
104 assert(xcm);
105
106 if (xcm->ownPeerKey)
107 GWEN_Crypt_Key_free(xcm->peerKey);
108 xcm->peerKey=peerKey;
109 xcm->ownPeerKey=ownKey;
110}
111
112
113
116 const uint8_t *pData, uint32_t lData,
117 GWEN_BUFFER *dbuf)
118{
119 GWEN_CRYPTMGR_KEYS *xcm;
120 GWEN_MDIGEST *md;
121 int rv;
122 GWEN_BUFFER *tbuf;
123 int ksize;
124 uint32_t signatureLen;
125
126 assert(cm);
127 xcm=GWEN_INHERIT_GETDATA(GWEN_CRYPTMGR, GWEN_CRYPTMGR_KEYS, cm);
128 assert(xcm);
129
130 if (xcm->localKey==NULL) {
131 DBG_ERROR(GWEN_LOGDOMAIN, "No local key");
132 return GWEN_ERROR_GENERIC;
133 }
134
135 ksize=GWEN_Crypt_Key_GetKeySize(xcm->localKey);
136
137 /* hash pData */
139 rv=GWEN_MDigest_Begin(md);
140 if (rv<0) {
141 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
143 return rv;
144 }
145 rv=GWEN_MDigest_Update(md, pData, lData);
146 if (rv<0) {
147 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
149 return rv;
150 }
151 rv=GWEN_MDigest_End(md);
152 if (rv<0) {
153 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
155 return rv;
156 }
157
158 /* padd */
159 tbuf=GWEN_Buffer_new(0, ksize, 0, 1);
161 (const char *)GWEN_MDigest_GetDigestPtr(md),
164 GWEN_Padd_PaddWithIso9796_2(tbuf, ksize);
165
166 /* sign */
167 GWEN_Buffer_AllocRoom(dbuf, ksize);
168 signatureLen=GWEN_Buffer_GetMaxUnsegmentedWrite(dbuf);
169 rv=GWEN_Crypt_Key_Sign(xcm->localKey,
170 (uint8_t *)GWEN_Buffer_GetStart(tbuf),
172 (uint8_t *)GWEN_Buffer_GetPosPointer(dbuf),
173 &signatureLen);
174 GWEN_Buffer_free(tbuf);
175 if (rv<0) {
176 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
177 return rv;
178 }
179
180 GWEN_Buffer_IncrementPos(dbuf, signatureLen);
182
183 return 0;
184}
185
186
187
190 const uint8_t *pData, uint32_t lData,
191 const uint8_t *pSignature, uint32_t lSignature)
192{
193 GWEN_CRYPTMGR_KEYS *xcm;
194 GWEN_MDIGEST *md;
195 int rv;
196 GWEN_BUFFER *tbuf;
197 int ksize;
198 uint32_t l;
199
200 assert(cm);
201 xcm=GWEN_INHERIT_GETDATA(GWEN_CRYPTMGR, GWEN_CRYPTMGR_KEYS, cm);
202 assert(xcm);
203
204 if (xcm->peerKey==NULL) {
205 DBG_ERROR(GWEN_LOGDOMAIN, "No peer key");
206 return GWEN_ERROR_GENERIC;
207 }
208
209 ksize=GWEN_Crypt_Key_GetKeySize(xcm->peerKey);
210
211 /* the padding algo uses random numbers, so we must use the encrypt function and
212 * compare the decoded and unpadded signature with the hash of the source data
213 */
214 tbuf=GWEN_Buffer_new(0, ksize+16, 0, 1);
216 rv=GWEN_Crypt_Key_Encipher(xcm->peerKey,
217 pSignature, lSignature,
218 (uint8_t *)GWEN_Buffer_GetPosPointer(tbuf),
219 &l);
220 if (rv<0) {
221 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
222 GWEN_Buffer_free(tbuf);
223 return rv;
224 }
227
228 /* unpadd */
230 if (rv<0) {
231 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
232 GWEN_Buffer_free(tbuf);
233 return rv;
234 }
235 /* tbuf now contains the hash */
236
237 /* hash source data */
239 rv=GWEN_MDigest_Begin(md);
240 if (rv<0) {
241 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
243 GWEN_Buffer_free(tbuf);
244 return rv;
245 }
246 rv=GWEN_MDigest_Update(md, pData, lData);
247 if (rv<0) {
248 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
250 GWEN_Buffer_free(tbuf);
251 return rv;
252 }
253 rv=GWEN_MDigest_End(md);
254 if (rv<0) {
255 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
257 GWEN_Buffer_free(tbuf);
258 return rv;
259 }
260
262 DBG_ERROR(GWEN_LOGDOMAIN, "Invalid signature");
264 GWEN_Buffer_free(tbuf);
265 return GWEN_ERROR_VERIFY;
266 }
267
268 if (memcmp(GWEN_MDigest_GetDigestPtr(md),
271 DBG_ERROR(GWEN_LOGDOMAIN, "Invalid signature");
273 GWEN_Buffer_free(tbuf);
274 return GWEN_ERROR_VERIFY;
275 }
276
278 GWEN_Buffer_free(tbuf);
279
280 return 0;
281}
282
283
284
287 const uint8_t *pData, uint32_t lData,
288 GWEN_BUFFER *dbuf)
289{
290 GWEN_CRYPTMGR_KEYS *xcm;
291 int rv;
292 GWEN_BUFFER *tbuf;
293 int ksize;
294 uint32_t l;
295
296 assert(cm);
297 xcm=GWEN_INHERIT_GETDATA(GWEN_CRYPTMGR, GWEN_CRYPTMGR_KEYS, cm);
298 assert(xcm);
299
300 if (xcm->peerKey==NULL) {
301 DBG_ERROR(GWEN_LOGDOMAIN, "No peer key");
302 return GWEN_ERROR_GENERIC;
303 }
304
305 ksize=GWEN_Crypt_Key_GetKeySize(xcm->peerKey);
306
307 /* padd key data */
308 tbuf=GWEN_Buffer_new(0, ksize, 0, 1);
309 GWEN_Buffer_AppendBytes(tbuf, (const char *) pData, lData);
310 rv=GWEN_Padd_PaddWithIso9796_2(tbuf, ksize);
311 if (rv<0) {
312 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
313 GWEN_Buffer_free(tbuf);
314 return rv;
315 }
316
317 GWEN_Buffer_AllocRoom(dbuf, ksize);
319 rv=GWEN_Crypt_Key_Encipher(xcm->peerKey,
320 (const uint8_t *)GWEN_Buffer_GetStart(tbuf),
322 (uint8_t *)GWEN_Buffer_GetPosPointer(dbuf),
323 &l);
324 GWEN_Buffer_free(tbuf);
325 if (rv<0) {
326 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
327 return rv;
328 }
329
332
333 return 0;
334}
335
336
337
340 const uint8_t *pData, uint32_t lData,
341 GWEN_BUFFER *dbuf)
342{
343 GWEN_CRYPTMGR_KEYS *xcm;
344 int rv;
345 GWEN_BUFFER *tbuf;
346 int ksize;
347 uint32_t l;
348
349 assert(cm);
350 xcm=GWEN_INHERIT_GETDATA(GWEN_CRYPTMGR, GWEN_CRYPTMGR_KEYS, cm);
351 assert(xcm);
352
353 if (xcm->localKey==NULL) {
354 DBG_ERROR(GWEN_LOGDOMAIN, "No local key");
355 return GWEN_ERROR_GENERIC;
356 }
357
358 ksize=GWEN_Crypt_Key_GetKeySize(xcm->localKey);
359
360 tbuf=GWEN_Buffer_new(0, ksize, 0, 1);
362 rv=GWEN_Crypt_Key_Decipher(xcm->localKey,
363 pData, lData,
364 (uint8_t *)GWEN_Buffer_GetPosPointer(tbuf),
365 &l);
366 if (rv<0) {
367 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
368 GWEN_Buffer_free(tbuf);
369 return rv;
370 }
373
374 /* unpadd data */
376 if (rv<0) {
377 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
378 GWEN_Buffer_free(tbuf);
379 return rv;
380 }
381
382 GWEN_Buffer_AppendBuffer(dbuf, tbuf);
383 GWEN_Buffer_free(tbuf);
384
385 return 0;
386}
387
388
389
390
391
392
393
394
395
396
397
398
399
#define NULL
Definition binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition buffer.c:42
int GWEN_Buffer_IncrementPos(GWEN_BUFFER *bf, uint32_t i)
Definition buffer.c:451
uint32_t GWEN_Buffer_GetMaxUnsegmentedWrite(GWEN_BUFFER *bf)
Definition buffer.c:527
int GWEN_Buffer_AdjustUsedBytes(GWEN_BUFFER *bf)
Definition buffer.c:468
char * GWEN_Buffer_GetPosPointer(const GWEN_BUFFER *bf)
Definition buffer.c:548
int GWEN_Buffer_AppendBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
Definition buffer.c:360
int GWEN_Buffer_AppendBuffer(GWEN_BUFFER *bf, GWEN_BUFFER *sf)
Definition buffer.c:506
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition buffer.c:277
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
int GWEN_Buffer_AllocRoom(GWEN_BUFFER *bf, uint32_t size)
Definition buffer.c:285
int GWEN_Crypt_Key_Decipher(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen)
Definition cryptkey.c:318
void GWEN_Crypt_Key_free(GWEN_CRYPT_KEY *k)
Definition cryptkey.c:154
int GWEN_Crypt_Key_Sign(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pSignatureData, uint32_t *pSignatureLen)
Definition cryptkey.c:273
int GWEN_Crypt_Key_GetKeyVersion(const GWEN_CRYPT_KEY *k)
Definition cryptkey.c:203
int GWEN_Crypt_Key_GetKeySize(const GWEN_CRYPT_KEY *k)
Definition cryptkey.c:179
int GWEN_Crypt_Key_GetKeyNumber(const GWEN_CRYPT_KEY *k)
Definition cryptkey.c:187
int GWEN_Crypt_Key_Encipher(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen)
Definition cryptkey.c:303
struct GWEN_CRYPT_KEY GWEN_CRYPT_KEY
Definition cryptkey.h:26
void GWEN_CryptMgr_SetLocalKeyName(GWEN_CRYPTMGR *cm, const char *s)
Definition cryptmgr.c:70
void GWEN_CryptMgr_SetLocalKeyNumber(GWEN_CRYPTMGR *cm, int i)
Definition cryptmgr.c:90
GWEN_CRYPTMGR_SIGNDATA_FN GWEN_CryptMgr_SetSignDataFn(GWEN_CRYPTMGR *cm, GWEN_CRYPTMGR_SIGNDATA_FN f)
Definition cryptmgr.c:246
GWEN_CRYPTMGR_DECRYPTKEY_FN GWEN_CryptMgr_SetDecryptKeyFn(GWEN_CRYPTMGR *cm, GWEN_CRYPTMGR_DECRYPTKEY_FN f)
Definition cryptmgr.c:285
GWEN_CRYPTMGR * GWEN_CryptMgr_new(void)
Definition cryptmgr.c:37
void GWEN_CryptMgr_SetPeerKeyVersion(GWEN_CRYPTMGR *cm, int i)
Definition cryptmgr.c:158
void GWEN_CryptMgr_SetPeerKeyName(GWEN_CRYPTMGR *cm, const char *s)
Definition cryptmgr.c:122
GWEN_CRYPTMGR_VERIFYDATA_FN GWEN_CryptMgr_SetVerifyDataFn(GWEN_CRYPTMGR *cm, GWEN_CRYPTMGR_VERIFYDATA_FN f)
Definition cryptmgr.c:259
void GWEN_CryptMgr_SetPeerKeyNumber(GWEN_CRYPTMGR *cm, int i)
Definition cryptmgr.c:142
GWEN_CRYPTMGR_ENCRYPTKEY_FN GWEN_CryptMgr_SetEncryptKeyFn(GWEN_CRYPTMGR *cm, GWEN_CRYPTMGR_ENCRYPTKEY_FN f)
Definition cryptmgr.c:272
void GWEN_CryptMgr_SetLocalKeyVersion(GWEN_CRYPTMGR *cm, int i)
Definition cryptmgr.c:106
struct GWEN_CRYPTMGR GWEN_CRYPTMGR
Definition cryptmgr.h:64
GWENHYWFAR_CB int GWEN_CryptMgrKeys_EncryptKey(GWEN_CRYPTMGR *cm, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *dbuf)
GWENHYWFAR_CB int GWEN_CryptMgrKeys_SignData(GWEN_CRYPTMGR *cm, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *dbuf)
GWENHYWFAR_CB int GWEN_CryptMgrKeys_VerifyData(GWEN_CRYPTMGR *cm, const uint8_t *pData, uint32_t lData, const uint8_t *pSignature, uint32_t lSignature)
GWENHYWFAR_CB int GWEN_CryptMgrKeys_DecryptKey(GWEN_CRYPTMGR *cm, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *dbuf)
void GWEN_CryptMgrKeys_SetPeerKey(GWEN_CRYPTMGR *cm, GWEN_CRYPT_KEY *peerKey, int ownKey)
GWENHYWFAR_CB void GWEN_CryptMgrKeys_FreeData(GWEN_UNUSED void *bp, void *p)
GWEN_CRYPTMGR * GWEN_CryptMgrKeys_new(const char *localName, GWEN_CRYPT_KEY *localKey, const char *peerName, GWEN_CRYPT_KEY *peerKey, int ownKeys)
#define DBG_INFO(dbg_logger, format,...)
Definition debug.h:181
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define GWEN_ERROR_VERIFY
Definition error.h:104
#define GWEN_ERROR_GENERIC
Definition error.h:62
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
#define GWEN_UNUSED
#define GWENHYWFAR_CB
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
Definition inherit.h:300
#define GWEN_INHERIT(bt, t)
Definition inherit.h:264
#define GWEN_INHERIT_GETDATA(bt, t, element)
Definition inherit.h:279
#define GWEN_LOGDOMAIN
Definition logger.h:35
int GWEN_MDigest_Begin(GWEN_MDIGEST *md)
Definition mdigest.c:129
int GWEN_MDigest_End(GWEN_MDIGEST *md)
Definition mdigest.c:141
unsigned int GWEN_MDigest_GetDigestSize(GWEN_MDIGEST *md)
Definition mdigest.c:90
uint8_t * GWEN_MDigest_GetDigestPtr(GWEN_MDIGEST *md)
Definition mdigest.c:81
void GWEN_MDigest_free(GWEN_MDIGEST *md)
Definition mdigest.c:54
int GWEN_MDigest_Update(GWEN_MDIGEST *md, const uint8_t *buf, unsigned int l)
Definition mdigest.c:153
GWENHYWFAR_API GWEN_MDIGEST * GWEN_MDigest_Rmd160_new(void)
Definition mdigestgc.c:158
struct GWEN_MDIGEST GWEN_MDIGEST
Definition mdigest.h:25
#define GWEN_NEW_OBJECT(typ, varname)
Definition memory.h:55
int GWEN_Padd_PaddWithIso9796_2(GWEN_BUFFER *buf, int dstSize)
Definition padd.c:148
int GWEN_Padd_UnpaddWithIso9796_2(GWEN_BUFFER *buf)
Definition padd.c:196