d5df2c61872104a10f84c2398e8a6a4558629687
[gpgme.git] / tests / gpgsm / t-genkey.c
1 /* t-genkey.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 #include <stdlib.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include <errno.h>
25
26 #include <gpgme.h>
27
28 #define fail_if_err(err)                                        \
29   do                                                            \
30     {                                                           \
31       if (err)                                                  \
32         {                                                       \
33           fprintf (stderr, "%s:%d: gpgme_error_t %s\n",         \
34                    __FILE__, __LINE__, gpgme_strerror (err));   \
35           exit (1);                                             \
36         }                                                       \
37     }                                                           \
38   while (0)
39
40
41 static void
42 print_data (gpgme_data_t dh)
43 {
44 #define BUF_SIZE 512
45   char buf[BUF_SIZE + 1];
46   int ret;
47   
48   ret = gpgme_data_seek (dh, 0, SEEK_SET);
49   if (ret)
50     fail_if_err (GPGME_File_Error);
51   while ((ret = gpgme_data_read (dh, buf, BUF_SIZE)) > 0)
52     fwrite (buf, ret, 1, stdout);
53   if (ret < 0)
54     fail_if_err (GPGME_File_Error);
55 }
56
57
58 /* True if progress function printed something on the screen.  */
59 static int progress_called;
60
61 static void
62 progress (void *self, const char *what, int type, int current, int total)
63 {
64   if (!strcmp (what, "primegen") && !current && !total
65       && (type == '.' || type == '+' || type == '!'
66           || type == '^' || type == '<' || type == '>'))
67     {
68       printf ("%c", type);
69       fflush (stdout);
70       progress_called = 1;
71     }
72   else
73     {
74       fprintf (stderr, "unknown progress `%s' %d %d %d\n", what, type,
75                current, total);
76       exit (1);
77     }
78 }
79
80
81 int 
82 main (int argc, char **argv)
83 {
84   gpgme_ctx_t ctx;
85   gpgme_error_t err;
86   const char *parms = "<GnupgKeyParms format=\"internal\">\n"
87     "Key-Type: RSA\n"
88     "Key-Length: 1024\n"
89     "Name-DN: C=de,O=g10 code,OU=Testlab,CN=Joe 2 Tester\n"
90     "Name-Email: joe@foo.bar\n"
91     "</GnupgKeyParms>\n";
92   gpgme_genkey_result_t result;
93   gpgme_data_t certreq;
94
95   err = gpgme_engine_check_version (GPGME_PROTOCOL_CMS);
96   fail_if_err (err);
97
98   err = gpgme_data_new (&certreq);
99   fail_if_err (err);
100
101   err = gpgme_new (&ctx);
102   fail_if_err (err);
103
104   gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
105   gpgme_set_armor (ctx, 1);
106
107   gpgme_set_progress_cb (ctx, progress, NULL);
108   
109   err = gpgme_op_genkey (ctx, parms, certreq, NULL);
110   fail_if_err (err);
111
112   result = gpgme_op_genkey_result (ctx);
113   if (!result)
114     {
115       fprintf (stderr, "%s:%d: gpgme_op_genkey_result returns NULL\n",
116                __FILE__, __LINE__);
117       exit (1);
118     }
119   if (progress_called)
120     printf ("\n");
121
122   printf ("Generated key: %s (%s)\n", result->fpr ? result->fpr : "none",
123           result->primary ? (result->sub ? "primary, sub" : "primary")
124           : (result->sub ? "sub" : "none"));
125
126   if (result->fpr)
127     {
128       fprintf (stderr, "%s:%d: generated key has (unexpectdly) a fingerprint\n",
129                __FILE__, __LINE__);
130       exit (1);
131     }
132   if (!result->primary)
133     {
134       fprintf (stderr, "%s:%d: primary key was not generated\n",
135                __FILE__, __LINE__);
136       exit (1);
137     }
138   if (result->sub)
139     {
140       fprintf (stderr, "%s:%d: sub key was (unexpectedly) generated\n",
141                __FILE__, __LINE__);
142       exit (1);
143     }
144   gpgme_release (ctx);
145
146   print_data (certreq);
147   gpgme_data_release (certreq);
148
149   return 0;
150 }