Allow use of debug flag names for all tools.
[gnupg.git] / g13 / create.c
1 /* create.c - Create a new crypto container
2  * Copyright (C) 2009 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
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 3 of the License, or
9  * (at your option) any later version.
10  *
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.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <errno.h>
25 #include <unistd.h>
26 #include <sys/stat.h>
27 #include <assert.h>
28
29 #include "g13.h"
30 #include "i18n.h"
31 #include "create.h"
32
33 #include "keyblob.h"
34 #include "backend.h"
35 #include "utils.h"
36 #include "call-gpg.h"
37
38 /* Create a new blob with all the session keys and other meta
39    information which are to be stored encrypted in the crypto
40    container header.  On success the malloced blob is stored at R_BLOB
41    and its length at R_BLOBLEN.  On error an error code is returned
42    and (R_BLOB,R_BLOBLEN) are set to (NULL,0).
43
44    The format of this blob is a sequence of tag-length-value tuples.
45    All tuples have this format:
46
47      2 byte TAG           Big endian unsigned integer (0..65535)
48                           described by the KEYBLOB_TAG_ constants.
49      2 byte LENGTH        Big endian unsigned integer (0..65535)
50                           giving the length of the value.
51      length bytes VALUE   The value described by the tag.
52
53    The first tag in a keyblob must be a BLOBVERSION.  The other tags
54    depend on the type of the container as described by the CONTTYPE
55    tag.  See keyblob.h for details.  */
56 static gpg_error_t
57 create_new_keyblob (ctrl_t ctrl, int is_detached,
58                     void **r_blob, size_t *r_bloblen)
59 {
60   gpg_error_t err;
61   unsigned char twobyte[2];
62   membuf_t mb;
63
64   *r_blob = NULL;
65   *r_bloblen = 0;
66
67   init_membuf_secure (&mb, 512);
68
69   append_tuple (&mb, KEYBLOB_TAG_BLOBVERSION, "\x01", 1);
70
71   twobyte[0] = (ctrl->conttype >> 8);
72   twobyte[1] = (ctrl->conttype);
73   append_tuple (&mb, KEYBLOB_TAG_CONTTYPE, twobyte, 2);
74   if (is_detached)
75     append_tuple (&mb, KEYBLOB_TAG_DETACHED, NULL, 0);
76
77   err = be_create_new_keys (ctrl->conttype, &mb);
78   if (err)
79     goto leave;
80
81   /* Just for testing.  */
82   append_tuple (&mb, KEYBLOB_TAG_FILLER, "filler", 6);
83
84   *r_blob = get_membuf (&mb, r_bloblen);
85   if (!*r_blob)
86     {
87       err = gpg_error_from_syserror ();
88       *r_bloblen = 0;
89     }
90   else
91     log_debug ("used keyblob size is %zu\n", *r_bloblen);
92
93  leave:
94   xfree (get_membuf (&mb, NULL));
95   return err;
96 }
97
98
99
100 /* Encrypt the keyblob (KEYBLOB,KEYBLOBLEN) and store the result at
101    (R_ENCBLOB, R_ENCBLOBLEN).  Returns 0 on success or an error code.
102    On error R_EKYBLOB is set to NULL.  Depending on the keys set in
103    CTRL the result is a single OpenPGP binary message, a single
104    special OpenPGP packet encapsulating a CMS message or a
105    concatenation of both with the CMS packet being the last.  */
106 static gpg_error_t
107 encrypt_keyblob (ctrl_t ctrl, void *keyblob, size_t keybloblen,
108                  strlist_t keys,
109                  void **r_encblob, size_t *r_encbloblen)
110 {
111   gpg_error_t err;
112
113   /* FIXME:  For now we only implement OpenPGP.  */
114   err = gpg_encrypt_blob (ctrl, keyblob, keybloblen, keys,
115                           r_encblob, r_encbloblen);
116
117   return err;
118 }
119
120
121 /* Write a new file under the name FILENAME with the keyblob and an
122    appropriate header.  This fucntion is called with a lock file in
123    place and after checking that the filename does not exists.  */
124 static gpg_error_t
125 write_keyblob (const char *filename,
126                const void *keyblob, size_t keybloblen)
127 {
128   gpg_error_t err;
129   estream_t fp;
130   unsigned char packet[32];
131   size_t headerlen, paddinglen;
132
133   fp = es_fopen (filename, "wbx");
134   if (!fp)
135     {
136       err = gpg_error_from_syserror ();
137       log_error ("error creating new container '%s': %s\n",
138                  filename, gpg_strerror (err));
139       return err;
140     }
141
142   /* Allow for an least 8 times larger keyblob to accommodate for
143      future key changes.  Round it up to 4096 byte. */
144   headerlen = ((32 + 8 * keybloblen + 16) + 4095) / 4096 * 4096;
145   paddinglen = headerlen - 32 - keybloblen;
146   assert (paddinglen >= 16);
147
148   packet[0] = (0xc0|61); /* CTB for the private packet type 0x61.  */
149   packet[1] = 0xff;      /* 5 byte length packet, value 20.  */
150   packet[2] = 0;
151   packet[3] = 0;
152   packet[4] = 0;
153   packet[5] = 26;
154   memcpy (packet+6, "GnuPG/G13", 10); /* Packet subtype.  */
155   packet[16] = 1;   /* G13 packet format version.  */
156   packet[17] = 0;   /* Reserved.  */
157   packet[18] = 0;   /* Reserved.  */
158   packet[19] = 0;   /* OS Flag.  */
159   packet[20] = (headerlen >> 24);  /* Total length of header.  */
160   packet[21] = (headerlen >> 16);
161   packet[22] = (headerlen >> 8);
162   packet[23] = (headerlen);
163   packet[24] = 1;   /* Number of header copies.  */
164   packet[25] = 0;   /* Number of header copies at the end.  */
165   packet[26] = 0;   /* Reserved.  */
166   packet[27] = 0;   /* Reserved.  */
167   packet[28] = 0;   /* Reserved.  */
168   packet[29] = 0;   /* Reserved.  */
169   packet[30] = 0;   /* Reserved.  */
170   packet[31] = 0;   /* Reserved.  */
171
172   if (es_fwrite (packet, 32, 1, fp) != 1)
173     goto writeerr;
174
175   if (es_fwrite (keyblob, keybloblen, 1, fp) != 1)
176     goto writeerr;
177
178   /* Write the padding.  */
179   packet[0] = (0xc0|61); /* CTB for Private packet type 0x61.  */
180   packet[1] = 0xff;      /* 5 byte length packet, value 20.  */
181   packet[2] = (paddinglen-6) >> 24;
182   packet[3] = (paddinglen-6) >> 16;
183   packet[4] = (paddinglen-6) >> 8;
184   packet[5] = (paddinglen-6);
185   memcpy (packet+6, "GnuPG/PAD", 10); /* Packet subtype.  */
186   if (es_fwrite (packet, 16, 1, fp) != 1)
187     goto writeerr;
188   memset (packet, 0, 32);
189   for (paddinglen-=16; paddinglen >= 32; paddinglen -= 32)
190     if (es_fwrite (packet, 32, 1, fp) != 1)
191       goto writeerr;
192   if (paddinglen)
193     if (es_fwrite (packet, paddinglen, 1, fp) != 1)
194       goto writeerr;
195
196   if (es_fclose (fp))
197     {
198       err = gpg_error_from_syserror ();
199       log_error ("error closing '%s': %s\n",
200                  filename, gpg_strerror (err));
201       remove (filename);
202       return err;
203     }
204
205   return 0;
206
207
208  writeerr:
209   err = gpg_error_from_syserror ();
210   log_error ("error writing header to '%s': %s\n",
211              filename, gpg_strerror (err));
212   es_fclose (fp);
213   remove (filename);
214   return err;
215 }
216
217
218
219 /* Create a new container under the name FILENAME and intialize it
220    using the current settings.  KEYS is a list of public keys to which
221    the container will be encrypted.  If the file already exists an
222    error is returned.  */
223 gpg_error_t
224 g13_create_container (ctrl_t ctrl, const char *filename, strlist_t keys)
225 {
226   gpg_error_t err;
227   dotlock_t lock;
228   void *keyblob = NULL;
229   size_t keybloblen;
230   void *enckeyblob = NULL;
231   size_t enckeybloblen;
232   char *detachedname = NULL;
233   int detachedisdir;
234   tupledesc_t tuples = NULL;
235   unsigned int dummy_rid;
236
237   if (!keys)
238     return gpg_error (GPG_ERR_NO_PUBKEY);
239
240   /* A quick check to see that no container with that name already
241      exists.  */
242   if (!access (filename, F_OK))
243     return gpg_error (GPG_ERR_EEXIST);
244
245   /* Take a lock and proceed with the creation.  If there is a lock we
246      immediately return an error because for creation it does not make
247      sense to wait.  */
248   lock = dotlock_create (filename, 0);
249   if (!lock)
250     return gpg_error_from_syserror ();
251   if (dotlock_take (lock, 0))
252     {
253       err = gpg_error_from_syserror ();
254       goto leave;
255     }
256   else
257     err = 0;
258
259   /* Check again that the file does not exist.  */
260   {
261       struct stat sb;
262
263       if (!stat (filename, &sb))
264         {
265           err = gpg_error (GPG_ERR_EEXIST);
266           goto leave;
267         }
268   }
269   /* And a possible detached file or directory may not exist either.  */
270   err = be_get_detached_name (ctrl->conttype, filename,
271                               &detachedname, &detachedisdir);
272   if (err)
273     goto leave;
274   if (detachedname)
275     {
276       struct stat sb;
277
278       if (!stat (detachedname, &sb))
279         {
280           err = gpg_error (GPG_ERR_EEXIST);
281           goto leave;
282         }
283     }
284
285   /* Create a new keyblob.  */
286   err = create_new_keyblob (ctrl, !!detachedname, &keyblob, &keybloblen);
287   if (err)
288     goto leave;
289
290   /* Encrypt that keyblob.  */
291   err = encrypt_keyblob (ctrl, keyblob, keybloblen, keys,
292                          &enckeyblob, &enckeybloblen);
293   if (err)
294     goto leave;
295
296   /* Put a copy of the keyblob into a tuple structure.  */
297   err = create_tupledesc (&tuples, keyblob, keybloblen);
298   if (err)
299     goto leave;
300   keyblob = NULL;
301   /* if (opt.verbose) */
302   /*   dump_keyblob (tuples); */
303
304   /* Write out the header, the encrypted keyblob and some padding. */
305   err = write_keyblob (filename, enckeyblob, enckeybloblen);
306   if (err)
307     goto leave;
308
309   /* Create and append the container.  FIXME: We should pass the
310      estream object in addition to the filename, so that the backend
311      can append the container to the g13 file.  */
312   err = be_create_container (ctrl, ctrl->conttype, filename, -1, tuples,
313                              &dummy_rid);
314
315
316  leave:
317   destroy_tupledesc (tuples);
318   xfree (detachedname);
319   xfree (enckeyblob);
320   xfree (keyblob);
321   dotlock_destroy (lock);
322
323   return err;
324 }