last local commit
[gnupg.git] / g10 / tdbio.h
1 /* tdbio.h - Trust database I/O functions
2  *      Copyright (C) 1998 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 G10_TDBIO_H
22 #define G10_TDBIO_H
23
24
25 #define TRUST_RECORD_LEN 40
26 #define SIGS_PER_RECORD         ((TRUST_RECORD_LEN-10)/5)
27 #define ITEMS_PER_HTBL_RECORD   ((TRUST_RECORD_LEN-2)/4)
28 #define ITEMS_PER_HLST_RECORD   ((TRUST_RECORD_LEN-6)/5)
29 #define ITEMS_PER_PREF_RECORD   (TRUST_RECORD_LEN-10)
30 #if ITEMS_PER_PREF_RECORD % 2
31   #error ITEMS_PER_PREF_RECORD must be even
32 #endif
33 #define MAX_LIST_SIGS_DEPTH  20
34
35
36 #define RECTYPE_VER  1
37 #define RECTYPE_DIR  2
38 #define RECTYPE_KEY  3
39 #define RECTYPE_UID  4
40 #define RECTYPE_PREF 5
41 #define RECTYPE_SIG  6
42 #define RECTYPE_SDIR 8
43 #define RECTYPE_CACH 9
44 #define RECTYPE_HTBL 10
45 #define RECTYPE_HLST 11
46 #define RECTYPE_FREE 254
47
48
49 #define DIRF_CHECKED  1 /* everything has been checked, the other bits are
50                            valid */
51 #define DIRF_MISKEY   2 /* not all signatures are checked */
52                         /* this flag is used as a quick hint, that we */
53                         /* do not need to look at the sig records */
54 #define DIRF_ERROR    4 /* severe errors: the key is not valid for some reasons
55                            but we mark it to avoid duplicate checks */
56 #define DIRF_REVOKED  8 /* the complete key has been revoked */
57
58 #define KEYF_REVOKED  8 /* this key has been revoked (only useful on subkeys)*/
59
60 #define UIDF_CHECKED  1 /* user id has been checked - other bits are valid */
61 #define UIDF_VALID    2 /* this is a valid user id */
62 #define UIDF_REVOKED  8 /* this user id has been revoked */
63
64 #define SIGF_CHECKED  1 /* signature has been checked - bits 0..6 are valid */
65 #define SIGF_VALID    2 /* the signature is valid */
66 #define SIGF_REVOKED  8 /* this signature has been revoked */
67 #define SIGF_NOPUBKEY 128 /* there is no pubkey for this sig */
68
69 struct trust_record {
70     int  rectype;
71     int  mark;
72     int  dirty;                 /* for now only used internal by functions */
73     struct trust_record *next;  /* help pointer to build lists in memory */
74     ulong recnum;
75     union {
76         struct {             /* version record: */
77             byte version;    /* should be 2 */
78             ulong created;   /* timestamp of trustdb creation  */
79             ulong modified;  /* timestamp of last modification */
80             ulong validated; /* timestamp of last validation   */
81             ulong keyhashtbl;
82             ulong firstfree;
83             ulong sdirhashtbl;
84         } ver;
85         struct {            /* free record */
86             ulong next;
87         } free;
88         struct {            /* directory record */
89             ulong lid;
90             ulong keylist;  /* List of keys (the first is the primary key)*/
91             ulong uidlist;  /* list of uid records */
92             ulong cacherec; /* the cache record */
93             byte ownertrust;
94             byte dirflags;
95         } dir;
96         struct {            /* primary public key record */
97             ulong lid;
98             ulong next;    /* next key */
99             byte keyflags;
100             byte pubkey_algo;
101             byte fingerprint_len;
102             byte fingerprint[20];
103         } key;
104         struct {            /* user id reord */
105             ulong lid;      /* point back to the directory record */
106             ulong next;    /* points to next user id record */
107             ulong prefrec;   /* recno of preference record */
108             ulong siglist;   /* list of valid signatures (w/o self-sig)*/
109             byte uidflags;
110             byte namehash[20]; /* ripemd hash of the username */
111         } uid;
112         struct {            /* preference record */
113             ulong lid;      /* point back to the directory record */
114                             /* or 0 for a glocal pref record */
115             ulong next;    /* points to next pref record */
116             byte  data[ITEMS_PER_PREF_RECORD];
117         } pref;
118         struct {            /* signature record */
119             ulong lid;
120             ulong next;   /* recnno of next record or NULL for last one */
121             struct {
122                 ulong lid;       /* of pubkey record of signator (0=unused) */
123                 byte flag;       /* SIGF_xxxxx */
124             } sig[SIGS_PER_RECORD];
125         } sig;
126         struct {
127             ulong lid;
128             u32  keyid[2];
129             byte pubkey_algo;
130             u32  hintlist;
131         } sdir;
132         struct {            /* cache record */
133             ulong lid;
134             byte blockhash[20];
135             byte trustlevel;   /* calculated trustlevel */
136         } cache;
137         struct {
138             ulong item[ITEMS_PER_HTBL_RECORD];
139         } htbl;
140         struct {
141             ulong next;
142             ulong rnum[ITEMS_PER_HLST_RECORD]; /* of another record */
143         } hlst;
144     } r;
145 };
146 typedef struct trust_record TRUSTREC;
147
148 typedef struct {
149     ulong     lid;         /* localid */
150     ulong     sigrec;
151     ulong     sig_lid;     /* returned signatures LID */
152     unsigned  sig_flag;    /* returned signature record flag */
153     struct {               /* internal data */
154         int init_done;
155         int eof;
156         TRUSTREC rec;
157         ulong nextuid;
158         int index;
159     } ctl;
160 } SIGREC_CONTEXT;
161
162
163 /*-- tdbio.c --*/
164 int tdbio_set_dbname( const char *new_dbname, int create );
165 const char *tdbio_get_dbname(void);
166 void tdbio_dump_record( TRUSTREC *rec, FILE *fp );
167 int tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected );
168 int tdbio_write_record( TRUSTREC *rec );
169 int tdbio_sync(void);
170 int tdbio_delete_record( ulong recnum );
171 ulong tdbio_new_recnum(void);
172 int tdbio_search_dir_bypk( PKT_public_key *pk, TRUSTREC *rec );
173 int tdbio_search_dir_byfpr( const byte *fingerprint, size_t fingerlen,
174                                         int pubkey_algo, TRUSTREC *rec );
175 int tdbio_search_sdir( u32 *keyid, int pubkey_algo, TRUSTREC *rec );
176
177
178 #define buftoulong( p )  ((*(byte*)(p) << 24) | (*((byte*)(p)+1)<< 16) | \
179                        (*((byte*)(p)+2) << 8) | (*((byte*)(p)+3)))
180 #define buftoushort( p )  ((*((byte*)(p)) << 8) | (*((byte*)(p)+1)))
181 #define ulongtobuf( p, a ) do {                           \
182                             ((byte*)p)[0] = a >> 24;    \
183                             ((byte*)p)[1] = a >> 16;    \
184                             ((byte*)p)[2] = a >>  8;    \
185                             ((byte*)p)[3] = a      ;    \
186                         } while(0)
187 #define ushorttobuf( p, a ) do {                           \
188                             ((byte*)p)[0] = a >>  8;    \
189                             ((byte*)p)[1] = a      ;    \
190                         } while(0)
191 #define buftou32( p)    buftoulong( (p) )
192 #define u32tobuf( p, a) ulongtobuf( (p), (a) )
193
194
195
196 #endif /*G10_TDBIO_H*/