fixed severe exploit
[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_CTL  4
36 #define RECTYPE_SIG  5
37 #define RECTYPE_HTBL 6
38 #define RECTYPE_HLST 7
39 #define RECTYPE_UID  8
40
41
42 struct trust_record {
43     int  rectype;
44     union {
45         struct {            /* version record: */
46             byte version;   /* should be 1 */
47             ulong locked;    /* pid of process which holds a lock */
48             ulong created;   /* timestamp of trustdb creation  */
49             ulong modified;  /* timestamp of last modification */
50             ulong validated; /* timestamp of last validation   */
51             byte marginals_needed;
52             byte completes_needed;
53             byte max_cert_depth;
54         } ver;
55         struct {            /* directory record */
56             ulong local_id;
57             u32  keyid[2];
58             ulong keyrec;   /* recno of primary public key record */
59             ulong ctlrec;   /* recno of control record */
60             ulong sigrec;   /* recno of first signature record (osolete) */
61             ulong uidrec;   /* recno of first user-id record */
62             ulong link;     /* to next dir record */
63             byte no_sigs;   /* does not have sigature and checked */
64         } dir;
65         struct {            /* primary public key record */
66             ulong owner;
67             u32  keyid[2];
68             byte pubkey_algo;
69             byte fingerprint_len;
70             byte fingerprint[20];
71             byte ownertrust;
72         } key;
73         struct {            /* user id reord */
74             ulong owner;    /* point back to the directory record */
75             ulong chain;    /* points to next user id record */
76             byte  subtype;  /* must be 0 */
77             byte  namehash[20]; /* ripemd hash of the username */
78             byte ownertrust;
79             u32  prefrec;   /* recno of reference record */
80         } uid;
81         struct {            /* control record */
82             ulong owner;
83             byte blockhash[20];
84             byte trustlevel;   /* calculated trustlevel */
85         } ctl;
86         struct {            /* signature record */
87             ulong owner;  /* local_id of record owner (pubkey record) */
88             ulong chain;  /* offset of next record or NULL for last one */
89             struct {
90                 ulong  local_id; /* of pubkey record of signator (0=unused) */
91                 byte flag;     /* reserved */
92             } sig[SIGS_PER_RECORD];
93         } sig;
94         struct {
95             ulong item[ITEMS_PER_HTBL_RECORD];
96         } htbl;
97         struct {
98             ulong chain;
99             struct {
100                 byte hash;
101                 ulong rnum;
102             } item[ITEMS_PER_HLST_RECORD];
103         } hlst;
104     } r;
105 };
106 typedef struct trust_record TRUSTREC;
107
108 typedef struct {
109     ulong     local_id;    /* localid of the pubkey */
110     ulong     sigrec;
111     ulong     sig_id;      /* returned signature id */
112     unsigned  sig_flag;    /* returned signature record flag */
113     struct {               /* internal data */
114         int init_done;
115         int eof;
116         TRUSTREC rec;
117         int index;
118     } ctl;
119 } SIGREC_CONTEXT;
120
121
122 /*-- tdbio.c --*/
123 int tdbio_set_dbname( const char *new_dbname, int create );
124 const char *tdbio_get_dbname(void);
125 void tdbio_dump_record( ulong rnum, TRUSTREC *rec, FILE *fp );
126 int tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected );
127 int tdbio_write_record( ulong recnum, TRUSTREC *rec );
128 ulong tdbio_new_recnum(void);
129 int tdbio_search_record( PKT_public_key *pk, TRUSTREC *rec );
130
131
132 #define buftoulong( p )  ((*(byte*)(p) << 24) | (*((byte*)(p)+1)<< 16) | \
133                        (*((byte*)(p)+2) << 8) | (*((byte*)(p)+3)))
134 #define buftoushort( p )  ((*((byte*)(p)) << 8) | (*((byte*)(p)+1)))
135 #define ulongtobuf( p, a ) do {                           \
136                             ((byte*)p)[0] = a >> 24;    \
137                             ((byte*)p)[1] = a >> 16;    \
138                             ((byte*)p)[2] = a >>  8;    \
139                             ((byte*)p)[3] = a      ;    \
140                         } while(0)
141 #define ushorttobuf( p, a ) do {                           \
142                             ((byte*)p)[0] = a >>  8;    \
143                             ((byte*)p)[1] = a      ;    \
144                         } while(0)
145 #define buftou32( p)    buftoulong( (p) )
146 #define u32tobuf( p, a) ulongtobuf( (p), (a) )
147
148
149
150 #endif /*G10_TDBIO_H*/