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
39 hash_data (int fd
, gcry_md_hd_t md
)
45 fp
= fdopen ( dup (fd
), "rb");
48 log_error ("fdopen(%d) failed: %s\n", fd
, strerror (errno
));
54 nread
= fread (buffer
, 1, DIM(buffer
), fp
);
55 gcry_md_write (md
, buffer
, nread
);
59 log_error ("read error on fd %d: %s\n", fd
, strerror (errno
));
64 hash_and_copy_data (int fd
, gcry_md_hd_t md
, ksba_writer_t writer
)
73 fp
= fdopen ( dup (fd
), "rb");
76 gpg_error_t tmperr
= gpg_error (gpg_err_code_from_errno (errno
));
77 log_error ("fdopen(%d) failed: %s\n", fd
, strerror (errno
));
83 nread
= fread (buffer
, 1, DIM(buffer
), fp
);
87 gcry_md_write (md
, buffer
, nread
);
88 err
= ksba_writer_write_octet_string (writer
, buffer
, nread
, 0);
91 log_error ("write failed: %s\n", gpg_strerror (err
));
99 rc
= gpg_error (gpg_err_code_from_errno (errno
));
100 log_error ("read error on fd %d: %s\n", fd
, strerror (errno
));
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
);
114 err
= ksba_writer_write_octet_string (writer
, NULL
, 0, 1);
117 log_error ("write failed: %s\n", gpg_strerror (err
));
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
)
132 ksba_cert_t cert
= NULL
;
138 return gpg_error (GPG_ERR_GENERAL
);
139 rc
= keydb_search_first (hd
);
148 rc
= keydb_get_cert (hd
, &cert
);
151 log_error ("keydb_get_cert failed: %s\n", gpg_strerror (rc
));
156 p
= gpgsm_get_keygrip_hexstring (cert
);
159 if (!gpgsm_agent_havekey (ctrl
, p
))
164 return 0; /* got it */
169 ksba_cert_release (cert
);
172 while (!(rc
= keydb_search_next (hd
)));
174 log_error ("keydb_search_next failed: %s\n", gpg_strerror (rc
));
176 ksba_cert_release (cert
);
183 get_default_signer (ctrl_t ctrl
)
185 KEYDB_SEARCH_DESC desc
;
186 ksba_cert_t cert
= NULL
;
187 KEYDB_HANDLE kh
= NULL
;
192 rc
= gpgsm_get_default_cert (ctrl
, &cert
);
196 log_debug ("failed to find default certificate: %s\n",
203 rc
= keydb_classify_name (opt
.local_user
, &desc
);
206 log_error ("failed to find default signer: %s\n", gpg_strerror (rc
));
214 rc
= keydb_search (kh
, &desc
, 1);
217 log_debug ("failed to find default certificate: rc=%d\n", rc
);
221 rc
= keydb_get_cert (kh
, &cert
);
224 log_debug ("failed to get cert: rc=%d\n", rc
);
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
236 add_certificate_list (CTRL ctrl
, ksba_cms_t cms
, ksba_cert_t cert
)
240 ksba_cert_t next
= NULL
;
244 ksba_cert_ref (cert
);
246 n
= ctrl
->include_certs
;
247 log_debug ("adding certificates at level %d\n", n
);
254 n
= 50; /* We better apply an upper bound */
256 /* First add my own certificate unless we don't want any certificate
260 if (not_root
&& gpgsm_is_root_cert (cert
))
263 err
= ksba_cms_add_cert (cms
, cert
);
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
272 while ( n
-- && !(rc
= gpgsm_walk_cert_chain (cert
, &next
)) )
274 if (not_root
&& gpgsm_is_root_cert (next
))
277 err
= ksba_cms_add_cert (cms
, next
);
278 ksba_cert_release (cert
);
279 cert
= next
; next
= NULL
;
283 ksba_cert_release (cert
);
285 return rc
== -1? 0: rc
;
288 ksba_cert_release (cert
);
289 log_error ("ksba_cms_add_cert failed: %s\n", gpg_strerror (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
)
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
;
317 ksba_isotime_t signed_at
;
319 int release_signerlist
= 0;
324 log_error (_("failed to allocated keyDB handle\n"));
325 rc
= gpg_error (GPG_ERR_GENERAL
);
329 ctrl
->pem_name
= "SIGNED MESSAGE";
330 rc
= gpgsm_create_writer (&b64writer
, ctrl
, out_fp
, &writer
);
333 log_error ("can't create writer: %s\n", gpg_strerror (rc
));
337 err
= ksba_cms_new (&cms
);
344 err
= ksba_cms_set_reader_writer (cms
, NULL
, writer
);
347 log_debug ("ksba_cms_set_reader_writer failed: %s\n",
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
);
356 err
= ksba_cms_set_content_type (cms
, 1, KSBA_CT_DATA
);
359 log_debug ("ksba_cms_set_content_type failed: %s\n",
365 /* If no list of signers is given, use a default one. */
368 ksba_cert_t cert
= get_default_signer (ctrl
);
371 log_error ("no default signer found\n");
372 rc
= gpg_error (GPG_ERR_GENERAL
);
376 /* Although we don't check for ambigious specification we will
377 check that the signer's certificate is is usable and
379 rc
= gpgsm_cert_use_sign_p (cert
);
381 rc
= gpgsm_validate_chain (ctrl
, cert
, NULL
, 0, NULL
, 0);
385 /* That one is fine - create signerlist. */
386 signerlist
= xtrycalloc (1, sizeof *signerlist
);
389 rc
= OUT_OF_CORE (errno
);
390 ksba_cert_release (cert
);
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
);
405 err
= ksba_cms_add_signer (cms
, cl
->cert
);
408 log_error ("ksba_cms_add_signer failed: %s\n", gpg_strerror (err
));
412 rc
= add_certificate_list (ctrl
, cms
, cl
->cert
);
415 log_error ("failed to store list of certificates: %s\n",
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*/);
423 log_debug ("ksba_cms_add_digest_algo failed: %s\n",
430 /* Prepare hashing (actually we are figuring out what we have set above)*/
431 rc
= gcry_md_open (&data_md
, 0, 0);
434 log_error ("md_open failed: %s\n", gpg_strerror (rc
));
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
);
445 log_error ("unknown hash algorithm `%s'\n", algoid
? algoid
:"?");
446 rc
= gpg_error (GPG_ERR_BUG
);
449 gcry_md_enable (data_md
, algo
);
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
456 unsigned char *digest
;
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. */
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
);
471 for (cl
=signerlist
,signer
=0; cl
; cl
= cl
->next
, signer
++)
473 err
= ksba_cms_set_message_digest (cms
, signer
, digest
, digest_len
);
476 log_error ("ksba_cms_set_message_digest failed: %s\n",
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
);
490 log_error ("ksba_cms_set_signing_time failed: %s\n",
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
504 err
= ksba_cms_add_smime_capability (cms
, "2.16.840.1.101.3.4.1.2", NULL
, 0);
506 err
= ksba_cms_add_smime_capability (cms
, "1.2.840.113549.3.7", NULL
, 0);
509 log_error ("ksba_cms_add_smime_capability failed: %s\n",
515 /* Main building loop. */
518 err
= ksba_cms_build (cms
, &stopreason
);
521 log_debug ("ksba_cms_build failed: %s\n", gpg_strerror (err
));
526 if (stopreason
== KSBA_SR_BEGIN_DATA
)
527 { /* hash the data and store the message digest */
528 unsigned char *digest
;
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. */
538 rc
= hash_and_copy_data (data_fd
, data_md
, writer
);
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
);
549 for (cl
=signerlist
,signer
=0; cl
; cl
= cl
->next
, signer
++)
551 err
= ksba_cms_set_message_digest (cms
, signer
,
555 log_error ("ksba_cms_set_message_digest failed: %s\n",
562 else if (stopreason
== KSBA_SR_NEED_SIG
)
563 { /* calculate the signature for all signers */
567 rc
= gcry_md_open (&md
, algo
, 0);
570 log_error ("md_open failed: %s\n", gpg_strerror (rc
));
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
++)
583 rc
= ksba_cms_hash_signed_attrs (cms
, signer
);
586 log_debug ("hashing signed attrs failed: %s\n",
592 rc
= gpgsm_create_cms_signature (ctrl
, cl
->cert
,
600 err
= ksba_cms_set_sig_val (cms
, signer
, sigval
);
604 log_error ("failed to store the signature: %s\n",
611 /* write a status message */
612 fpr
= gpgsm_get_fingerprint_hexstring (cl
->cert
, GCRY_MD_SHA1
);
615 rc
= gpg_error (GPG_ERR_ENOMEM
);
620 int pkalgo
= gpgsm_get_key_algo_info (cl
->cert
, NULL
);
621 rc
= asprintf (&buf
, "%c %d %d 00 %s %s",
631 rc
= gpg_error (GPG_ERR_ENOMEM
);
636 gpgsm_status (ctrl
, STATUS_SIG_CREATED
, buf
);
637 free (buf
); /* yes, we must use the regular free() here */
643 while (stopreason
!= KSBA_SR_READY
);
645 rc
= gpgsm_finish_writer (b64writer
);
648 log_error ("write failed: %s\n", gpg_strerror (rc
));
652 log_info ("signature created\n");
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
);
664 gcry_md_close (data_md
);