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