Add support for direct pkcs#7 signatures
[gnupg.git] / kbx / keybox-defs.h
1 /* keybox-defs.h - interal Keybox defintions
2  *      Copyright (C) 2001, 2004 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 2 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, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #ifndef KEYBOX_DEFS_H
22 #define KEYBOX_DEFS_H 1
23
24 #ifdef GPG_ERR_SOURCE_DEFAULT
25 #error GPG_ERR_SOURCE_DEFAULT already defined
26 #endif
27 #define GPG_ERR_SOURCE_DEFAULT  GPG_ERR_SOURCE_KEYBOX
28 #include <gpg-error.h>
29 #define map_assuan_err(a) \
30         map_assuan_err_with_source (GPG_ERR_SOURCE_DEFAULT, (a))
31
32 #include <sys/types.h> /* off_t */
33
34 /* We include the type defintions from jnlib instead of defining our
35    owns here.  This will not allow us build KBX in a standalone way
36    but there is currently no need for it anyway.  Same goes for
37    stringhelp.h which for example provides a replacement for stpcpy -
38    fixme: Better the LIBOBJ mechnism. */
39 #include "../jnlib/types.h"
40 #include "../jnlib/stringhelp.h"
41
42 #include "keybox.h"
43
44
45 enum {
46   BLOBTYPE_EMPTY = 0,
47   BLOBTYPE_HEADER = 1,
48   BLOBTYPE_PGP = 2,
49   BLOBTYPE_X509 = 3
50 };
51
52
53 typedef struct keyboxblob *KEYBOXBLOB;
54
55
56 typedef struct keybox_name *KB_NAME;
57 typedef struct keybox_name const * CONST_KB_NAME;
58 struct keybox_name {
59   struct keybox_name *next;
60   int secret;
61   /*DOTLOCK lockhd;*/
62   int is_locked;
63   int did_full_scan;
64   char fname[1];
65 };
66
67
68
69 struct keybox_handle {
70   CONST_KB_NAME kb;
71   int secret;             /* this is for a secret keybox */
72   FILE *fp;
73   int eof;
74   int error;
75   int ephemeral;  
76   struct {
77     KEYBOXBLOB blob;
78     off_t offset;
79     size_t pk_no;
80     size_t uid_no;
81     unsigned int n_packets; /*used for delete and update*/
82   } found;
83   struct {
84     char *name;
85     char *pattern;
86   } word_match;
87 };
88
89
90 /* Openpgp helper structures. */
91 struct _keybox_openpgp_key_info
92 {
93   struct _keybox_openpgp_key_info *next;
94   unsigned char keyid[8];
95   int fprlen;  /* Either 16 or 20 */
96   unsigned char fpr[20];
97 };
98
99 struct _keybox_openpgp_uid_info
100 {
101   struct _keybox_openpgp_uid_info *next;
102   size_t off;
103   size_t len;
104 };
105
106 struct _keybox_openpgp_info
107 {
108   int is_secret;        /* True if this is a secret key. */
109   unsigned int nsubkeys;/* Total number of subkeys.  */
110   unsigned int nuids;   /* Total number of user IDs in the keyblock. */
111   unsigned int nsigs;   /* Total number of signatures in the keyblock. */
112
113   /* Note, we use 2 structs here to better cope with the most common
114      use of having one primary and one subkey - this allows us to
115      statically allocate this structure and only malloc stuff for more
116      than one subkey. */
117   struct _keybox_openpgp_key_info primary;
118   struct _keybox_openpgp_key_info subkeys;
119   struct _keybox_openpgp_uid_info uids;
120 };
121 typedef struct _keybox_openpgp_info *keybox_openpgp_info_t;
122
123
124 /* Don't know whether this is needed: */
125 /*  static struct { */
126 /*    const char *homedir; */
127 /*    int dry_run; */
128 /*    int quiet; */
129 /*    int verbose; */
130 /*    int preserve_permissions; */
131 /*  } keybox_opt; */
132
133
134 /*-- keybox-blob.c --*/
135 #ifdef KEYBOX_WITH_OPENPGP
136   /* fixme */
137 #endif /*KEYBOX_WITH_OPENPGP*/
138 #ifdef KEYBOX_WITH_X509
139 int _keybox_create_x509_blob (KEYBOXBLOB *r_blob, ksba_cert_t cert,
140                               unsigned char *sha1_digest, int as_ephemeral);
141 #endif /*KEYBOX_WITH_X509*/
142
143 int  _keybox_new_blob (KEYBOXBLOB *r_blob,
144                        unsigned char *image, size_t imagelen,
145                        off_t off);
146 void _keybox_release_blob (KEYBOXBLOB blob);
147 const unsigned char *_keybox_get_blob_image (KEYBOXBLOB blob, size_t *n);
148 off_t _keybox_get_blob_fileoffset (KEYBOXBLOB blob);
149 void _keybox_update_header_blob (KEYBOXBLOB blob);
150
151 /*-- keybox-openpgp.c --*/
152 gpg_error_t _keybox_parse_openpgp (const unsigned char *image, size_t imagelen,
153                                    size_t *nparsed,
154                                    keybox_openpgp_info_t info);
155 void _keybox_destroy_openpgp_info (keybox_openpgp_info_t info);
156
157
158 /*-- keybox-file.c --*/
159 int _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp);
160 int _keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted);
161 int _keybox_write_blob (KEYBOXBLOB blob, FILE *fp);
162 int _keybox_write_header_blob (FILE *fp);
163
164 /*-- keybox-search.c --*/
165 gpg_err_code_t _keybox_get_flag_location (const unsigned char *buffer,
166                                           size_t length,
167                                           int what,
168                                           size_t *flag_off, size_t *flag_size);
169
170 /*-- keybox-dump.c --*/
171 int _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp);
172 int _keybox_dump_file (const char *filename, int stats_only, FILE *outfp);
173
174
175 /*-- keybox-util.c --*/
176 void *_keybox_malloc (size_t n);
177 void *_keybox_calloc (size_t n, size_t m);
178 void *_keybox_realloc (void *p, size_t n);
179 void  _keybox_free (void *p);
180
181 #define xtrymalloc(a)    _keybox_malloc ((a))
182 #define xtrycalloc(a,b)  _keybox_calloc ((a),(b))
183 #define xtryrealloc(a,b) _keybox_realloc((a),(b))
184 #define xfree(a)         _keybox_free ((a))
185
186
187 #define DIM(v) (sizeof(v)/sizeof((v)[0]))
188 #define DIMof(type,member)   DIM(((type *)0)->member)
189 #ifndef STR
190   #define STR(v) #v
191 #endif
192 #define STR2(v) STR(v)
193
194 /*
195   a couple of handy macros 
196 */
197
198 #define return_if_fail(expr) do {                        \
199     if (!(expr)) {                                       \
200         fprintf (stderr, "%s:%d: assertion `%s' failed\n", \
201                  __FILE__, __LINE__, #expr );            \
202         return;                                          \
203     } } while (0)
204 #define return_null_if_fail(expr) do {                   \
205     if (!(expr)) {                                       \
206         fprintf (stderr, "%s:%d: assertion `%s' failed\n", \
207                  __FILE__, __LINE__, #expr );            \
208         return NULL;                                     \
209     } } while (0)
210 #define return_val_if_fail(expr,val) do {                \
211     if (!(expr)) {                                       \
212         fprintf (stderr, "%s:%d: assertion `%s' failed\n", \
213                  __FILE__, __LINE__, #expr );            \
214         return (val);                                    \
215     } } while (0)
216 #define never_reached() do {                                   \
217         fprintf (stderr, "%s:%d: oops; should never get here\n", \
218                  __FILE__, __LINE__ );                         \
219     } while (0)
220
221
222 /* some macros to replace ctype ones and avoid locale problems */
223 #define digitp(p)   (*(p) >= '0' && *(p) <= '9')
224 #define hexdigitp(a) (digitp (a)                     \
225                       || (*(a) >= 'A' && *(a) <= 'F')  \
226                       || (*(a) >= 'a' && *(a) <= 'f'))
227 /* the atoi macros assume that the buffer has only valid digits */
228 #define atoi_1(p)   (*(p) - '0' )
229 #define atoi_2(p)   ((atoi_1(p) * 10) + atoi_1((p)+1))
230 #define atoi_4(p)   ((atoi_2(p) * 100) + atoi_2((p)+2))
231 #define xtoi_1(p)   (*(p) <= '9'? (*(p)- '0'): \
232                      *(p) <= 'F'? (*(p)-'A'+10):(*(p)-'a'+10))
233 #define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))
234
235
236 #endif /*KEYBOX_DEFS_H*/
237
238