See ChangeLog: Fri Jul 14 19:38:23 CEST 2000 Werner Koch
[gnupg.git] / g10 / tdbio.h
1 /* tdbio.h - Trust database I/O functions
2  *      Copyright (C) 1998, 1999, 2000 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 GPG_TDBIO_H
22 #define GPG_TDBIO_H
23
24 #include "host2net.h"
25
26 #define TRUST_RECORD_LEN 40
27 #define SIGS_PER_RECORD         ((TRUST_RECORD_LEN-10)/5)
28 #define ITEMS_PER_HTBL_RECORD   ((TRUST_RECORD_LEN-2)/4)
29 #define ITEMS_PER_HLST_RECORD   ((TRUST_RECORD_LEN-6)/5)
30 #define ITEMS_PER_PREF_RECORD   (TRUST_RECORD_LEN-10)
31 #if ITEMS_PER_PREF_RECORD % 2
32   #error ITEMS_PER_PREF_RECORD must be even
33 #endif
34 #define MAX_LIST_SIGS_DEPTH  20
35
36
37 #define RECTYPE_VER  1
38 #define RECTYPE_DIR  2
39 #define RECTYPE_KEY  3
40 #define RECTYPE_UID  4
41 #define RECTYPE_PREF 5
42 #define RECTYPE_SIG  6
43 #define RECTYPE_SDIR 8
44 #define RECTYPE_CACH 9
45 #define RECTYPE_HTBL 10
46 #define RECTYPE_HLST 11
47 #define RECTYPE_FREE 254
48
49
50 #define DIRF_CHECKED  1 /* has been checked - bits 1,2,3 are valid */
51 #define DIRF_VALID    2 /* This key is valid:  There is at least */
52                         /* one uid with a selfsignature or an revocation */
53 #define DIRF_EXPIRED  4 /* the complete key has expired */
54 #define DIRF_REVOKED  8 /* the complete key has been revoked */
55 #define DIRF_NEWKEYS 128 /* new keys are available: we can check the sigs */
56
57 #define KEYF_CHECKED  1 /* This key has been checked */
58 #define KEYF_VALID    2 /* This is a valid (sub)key */
59 #define KEYF_EXPIRED  4 /* this key is expired */
60 #define KEYF_REVOKED  8 /* this key has been revoked */
61
62 #define UIDF_CHECKED  1  /* user id has been checked - other bits are valid */
63 #define UIDF_VALID    2  /* this is a valid user id */
64 #define UIDF_REVOKED  8  /* this user id has been revoked */
65
66 #define SIGF_CHECKED  1 /* signature has been checked - bits 0..6 are valid */
67 #define SIGF_VALID    2 /* the signature is valid */
68 #define SIGF_EXPIRED  4 /* the key of this signature has expired */
69 #define SIGF_REVOKED  8 /* this signature has been revoked */
70 #define SIGF_IGNORED  64  /* this signature is ignored by the system */
71 #define SIGF_NOPUBKEY 128 /* there is no pubkey for this sig */
72
73 struct trust_record {
74     int  rectype;
75     int  mark;
76     int  dirty;                 /* for now only used internal by functions */
77     struct trust_record *next;  /* help pointer to build lists in memory */
78     ulong recnum;
79     union {
80         struct {             /* version record: */
81             byte version;    /* should be 2 */
82             byte  marginals;
83             byte  completes;
84             byte  cert_depth;
85             ulong created;   /* timestamp of trustdb creation  */
86             ulong mod_down;  /* timestamp of last modification downward */
87             ulong mod_up;    /* timestamp of last modification upward */
88             ulong keyhashtbl;
89             ulong firstfree;
90             ulong sdirhashtbl;
91         } ver;
92         struct {            /* free record */
93             ulong next;
94         } free;
95         struct {            /* directory record */
96             ulong lid;
97             ulong keylist;  /* List of keys (the first is the primary key)*/
98             ulong uidlist;  /* list of uid records */
99             ulong cacherec; /* the cache record */
100             byte ownertrust;
101             byte dirflags;
102             byte validity;   /* calculated trustlevel over all uids */
103             ulong valcheck;  /* timestamp of last validation check */
104             ulong checkat;   /* Check key when this time has been reached*/
105         } dir;
106         struct {            /* primary public key record */
107             ulong lid;
108             ulong next;    /* next key */
109             byte keyflags;
110             byte pubkey_algo;
111             byte fingerprint_len;
112             byte fingerprint[20];
113         } key;
114         struct {            /* user id reord */
115             ulong lid;      /* point back to the directory record */
116             ulong next;    /* points to next user id record */
117             ulong prefrec;   /* recno of preference record */
118             ulong siglist;   /* list of valid signatures (w/o self-sig)*/
119             byte uidflags;
120             byte validity;  /* calculated trustlevel of this uid */
121             byte namehash[20]; /* ripemd hash of the username */
122         } uid;
123         struct {            /* preference record */
124             ulong lid;      /* point back to the directory record */
125                             /* or 0 for a global pref record */
126             ulong next;    /* points to next pref record */
127             byte  data[ITEMS_PER_PREF_RECORD];
128         } pref;
129         struct {            /* signature record */
130             ulong lid;
131             ulong next;   /* recnno of next record or NULL for last one */
132             struct {
133                 ulong lid;       /* of pubkey record of signator (0=unused) */
134                 byte flag;       /* SIGF_xxxxx */
135             } sig[SIGS_PER_RECORD];
136         } sig;
137         struct {
138             ulong lid;
139             u32  keyid[2];
140             byte pubkey_algo;
141             u32  hintlist;
142         } sdir;
143         struct {            /* cache record */
144             ulong lid;
145             byte blockhash[20];
146             byte trustlevel;   /* calculated trustlevel */
147         } cache;
148         struct {
149             ulong item[ITEMS_PER_HTBL_RECORD];
150         } htbl;
151         struct {
152             ulong next;
153             ulong rnum[ITEMS_PER_HLST_RECORD]; /* of another record */
154         } hlst;
155     } r;
156 };
157 typedef struct trust_record TRUSTREC;
158
159 typedef struct {
160     ulong     lid;         /* localid */
161     ulong     sigrec;
162     ulong     sig_lid;     /* returned signatures LID */
163     unsigned  sig_flag;    /* returned signature record flag */
164     struct {               /* internal data */
165         int init_done;
166         int eof;
167         TRUSTREC rec;
168         ulong nextuid;
169         int index;
170     } ctl;
171 } SIGREC_CONTEXT;
172
173
174 /*-- tdbio.c --*/
175 int tdbio_set_dbname( const char *new_dbname, int create );
176 const char *tdbio_get_dbname(void);
177 void tdbio_dump_record( TRUSTREC *rec, FILE *fp );
178 int tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected );
179 int tdbio_write_record( TRUSTREC *rec );
180 int tdbio_db_matches_options(void);
181 ulong tdbio_read_modify_stamp( int modify_down );
182 void tdbio_write_modify_stamp( int up, int down );
183 int tdbio_is_dirty(void);
184 int tdbio_sync(void);
185 int tdbio_begin_transaction(void);
186 int tdbio_end_transaction(void);
187 int tdbio_cancel_transaction(void);
188 int tdbio_delete_record( ulong recnum );
189 ulong tdbio_new_recnum(void);
190 int tdbio_search_dir_bypk( PKT_public_key *pk, TRUSTREC *rec );
191 int tdbio_search_dir_byfpr( const byte *fingerprint, size_t fingerlen,
192                                         int pubkey_algo, TRUSTREC *rec );
193 int tdbio_search_dir(  u32 *keyid, int pubkey_algo, TRUSTREC *rec );
194 int tdbio_search_sdir( u32 *keyid, int pubkey_algo, TRUSTREC *rec );
195
196 void tdbio_invalid(void);
197
198 #endif /*GPG_TDBIO_H*/