diff options
author | Werner Koch <wk@gnupg.org> | 1998-07-09 15:37:17 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 1998-07-09 15:37:17 +0200 |
commit | e143f23c237e523758173e65ff8fdd2966ed938b (patch) | |
tree | b17a57e05ddb9680922b00a42bb5ebefe62d71cd /g10/tdbio.h | |
parent | fixed clearsig stuff (diff) | |
download | gnupg2-e143f23c237e523758173e65ff8fdd2966ed938b.tar.xz gnupg2-e143f23c237e523758173e65ff8fdd2966ed938b.zip |
fixed severe exploitV0-3-2
Diffstat (limited to 'g10/tdbio.h')
-rw-r--r-- | g10/tdbio.h | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/g10/tdbio.h b/g10/tdbio.h new file mode 100644 index 000000000..facb5c307 --- /dev/null +++ b/g10/tdbio.h @@ -0,0 +1,150 @@ +/* tdbio.h - Trust database I/O functions + * Copyright (C) 1998 Free Software Foundation, Inc. + * + * This file is part of GNUPG. + * + * GNUPG is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * GNUPG is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef G10_TDBIO_H +#define G10_TDBIO_H + + +#define TRUST_RECORD_LEN 40 +#define SIGS_PER_RECORD ((TRUST_RECORD_LEN-10)/5) +#define ITEMS_PER_HTBL_RECORD ((TRUST_RECORD_LEN-2)/4) +#define ITEMS_PER_HLST_RECORD ((TRUST_RECORD_LEN-6)/5) +#define MAX_LIST_SIGS_DEPTH 20 + + +#define RECTYPE_VER 1 +#define RECTYPE_DIR 2 +#define RECTYPE_KEY 3 +#define RECTYPE_CTL 4 +#define RECTYPE_SIG 5 +#define RECTYPE_HTBL 6 +#define RECTYPE_HLST 7 +#define RECTYPE_UID 8 + + +struct trust_record { + int rectype; + union { + struct { /* version record: */ + byte version; /* should be 1 */ + ulong locked; /* pid of process which holds a lock */ + ulong created; /* timestamp of trustdb creation */ + ulong modified; /* timestamp of last modification */ + ulong validated; /* timestamp of last validation */ + byte marginals_needed; + byte completes_needed; + byte max_cert_depth; + } ver; + struct { /* directory record */ + ulong local_id; + u32 keyid[2]; + ulong keyrec; /* recno of primary public key record */ + ulong ctlrec; /* recno of control record */ + ulong sigrec; /* recno of first signature record (osolete) */ + ulong uidrec; /* recno of first user-id record */ + ulong link; /* to next dir record */ + byte no_sigs; /* does not have sigature and checked */ + } dir; + struct { /* primary public key record */ + ulong owner; + u32 keyid[2]; + byte pubkey_algo; + byte fingerprint_len; + byte fingerprint[20]; + byte ownertrust; + } key; + struct { /* user id reord */ + ulong owner; /* point back to the directory record */ + ulong chain; /* points to next user id record */ + byte subtype; /* must be 0 */ + byte namehash[20]; /* ripemd hash of the username */ + byte ownertrust; + u32 prefrec; /* recno of reference record */ + } uid; + struct { /* control record */ + ulong owner; + byte blockhash[20]; + byte trustlevel; /* calculated trustlevel */ + } ctl; + struct { /* signature record */ + ulong owner; /* local_id of record owner (pubkey record) */ + ulong chain; /* offset of next record or NULL for last one */ + struct { + ulong local_id; /* of pubkey record of signator (0=unused) */ + byte flag; /* reserved */ + } sig[SIGS_PER_RECORD]; + } sig; + struct { + ulong item[ITEMS_PER_HTBL_RECORD]; + } htbl; + struct { + ulong chain; + struct { + byte hash; + ulong rnum; + } item[ITEMS_PER_HLST_RECORD]; + } hlst; + } r; +}; +typedef struct trust_record TRUSTREC; + +typedef struct { + ulong local_id; /* localid of the pubkey */ + ulong sigrec; + ulong sig_id; /* returned signature id */ + unsigned sig_flag; /* returned signature record flag */ + struct { /* internal data */ + int init_done; + int eof; + TRUSTREC rec; + int index; + } ctl; +} SIGREC_CONTEXT; + + +/*-- tdbio.c --*/ +int tdbio_set_dbname( const char *new_dbname, int create ); +const char *tdbio_get_dbname(void); +void tdbio_dump_record( ulong rnum, TRUSTREC *rec, FILE *fp ); +int tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected ); +int tdbio_write_record( ulong recnum, TRUSTREC *rec ); +ulong tdbio_new_recnum(void); +int tdbio_search_record( PKT_public_key *pk, TRUSTREC *rec ); + + +#define buftoulong( p ) ((*(byte*)(p) << 24) | (*((byte*)(p)+1)<< 16) | \ + (*((byte*)(p)+2) << 8) | (*((byte*)(p)+3))) +#define buftoushort( p ) ((*((byte*)(p)) << 8) | (*((byte*)(p)+1))) +#define ulongtobuf( p, a ) do { \ + ((byte*)p)[0] = a >> 24; \ + ((byte*)p)[1] = a >> 16; \ + ((byte*)p)[2] = a >> 8; \ + ((byte*)p)[3] = a ; \ + } while(0) +#define ushorttobuf( p, a ) do { \ + ((byte*)p)[0] = a >> 8; \ + ((byte*)p)[1] = a ; \ + } while(0) +#define buftou32( p) buftoulong( (p) ) +#define u32tobuf( p, a) ulongtobuf( (p), (a) ) + + + +#endif /*G10_TDBIO_H*/ |