1 /* t-keylist-sig.c - Regression test.
2 Copyright (C) 2000 Werner Koch (dd9jn)
3 Copyright (C) 2001, 2003, 2004 g10 Code GmbH
5 This file is part of GPGME.
7 GPGME is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as
9 published by the Free Software Foundation; either version 2.1 of
10 the License, or (at your option) any later version.
12 GPGME is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22 /* We need to include config.h so that we know whether we are building
23 with large file system (LFS) support. */
34 #include "t-support.h"
48 gpgme_pubkey_algo_t algo;
53 unsigned int sig_class;
60 { "A0FF4590BB6122EDEF6E3C542D727CC768697734", "6AE6D7EE46A871F8",
61 { { "Alfa Test", "demo key", "alfa@example.net",
62 { GPGME_PK_DSA, "2D727CC768697734",
63 "Alfa Test", "demo key", "alfa@example.net", 19, 1 } },
64 { "Alpha Test", "demo key", "alpha@example.net",
65 { GPGME_PK_DSA, "2D727CC768697734",
66 "Alfa Test", "demo key", "alfa@example.net", 19, 1 } },
67 { "Alice", "demo key", NULL,
68 { GPGME_PK_DSA, "2D727CC768697734",
69 "Alfa Test", "demo key", "alfa@example.net", 19, 1 } } } },
75 main (int argc, char **argv)
80 gpgme_keylist_result_t result;
84 init_gpgme (GPGME_PROTOCOL_OpenPGP);
86 err = gpgme_new (&ctx);
89 mode = gpgme_get_keylist_mode (ctx);
90 mode |= GPGME_KEYLIST_MODE_SIGS;
91 err = gpgme_set_keylist_mode (ctx, mode);
94 err = gpgme_op_keylist_start (ctx, "Alpha", 0);
97 while (!(err = gpgme_op_keylist_next (ctx, &key)))
101 fprintf (stderr, "More keys returned than expected\n");
105 /* Global key flags. */
108 fprintf (stderr, "Key unexpectedly revoked\n");
113 fprintf (stderr, "Key unexpectedly expired\n");
118 fprintf (stderr, "Key unexpectedly disabled\n");
123 fprintf (stderr, "Key unexpectedly invalid\n");
126 if (!key->can_encrypt)
128 fprintf (stderr, "Key unexpectedly unusable for encryption\n");
133 fprintf (stderr, "Key unexpectedly unusable for signing\n");
136 if (!key->can_certify)
138 fprintf (stderr, "Key unexpectedly unusable for certifications\n");
143 fprintf (stderr, "Key unexpectedly secret\n");
146 if (key->protocol != GPGME_PROTOCOL_OpenPGP)
148 fprintf (stderr, "Key has unexpected protocol: %s\n",
149 gpgme_get_protocol_name (key->protocol));
152 if (key->issuer_serial)
154 fprintf (stderr, "Key unexpectedly carries issuer serial: %s\n",
158 if (key->issuer_name)
160 fprintf (stderr, "Key unexpectedly carries issuer name: %s\n",
166 fprintf (stderr, "Key unexpectedly carries chain ID: %s\n",
170 if (key->owner_trust != GPGME_VALIDITY_UNKNOWN)
172 fprintf (stderr, "Key has unexpected owner trust: %i\n",
176 if (!key->subkeys || !key->subkeys->next || key->subkeys->next->next)
178 fprintf (stderr, "Key has unexpected number of subkeys\n");
183 if (key->subkeys->revoked)
185 fprintf (stderr, "Primary key unexpectedly revoked\n");
188 if (key->subkeys->expired)
190 fprintf (stderr, "Primary key unexpectedly expired\n");
193 if (key->subkeys->disabled)
195 fprintf (stderr, "Primary key unexpectedly disabled\n");
198 if (key->subkeys->invalid)
200 fprintf (stderr, "Primary key unexpectedly invalid\n");
203 if (key->subkeys->can_encrypt)
205 fprintf (stderr, "Primary key unexpectedly usable for encryption\n");
208 if (!key->subkeys->can_sign)
210 fprintf (stderr, "Primary key unexpectedly unusable for signing\n");
213 if (!key->subkeys->can_certify)
215 fprintf (stderr, "Primary key unexpectedly unusable for certifications\n");
218 if (key->subkeys->secret)
220 fprintf (stderr, "Primary key unexpectedly secret\n");
223 if (key->subkeys->pubkey_algo != GPGME_PK_DSA)
225 fprintf (stderr, "Primary key has unexpected public key algo: %s\n",
226 gpgme_pubkey_algo_name (key->subkeys->pubkey_algo));
229 if (key->subkeys->length != 1024)
231 fprintf (stderr, "Primary key has unexpected length: %i\n",
232 key->subkeys->length);
235 if (strcmp (key->subkeys->keyid, &keys[i].fpr[40 - 16]))
237 fprintf (stderr, "Primary key has unexpected key ID: %s\n",
238 key->subkeys->keyid);
241 if (strcmp (key->subkeys->fpr, keys[i].fpr))
243 fprintf (stderr, "Primary key has unexpected fingerprint: %s\n",
247 if (key->subkeys->expires)
249 fprintf (stderr, "Primary key unexpectedly expires: %lu\n",
250 key->subkeys->expires);
255 if (key->subkeys->next->revoked)
257 fprintf (stderr, "Secondary key unexpectedly revoked\n");
260 if (key->subkeys->next->expired)
262 fprintf (stderr, "Secondary key unexpectedly expired\n");
265 if (key->subkeys->next->disabled)
267 fprintf (stderr, "Secondary key unexpectedly disabled\n");
270 if (key->subkeys->next->invalid)
272 fprintf (stderr, "Secondary key unexpectedly invalid\n");
275 if (!key->subkeys->next->can_encrypt)
277 fprintf (stderr, "Secondary key unexpectedly unusable for encryption\n");
280 if (key->subkeys->next->can_sign)
282 fprintf (stderr, "Secondary key unexpectedly usable for signing\n");
285 if (key->subkeys->next->can_certify)
287 fprintf (stderr, "Secondary key unexpectedly usable for certifications\n");
290 if (key->subkeys->next->secret)
292 fprintf (stderr, "Secondary key unexpectedly secret\n");
295 if (key->subkeys->next->pubkey_algo != GPGME_PK_ELG_E)
297 fprintf (stderr, "Secondary key has unexpected public key algo: %s\n",
298 gpgme_pubkey_algo_name (key->subkeys->next->pubkey_algo));
301 if (key->subkeys->next->length != 1024)
303 fprintf (stderr, "Secondary key has unexpected length: %i\n",
304 key->subkeys->next->length);
307 if (strcmp (key->subkeys->next->keyid, keys[i].sec_keyid))
309 fprintf (stderr, "Secondary key has unexpected key ID: %s\n",
310 key->subkeys->next->keyid);
313 if (!key->subkeys->next->fpr)
315 fprintf (stderr, "Secondary key has unexpectedly no fingerprint\n");
318 if (key->subkeys->next->expires)
320 fprintf (stderr, "Secondary key unexpectedly expires: %lu\n",
321 key->subkeys->next->expires);
325 /* FIXME: The below test will crash if we want to check for a
326 name, comment or email that doesn't exist in the key's user
328 if (!((!keys[i].uid[0].name && !key->uids)
329 || (keys[i].uid[0].name && !keys[i].uid[1].name
330 && key->uids && !key->uids->next)
331 || (keys[i].uid[0].name && keys[i].uid[1].name
332 && !keys[i].uid[2].name
333 && key->uids && key->uids->next && !key->uids->next->next)
334 || (keys[i].uid[0].name && keys[i].uid[1].name
335 && keys[i].uid[2].name
336 && key->uids && key->uids->next && key->uids->next->next
337 && !key->uids->next->next->next)))
339 fprintf (stderr, "Key has unexpected number of user IDs\n");
342 if (key->uids && key->uids->revoked)
344 fprintf (stderr, "First user ID unexpectedly revoked\n");
347 if (key->uids && key->uids->invalid)
349 fprintf (stderr, "First user ID unexpectedly invalid\n");
352 if (key->uids && key->uids->validity != GPGME_VALIDITY_UNKNOWN)
354 fprintf (stderr, "First user ID has unexpectedly validity: %i\n",
355 key->uids->validity);
358 if (keys[i].uid[0].name
359 && strcmp (keys[i].uid[0].name, key->uids->name))
361 fprintf (stderr, "Unexpected name in first user ID: %s\n",
365 if (keys[i].uid[0].comment
366 && strcmp (keys[i].uid[0].comment, key->uids->comment))
368 fprintf (stderr, "Unexpected comment in first user ID: %s\n",
372 if (keys[i].uid[0].email
373 && strcmp (keys[i].uid[0].email, key->uids->email))
375 fprintf (stderr, "Unexpected email in first user ID: %s\n",
379 if (key->uids && (!key->uids->signatures || key->uids->signatures->next))
381 fprintf (stderr, "First user ID unexpected number of signatures\n");
384 if (keys[i].uid[0].sig.algo != key->uids->signatures->pubkey_algo)
386 fprintf (stderr, "Unexpected algorithm in first user ID sig: %s\n",
387 gpgme_pubkey_algo_name (key->uids->signatures->pubkey_algo));
390 if (strcmp (keys[i].uid[0].sig.keyid, key->uids->signatures->keyid))
392 fprintf (stderr, "Unexpected key ID in first user ID sig: %s\n",
393 key->uids->signatures->keyid);
396 if (strcmp (keys[i].uid[0].sig.name, key->uids->signatures->name))
398 fprintf (stderr, "Unexpected name in first user ID sig: %s\n",
399 key->uids->signatures->name);
402 if (strcmp (keys[i].uid[0].sig.comment, key->uids->signatures->comment))
404 fprintf (stderr, "Unexpected comment in first user ID sig: %s\n",
405 key->uids->signatures->comment);
408 if (strcmp (keys[i].uid[0].sig.email, key->uids->signatures->email))
410 fprintf (stderr, "Unexpected email in first user ID sig: %s\n",
411 key->uids->signatures->email);
414 if (keys[i].uid[0].sig.sig_class != key->uids->signatures->sig_class)
416 fprintf (stderr, "Unexpected class in first user ID sig: %i\n",
417 key->uids->signatures->sig_class);
420 if (keys[i].uid[0].sig.exportable != key->uids->signatures->exportable)
422 fprintf (stderr, "Unexpected exportable stat in first user ID sig: %i\n",
423 key->uids->signatures->exportable);
427 if (key->uids && key->uids->next && key->uids->next->revoked)
429 fprintf (stderr, "Second user ID unexpectedly revoked\n");
432 if (key->uids && key->uids->next && key->uids->next->invalid)
434 fprintf (stderr, "Second user ID unexpectedly invalid\n");
437 if (key->uids && key->uids->next
438 && key->uids->next->validity != GPGME_VALIDITY_UNKNOWN)
440 fprintf (stderr, "Second user ID has unexpectedly validity: %i\n",
441 key->uids->next->validity);
444 if (keys[i].uid[1].name
445 && strcmp (keys[i].uid[1].name, key->uids->next->name))
447 fprintf (stderr, "Unexpected name in second user ID: %s\n",
448 key->uids->next->name);
451 if (keys[i].uid[1].comment
452 && strcmp (keys[i].uid[1].comment, key->uids->next->comment))
454 fprintf (stderr, "Unexpected comment in second user ID: %s\n",
455 key->uids->next->comment);
458 if (keys[i].uid[1].email
459 && strcmp (keys[i].uid[1].email, key->uids->next->email))
461 fprintf (stderr, "Unexpected email in second user ID: %s\n",
462 key->uids->next->email);
465 /*FIXME: There is a bug in gpg 1.3.4 which duplicates a signaure
466 after importing the secret key. We disable this test for
469 #warning test disabled due to problems with gpg 1.3.4 generated key
471 if (key->uids && (!key->uids->next->signatures /*|| key->uids->next->signatures->next*/))
473 fprintf (stderr, "Second user ID unexpected number of signatures\n");
476 if (keys[i].uid[1].sig.algo != key->uids->next->signatures->pubkey_algo)
478 fprintf (stderr, "Unexpected algorithm in second user ID sig: %s\n",
479 gpgme_pubkey_algo_name (key->uids->next->signatures->pubkey_algo));
482 if (strcmp (keys[i].uid[1].sig.keyid, key->uids->next->signatures->keyid))
484 fprintf (stderr, "Unexpected key ID in second user ID sig: %s\n",
485 key->uids->next->signatures->keyid);
488 if (strcmp (keys[i].uid[1].sig.name, key->uids->next->signatures->name))
490 fprintf (stderr, "Unexpected name in second user ID sig: %s\n",
491 key->uids->next->signatures->name);
494 if (strcmp (keys[i].uid[1].sig.comment, key->uids->next->signatures->comment))
496 fprintf (stderr, "Unexpected comment in second user ID sig: %s\n",
497 key->uids->next->signatures->comment);
500 if (strcmp (keys[i].uid[1].sig.email, key->uids->next->signatures->email))
502 fprintf (stderr, "Unexpected email in second user ID sig: %s\n",
503 key->uids->next->signatures->email);
506 if (keys[i].uid[1].sig.sig_class != key->uids->next->signatures->sig_class)
508 fprintf (stderr, "Unexpected class in second user ID sig: %i\n",
509 key->uids->next->signatures->sig_class);
512 if (keys[i].uid[1].sig.exportable != key->uids->next->signatures->exportable)
514 fprintf (stderr, "Unexpected exportable stat in second user ID sig: %i\n",
515 key->uids->next->signatures->exportable);
519 if (key->uids && key->uids->next && key->uids->next->next
520 && key->uids->next->next->revoked)
522 fprintf (stderr, "Third user ID unexpectedly revoked\n");
525 if (key->uids && key->uids->next && key->uids->next->next
526 && key->uids->next->next->invalid)
528 fprintf (stderr, "Third user ID unexpectedly invalid\n");
531 if (key->uids && key->uids->next && key->uids->next->next
532 && key->uids->next->next->validity != GPGME_VALIDITY_UNKNOWN)
534 fprintf (stderr, "Third user ID has unexpectedly validity: %i\n",
535 key->uids->next->next->validity);
538 if (keys[i].uid[2].name
539 && strcmp (keys[i].uid[2].name, key->uids->next->next->name))
541 fprintf (stderr, "Unexpected name in third user ID: %s\n",
542 key->uids->next->next->name);
545 if (keys[i].uid[2].comment
546 && strcmp (keys[i].uid[2].comment, key->uids->next->next->comment))
548 fprintf (stderr, "Unexpected comment in third user ID: %s\n",
549 key->uids->next->next->comment);
552 if (keys[i].uid[2].email
553 && strcmp (keys[i].uid[2].email, key->uids->next->next->email))
555 fprintf (stderr, "Unexpected email in third user ID: %s\n",
556 key->uids->next->next->email);
559 if (key->uids && (!key->uids->next->next->signatures
560 || key->uids->next->next->signatures->next))
562 fprintf (stderr, "Third user ID unexpected number of signatures\n");
565 if (keys[i].uid[2].sig.algo != key->uids->next->next->signatures->pubkey_algo)
567 fprintf (stderr, "Unexpected algorithm in third user ID sig: %s\n",
568 gpgme_pubkey_algo_name (key->uids->next->next->signatures->pubkey_algo));
571 if (strcmp (keys[i].uid[2].sig.keyid, key->uids->next->next->signatures->keyid))
573 fprintf (stderr, "Unexpected key ID in third user ID sig: %s\n",
574 key->uids->next->next->signatures->keyid);
577 if (strcmp (keys[i].uid[2].sig.name, key->uids->next->next->signatures->name))
579 fprintf (stderr, "Unexpected name in third user ID sig: %s\n",
580 key->uids->next->next->signatures->name);
583 if (strcmp (keys[i].uid[2].sig.comment, key->uids->next->next->signatures->comment))
585 fprintf (stderr, "Unexpected comment in third user ID sig: %s\n",
586 key->uids->next->next->signatures->comment);
589 if (strcmp (keys[i].uid[2].sig.email, key->uids->next->next->signatures->email))
591 fprintf (stderr, "Unexpected email in third user ID sig: %s\n",
592 key->uids->next->next->signatures->email);
595 if (keys[i].uid[2].sig.sig_class != key->uids->next->next->signatures->sig_class)
597 fprintf (stderr, "Unexpected class in third user ID sig: %i\n",
598 key->uids->next->next->signatures->sig_class);
601 if (keys[i].uid[2].sig.exportable != key->uids->next->next->signatures->exportable)
603 fprintf (stderr, "Unexpected exportable stat in third user ID sig: %i\n",
604 key->uids->next->next->signatures->exportable);
612 gpgme_key_unref (key);
615 if (gpg_err_code (err) != GPG_ERR_EOF)
617 err = gpgme_op_keylist_end (ctx);
620 result = gpgme_op_keylist_result (ctx);
621 if (result->truncated)
623 fprintf (stderr, "Key listing unexpectedly truncated\n");
629 fprintf (stderr, "Less keys returned than expected\n");