2004-08-17 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / tests / gpgsm / t-keylist.c
1 /* t-keylist.c  - regression test
2    Copyright (C) 2000 Werner Koch (dd9jn)
3    Copyright (C) 2001, 2003 g10 Code GmbH
4
5    This file is part of GPGME.
6  
7    GPGME is free software; you can redistribute it and/or modify it
8    under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11  
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    General Public License for more details.
16  
17    You should have received a copy of the GNU General Public License
18    along with GPGME; if not, write to the Free Software Foundation,
19    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 /* We need to include config.h so that we know whether we are building
22    with large file system (LFS) support. */
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <stdlib.h>
28 #include <stdio.h>
29 #include <string.h>
30
31 #include <gpgme.h>
32
33 #include "t-support.h"
34
35 \f
36 struct
37 {
38   char *fpr;
39   int secret;
40   long timestamp;
41   long expires;
42   char *issuer_serial;
43   char *issuer_name;
44   char *chain_id;
45   char *uid;
46   gpgme_validity_t validity;
47   unsigned int key_length;
48 }
49 keys[] =
50   {
51     { "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E", 1, 1007372198, 1038908198, "00",
52       "CN=test cert 1,OU=Aegypten Project,O=g10 Code GmbH,L=D\xc3\xbcsseldorf,C=DE",
53       "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E",
54       "CN=test cert 1,OU=Aegypten Project,O=g10 Code GmbH,L=D\xc3\xbcsseldorf,C=DE",
55       GPGME_VALIDITY_ULTIMATE, 1024
56     },
57     { "DFA56FB5FC41E3A8921F77AD1622EEFD9152A5AD", 0, 909684190, 1009821790, "01",
58       "1.2.840.113549.1.9.1=#63657274696679407063612E64666E2E6465,"
59       "CN=DFN Top Level Certification Authority,OU=DFN-PCA,"
60       "O=Deutsches Forschungsnetz,C=DE",
61       "DFA56FB5FC41E3A8921F77AD1622EEFD9152A5AD",
62       "1.2.840.113549.1.9.1=#63657274696679407063612E64666E2E6465,"
63       "CN=DFN Top Level Certification Authority,OU=DFN-PCA,"
64       "O=Deutsches Forschungsnetz,C=DE",
65       GPGME_VALIDITY_NEVER, 2048
66     },
67     { "2C8F3C356AB761CB3674835B792CDA52937F9285", 0, 973183644, 1009735200, "15",
68       "1.2.840.113549.1.9.1=#63657274696679407063612E64666E2E6465,"
69       "CN=DFN Top Level Certification Authority,OU=DFN-PCA,"
70       "O=Deutsches Forschungsnetz,C=DE",
71       "DFA56FB5FC41E3A8921F77AD1622EEFD9152A5AD",
72       "1.2.840.113549.1.9.1=#63657274696679407063612E64666E2E6465,"
73       "CN=DFN Server Certification Authority,OU=DFN-PCA,"
74       "O=Deutsches Forschungsnetz,C=DE",
75       GPGME_VALIDITY_UNKNOWN, 2048
76     },
77     { NULL }
78   };
79
80
81 int 
82 main (int argc, char **argv)
83 {
84   gpgme_error_t err;
85   gpgme_ctx_t ctx;
86   gpgme_key_t key;
87   gpgme_keylist_result_t result;
88   int i = 0;
89
90   init_gpgme (GPGME_PROTOCOL_CMS);
91
92   err = gpgme_new (&ctx);
93   fail_if_err (err);
94   gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
95
96   err = gpgme_op_keylist_start (ctx, NULL, 0);
97   fail_if_err (err);
98     
99   while (!(err = gpgme_op_keylist_next (ctx, &key)))
100     {
101       if (!keys[i].fpr)
102         {
103           fprintf (stderr, "More keys returned than expected\n");
104           exit (1);
105         }
106
107       /* Global key flags.  */
108       if (key->revoked)
109         {
110           fprintf (stderr, "Key unexpectedly revoked\n");
111           exit (1);
112         }
113       if (key->expired)
114         {
115           fprintf (stderr, "Key unexpectedly expired\n");
116           exit (1);
117         }
118       if (key->disabled)
119         {
120           fprintf (stderr, "Key unexpectedly disabled\n");
121           exit (1);
122         }
123       if (key->invalid)
124         {
125           fprintf (stderr, "Key unexpectedly invalid\n");
126           exit (1);
127         }
128       if (key->can_encrypt != keys[i].secret)
129         {
130           fprintf (stderr, "Key unexpectedly%s usable for encryption\n",
131                    key->can_encrypt ? "" : " not");
132           exit (1);
133         }
134       if (key->can_sign != keys[i].secret)
135         {
136           fprintf (stderr, "Key unexpectedly%s usable for signing\n",
137                    key->can_sign ? "" : " not");
138           exit (1);
139         }
140       if (!key->can_certify)
141         {
142           fprintf (stderr, "Key unexpectedly unusable for certifications\n");
143           exit (1);
144         }
145       if (key->secret != keys[i].secret)
146         {
147           fprintf (stderr, "Key unexpectedly%s secret\n",
148                    key->secret ? "" : " not");
149           exit (1);
150         }
151       if (key->protocol != GPGME_PROTOCOL_CMS)
152         {
153           fprintf (stderr, "Key has unexpected protocol: %s\n",
154                    gpgme_get_protocol_name (key->protocol));
155           exit (1);
156         }
157       if (!key->issuer_serial)
158         {
159           fprintf (stderr, "Key unexpectedly misses issuer serial\n");
160           exit (1);
161         }
162       if (strcmp (key->issuer_serial, keys[i].issuer_serial))
163         {
164           fprintf (stderr, "Key has unexpected issuer serial: %s\n",
165                    key->issuer_serial);
166           exit (1);
167         }
168       if (!key->issuer_name)
169         {
170           fprintf (stderr, "Key unexpectedly misses issuer name\n");
171           exit (1);
172         }
173       if (strcmp (key->issuer_name, keys[i].issuer_name))
174         {
175           fprintf (stderr, "Key has unexpected issuer name: %s\n",
176                    key->issuer_name);
177           exit (1);
178         }
179       if (key->chain_id && !keys[i].chain_id)
180         {
181           fprintf (stderr, "Key unexpectedly carries chain ID: %s\n",
182                    key->chain_id);
183           exit (1);
184         }
185       if (!key->chain_id && keys[i].chain_id)
186         {
187           fprintf (stderr, "Key unexpectedly carries no chain ID\n");
188           exit (1);
189         }
190       if (key->chain_id && strcmp (key->chain_id, keys[i].chain_id))
191         {
192           fprintf (stderr, "Key carries unexpected chain ID: %s\n",
193                    key->chain_id);
194           exit (1);
195         }
196       if (key->owner_trust != GPGME_VALIDITY_UNKNOWN)
197         {
198           fprintf (stderr, "Key has unexpected owner trust: %i\n",
199                    key->owner_trust);
200           exit (1);
201         }
202       if (!key->subkeys || key->subkeys->next)
203         {
204           fprintf (stderr, "Key has unexpected number of subkeys\n");
205           exit (1);
206         }
207
208       /* Primary key.  */
209       if (key->subkeys->revoked)
210         {
211           fprintf (stderr, "Primary key unexpectedly revoked\n");
212           exit (1);
213         }
214       if (key->subkeys->expired)
215         {
216           fprintf (stderr, "Primary key unexpectedly expired\n");
217           exit (1);
218         }
219       if (key->subkeys->disabled)
220         {
221           fprintf (stderr, "Primary key unexpectedly disabled\n");
222           exit (1);
223         }
224       if (key->subkeys->invalid)
225         {
226           fprintf (stderr, "Primary key unexpectedly invalid\n");
227           exit (1);
228         }
229       if (key->subkeys->can_encrypt != keys[i].secret)
230         {
231           fprintf (stderr, "Key unexpectedly%s usable for encryption\n",
232                    key->subkeys->can_encrypt ? "" : " not");
233           exit (1);
234         }
235       if (key->subkeys->can_sign != keys[i].secret)
236         {
237           fprintf (stderr, "Key unexpectedly%s usable for signing\n",
238                    key->subkeys->can_sign ? "" : " not");
239           exit (1);
240         }
241       if (!key->subkeys->can_certify)
242         {
243           fprintf (stderr, "Primary key unexpectedly unusable for certifications\n");
244           exit (1);
245         }
246       if (key->subkeys->secret)
247         {
248           fprintf (stderr, "Primary key unexpectedly secret\n");
249           exit (1);
250         }
251       if (key->subkeys->pubkey_algo != GPGME_PK_RSA)
252         {
253           fprintf (stderr, "Primary key has unexpected public key algo: %s\n",
254                    gpgme_pubkey_algo_name (key->subkeys->pubkey_algo));
255           exit (1);
256         }
257       if (key->subkeys->length != keys[i].key_length)
258         {
259           fprintf (stderr, "Primary key has unexpected length: %i\n",
260                    key->subkeys->length);
261           exit (1);
262         }
263       if (strcmp (key->subkeys->keyid, &keys[i].fpr[40 - 16]))
264         {
265           fprintf (stderr, "Primary key has unexpected key ID: %s\n",
266                    key->subkeys->keyid);
267           exit (1);
268         }
269       if (strcmp (key->subkeys->fpr, keys[i].fpr))
270         {
271           fprintf (stderr, "Primary key has unexpected fingerprint: %s\n",
272                    key->subkeys->fpr);
273           exit (1);
274         }
275       if (key->subkeys->timestamp != keys[i].timestamp)
276         {
277           fprintf (stderr, "Primary key unexpected timestamp: %lu\n",
278                    key->subkeys->timestamp);
279           exit (1);
280         }
281       if (key->subkeys->expires != keys[i].expires)
282         {
283           fprintf (stderr, "Primary key unexpectedly expires: %lu\n",
284                    key->subkeys->expires);
285           exit (1);
286         }
287
288       if (!key->uids || key->uids->next)
289         {
290           fprintf (stderr, "Key has unexpected number of user IDs\n");
291           exit (1);
292         }
293       if (key->uids->revoked)
294         {
295           fprintf (stderr, "User ID unexpectedly revoked\n");
296           exit (1);
297         }
298       if (key->uids->invalid)
299         {
300           fprintf (stderr, "User ID unexpectedly invalid\n");
301           exit (1);
302         }
303       if (key->uids->validity != keys[i].validity)
304         {
305           fprintf (stderr, "User ID unexpectedly validity: %i\n",
306                    key->uids->validity);
307           exit (1);
308         }
309       if (key->uids->signatures)
310         {
311           fprintf (stderr, "User ID unexpectedly signed\n");
312           exit (1);
313         }
314       if (!key->uids->name || key->uids->name[0])
315         {
316           fprintf (stderr, "Unexpected name in user ID: %s\n",
317                    key->uids->name);
318           exit (1);
319         }
320       if (!key->uids->comment || key->uids->comment[0])
321         {
322           fprintf (stderr, "Unexpected comment in user ID: %s\n",
323                    key->uids->comment);
324           exit (1);
325         }
326       if (!key->uids->email || key->uids->email[0])
327         {
328           fprintf (stderr, "Unexpected email in user ID: %s\n",
329                    key->uids->email);
330           exit (1);
331         }
332       if (!key->uids->uid || strcmp (key->uids->uid, keys[i].uid))
333         {
334           fprintf (stderr, "Unexpected uid in user ID: %s\n",
335                    key->uids->uid);
336           exit (1);
337         }
338
339       gpgme_key_unref (key);
340       i++;
341     }
342   if (gpg_err_code (err) != GPG_ERR_EOF)
343     fail_if_err (err);
344   err = gpgme_op_keylist_end (ctx);
345   fail_if_err (err);
346
347   result = gpgme_op_keylist_result (ctx);
348   if (result->truncated)
349     {
350       fprintf (stderr, "Key listing unexpectedly truncated\n");
351       exit (1);
352     }
353
354   if (keys[i].fpr)
355     {
356       fprintf (stderr, "Less keys returned than expected\n");
357       exit (1);
358     }
359
360   gpgme_release (ctx);
361   return 0;
362 }