2005-04-11 Marcus Brinkmann <marcus@g10code.de>
[gnupg.git] / sm / sign.c
blob5deef6088e68d98d2859b124fd55e45b2c349b5a
1 /* sign.c - Sign a message
2 * Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
4 * This file is part of GnuPG.
6 * GnuPG is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * GnuPG is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <errno.h>
26 #include <unistd.h>
27 #include <time.h>
28 #include <assert.h>
30 #include "gpgsm.h"
31 #include <gcrypt.h>
32 #include <ksba.h>
34 #include "keydb.h"
35 #include "i18n.h"
38 static void
39 hash_data (int fd, gcry_md_hd_t md)
41 FILE *fp;
42 char buffer[4096];
43 int nread;
45 fp = fdopen ( dup (fd), "rb");
46 if (!fp)
48 log_error ("fdopen(%d) failed: %s\n", fd, strerror (errno));
49 return;
52 do
54 nread = fread (buffer, 1, DIM(buffer), fp);
55 gcry_md_write (md, buffer, nread);
57 while (nread);
58 if (ferror (fp))
59 log_error ("read error on fd %d: %s\n", fd, strerror (errno));
60 fclose (fp);
63 static int
64 hash_and_copy_data (int fd, gcry_md_hd_t md, ksba_writer_t writer)
66 gpg_error_t err;
67 FILE *fp;
68 char buffer[4096];
69 int nread;
70 int rc = 0;
71 int any = 0;
73 fp = fdopen ( dup (fd), "rb");
74 if (!fp)
76 gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno));
77 log_error ("fdopen(%d) failed: %s\n", fd, strerror (errno));
78 return tmperr;
81 do
83 nread = fread (buffer, 1, DIM(buffer), fp);
84 if (nread)
86 any = 1;
87 gcry_md_write (md, buffer, nread);
88 err = ksba_writer_write_octet_string (writer, buffer, nread, 0);
89 if (err)
91 log_error ("write failed: %s\n", gpg_strerror (err));
92 rc = err;
96 while (nread && !rc);
97 if (ferror (fp))
99 rc = gpg_error (gpg_err_code_from_errno (errno));
100 log_error ("read error on fd %d: %s\n", fd, strerror (errno));
102 fclose (fp);
103 if (!any)
105 /* We can't allow to sign an empty message because it does not
106 make much sense and more seriously, ksba-cms_build has
107 already written the tag for data and now expects an octet
108 string but an octet string of zeize 0 is illegal. */
109 log_error ("cannot sign an empty message\n");
110 rc = gpg_error (GPG_ERR_NO_DATA);
112 if (!rc)
114 err = ksba_writer_write_octet_string (writer, NULL, 0, 1);
115 if (err)
117 log_error ("write failed: %s\n", gpg_strerror (err));
118 rc = err;
122 return rc;
126 /* Get the default certificate which is defined as the first one our
127 keyDB returns and has a secret key available. */
129 gpgsm_get_default_cert (ctrl_t ctrl, ksba_cert_t *r_cert)
131 KEYDB_HANDLE hd;
132 ksba_cert_t cert = NULL;
133 int rc;
134 char *p;
136 hd = keydb_new (0);
137 if (!hd)
138 return gpg_error (GPG_ERR_GENERAL);
139 rc = keydb_search_first (hd);
140 if (rc)
142 keydb_release (hd);
143 return rc;
148 rc = keydb_get_cert (hd, &cert);
149 if (rc)
151 log_error ("keydb_get_cert failed: %s\n", gpg_strerror (rc));
152 keydb_release (hd);
153 return rc;
156 p = gpgsm_get_keygrip_hexstring (cert);
157 if (p)
159 if (!gpgsm_agent_havekey (ctrl, p))
161 xfree (p);
162 keydb_release (hd);
163 *r_cert = cert;
164 return 0; /* got it */
166 xfree (p);
169 ksba_cert_release (cert);
170 cert = NULL;
172 while (!(rc = keydb_search_next (hd)));
173 if (rc && rc != -1)
174 log_error ("keydb_search_next failed: %s\n", gpg_strerror (rc));
176 ksba_cert_release (cert);
177 keydb_release (hd);
178 return rc;
182 static ksba_cert_t
183 get_default_signer (ctrl_t ctrl)
185 KEYDB_SEARCH_DESC desc;
186 ksba_cert_t cert = NULL;
187 KEYDB_HANDLE kh = NULL;
188 int rc;
190 if (!opt.local_user)
192 rc = gpgsm_get_default_cert (ctrl, &cert);
193 if (rc)
195 if (rc != -1)
196 log_debug ("failed to find default certificate: %s\n",
197 gpg_strerror (rc));
198 return NULL;
200 return cert;
203 rc = keydb_classify_name (opt.local_user, &desc);
204 if (rc)
206 log_error ("failed to find default signer: %s\n", gpg_strerror (rc));
207 return NULL;
210 kh = keydb_new (0);
211 if (!kh)
212 return NULL;
214 rc = keydb_search (kh, &desc, 1);
215 if (rc)
217 log_debug ("failed to find default certificate: rc=%d\n", rc);
219 else
221 rc = keydb_get_cert (kh, &cert);
222 if (rc)
224 log_debug ("failed to get cert: rc=%d\n", rc);
228 keydb_release (kh);
229 return cert;
232 /* Depending on the options in CTRL add the certificate CERT as well as
233 other certificate up in the chain to the Root-CA to the CMS
234 object. */
235 static int
236 add_certificate_list (CTRL ctrl, ksba_cms_t cms, ksba_cert_t cert)
238 gpg_error_t err;
239 int rc = 0;
240 ksba_cert_t next = NULL;
241 int n;
242 int not_root = 0;
244 ksba_cert_ref (cert);
246 n = ctrl->include_certs;
247 log_debug ("adding certificates at level %d\n", n);
248 if (n == -2)
250 not_root = 1;
251 n = -1;
253 if (n < 0 || n > 50)
254 n = 50; /* We better apply an upper bound */
256 /* First add my own certificate unless we don't want any certificate
257 included at all. */
258 if (n)
260 if (not_root && gpgsm_is_root_cert (cert))
261 err = 0;
262 else
263 err = ksba_cms_add_cert (cms, cert);
264 if (err)
265 goto ksba_failure;
266 if (n>0)
267 n--;
269 /* Walk the chain to include all other certificates. Note that a -1
270 used for N makes sure that there is no limit and all certs get
271 included. */
272 while ( n-- && !(rc = gpgsm_walk_cert_chain (cert, &next)) )
274 if (not_root && gpgsm_is_root_cert (next))
275 err = 0;
276 else
277 err = ksba_cms_add_cert (cms, next);
278 ksba_cert_release (cert);
279 cert = next; next = NULL;
280 if (err)
281 goto ksba_failure;
283 ksba_cert_release (cert);
285 return rc == -1? 0: rc;
287 ksba_failure:
288 ksba_cert_release (cert);
289 log_error ("ksba_cms_add_cert failed: %s\n", gpg_strerror (err));
290 return err;
296 /* Perform a sign operation.
298 Sign the data received on DATA-FD in embedded mode or in detached
299 mode when DETACHED is true. Write the signature to OUT_FP. The
300 keys used to sign are taken from SIGNERLIST or the default one will
301 be used if the value of this argument is NULL. */
303 gpgsm_sign (CTRL ctrl, CERTLIST signerlist,
304 int data_fd, int detached, FILE *out_fp)
306 int i, rc;
307 gpg_error_t err;
308 Base64Context b64writer = NULL;
309 ksba_writer_t writer;
310 ksba_cms_t cms = NULL;
311 ksba_stop_reason_t stopreason;
312 KEYDB_HANDLE kh = NULL;
313 gcry_md_hd_t data_md = NULL;
314 int signer;
315 const char *algoid;
316 int algo;
317 ksba_isotime_t signed_at;
318 CERTLIST cl;
319 int release_signerlist = 0;
321 kh = keydb_new (0);
322 if (!kh)
324 log_error (_("failed to allocated keyDB handle\n"));
325 rc = gpg_error (GPG_ERR_GENERAL);
326 goto leave;
329 ctrl->pem_name = "SIGNED MESSAGE";
330 rc = gpgsm_create_writer (&b64writer, ctrl, out_fp, &writer);
331 if (rc)
333 log_error ("can't create writer: %s\n", gpg_strerror (rc));
334 goto leave;
337 err = ksba_cms_new (&cms);
338 if (err)
340 rc = err;
341 goto leave;
344 err = ksba_cms_set_reader_writer (cms, NULL, writer);
345 if (err)
347 log_debug ("ksba_cms_set_reader_writer failed: %s\n",
348 gpg_strerror (err));
349 rc = err;
350 goto leave;
353 /* We are going to create signed data with data as encap. content */
354 err = ksba_cms_set_content_type (cms, 0, KSBA_CT_SIGNED_DATA);
355 if (!err)
356 err = ksba_cms_set_content_type (cms, 1, KSBA_CT_DATA);
357 if (err)
359 log_debug ("ksba_cms_set_content_type failed: %s\n",
360 gpg_strerror (err));
361 rc = err;
362 goto leave;
365 /* If no list of signers is given, use a default one. */
366 if (!signerlist)
368 ksba_cert_t cert = get_default_signer (ctrl);
369 if (!cert)
371 log_error ("no default signer found\n");
372 rc = gpg_error (GPG_ERR_GENERAL);
373 goto leave;
376 /* Although we don't check for ambigious specification we will
377 check that the signer's certificate is is usable and
378 valid. */
379 rc = gpgsm_cert_use_sign_p (cert);
380 if (!rc)
381 rc = gpgsm_validate_chain (ctrl, cert, NULL, 0, NULL, 0);
382 if (rc)
383 goto leave;
385 /* That one is fine - create signerlist. */
386 signerlist = xtrycalloc (1, sizeof *signerlist);
387 if (!signerlist)
389 rc = OUT_OF_CORE (errno);
390 ksba_cert_release (cert);
391 goto leave;
393 signerlist->cert = cert;
394 release_signerlist = 1;
398 /* Gather certificates of signers and store them in the CMS object. */
399 for (cl=signerlist; cl; cl = cl->next)
401 rc = gpgsm_cert_use_sign_p (cl->cert);
402 if (rc)
403 goto leave;
405 err = ksba_cms_add_signer (cms, cl->cert);
406 if (err)
408 log_error ("ksba_cms_add_signer failed: %s\n", gpg_strerror (err));
409 rc = err;
410 goto leave;
412 rc = add_certificate_list (ctrl, cms, cl->cert);
413 if (rc)
415 log_error ("failed to store list of certificates: %s\n",
416 gpg_strerror(rc));
417 goto leave;
419 /* Set the hash algorithm we are going to use */
420 err = ksba_cms_add_digest_algo (cms, "1.3.14.3.2.26" /*SHA-1*/);
421 if (err)
423 log_debug ("ksba_cms_add_digest_algo failed: %s\n",
424 gpg_strerror (err));
425 rc = err;
426 goto leave;
430 /* Prepare hashing (actually we are figuring out what we have set above)*/
431 rc = gcry_md_open (&data_md, 0, 0);
432 if (rc)
434 log_error ("md_open failed: %s\n", gpg_strerror (rc));
435 goto leave;
437 if (DBG_HASHING)
438 gcry_md_start_debug (data_md, "sign.data");
440 for (i=0; (algoid=ksba_cms_get_digest_algo_list (cms, i)); i++)
442 algo = gcry_md_map_name (algoid);
443 if (!algo)
445 log_error ("unknown hash algorithm `%s'\n", algoid? algoid:"?");
446 rc = gpg_error (GPG_ERR_BUG);
447 goto leave;
449 gcry_md_enable (data_md, algo);
452 if (detached)
453 { /* we hash the data right now so that we can store the message
454 digest. ksba_cms_build() takes this as an flag that detached
455 data is expected. */
456 unsigned char *digest;
457 size_t digest_len;
458 /* Fixme do this for all signers and get the algo to use from
459 the signer's certificate - does not make mich sense, but we
460 should do this consistent as we have already done it above. */
461 algo = GCRY_MD_SHA1;
462 hash_data (data_fd, data_md);
463 digest = gcry_md_read (data_md, algo);
464 digest_len = gcry_md_get_algo_dlen (algo);
465 if ( !digest || !digest_len)
467 log_error ("problem getting the hash of the data\n");
468 rc = gpg_error (GPG_ERR_BUG);
469 goto leave;
471 for (cl=signerlist,signer=0; cl; cl = cl->next, signer++)
473 err = ksba_cms_set_message_digest (cms, signer, digest, digest_len);
474 if (err)
476 log_error ("ksba_cms_set_message_digest failed: %s\n",
477 gpg_strerror (err));
478 rc = err;
479 goto leave;
484 gnupg_get_isotime (signed_at);
485 for (cl=signerlist,signer=0; cl; cl = cl->next, signer++)
487 err = ksba_cms_set_signing_time (cms, signer, signed_at);
488 if (err)
490 log_error ("ksba_cms_set_signing_time failed: %s\n",
491 gpg_strerror (err));
492 rc = err;
493 goto leave;
497 /* We need to write at least a minimal list of our capabilities to
498 try to convince some MUAs to use 3DEs and not the crippled
499 RC2. Our list is:
501 aes128-CBC
502 des-EDE3-CBC
504 err = ksba_cms_add_smime_capability (cms, "2.16.840.1.101.3.4.1.2", NULL, 0);
505 if (!err)
506 err = ksba_cms_add_smime_capability (cms, "1.2.840.113549.3.7", NULL, 0);
507 if (err)
509 log_error ("ksba_cms_add_smime_capability failed: %s\n",
510 gpg_strerror (err));
511 goto leave;
515 /* Main building loop. */
518 err = ksba_cms_build (cms, &stopreason);
519 if (err)
521 log_debug ("ksba_cms_build failed: %s\n", gpg_strerror (err));
522 rc = err;
523 goto leave;
526 if (stopreason == KSBA_SR_BEGIN_DATA)
527 { /* hash the data and store the message digest */
528 unsigned char *digest;
529 size_t digest_len;
531 assert (!detached);
532 /* Fixme: get the algo to use from the signer's certificate
533 - does not make much sense, but we should do this
534 consistent as we have already done it above. Code is
535 mostly duplicated above. */
537 algo = GCRY_MD_SHA1;
538 rc = hash_and_copy_data (data_fd, data_md, writer);
539 if (rc)
540 goto leave;
541 digest = gcry_md_read (data_md, algo);
542 digest_len = gcry_md_get_algo_dlen (algo);
543 if ( !digest || !digest_len)
545 log_error ("problem getting the hash of the data\n");
546 rc = gpg_error (GPG_ERR_BUG);
547 goto leave;
549 for (cl=signerlist,signer=0; cl; cl = cl->next, signer++)
551 err = ksba_cms_set_message_digest (cms, signer,
552 digest, digest_len);
553 if (err)
555 log_error ("ksba_cms_set_message_digest failed: %s\n",
556 gpg_strerror (err));
557 rc = err;
558 goto leave;
562 else if (stopreason == KSBA_SR_NEED_SIG)
563 { /* calculate the signature for all signers */
564 gcry_md_hd_t md;
566 algo = GCRY_MD_SHA1;
567 rc = gcry_md_open (&md, algo, 0);
568 if (rc)
570 log_error ("md_open failed: %s\n", gpg_strerror (rc));
571 goto leave;
573 if (DBG_HASHING)
574 gcry_md_start_debug (md, "sign.attr");
575 ksba_cms_set_hash_function (cms, HASH_FNC, md);
576 for (cl=signerlist,signer=0; cl; cl = cl->next, signer++)
578 char *sigval = NULL;
579 char *buf, *fpr;
581 if (signer)
582 gcry_md_reset (md);
583 rc = ksba_cms_hash_signed_attrs (cms, signer);
584 if (rc)
586 log_debug ("hashing signed attrs failed: %s\n",
587 gpg_strerror (rc));
588 gcry_md_close (md);
589 goto leave;
592 rc = gpgsm_create_cms_signature (ctrl, cl->cert,
593 md, algo, &sigval);
594 if (rc)
596 gcry_md_close (md);
597 goto leave;
600 err = ksba_cms_set_sig_val (cms, signer, sigval);
601 xfree (sigval);
602 if (err)
604 log_error ("failed to store the signature: %s\n",
605 gpg_strerror (err));
606 rc = err;
607 gcry_md_close (md);
608 goto leave;
611 /* write a status message */
612 fpr = gpgsm_get_fingerprint_hexstring (cl->cert, GCRY_MD_SHA1);
613 if (!fpr)
615 rc = gpg_error (GPG_ERR_ENOMEM);
616 gcry_md_close (md);
617 goto leave;
620 int pkalgo = gpgsm_get_key_algo_info (cl->cert, NULL);
621 rc = asprintf (&buf, "%c %d %d 00 %s %s",
622 detached? 'D':'S',
623 pkalgo,
624 algo,
625 signed_at,
626 fpr);
628 xfree (fpr);
629 if (rc < 0)
631 rc = gpg_error (GPG_ERR_ENOMEM);
632 gcry_md_close (md);
633 goto leave;
635 rc = 0;
636 gpgsm_status (ctrl, STATUS_SIG_CREATED, buf);
637 free (buf); /* yes, we must use the regular free() here */
639 gcry_md_close (md);
643 while (stopreason != KSBA_SR_READY);
645 rc = gpgsm_finish_writer (b64writer);
646 if (rc)
648 log_error ("write failed: %s\n", gpg_strerror (rc));
649 goto leave;
652 log_info ("signature created\n");
655 leave:
656 if (rc)
657 log_error ("error creating signature: %s <%s>\n",
658 gpg_strerror (rc), gpg_strsource (rc) );
659 if (release_signerlist)
660 gpgsm_release_certlist (signerlist);
661 ksba_cms_release (cms);
662 gpgsm_destroy_writer (b64writer);
663 keydb_release (kh);
664 gcry_md_close (data_md);
665 return rc;