gwenhywfar  5.10.1
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 
29 GWEN_INHERIT(GWEN_CRYPTMGR, GWEN_CRYPTMGR_KEYS);
30 
31 
32 
33 GWEN_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 
42  cm=GWEN_CryptMgr_new();
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 
82 void GWEN_CryptMgrKeys_FreeData(GWEN_UNUSED void *bp, void *p)
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);
142  GWEN_MDigest_free(md);
143  return rv;
144  }
145  rv=GWEN_MDigest_Update(md, pData, lData);
146  if (rv<0) {
147  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
148  GWEN_MDigest_free(md);
149  return rv;
150  }
151  rv=GWEN_MDigest_End(md);
152  if (rv<0) {
153  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
154  GWEN_MDigest_free(md);
155  return rv;
156  }
157 
158  /* padd */
159  tbuf=GWEN_Buffer_new(0, ksize, 0, 1);
161  (const char *)GWEN_MDigest_GetDigestPtr(md),
163  GWEN_MDigest_free(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  }
225  GWEN_Buffer_IncrementPos(tbuf, l);
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);
242  GWEN_MDigest_free(md);
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);
249  GWEN_MDigest_free(md);
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);
256  GWEN_MDigest_free(md);
257  GWEN_Buffer_free(tbuf);
258  return rv;
259  }
260 
262  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid signature");
263  GWEN_MDigest_free(md);
264  GWEN_Buffer_free(tbuf);
265  return GWEN_ERROR_VERIFY;
266  }
267 
268  if (memcmp(GWEN_MDigest_GetDigestPtr(md),
269  GWEN_Buffer_GetStart(tbuf),
270  GWEN_MDigest_GetDigestSize(md))!=0) {
271  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid signature");
272  GWEN_MDigest_free(md);
273  GWEN_Buffer_free(tbuf);
274  return GWEN_ERROR_VERIFY;
275  }
276 
277  GWEN_MDigest_free(md);
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 
330  GWEN_Buffer_IncrementPos(dbuf, l);
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  }
371  GWEN_Buffer_IncrementPos(tbuf, l);
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 
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
void GWEN_MDigest_free(GWEN_MDIGEST *md)
Definition: mdigest.c:54
GWENHYWFAR_CB int GWEN_CryptMgrKeys_DecryptKey(GWEN_CRYPTMGR *cm, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *dbuf)
Definition: cryptmgrkeys.c:339
int GWEN_Buffer_AllocRoom(GWEN_BUFFER *bf, uint32_t size)
Definition: buffer.c:285
uint32_t GWEN_Buffer_GetMaxUnsegmentedWrite(GWEN_BUFFER *bf)
Definition: buffer.c:528
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
int GWEN_Crypt_Key_GetKeySize(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:179
void GWEN_Crypt_Key_free(GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:154
void GWEN_CryptMgr_SetLocalKeyName(GWEN_CRYPTMGR *cm, const char *s)
Definition: cryptmgr.c:70
#define NULL
Definition: binreloc.c:300
GWEN_CRYPTMGR_ENCRYPTKEY_FN GWEN_CryptMgr_SetEncryptKeyFn(GWEN_CRYPTMGR *cm, GWEN_CRYPTMGR_ENCRYPTKEY_FN f)
Definition: cryptmgr.c:272
void GWEN_CryptMgr_SetPeerKeyName(GWEN_CRYPTMGR *cm, const char *s)
Definition: cryptmgr.c:122
int GWEN_Buffer_AdjustUsedBytes(GWEN_BUFFER *bf)
Definition: buffer.c:469
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
#define GWEN_LOGDOMAIN
Definition: logger.h:35
void GWEN_CryptMgr_SetLocalKeyVersion(GWEN_CRYPTMGR *cm, int i)
Definition: cryptmgr.c:106
int GWEN_Crypt_Key_GetKeyNumber(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:187
int GWEN_MDigest_Update(GWEN_MDIGEST *md, const uint8_t *buf, unsigned int l)
Definition: mdigest.c:153
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
char * GWEN_Buffer_GetPosPointer(const GWEN_BUFFER *bf)
Definition: buffer.c:549
int GWEN_Buffer_IncrementPos(GWEN_BUFFER *bf, uint32_t i)
Definition: buffer.c:452
GWEN_CRYPTMGR_VERIFYDATA_FN GWEN_CryptMgr_SetVerifyDataFn(GWEN_CRYPTMGR *cm, GWEN_CRYPTMGR_VERIFYDATA_FN f)
Definition: cryptmgr.c:259
uint8_t * GWEN_MDigest_GetDigestPtr(GWEN_MDIGEST *md)
Definition: mdigest.c:81
int GWEN_MDigest_Begin(GWEN_MDIGEST *md)
Definition: mdigest.c:129
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
GWENHYWFAR_API GWEN_MDIGEST * GWEN_MDigest_Rmd160_new(void)
Definition: mdigestgc.c:158
GWEN_CRYPTMGR_SIGNDATA_FN GWEN_CryptMgr_SetSignDataFn(GWEN_CRYPTMGR *cm, GWEN_CRYPTMGR_SIGNDATA_FN f)
Definition: cryptmgr.c:246
int GWEN_Padd_UnpaddWithIso9796_2(GWEN_BUFFER *buf)
Definition: padd.c:196
#define GWENHYWFAR_CB
Definition: gwenhywfarapi.h:89
int GWEN_Buffer_AppendBuffer(GWEN_BUFFER *bf, GWEN_BUFFER *sf)
Definition: buffer.c:507
#define GWEN_ERROR_GENERIC
Definition: error.h:62
struct GWEN_MDIGEST GWEN_MDIGEST
Definition: mdigest.h:25
int GWEN_Padd_PaddWithIso9796_2(GWEN_BUFFER *buf, int dstSize)
Definition: padd.c:148
struct GWEN_CRYPT_KEY GWEN_CRYPT_KEY
Definition: cryptkey.h:26
GWENHYWFAR_CB int GWEN_CryptMgrKeys_VerifyData(GWEN_CRYPTMGR *cm, const uint8_t *pData, uint32_t lData, const uint8_t *pSignature, uint32_t lSignature)
Definition: cryptmgrkeys.c:189
GWEN_CRYPTMGR * GWEN_CryptMgr_new(void)
Definition: cryptmgr.c:37
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
GWEN_CRYPTMGR * GWEN_CryptMgrKeys_new(const char *localName, GWEN_CRYPT_KEY *localKey, const char *peerName, GWEN_CRYPT_KEY *peerKey, int ownKeys)
Definition: cryptmgrkeys.c:33
GWENHYWFAR_CB int GWEN_CryptMgrKeys_SignData(GWEN_CRYPTMGR *cm, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *dbuf)
Definition: cryptmgrkeys.c:115
GWEN_INHERIT(GWEN_CRYPTMGR, GWEN_CRYPTMGR_KEYS)
int GWEN_MDigest_End(GWEN_MDIGEST *md)
Definition: mdigest.c:141
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
unsigned int GWEN_MDigest_GetDigestSize(GWEN_MDIGEST *md)
Definition: mdigest.c:90
void GWEN_CryptMgr_SetPeerKeyVersion(GWEN_CRYPTMGR *cm, int i)
Definition: cryptmgr.c:158
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
GWENHYWFAR_CB int GWEN_CryptMgrKeys_EncryptKey(GWEN_CRYPTMGR *cm, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *dbuf)
Definition: cryptmgrkeys.c:286
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
GWEN_CRYPTMGR_DECRYPTKEY_FN GWEN_CryptMgr_SetDecryptKeyFn(GWEN_CRYPTMGR *cm, GWEN_CRYPTMGR_DECRYPTKEY_FN f)
Definition: cryptmgr.c:285
int GWEN_Crypt_Key_GetKeyVersion(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:203
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
int GWEN_Buffer_AppendBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
Definition: buffer.c:361
#define GWEN_ERROR_VERIFY
Definition: error.h:104
void GWEN_CryptMgr_SetLocalKeyNumber(GWEN_CRYPTMGR *cm, int i)
Definition: cryptmgr.c:90
struct GWEN_CRYPTMGR GWEN_CRYPTMGR
Definition: cryptmgr.h:64
void GWEN_CryptMgr_SetPeerKeyNumber(GWEN_CRYPTMGR *cm, int i)
Definition: cryptmgr.c:142
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
Definition: inherit.h:292
#define GWEN_UNUSED
#define GWEN_INHERIT_GETDATA(bt, t, element)
Definition: inherit.h:271
GWENHYWFAR_CB void GWEN_CryptMgrKeys_FreeData(GWEN_UNUSED void *bp, void *p)
Definition: cryptmgrkeys.c:82
void GWEN_CryptMgrKeys_SetPeerKey(GWEN_CRYPTMGR *cm, GWEN_CRYPT_KEY *peerKey, int ownKey)
Definition: cryptmgrkeys.c:96