gwenhywfar  4.99.8beta
cryptkeyrsa.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Wed Mar 16 2005
3  copyright : (C) 2005 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * Please see toplevel file COPYING for license details *
8  ***************************************************************************/
9 
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13 
14 #define DISABLE_DEBUGLOG
15 
16 
17 #include "cryptkeyrsa_p.h"
18 #include <gwenhywfar/misc.h>
19 #include <gwenhywfar/debug.h>
20 #include <gwenhywfar/text.h>
21 
22 
23 
24 
25 GWEN_INHERIT(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA)
26 
27 
28 
29 
30 #if 0
31 static void dumpKeyData(gcry_ac_data_t data) {
32  int i;
33  unsigned int l;
34 
35  l=gcry_ac_data_length(data);
36  for (i=0; i<l; i++) {
37  const char *dname;
38  gcry_mpi_t mpi;
39  gcry_error_t err;
40  unsigned char *buf;
41  size_t nbytes;
42 
43  gcry_ac_data_get_index(data, 0, i, &dname, &mpi);
44  fprintf(stderr, "%3d: [%s]\n", i, dname);
45 
46  /* write mpi as bin into a buffer which will be allocates by this function */
47  err=gcry_mpi_aprint(GCRYMPI_FMT_USG, &buf, &nbytes, mpi);
48  if (err) {
49  DBG_INFO(GWEN_LOGDOMAIN, "gcry_mpi_aprint(): %d", err);
50  }
51  else {
52  GWEN_Text_DumpString((const char*)buf, nbytes, stderr, 6);
53  gcry_free(buf);
54  }
55  }
56 }
57 #endif
58 
59 
60 
61 static int GWEN_Crypt_KeyRsa__getNamedElement(gcry_sexp_t pkey, const char *name, gcry_mpi_t *pMpi) {
62  gcry_sexp_t list;
63  gcry_mpi_t mpi;
64 
65  /* get public exponent */
66  list=gcry_sexp_find_token(pkey, name, 0);
67  if (!list) {
68  DBG_ERROR(GWEN_LOGDOMAIN, "Missing element \"%s\" in sexp", name);
69  return GWEN_ERROR_GENERIC;
70  }
71 
72  mpi=gcry_sexp_nth_mpi(list, 1, GCRYMPI_FMT_USG);
73  if (!mpi) {
74  DBG_ERROR(GWEN_LOGDOMAIN, "Eror getting value for element \"%s\"", name);
75  gcry_sexp_release(list);
76  return GWEN_ERROR_GENERIC;
77  }
78 
79  *pMpi=mpi;
80  gcry_sexp_release(list);
81 
82  return 0;
83 }
84 
85 
86 
87 int GWEN_Crypt_KeyRsa_GeneratePair(unsigned int nbytes, int use65537e,
88  GWEN_CRYPT_KEY **pPubKey,
89  GWEN_CRYPT_KEY **pSecretKey) {
90  gcry_sexp_t keyparm, key;
91  int rc;
92  char buffer[256];
93  char numbuf[32];
94  gcry_sexp_t pkey;
95  int nbits;
96  GWEN_CRYPT_KEY *pubKey=NULL;
97  GWEN_CRYPT_KEY *secretKey=NULL;
98 
99  nbits=nbytes*8;
100  assert(nbits>0);
101  snprintf(numbuf, sizeof(numbuf)-1, "%d", nbits);
102  if (use65537e) {
103  snprintf(buffer, sizeof(buffer)-1,
104  "(genkey\n"
105  " (rsa\n"
106  " (nbits %zd:%d)\n"
107  " (rsa-use-e 5:65537)\n"
108  " ))",
109  strlen(numbuf),
110  nbits);
111  }
112  else
113  snprintf(buffer, sizeof(buffer)-1,
114  "(genkey\n"
115  " (rsa\n"
116  " (nbits %zd:%d)\n"
117  " (rsa-use-e 1:0)\n"
118  " ))",
119  strlen(numbuf),
120  nbits);
121  buffer[sizeof(buffer)-1]=0;
122 
123  /*DBG_ERROR(0, "Genkey string: [%s]", buffer);*/
124 
125  rc=gcry_sexp_new(&keyparm, buffer, 0, 1);
126  if (rc) {
128  "Error creating S-expression: %s", gpg_strerror (rc));
129  return GWEN_ERROR_GENERIC;
130  }
131 
132  rc=gcry_pk_genkey(&key, keyparm);
133  gcry_sexp_release(keyparm);
134  if (rc) {
135  DBG_ERROR(GWEN_LOGDOMAIN, "Error generating RSA key: %s", gpg_strerror (rc));
136  return GWEN_ERROR_GENERIC;
137  }
138 
139  pkey=gcry_sexp_find_token(key, "public-key", 0);
140  if (!pkey) {
141  DBG_ERROR(GWEN_LOGDOMAIN, "Public part missing in return value");
142  gcry_sexp_release(key);
143  return GWEN_ERROR_GENERIC;
144  }
145  else {
146  int rv;
147  gcry_mpi_t n=NULL;
148  gcry_mpi_t e=NULL;
149  GWEN_CRYPT_KEY *k;
150  GWEN_CRYPT_KEY_RSA *xk;
151 
152  /* get public exponent */
153  rv=GWEN_Crypt_KeyRsa__getNamedElement(pkey, "n", &n);
154  if (rv<0) {
155  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
156  gcry_sexp_release(key);
157  return GWEN_ERROR_GENERIC;
158  }
159 
160  rv=GWEN_Crypt_KeyRsa__getNamedElement(pkey, "e", &e);
161  if (rv<0) {
162  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
163  gcry_mpi_release(n);
164  gcry_sexp_release(key);
165  return GWEN_ERROR_GENERIC;
166  }
167 
168  /* create public key */
169  k=GWEN_Crypt_Key_new(GWEN_Crypt_CryptAlgoId_Rsa, nbytes);
170  GWEN_NEW_OBJECT(GWEN_CRYPT_KEY_RSA, xk);
176  xk->modulus=gcry_mpi_copy(n);
177  xk->pubExponent=gcry_mpi_copy(e);
178  xk->pub=1;
179  pubKey=k;
180 
181  gcry_mpi_release(e);
182  gcry_mpi_release(n);
183  }
184 
185 
186  pkey=gcry_sexp_find_token(key, "private-key", 0);
187  if (!pkey) {
188  DBG_ERROR(GWEN_LOGDOMAIN, "Private part missing in return value");
189  gcry_sexp_release(key);
190  return GWEN_ERROR_GENERIC;
191  }
192  else {
193  int rv;
194  gcry_mpi_t n=NULL;
195  gcry_mpi_t e=NULL;
196  gcry_mpi_t d=NULL;
197  GWEN_CRYPT_KEY *k;
198  GWEN_CRYPT_KEY_RSA *xk;
199 
200  /* get public exponent */
201  rv=GWEN_Crypt_KeyRsa__getNamedElement(pkey, "n", &n);
202  if (rv<0) {
203  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
204  gcry_sexp_release(key);
205  return GWEN_ERROR_GENERIC;
206  }
207 
208  rv=GWEN_Crypt_KeyRsa__getNamedElement(pkey, "e", &e);
209  if (rv<0) {
210  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
211  gcry_mpi_release(n);
212  gcry_sexp_release(key);
213  return GWEN_ERROR_GENERIC;
214  }
215 
216  rv=GWEN_Crypt_KeyRsa__getNamedElement(pkey, "d", &d);
217  if (rv<0) {
218  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
219  gcry_mpi_release(e);
220  gcry_mpi_release(n);
221  gcry_sexp_release(key);
222  return GWEN_ERROR_GENERIC;
223  }
224 
225  /* create private key */
226  k=GWEN_Crypt_Key_new(GWEN_Crypt_CryptAlgoId_Rsa, nbytes);
227  GWEN_NEW_OBJECT(GWEN_CRYPT_KEY_RSA, xk);
233  xk->modulus=gcry_mpi_copy(n);
234  xk->pubExponent=gcry_mpi_copy(e);
235  xk->privExponent=gcry_mpi_copy(d);
236  xk->pub=0;
237  secretKey=k;
238 
239  gcry_mpi_release(d);
240  gcry_mpi_release(e);
241  gcry_mpi_release(n);
242  }
243 
244  gcry_sexp_release(key);
245 
246  *pPubKey=pubKey;
247  *pSecretKey=secretKey;
248 
249  return 0;
250 }
251 
252 
253 
254 #ifndef NO_DEPRECATED_SYMBOLS
255 int GWEN_Crypt_KeyRsa_GeneratePair2(unsigned int nbits, int use65537e,
256  GWEN_CRYPT_KEY **pPubKey,
257  GWEN_CRYPT_KEY **pSecretKey) {
258  if (nbits%8) {
260  "nbits is required to be a multiple of 8 (%d)", nbits);
261  return GWEN_ERROR_INVALID;
262  }
263  return GWEN_Crypt_KeyRsa_GeneratePair(nbits/8, use65537e, pPubKey, pSecretKey);
264 }
265 #endif // ifndef NO_DEPRECATED_SYMBOLS
266 
267 
268 
269 
271  const uint8_t *pInData,
272  uint32_t inLen,
273  uint8_t *pSignatureData,
274  uint32_t *pSignatureLen) {
275  GWEN_CRYPT_KEY_RSA *xk;
276  gcry_error_t err;
277  size_t nscanned;
278  gcry_mpi_t mpi_in=NULL;
279  gcry_mpi_t mpi_sigout1;
280  gcry_mpi_t mpi_sigout2=NULL;
281  size_t nwritten;
282 
283  assert(k);
284  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
285  assert(xk);
286 
287  if (xk->modulus==NULL) {
288  DBG_ERROR(GWEN_LOGDOMAIN, "No modulus in key data");
289  return GWEN_ERROR_BAD_DATA;
290  }
291 
292  if (xk->privExponent==NULL) {
293  DBG_ERROR(GWEN_LOGDOMAIN, "No secret exponent in key data");
294  return GWEN_ERROR_BAD_DATA;
295  }
296 
297  /* convert input to MPI */
298  err=gcry_mpi_scan(&mpi_in, GCRYMPI_FMT_USG, pInData, inLen, &nscanned);
299  if (err) {
300  DBG_INFO(GWEN_LOGDOMAIN, "gcry_mpi_scan(): %s", gcry_strerror(err));
301  gcry_mpi_release(mpi_in);
302  return GWEN_ERROR_BAD_DATA;
303  }
304 
305  /* create first signature */
306  mpi_sigout1=gcry_mpi_new(GWEN_Crypt_Key_GetKeySize(k));
307  gcry_mpi_powm(mpi_sigout1, mpi_in, xk->privExponent, xk->modulus);
308 
309  if (!(xk->flags & GWEN_CRYPT_KEYRSA_FLAGS_DIRECTSIGN)) {
310  /* create second signature */
311  mpi_sigout2=gcry_mpi_new(GWEN_Crypt_Key_GetKeySize(k));
312  gcry_mpi_sub(mpi_sigout2, xk->modulus, mpi_sigout1);
313 
314  if (gcry_mpi_cmp(mpi_sigout2, mpi_sigout1)<0) {
315  DBG_DEBUG(GWEN_LOGDOMAIN, "Choosing 2nd variant");
316  gcry_mpi_set(mpi_sigout1, mpi_sigout2);
317  }
318  }
319 
320  /* release unneeded objects */
321  gcry_mpi_release(mpi_sigout2);
322  gcry_mpi_release(mpi_in);
323 
324  /* convert signature MPI */
325  err=gcry_mpi_print(GCRYMPI_FMT_USG,
326  pSignatureData, *pSignatureLen,
327  &nwritten, mpi_sigout1);
328  gcry_mpi_release(mpi_sigout1);
329  if (err) {
330  DBG_INFO(GWEN_LOGDOMAIN, "gcry_mpi_print(): %s", gcry_strerror(err));
331  return GWEN_ERROR_BAD_DATA;
332  }
333  *pSignatureLen=nwritten;
334 
335  return 0;
336 }
337 
338 
339 
341  const uint8_t *pInData,
342  uint32_t inLen,
343  const uint8_t *pSignatureData,
344  uint32_t signatureLen) {
345  GWEN_CRYPT_KEY_RSA *xk;
346  gcry_error_t err;
347  size_t nscanned;
348  gcry_mpi_t mpi_in=NULL;
349  gcry_mpi_t mpi_sigin1=NULL;
350  gcry_mpi_t mpi_sigout;
351 
352  assert(k);
353  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
354  assert(xk);
355 
356  if (xk->modulus==NULL) {
357  DBG_ERROR(GWEN_LOGDOMAIN, "No modulus in key data");
358  return GWEN_ERROR_BAD_DATA;
359  }
360 
361  if (xk->pubExponent==NULL) {
362  DBG_ERROR(GWEN_LOGDOMAIN, "No public exponent in key data");
363  return GWEN_ERROR_BAD_DATA;
364  }
365 
366 
367  /* convert input to MPI */
368  err=gcry_mpi_scan(&mpi_in, GCRYMPI_FMT_USG, pInData, inLen, &nscanned);
369  if (err) {
370  DBG_INFO(GWEN_LOGDOMAIN, "gcry_mpi_scan(): %s", gcry_strerror(err));
371  gcry_mpi_release(mpi_in);
372  return GWEN_ERROR_BAD_DATA;
373  }
374 
375  /* convert signature to MPI */
376  err=gcry_mpi_scan(&mpi_sigin1, GCRYMPI_FMT_USG,
377  pSignatureData, signatureLen,
378  &nscanned);
379  if (err) {
380  DBG_INFO(GWEN_LOGDOMAIN, "gcry_mpi_scan(): %s", gcry_strerror(err));
381  gcry_mpi_release(mpi_sigin1);
382  gcry_mpi_release(mpi_in);
383  return GWEN_ERROR_BAD_DATA;
384  }
385 
386  /* create signature */
387  mpi_sigout=gcry_mpi_new(GWEN_Crypt_Key_GetKeySize(k));
388  gcry_mpi_powm(mpi_sigout, mpi_sigin1, xk->pubExponent, xk->modulus);
389  /* compare */
390  if (gcry_mpi_cmp(mpi_sigout, mpi_in)) {
391  gcry_mpi_t mpi_sigin2;
392 
393  mpi_sigin2=gcry_mpi_new(GWEN_Crypt_Key_GetKeySize(k));
394 
395  DBG_DEBUG(GWEN_LOGDOMAIN, "Trying 2nd variant");
396  gcry_mpi_sub(mpi_sigin2, xk->modulus, mpi_sigin1);
397  gcry_mpi_powm(mpi_sigout, mpi_sigin2, xk->pubExponent, xk->modulus);
398  if (gcry_mpi_cmp(mpi_sigout, mpi_in)) {
399  DBG_ERROR(GWEN_LOGDOMAIN, "Bad signature");
400  gcry_mpi_release(mpi_sigin2);
401  gcry_mpi_release(mpi_sigout);
402  gcry_mpi_release(mpi_sigin1);
403  gcry_mpi_release(mpi_in);
404  return GWEN_ERROR_VERIFY;
405  }
406  gcry_mpi_release(mpi_sigin2);
407  }
408 
409  gcry_mpi_release(mpi_sigout);
410  gcry_mpi_release(mpi_sigin1);
411  gcry_mpi_release(mpi_in);
412 
413  return 0;
414 }
415 
416 
417 
419  const uint8_t *pInData,
420  uint32_t inLen,
421  uint8_t *pOutData,
422  uint32_t *pOutLen) {
423  GWEN_CRYPT_KEY_RSA *xk;
424  gcry_error_t err;
425  size_t nscanned;
426  gcry_mpi_t mpi_in=NULL;
427  gcry_mpi_t mpi_out;
428  size_t nwritten;
429 
430  assert(k);
431  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
432  assert(xk);
433 
434  if (xk->modulus==NULL) {
435  DBG_ERROR(GWEN_LOGDOMAIN, "No modulus in key data");
436  return GWEN_ERROR_BAD_DATA;
437  }
438 
439  if (xk->pubExponent==NULL) {
440  DBG_ERROR(GWEN_LOGDOMAIN, "No public exponent in key data");
441  return GWEN_ERROR_BAD_DATA;
442  }
443 
444 
445  /* convert input to MPI */
446  err=gcry_mpi_scan(&mpi_in, GCRYMPI_FMT_USG, pInData, inLen, &nscanned);
447  if (err) {
448  DBG_INFO(GWEN_LOGDOMAIN, "gcry_mpi_scan(): %s", gcry_strerror(err));
449  gcry_mpi_release(mpi_in);
450  return GWEN_ERROR_BAD_DATA;
451  }
452 
453  /* encrypt */
454  mpi_out=gcry_mpi_new(GWEN_Crypt_Key_GetKeySize(k));
455  gcry_mpi_powm(mpi_out, mpi_in, xk->pubExponent, xk->modulus);
456 
457  /* release unneeded objects */
458  gcry_mpi_release(mpi_in);
459 
460  /* convert result MPI */
461  err=gcry_mpi_print(GCRYMPI_FMT_USG,
462  pOutData, *pOutLen,
463  &nwritten, mpi_out);
464  gcry_mpi_release(mpi_out);
465  if (err) {
466  DBG_INFO(GWEN_LOGDOMAIN, "gcry_mpi_print(): %s", gcry_strerror(err));
467  return GWEN_ERROR_BAD_DATA;
468  }
469  *pOutLen=nwritten;
470 
471  return 0;
472 }
473 
474 
475 
477  const uint8_t *pInData,
478  uint32_t inLen,
479  uint8_t *pOutData,
480  uint32_t *pOutLen) {
481  GWEN_CRYPT_KEY_RSA *xk;
482  gcry_error_t err;
483  size_t nscanned;
484  gcry_mpi_t mpi_in=NULL;
485  gcry_mpi_t mpi_out;
486  size_t nwritten;
487 
488  assert(k);
489  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
490  assert(xk);
491 
492  if (xk->modulus==NULL) {
493  DBG_ERROR(GWEN_LOGDOMAIN, "No modulus in key data");
494  return GWEN_ERROR_BAD_DATA;
495  }
496 
497  if (xk->privExponent==NULL) {
498  DBG_ERROR(GWEN_LOGDOMAIN, "No secret exponent in key data");
499  return GWEN_ERROR_BAD_DATA;
500  }
501 
502 
503  /* convert input to MPI */
504  err=gcry_mpi_scan(&mpi_in, GCRYMPI_FMT_USG, pInData, inLen, &nscanned);
505  if (err) {
506  DBG_INFO(GWEN_LOGDOMAIN, "gcry_mpi_scan(): %s", gcry_strerror(err));
507  gcry_mpi_release(mpi_in);
508  return GWEN_ERROR_BAD_DATA;
509  }
510 
511  /* decrypt */
512  mpi_out=gcry_mpi_new(GWEN_Crypt_Key_GetKeySize(k));
513  gcry_mpi_powm(mpi_out, mpi_in, xk->privExponent, xk->modulus);
514 
515  /* release unneeded objects */
516  gcry_mpi_release(mpi_in);
517 
518  /* convert result MPI */
519  err=gcry_mpi_print(GCRYMPI_FMT_USG,
520  pOutData, *pOutLen,
521  &nwritten, mpi_out);
522  gcry_mpi_release(mpi_out);
523  if (err) {
524  DBG_INFO(GWEN_LOGDOMAIN, "gcry_mpi_print(): %s", gcry_strerror(err));
525  return GWEN_ERROR_BAD_DATA;
526  }
527  *pOutLen=nwritten;
528 
529  return 0;
530 }
531 
532 
533 
534 static int GWEN_Crypt_KeyRsa__ReadMpi(GWEN_DB_NODE *db, const char *dbName, gcry_mpi_t *pMpi) {
535  gcry_error_t err;
536  const void *p;
537  unsigned int len;
538  gcry_mpi_t mpi=NULL;
539  size_t nscanned=0;
540 
541  /* read n */
542  p=GWEN_DB_GetBinValue(db, dbName, 0, NULL, 0, &len);
543  if (p==NULL || len<1) {
544  DBG_INFO(GWEN_LOGDOMAIN, "Missing %s", dbName);
545  return GWEN_ERROR_NO_DATA;
546  }
547 
548  err=gcry_mpi_scan(&mpi, GCRYMPI_FMT_USG, p, len, &nscanned);
549  if (err) {
550  DBG_INFO(GWEN_LOGDOMAIN, "gcry_mpi_scan(): %s", gcry_strerror(err));
551  gcry_mpi_release(mpi);
552  return GWEN_ERROR_GENERIC;
553  }
554  if (nscanned<1) {
555  if (mpi==NULL) {
556  DBG_INFO(GWEN_LOGDOMAIN, "Empty %s (%d)", dbName, (int)nscanned);
557  return GWEN_ERROR_BAD_DATA;
558  }
559  }
560  *pMpi=mpi;
561 
562  return 0;
563 }
564 
565 
566 
567 
568 static int GWEN_Crypt_KeyRsa__WriteMpi(GWEN_DB_NODE *db, const char *dbName, const gcry_mpi_t mpi) {
569  gcry_error_t err;
570  unsigned char *buf;
571  size_t nbytes;
572 
573  /* write mpi as bin into a buffer which will be allocates by this function */
574  err=gcry_mpi_aprint(GCRYMPI_FMT_USG, &buf, &nbytes, mpi);
575  if (err) {
576  DBG_INFO(GWEN_LOGDOMAIN, "gcry_mpi_aprint(%s): %s", dbName, gcry_strerror(err));
577  return GWEN_ERROR_GENERIC;
578  }
580  dbName,
581  buf, nbytes);
582  gcry_free(buf);
583 
584  return 0;
585 }
586 
587 
588 
589 static int GWEN_Crypt_KeyRsa__MpiToBuffer(const gcry_mpi_t mpi, unsigned char *buf, size_t nbytes) {
590  gcry_error_t err;
591  size_t nwritten=0;
592 
593  /* write mpi as bin into the given buffer */
594  err=gcry_mpi_print(GCRYMPI_FMT_USG, buf, nbytes, &nwritten, mpi);
595  if (err) {
596  DBG_INFO(GWEN_LOGDOMAIN, "gcry_mpi_print(): %s", gcry_strerror(err));
597  return GWEN_ERROR_GENERIC;
598  }
599 
600  return nwritten;
601 }
602 
603 
604 
605 static GWENHYWFAR_CB
606 void GWEN_Crypt_KeyRsa_freeData(GWEN_UNUSED void *bp, void *p) {
607  GWEN_CRYPT_KEY_RSA *xk;
608 
609  xk=(GWEN_CRYPT_KEY_RSA*) p;
610  if (xk->modulus)
611  gcry_mpi_release(xk->modulus);
612  if (xk->pubExponent)
613  gcry_mpi_release(xk->pubExponent);
614  if (xk->privExponent)
615  gcry_mpi_release(xk->privExponent);
616 
617  GWEN_FREE_OBJECT(xk);
618 }
619 
620 
621 
623  int rv;
624  int isPublic;
625  GWEN_CRYPT_KEY *k;
626  GWEN_CRYPT_KEY_RSA *xk;
627  GWEN_DB_NODE *dbR;
628 
630  if (dbR==NULL) {
631  DBG_ERROR(GWEN_LOGDOMAIN, "DB does not contain an RSA key (no RSA group)");
632  return NULL;
633  }
634  k=GWEN_Crypt_Key_fromDb(db);
635  if (k==NULL) {
636  DBG_INFO(GWEN_LOGDOMAIN, "here");
637  return NULL;
638  }
639  if (GWEN_Crypt_Key_GetCryptAlgoId(k)!=GWEN_Crypt_CryptAlgoId_Rsa) {
640  DBG_ERROR(GWEN_LOGDOMAIN, "DB does not contain an RSA key");
642  return NULL;
643  }
644 
645  /* extend key */
646  GWEN_NEW_OBJECT(GWEN_CRYPT_KEY_RSA, xk);
647  GWEN_INHERIT_SETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k, xk,
653 
654  isPublic=GWEN_DB_GetIntValue(dbR, "isPublic", 0, 1);
655  xk->pub=isPublic;
656 
657  xk->flags=GWEN_DB_GetIntValue(dbR, "flags", 0, 0);
658 
659  /* read data */
660  rv=GWEN_Crypt_KeyRsa__ReadMpi(dbR, "n", &(xk->modulus));
661  if (rv<0) {
662  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
664  return NULL;
665  }
666 
667  rv=GWEN_Crypt_KeyRsa__ReadMpi(dbR, "e", &(xk->pubExponent));
668  if (rv<0) {
669  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
671  return NULL;
672  }
673 
674  if (!isPublic) {
675  rv=GWEN_Crypt_KeyRsa__ReadMpi(dbR, "d", &(xk->privExponent));
676  if (rv<0) {
677  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
679  return NULL;
680  }
681  }
682 
683 
684  return k;
685 }
686 
687 
688 
690  GWEN_CRYPT_KEY_RSA *xk;
691  GWEN_DB_NODE *dbR;
692  int rv;
693 
694  assert(k);
695  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
696  assert(xk);
697 
698  if (xk->pub && !pub) {
699  DBG_ERROR(GWEN_LOGDOMAIN, "Can't write public key as secret key");
700  return GWEN_ERROR_INVALID;
701  }
702 
703 #if 0
704  DBG_ERROR(0, "toDb (%s):", pub?"public":"private");
705  dumpKeyData(ds);
706 #endif
707 
708  /* let key module write basic key info */
709  rv=GWEN_Crypt_Key_toDb(k, db);
710  if (rv)
711  return rv;
712 
713  /* write RSA stuff into our own group */
715  assert(dbR);
716 
718  "isPublic", pub);
720  "flags", xk->flags);
721 
722  /* store n */
723  rv=GWEN_Crypt_KeyRsa__WriteMpi(dbR, "n", xk->modulus);
724  if (rv) {
725  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
726  return rv;
727  }
728 
729  /* store e */
730  rv=GWEN_Crypt_KeyRsa__WriteMpi(dbR, "e", xk->pubExponent);
731  if (rv) {
732  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
733  return rv;
734  }
735 
736 
737  if (!pub) {
738  /* store d */
739  rv=GWEN_Crypt_KeyRsa__WriteMpi(dbR, "d", xk->privExponent);
740  if (rv) {
741  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
742  return rv;
743  }
744  }
745 
746  return 0;
747 }
748 
749 
750 
751 
752 int GWEN_Crypt_KeyRsa_GetModulus(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen) {
753  GWEN_CRYPT_KEY_RSA *xk;
754  int rv;
755 
756  assert(k);
757  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
758  assert(xk);
759 
760  rv=GWEN_Crypt_KeyRsa__MpiToBuffer(xk->modulus, buffer, *pBufLen);
761  if (rv<1) {
762  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
763  if (rv<0)
764  return rv;
765  return GWEN_ERROR_GENERIC;
766  }
767 
768  *pBufLen=rv;
769  return 0;
770 }
771 
772 
773 
774 int GWEN_Crypt_KeyRsa_GetExponent(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen) {
775  GWEN_CRYPT_KEY_RSA *xk;
776  int rv;
777 
778  assert(k);
779  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
780  assert(xk);
781 
782  rv=GWEN_Crypt_KeyRsa__MpiToBuffer(xk->pubExponent, buffer, *pBufLen);
783  if (rv<1) {
784  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
785  if (rv<0)
786  return rv;
787  return GWEN_ERROR_GENERIC;
788  }
789 
790  *pBufLen=rv;
791  return 0;
792 }
793 
794 
795 
796 int GWEN_Crypt_KeyRsa_GetSecretExponent(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen) {
797  GWEN_CRYPT_KEY_RSA *xk;
798  int rv;
799 
800  assert(k);
801  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
802  assert(xk);
803 
804  rv=GWEN_Crypt_KeyRsa__MpiToBuffer(xk->privExponent, buffer, *pBufLen);
805  if (rv<1) {
806  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
807  if (rv<0)
808  return rv;
809  return GWEN_ERROR_GENERIC;
810  }
811 
812  *pBufLen=rv;
813  return 0;
814 }
815 
816 
817 
819  const uint8_t *pModulus,
820  uint32_t lModulus,
821  const uint8_t *pExponent,
822  uint32_t lExponent) {
823  GWEN_DB_NODE *dbKey;
824  GWEN_DB_NODE *dbR;
825  GWEN_CRYPT_KEY *key;
826 
827  assert(nbytes);
828  assert(pModulus);
829  assert(lModulus);
830  assert(pExponent);
831  assert(lExponent);
832 
833  dbKey=GWEN_DB_Group_new("key");
835 
836  /* basic key stuff */
838  "cryptAlgoId",
839  GWEN_Crypt_CryptAlgoId_toString(GWEN_Crypt_CryptAlgoId_Rsa));
841  "keySize", nbytes);
842 
843  /* RSA stuff */
845  "isPublic", 1);
847  "n",
848  pModulus, lModulus);
850  "e",
851  pExponent, lExponent);
852 
853  /* create key from DB */
854  key=GWEN_Crypt_KeyRsa_fromDb(dbKey);
855  if (key==NULL) {
857  "Internal error: Bad RSA key group");
858  GWEN_DB_Dump(dbKey, 2);
859  GWEN_DB_Group_free(dbKey);
860  return NULL;
861  }
862 
863  GWEN_DB_Group_free(dbKey);
864  return key;
865 }
866 
867 
868 
870  const uint8_t *pModulus,
871  uint32_t lModulus,
872  const uint8_t *pExponent,
873  uint32_t lExponent,
874  const uint8_t *pPrivExponent,
875  uint32_t lPrivExponent) {
876  GWEN_DB_NODE *dbKey;
877  GWEN_DB_NODE *dbR;
878  GWEN_CRYPT_KEY *key;
879 
880  assert(nbytes);
881  assert(pModulus);
882  assert(lModulus);
883  assert(pExponent);
884  assert(lExponent);
885  assert(pPrivExponent);
886  assert(lPrivExponent);
887 
888  dbKey=GWEN_DB_Group_new("key");
890 
891  /* basic key stuff */
893  "cryptAlgoId",
894  GWEN_Crypt_CryptAlgoId_toString(GWEN_Crypt_CryptAlgoId_Rsa));
896  "keySize", nbytes);
897 
898  /* RSA stuff */
900  "isPublic", 0);
902  "n",
903  pModulus, lModulus);
905  "e",
906  pExponent, lExponent);
908  "d",
909  pPrivExponent, lPrivExponent);
910 
911  /* create key from DB */
912  key=GWEN_Crypt_KeyRsa_fromDb(dbKey);
913  if (key==NULL) {
915  "Internal error: Bad RSA key group");
916  GWEN_DB_Dump(dbKey, 2);
917  GWEN_DB_Group_free(dbKey);
918  return NULL;
919  }
920 
921  GWEN_DB_Group_free(dbKey);
922  return key;
923 }
924 
925 
926 
928  GWEN_CRYPT_KEY_RSA *xk;
929  GWEN_DB_NODE *dbKey;
930  GWEN_CRYPT_KEY *nk;
931  int rv;
932 
933  assert(k);
934  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
935  assert(xk);
936 
937  dbKey=GWEN_DB_Group_new("dbKey");
938  rv=GWEN_Crypt_KeyRsa_toDb(k, dbKey, xk->pub);
939  if (rv<0) {
940  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
941  GWEN_DB_Group_free(dbKey);
942  return NULL;
943  }
944 
945  nk=GWEN_Crypt_KeyRsa_fromDb(dbKey);
946  GWEN_DB_Group_free(dbKey);
947  if (nk==NULL) {
948  DBG_INFO(GWEN_LOGDOMAIN, "Could not create key");
949  }
950 
951  GWEN_Crypt_KeyRsa_SetFlags(nk, xk->flags);
952 
953  return nk;
954 }
955 
956 
957 
959  GWEN_CRYPT_KEY_RSA *xk;
960 
961  assert(k);
962  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
963  assert(xk);
964 
965  return xk->flags;
966 }
967 
968 
969 
971  GWEN_CRYPT_KEY_RSA *xk;
972 
973  assert(k);
974  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
975  assert(xk);
976 
977  xk->flags=fl;
978 }
979 
980 
981 
983  GWEN_CRYPT_KEY_RSA *xk;
984 
985  assert(k);
986  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
987  assert(xk);
988 
989  xk->flags|=fl;
990 }
991 
992 
993 
995  GWEN_CRYPT_KEY_RSA *xk;
996 
997  assert(k);
998  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_RSA, k);
999  assert(xk);
1000 
1001  xk->flags&=~fl;
1002 }
1003 
1004 
1005 
1006 
1007 
1008 
1009 
1010 
int GWEN_Crypt_KeyRsa_GeneratePair2(unsigned int nbits, int use65537e, GWEN_CRYPT_KEY **pPubKey, GWEN_CRYPT_KEY **pSecretKey)
Definition: cryptkeyrsa.c:255
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
Definition: db.c:1297
GWEN_CRYPT_KEY * GWEN_Crypt_KeyRsa_fromModPrivExp(unsigned int nbytes, const uint8_t *pModulus, uint32_t lModulus, const uint8_t *pExponent, uint32_t lExponent, const uint8_t *pPrivExponent, uint32_t lPrivExponent)
Definition: cryptkeyrsa.c:869
static GWENHYWFAR_CB void GWEN_Crypt_KeyRsa_freeData(GWEN_UNUSED void *bp, void *p)
Definition: cryptkeyrsa.c:606
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
Definition: db.c:369
#define GWEN_ERROR_INVALID
Definition: error.h:67
int GWEN_Crypt_Key_GetKeySize(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:171
GWEN_CRYPT_KEY_VERIFY_FN GWEN_Crypt_Key_SetVerifyFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_VERIFY_FN f)
Definition: cryptkey.c:218
void GWEN_Crypt_KeyRsa_SetFlags(GWEN_CRYPT_KEY *k, uint32_t fl)
Definition: cryptkeyrsa.c:970
void GWEN_Text_DumpString(const char *s, unsigned int l, unsigned int insert)
Definition: text.c:1235
void GWEN_Crypt_Key_free(GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:148
int GWEN_Crypt_KeyRsa_GeneratePair(unsigned int nbytes, int use65537e, GWEN_CRYPT_KEY **pPubKey, GWEN_CRYPT_KEY **pSecretKey)
Definition: cryptkeyrsa.c:87
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:92
#define NULL
Definition: binreloc.c:290
GWEN_CRYPT_KEY * GWEN_Crypt_KeyRsa_fromModExp(unsigned int nbytes, const uint8_t *pModulus, uint32_t lModulus, const uint8_t *pExponent, uint32_t lExponent)
Definition: cryptkeyrsa.c:818
GWENHYWFAR_CB int GWEN_Crypt_KeyRsa_Sign(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pSignatureData, uint32_t *pSignatureLen)
Definition: cryptkeyrsa.c:270
void GWEN_Crypt_KeyRsa_SubFlags(GWEN_CRYPT_KEY *k, uint32_t fl)
Definition: cryptkeyrsa.c:994
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_Key_GetCryptAlgoId(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:164
static int GWEN_Crypt_KeyRsa__WriteMpi(GWEN_DB_NODE *db, const char *dbName, const gcry_mpi_t mpi)
Definition: cryptkeyrsa.c:568
void GWEN_Crypt_KeyRsa_AddFlags(GWEN_CRYPT_KEY *k, uint32_t fl)
Definition: cryptkeyrsa.c:982
static GWENHYWFAR_CB int GWEN_Crypt_KeyRsa_Decipher(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen)
Definition: cryptkeyrsa.c:476
static int GWEN_Crypt_KeyRsa__getNamedElement(gcry_sexp_t pkey, const char *name, gcry_mpi_t *pMpi)
Definition: cryptkeyrsa.c:61
int GWEN_Crypt_Key_toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db)
Definition: cryptkey.c:113
#define GWEN_ERROR_BAD_DATA
Definition: error.h:121
int GWEN_DB_SetBinValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const void *val, unsigned int valSize)
Definition: db.c:1151
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:86
GWEN_CRYPT_KEY * GWEN_Crypt_KeyRsa_fromDb(GWEN_DB_NODE *db)
Definition: cryptkeyrsa.c:622
GWEN_CRYPT_KEY_SIGN_FN GWEN_Crypt_Key_SetSignFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_SIGN_FN f)
Definition: cryptkey.c:206
#define GWENHYWFAR_CB
Definition: gwenhywfarapi.h:89
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:192
static GWENHYWFAR_CB int GWEN_Crypt_KeyRsa_Encipher(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen)
Definition: cryptkeyrsa.c:418
const char * GWEN_Crypt_CryptAlgoId_toString(GWEN_CRYPT_CRYPTALGOID a)
Definition: cryptalgo.c:52
#define GWEN_DB_FLAGS_OVERWRITE_GROUPS
Definition: db.h:123
const void * GWEN_DB_GetBinValue(GWEN_DB_NODE *n, const char *path, int idx, const void *defVal, unsigned int defValSize, unsigned int *returnValueSize)
Definition: db.c:1120
#define GWEN_ERROR_GENERIC
Definition: error.h:62
struct GWEN_CRYPT_KEY GWEN_CRYPT_KEY
Definition: cryptkey.h:26
static int GWEN_Crypt_KeyRsa__ReadMpi(GWEN_DB_NODE *db, const char *dbName, gcry_mpi_t *pMpi)
Definition: cryptkeyrsa.c:534
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
Definition: db.c:1260
#define GWEN_CRYPT_KEYRSA_FLAGS_DIRECTSIGN
Definition: cryptkeyrsa.h:22
GWEN_CRYPT_KEY_DECIPHER_FN GWEN_Crypt_Key_SetDecipherFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_DECIPHER_FN f)
Definition: cryptkey.c:243
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:922
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:164
int GWEN_Crypt_KeyRsa_GetSecretExponent(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen)
Definition: cryptkeyrsa.c:796
int GWEN_DB_GetIntValue(GWEN_DB_NODE *n, const char *path, int idx, int defVal)
Definition: db.c:1048
#define GWEN_ERROR_VERIFY
Definition: error.h:104
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
Definition: db.c:131
uint32_t GWEN_Crypt_KeyRsa_GetFlags(const GWEN_CRYPT_KEY *k)
Definition: cryptkeyrsa.c:958
#define GWEN_INHERIT(bt, t)
Definition: inherit.h:264
GWEN_CRYPT_KEY_ENCIPHER_FN GWEN_Crypt_Key_SetEncipherFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_ENCIPHER_FN f)
Definition: cryptkey.c:230
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1086
GWEN_CRYPT_KEY * GWEN_Crypt_Key_new(GWEN_CRYPT_CRYPTALGOID cryptAlgoId, int keySize)
Definition: cryptkey.c:61
#define GWEN_ERROR_NO_DATA
Definition: error.h:94
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
Definition: inherit.h:292
GWEN_CRYPT_KEY * GWEN_Crypt_KeyRsa_dup(const GWEN_CRYPT_KEY *k)
Definition: cryptkeyrsa.c:927
int GWEN_Crypt_KeyRsa_GetExponent(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen)
Definition: cryptkeyrsa.c:774
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
Definition: path.h:84
int GWEN_Crypt_KeyRsa_toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db, int pub)
Definition: cryptkeyrsa.c:689
GWEN_CRYPT_KEY * GWEN_Crypt_Key_fromDb(GWEN_DB_NODE *db)
Definition: cryptkey.c:77
static int GWEN_Crypt_KeyRsa__MpiToBuffer(const gcry_mpi_t mpi, unsigned char *buf, size_t nbytes)
Definition: cryptkeyrsa.c:589
#define GWEN_UNUSED
int GWEN_Crypt_KeyRsa_GetModulus(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen)
Definition: cryptkeyrsa.c:752
#define GWEN_INHERIT_GETDATA(bt, t, element)
Definition: inherit.h:271
static GWENHYWFAR_CB int GWEN_Crypt_KeyRsa_Verify(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, const uint8_t *pSignatureData, uint32_t signatureLen)
Definition: cryptkeyrsa.c:340