sm: Do not expect X.509 keyids to be unique
[gnupg.git] / sm / certlist.c
1 /* certlist.c - build list of certificates
2  * Copyright (C) 2001, 2003, 2004, 2005, 2007,
3  *               2008, 2011 Free Software Foundation, Inc.
4  *
5  * This file is part of GnuPG.
6  *
7  * GnuPG is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * GnuPG is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, see <https://www.gnu.org/licenses/>.
19  */
20
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>
29
30 #include "gpgsm.h"
31 #include <gcrypt.h>
32 #include <ksba.h>
33
34 #include "keydb.h"
35 #include "../common/i18n.h"
36
37
38 static const char oid_kp_serverAuth[]     = "1.3.6.1.5.5.7.3.1";
39 static const char oid_kp_clientAuth[]     = "1.3.6.1.5.5.7.3.2";
40 static const char oid_kp_codeSigning[]    = "1.3.6.1.5.5.7.3.3";
41 static const char oid_kp_emailProtection[]= "1.3.6.1.5.5.7.3.4";
42 static const char oid_kp_timeStamping[]   = "1.3.6.1.5.5.7.3.8";
43 static const char oid_kp_ocspSigning[]    = "1.3.6.1.5.5.7.3.9";
44
45 /* Return 0 if the cert is usable for encryption.  A MODE of 0 checks
46    for signing a MODE of 1 checks for encryption, a MODE of 2 checks
47    for verification and a MODE of 3 for decryption (just for
48    debugging).  MODE 4 is for certificate signing, MODE for COSP
49    response signing. */
50 static int
51 cert_usage_p (ksba_cert_t cert, int mode)
52 {
53   gpg_error_t err;
54   unsigned int use;
55   char *extkeyusages;
56   int have_ocsp_signing = 0;
57
58   err = ksba_cert_get_ext_key_usages (cert, &extkeyusages);
59   if (gpg_err_code (err) == GPG_ERR_NO_DATA)
60     err = 0; /* no policy given */
61   if (!err)
62     {
63       unsigned int extusemask = ~0; /* Allow all. */
64
65       if (extkeyusages)
66         {
67           char *p, *pend;
68           int any_critical = 0;
69
70           extusemask = 0;
71
72           p = extkeyusages;
73           while (p && (pend=strchr (p, ':')))
74             {
75               *pend++ = 0;
76               /* Only care about critical flagged usages. */
77               if ( *pend == 'C' )
78                 {
79                   any_critical = 1;
80                   if ( !strcmp (p, oid_kp_serverAuth))
81                     extusemask |= (KSBA_KEYUSAGE_DIGITAL_SIGNATURE
82                                    | KSBA_KEYUSAGE_KEY_ENCIPHERMENT
83                                    | KSBA_KEYUSAGE_KEY_AGREEMENT);
84                   else if ( !strcmp (p, oid_kp_clientAuth))
85                     extusemask |= (KSBA_KEYUSAGE_DIGITAL_SIGNATURE
86                                    | KSBA_KEYUSAGE_KEY_AGREEMENT);
87                   else if ( !strcmp (p, oid_kp_codeSigning))
88                     extusemask |= (KSBA_KEYUSAGE_DIGITAL_SIGNATURE);
89                   else if ( !strcmp (p, oid_kp_emailProtection))
90                     extusemask |= (KSBA_KEYUSAGE_DIGITAL_SIGNATURE
91                                    | KSBA_KEYUSAGE_NON_REPUDIATION
92                                    | KSBA_KEYUSAGE_KEY_ENCIPHERMENT
93                                    | KSBA_KEYUSAGE_KEY_AGREEMENT);
94                   else if ( !strcmp (p, oid_kp_timeStamping))
95                     extusemask |= (KSBA_KEYUSAGE_DIGITAL_SIGNATURE
96                                    | KSBA_KEYUSAGE_NON_REPUDIATION);
97                 }
98
99               /* This is a hack to cope with OCSP.  Note that we do
100                  not yet fully comply with the requirements and that
101                  the entire CRL/OCSP checking thing should undergo a
102                  thorough review and probably redesign. */
103               if ( !strcmp (p, oid_kp_ocspSigning))
104                 have_ocsp_signing = 1;
105
106               if ((p = strchr (pend, '\n')))
107                 p++;
108             }
109           xfree (extkeyusages);
110           extkeyusages = NULL;
111
112           if (!any_critical)
113             extusemask = ~0; /* Reset to the don't care mask. */
114         }
115
116
117       err = ksba_cert_get_key_usage (cert, &use);
118       if (gpg_err_code (err) == GPG_ERR_NO_DATA)
119         {
120           err = 0;
121           if (opt.verbose && mode < 2)
122             log_info (_("no key usage specified - assuming all usages\n"));
123           use = ~0;
124         }
125
126       /* Apply extKeyUsage. */
127       use &= extusemask;
128
129     }
130   if (err)
131     {
132       log_error (_("error getting key usage information: %s\n"),
133                  gpg_strerror (err));
134       xfree (extkeyusages);
135       return err;
136     }
137
138   if (mode == 4)
139     {
140       if ((use & (KSBA_KEYUSAGE_KEY_CERT_SIGN)))
141         return 0;
142       log_info (_("certificate should not have "
143                   "been used for certification\n"));
144       return gpg_error (GPG_ERR_WRONG_KEY_USAGE);
145     }
146
147   if (mode == 5)
148     {
149       if (use != ~0
150           && (have_ocsp_signing
151               || (use & (KSBA_KEYUSAGE_KEY_CERT_SIGN
152                          |KSBA_KEYUSAGE_CRL_SIGN))))
153         return 0;
154       log_info (_("certificate should not have "
155                   "been used for OCSP response signing\n"));
156       return gpg_error (GPG_ERR_WRONG_KEY_USAGE);
157     }
158
159   if ((use & ((mode&1)?
160               (KSBA_KEYUSAGE_KEY_ENCIPHERMENT|KSBA_KEYUSAGE_DATA_ENCIPHERMENT):
161               (KSBA_KEYUSAGE_DIGITAL_SIGNATURE|KSBA_KEYUSAGE_NON_REPUDIATION)))
162       )
163     return 0;
164
165   log_info (mode==3? _("certificate should not have been used for encryption\n"):
166             mode==2? _("certificate should not have been used for signing\n"):
167             mode==1? _("certificate is not usable for encryption\n"):
168                      _("certificate is not usable for signing\n"));
169   return gpg_error (GPG_ERR_WRONG_KEY_USAGE);
170 }
171
172
173 /* Return 0 if the cert is usable for signing */
174 int
175 gpgsm_cert_use_sign_p (ksba_cert_t cert)
176 {
177   return cert_usage_p (cert, 0);
178 }
179
180
181 /* Return 0 if the cert is usable for encryption */
182 int
183 gpgsm_cert_use_encrypt_p (ksba_cert_t cert)
184 {
185   return cert_usage_p (cert, 1);
186 }
187
188 int
189 gpgsm_cert_use_verify_p (ksba_cert_t cert)
190 {
191   return cert_usage_p (cert, 2);
192 }
193
194 int
195 gpgsm_cert_use_decrypt_p (ksba_cert_t cert)
196 {
197   return cert_usage_p (cert, 3);
198 }
199
200 int
201 gpgsm_cert_use_cert_p (ksba_cert_t cert)
202 {
203   return cert_usage_p (cert, 4);
204 }
205
206 int
207 gpgsm_cert_use_ocsp_p (ksba_cert_t cert)
208 {
209   return cert_usage_p (cert, 5);
210 }
211
212
213 /* Return true if CERT has the well known private key extension.  */
214 int
215 gpgsm_cert_has_well_known_private_key (ksba_cert_t cert)
216 {
217   int idx;
218   const char *oid;
219
220   for (idx=0; !ksba_cert_get_extension (cert, idx,
221                                         &oid, NULL, NULL, NULL);idx++)
222     if (!strcmp (oid, "1.3.6.1.4.1.11591.2.2.2") )
223       return 1; /* Yes.  */
224   return 0; /* No.  */
225 }
226
227
228 static int
229 same_subject_issuer (const char *subject, const char *issuer, ksba_cert_t cert)
230 {
231   char *subject2 = ksba_cert_get_subject (cert, 0);
232   char *issuer2 = ksba_cert_get_issuer (cert, 0);
233   int tmp;
234
235   tmp = (subject && subject2
236          && !strcmp (subject, subject2)
237          && issuer && issuer2
238          && !strcmp (issuer, issuer2));
239   xfree (subject2);
240   xfree (issuer2);
241   return tmp;
242 }
243
244
245 /* Return true if CERT_A is the same as CERT_B.  */
246 int
247 gpgsm_certs_identical_p (ksba_cert_t cert_a, ksba_cert_t cert_b)
248 {
249   const unsigned char *img_a, *img_b;
250   size_t len_a, len_b;
251
252   img_a = ksba_cert_get_image (cert_a, &len_a);
253   if (img_a)
254     {
255       img_b = ksba_cert_get_image (cert_b, &len_b);
256       if (img_b && len_a == len_b && !memcmp (img_a, img_b, len_a))
257         return 1; /* Identical. */
258     }
259   return 0;
260 }
261
262
263 /* Return true if CERT is already contained in CERTLIST. */
264 static int
265 is_cert_in_certlist (ksba_cert_t cert, certlist_t certlist)
266 {
267   const unsigned char *img_a, *img_b;
268   size_t len_a, len_b;
269
270   img_a = ksba_cert_get_image (cert, &len_a);
271   if (img_a)
272     {
273       for ( ; certlist; certlist = certlist->next)
274         {
275           img_b = ksba_cert_get_image (certlist->cert, &len_b);
276           if (img_b && len_a == len_b && !memcmp (img_a, img_b, len_a))
277             return 1; /* Already contained. */
278         }
279     }
280   return 0;
281 }
282
283
284 /* Add CERT to the list of certificates at CERTADDR but avoid
285    duplicates. */
286 int
287 gpgsm_add_cert_to_certlist (ctrl_t ctrl, ksba_cert_t cert,
288                             certlist_t *listaddr, int is_encrypt_to)
289 {
290   (void)ctrl;
291
292   if (!is_cert_in_certlist (cert, *listaddr))
293     {
294       certlist_t cl = xtrycalloc (1, sizeof *cl);
295       if (!cl)
296         return out_of_core ();
297       cl->cert = cert;
298       ksba_cert_ref (cert);
299       cl->next = *listaddr;
300       cl->is_encrypt_to = is_encrypt_to;
301       *listaddr = cl;
302     }
303    return 0;
304 }
305
306 /* Add a certificate to a list of certificate and make sure that it is
307    a valid certificate.  With SECRET set to true a secret key must be
308    available for the certificate. IS_ENCRYPT_TO sets the corresponding
309    flag in the new create LISTADDR item.  */
310 int
311 gpgsm_add_to_certlist (ctrl_t ctrl, const char *name, int secret,
312                        certlist_t *listaddr, int is_encrypt_to)
313 {
314   int rc;
315   KEYDB_SEARCH_DESC desc;
316   KEYDB_HANDLE kh = NULL;
317   ksba_cert_t cert = NULL;
318
319   rc = classify_user_id (name, &desc, 0);
320   if (!rc)
321     {
322       kh = keydb_new ();
323       if (!kh)
324         rc = gpg_error (GPG_ERR_ENOMEM);
325       else
326         {
327           int wrong_usage = 0;
328           char *first_subject = NULL;
329           char *first_issuer = NULL;
330
331         get_next:
332           rc = keydb_search (ctrl, kh, &desc, 1);
333           if (!rc)
334             rc = keydb_get_cert (kh, &cert);
335           if (!rc)
336             {
337               if (!first_subject)
338                 {
339                   /* Save the subject and the issuer for key usage
340                      and ambiguous name tests. */
341                   first_subject = ksba_cert_get_subject (cert, 0);
342                   first_issuer = ksba_cert_get_issuer (cert, 0);
343                 }
344               rc = secret? gpgsm_cert_use_sign_p (cert)
345                          : gpgsm_cert_use_encrypt_p (cert);
346               if (gpg_err_code (rc) == GPG_ERR_WRONG_KEY_USAGE)
347                 {
348                   /* There might be another certificate with the
349                      correct usage, so we try again */
350                   if (!wrong_usage)
351                     { /* save the first match */
352                       wrong_usage = rc;
353                       ksba_cert_release (cert);
354                       cert = NULL;
355                       goto get_next;
356                     }
357                   else if (same_subject_issuer (first_subject, first_issuer,
358                                                 cert))
359                     {
360                       wrong_usage = rc;
361                       ksba_cert_release (cert);
362                       cert = NULL;
363                       goto get_next;
364                     }
365                   else
366                     wrong_usage = rc;
367
368                 }
369             }
370           /* We want the error code from the first match in this case. */
371           if (rc && wrong_usage)
372             rc = wrong_usage;
373
374           if (!rc)
375             {
376               certlist_t dup_certs = NULL;
377
378             next_ambigious:
379               rc = keydb_search (ctrl, kh, &desc, 1);
380               if (rc == -1)
381                 rc = 0;
382               else if (!rc)
383                 {
384                   ksba_cert_t cert2 = NULL;
385
386                   /* If this is the first possible duplicate, add the original
387                      certificate to our list of duplicates.  */
388                   if (!dup_certs)
389                     gpgsm_add_cert_to_certlist (ctrl, cert, &dup_certs, 0);
390
391                   /* We have to ignore ambiguous names as long as
392                      there only fault is a bad key usage.  This is
393                      required to support encryption and signing
394                      certificates of the same subject.
395
396                      Further we ignore them if they are due to an
397                      identical certificate (which may happen if a
398                      certificate is accidential duplicated in the
399                      keybox).  */
400                   if (!keydb_get_cert (kh, &cert2))
401                     {
402                       int tmp = (same_subject_issuer (first_subject,
403                                                       first_issuer,
404                                                       cert2)
405                                  && ((gpg_err_code (
406                                       secret? gpgsm_cert_use_sign_p (cert2)
407                                       : gpgsm_cert_use_encrypt_p (cert2)
408                                       )
409                                      )  == GPG_ERR_WRONG_KEY_USAGE));
410                       if (tmp)
411                         gpgsm_add_cert_to_certlist (ctrl, cert2,
412                                                     &dup_certs, 0);
413                       else
414                         {
415                           if (is_cert_in_certlist (cert2, dup_certs))
416                             tmp = 1;
417                         }
418
419                       ksba_cert_release (cert2);
420                       if (tmp)
421                         goto next_ambigious;
422                     }
423                   rc = gpg_error (GPG_ERR_AMBIGUOUS_NAME);
424                 }
425               gpgsm_release_certlist (dup_certs);
426             }
427           xfree (first_subject);
428           xfree (first_issuer);
429           first_subject = NULL;
430           first_issuer = NULL;
431
432           if (!rc && !is_cert_in_certlist (cert, *listaddr))
433             {
434               if (!rc && secret)
435                 {
436                   char *p;
437
438                   rc = gpg_error (GPG_ERR_NO_SECKEY);
439                   p = gpgsm_get_keygrip_hexstring (cert);
440                   if (p)
441                     {
442                       if (!gpgsm_agent_havekey (ctrl, p))
443                         rc = 0;
444                       xfree (p);
445                     }
446                 }
447               if (!rc)
448                 rc = gpgsm_validate_chain (ctrl, cert, "", NULL,
449                                            0, NULL, 0, NULL);
450               if (!rc)
451                 {
452                   certlist_t cl = xtrycalloc (1, sizeof *cl);
453                   if (!cl)
454                     rc = out_of_core ();
455                   else
456                     {
457                       cl->cert = cert; cert = NULL;
458                       cl->next = *listaddr;
459                       cl->is_encrypt_to = is_encrypt_to;
460                       *listaddr = cl;
461                     }
462                 }
463             }
464         }
465     }
466
467   keydb_release (kh);
468   ksba_cert_release (cert);
469   return rc == -1? gpg_error (GPG_ERR_NO_PUBKEY): rc;
470 }
471
472
473 void
474 gpgsm_release_certlist (certlist_t list)
475 {
476   while (list)
477     {
478       certlist_t cl = list->next;
479       ksba_cert_release (list->cert);
480       xfree (list);
481       list = cl;
482     }
483 }
484
485 \f
486 /* Like gpgsm_add_to_certlist, but look only for one certificate.  No
487    chain validation is done.  If KEYID is not NULL it is taken as an
488    additional filter value which must match the
489    subjectKeyIdentifier. */
490 int
491 gpgsm_find_cert (ctrl_t ctrl,
492                  const char *name, ksba_sexp_t keyid, ksba_cert_t *r_cert,
493                  int allow_ambiguous)
494 {
495   int rc;
496   KEYDB_SEARCH_DESC desc;
497   KEYDB_HANDLE kh = NULL;
498
499   *r_cert = NULL;
500   rc = classify_user_id (name, &desc, 0);
501   if (!rc)
502     {
503       kh = keydb_new ();
504       if (!kh)
505         rc = gpg_error (GPG_ERR_ENOMEM);
506       else
507         {
508         nextone:
509           rc = keydb_search (ctrl, kh, &desc, 1);
510           if (!rc)
511             {
512               rc = keydb_get_cert (kh, r_cert);
513               if (!rc && keyid)
514                 {
515                   ksba_sexp_t subj;
516
517                   rc = ksba_cert_get_subj_key_id (*r_cert, NULL, &subj);
518                   if (!rc)
519                     {
520                       if (cmp_simple_canon_sexp (keyid, subj))
521                         {
522                           xfree (subj);
523                           goto nextone;
524                         }
525                       xfree (subj);
526                       /* Okay: Here we know that the certificate's
527                          subjectKeyIdentifier matches the requested
528                          one. */
529                     }
530                   else if (gpg_err_code (rc) == GPG_ERR_NO_DATA)
531                     goto nextone;
532                 }
533             }
534
535           /* If we don't have the KEYID filter we need to check for
536              ambiguous search results.  Note, that it is somehwat
537              reasonable to assume that a specification of a KEYID
538              won't lead to ambiguous names. */
539           if (!rc && !keyid)
540             {
541               ksba_isotime_t notbefore = "";
542               const unsigned char *image = NULL;
543               size_t length = 0;
544               if (allow_ambiguous)
545                 {
546                   /* We want to return the newest certificate */
547                   if (ksba_cert_get_validity (*r_cert, 0, notbefore))
548                     *notbefore = '\0';
549                   image = ksba_cert_get_image (*r_cert, &length);
550                 }
551             next_ambiguous:
552               rc = keydb_search (ctrl, kh, &desc, 1);
553               if (rc == -1)
554                 rc = 0;
555               else
556                 {
557                   if (!rc)
558                     {
559                       ksba_cert_t cert2 = NULL;
560                       ksba_isotime_t notbefore2 = "";
561                       const unsigned char *image2 = NULL;
562                       size_t length2 = 0;
563                       int cmp = 0;
564
565                       if (!keydb_get_cert (kh, &cert2))
566                         {
567                           if (gpgsm_certs_identical_p (*r_cert, cert2))
568                             {
569                               ksba_cert_release (cert2);
570                               goto next_ambiguous;
571                             }
572                           if (allow_ambiguous)
573                             {
574                               if (ksba_cert_get_validity (cert2, 0, notbefore2))
575                                 *notbefore2 = '\0';
576                               image2 = ksba_cert_get_image (cert2, &length2);
577                               cmp = strcmp (notbefore, notbefore2);
578                               /* use certificate image bits as last resort for stable ordering */
579                               if (!cmp)
580                                 cmp = memcmp (image, image2, length < length2 ? length : length2);
581                               if (!cmp)
582                                 cmp = length < length2 ? -1 : length > length2 ? 1 : 0;
583                               if (cmp < 0)
584                                 {
585                                   ksba_cert_release (*r_cert);
586                                   *r_cert = cert2;
587                                   strcpy (notbefore, notbefore2);
588                                   image = image2;
589                                   length = length2;
590                                 }
591                               else
592                                 ksba_cert_release (cert2);
593                               goto next_ambiguous;
594                             }
595                           ksba_cert_release (cert2);
596                         }
597                       rc = gpg_error (GPG_ERR_AMBIGUOUS_NAME);
598                     }
599                   ksba_cert_release (*r_cert);
600                   *r_cert = NULL;
601                 }
602             }
603         }
604     }
605
606   keydb_release (kh);
607   return rc == -1? gpg_error (GPG_ERR_NO_PUBKEY): rc;
608 }