sync
[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 MAX_LIST_SIGS_DEPTH  20
30
31
32 #define RECTYPE_VER  1
33 #define RECTYPE_DIR  2
34 #define RECTYPE_KEY  3
35 #define RECTYPE_UID  4
36 #define RECTYPE_PREF 5
37 #define RECTYPE_SIG  6
38 #define RECTYPE_CACH 9
39 #define RECTYPE_HTBL 10
40 #define RECTYPE_HLST 11
41
42
43 struct trust_record {
44     int  rectype;
45     struct trust_record *next;  /* help pointer to build lists in memory */
46     struct trust_record *help_pref;
47     struct trust_record *help_sig;
48     int  mark;
49     ulong recnum;
50     union {
51         struct {            /* version record: */
52             byte version;   /* should be 1 */
53             ulong locked;    /* pid of process which holds a lock */
54             ulong created;   /* timestamp of trustdb creation  */
55             ulong modified;  /* timestamp of last modification */
56             ulong validated; /* timestamp of last validation   */
57             byte marginals_needed;
58             byte completes_needed;
59             byte max_cert_depth;
60         } ver;
61         struct {            /* directory record */
62             ulong lid;
63             ulong keylist;  /* List of keys (the first is the primary key)*/
64             ulong uidlist;  /* list of uid records */
65             ulong cacherec; /* the cache record */
66             byte ownertrust;
67             byte sigflag;
68         } dir;
69         struct {            /* primary public key record */
70             ulong lid;
71             ulong next;    /* next key */
72             byte pubkey_algo;
73             byte fingerprint_len;
74             byte fingerprint[20];
75         } key;
76         struct {            /* user id reord */
77             ulong lid;      /* point back to the directory record */
78             ulong next;    /* points to next user id record */
79             ulong prefrec;   /* recno of preference record */
80             ulong siglist;   /* list of valid signatures (w/o self-sig)*/
81             byte namehash[20]; /* ripemd hash of the username */
82         } uid;
83         struct {            /* preference reord */
84             ulong lid;      /* point back to the directory record */
85                             /* or 0 for a glocal pref record */
86             ulong next;    /* points to next pref record */
87         } pref;
88         struct {            /* signature record */
89             ulong lid;
90             ulong next;   /* recnno of next record or NULL for last one */
91             struct {
92                 ulong lid;       /* of pubkey record of signator (0=unused) */
93                 byte flag;       /* reserved */
94             } sig[SIGS_PER_RECORD];
95         } sig;
96         struct {            /* cache record */
97             ulong lid;
98             byte blockhash[20];
99             byte trustlevel;   /* calculated trustlevel */
100         } cache;
101         struct {
102             ulong item[ITEMS_PER_HTBL_RECORD];
103         } htbl;
104         struct {
105             ulong next;
106             struct {
107                 byte hash;
108                 ulong rnum;
109             } item[ITEMS_PER_HLST_RECORD];
110         } hlst;
111     } r;
112 };
113 typedef struct trust_record TRUSTREC;
114
115 typedef struct {
116     ulong     local_id;    /* localid of the pubkey */
117     ulong     sigrec;
118     ulong     sig_id;      /* returned signature id */
119     unsigned  sig_flag;    /* returned signature record flag */
120     struct {               /* internal data */
121         int init_done;
122         int eof;
123         TRUSTREC rec;
124         int index;
125     } ctl;
126 } SIGREC_CONTEXT;
127
128
129 /*-- tdbio.c --*/
130 int tdbio_set_dbname( const char *new_dbname, int create );
131 const char *tdbio_get_dbname(void);
132 void tdbio_dump_record( ulong rnum, TRUSTREC *rec, FILE *fp );
133 int tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected );
134 int tdbio_write_record( TRUSTREC *rec );
135 ulong tdbio_new_recnum(void);
136 int tdbio_search_dir_record( PKT_public_key *pk, TRUSTREC *rec );
137 int tdbio_update_sigflag( ulong lid, int sigflag );
138
139
140 #define buftoulong( p )  ((*(byte*)(p) << 24) | (*((byte*)(p)+1)<< 16) | \
141                        (*((byte*)(p)+2) << 8) | (*((byte*)(p)+3)))
142 #define buftoushort( p )  ((*((byte*)(p)) << 8) | (*((byte*)(p)+1)))
143 #define ulongtobuf( p, a ) do {                           \
144                             ((byte*)p)[0] = a >> 24;    \
145                             ((byte*)p)[1] = a >> 16;    \
146                             ((byte*)p)[2] = a >>  8;    \
147                             ((byte*)p)[3] = a      ;    \
148                         } while(0)
149 #define ushorttobuf( p, a ) do {                           \
150                             ((byte*)p)[0] = a >>  8;    \
151                             ((byte*)p)[1] = a      ;    \
152                         } while(0)
153 #define buftou32( p)    buftoulong( (p) )
154 #define u32tobuf( p, a) ulongtobuf( (p), (a) )
155
156
157
158 #endif /*G10_TDBIO_H*/