3 * @brief Routines to store and fetch keys.
5 * Copyright 2002-2004 Jonathan McDowell <noodles@earth.li>
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; version 2 of the License.
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc., 51
18 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 #include "keystructs.h"
30 * @brief All of the functions a DB backend exports.
34 * @brief Initialize the key database.
35 * @param readonly If we'll only be reading the DB, not writing to it.
37 * This function should be called before any of the other functions in
38 * this file are called in order to allow the DB to be initialized ready
41 void (*initdb)(bool readonly);
44 * @brief De-initialize the key database.
46 * This function should be called upon program exit to allow the DB to
47 * cleanup after itself.
49 void (*cleanupdb)(void);
52 * @brief Start a transaction.
54 * Start a transaction. Intended to be used if we're about to perform many
55 * operations on the database to help speed it all up, or if we want
56 * something to only succeed if all relevant operations are successful.
58 bool (*starttrans)(void);
61 * @brief End a transaction.
65 void (*endtrans)(void);
68 * @brief Given a keyid fetch the key from storage.
69 * @param keyid The keyid to fetch.
70 * @param publickey A pointer to a structure to return the key in.
71 * @param intrans If we're already in a transaction.
73 * This function returns a public key from whatever storage mechanism we
76 * TODO: What about keyid collisions? Should we use fingerprint instead?
78 int (*fetch_key_id)(uint64_t keyid,
79 struct openpgp_publickey **publickey,
83 * @brief Given a fingerprint fetch the key from storage.
84 * @param fp The fingerprint to fetch.
85 * @param fpsize Number of bytes in the fingerprint (16 for v3, 20 for v4)
86 * @param publickey A pointer to a structure to return the key in.
87 * @param intrans If we're already in a transaction.
89 * This function returns a public key from whatever storage mechanism we
92 int (*fetch_key_fp)(uint8_t *fp,
94 struct openpgp_publickey **publickey,
98 * @brief Takes a key and stores it.
99 * @param publickey A pointer to the public key to store.
100 * @param intrans If we're already in a transaction.
101 * @param update If true the key exists and should be updated.
103 * This function stores a public key in whatever storage mechanism we are
104 * using. intrans indicates if we're already in a transaction so don't
105 * need to start one. update indicates if the key already exists and is
106 * just being updated.
108 * TODO: Do we store multiple keys of the same id? Or only one and replace it?
110 int (*store_key)(struct openpgp_publickey *publickey, bool intrans,
114 * @brief Given a keyid delete the key from storage.
115 * @param keyid The keyid to delete.
116 * @param intrans If we're already in a transaction.
118 * This function deletes a public key from whatever storage mechanism we
119 * are using. Returns 0 if the key existed.
121 int (*delete_key)(uint64_t keyid, bool intrans);
124 * @brief Trys to find the keys that contain the supplied text.
125 * @param search The text to search for.
126 * @param publickey A pointer to a structure to return the key in.
128 * This function searches for the supplied text and returns the keys that
131 int (*fetch_key_text)(const char *search,
132 struct openpgp_publickey **publickey);
135 * @brief Tries to find the keys from an SKS hash
136 * @param hash The hash to search for.
137 * @param publickey A pointer to a structure to return the key in.
139 * This function looks for the key that is referenced by the supplied
140 * SKS hash and returns it.
142 int (*fetch_key_skshash)(const struct skshash *hash,
143 struct openpgp_publickey **publickey);
146 * @brief Takes a list of public keys and updates them in the DB.
147 * @param keys The keys to update in the DB.
148 * @param sendsync If we should send a keysync mail.
150 * Takes a list of keys and adds them to the database, merging them with
151 * the key in the database if it's already present there. The key list is
152 * update to contain the minimum set of updates required to get from what
153 * we had before to what we have now (ie the set of data that was added to
154 * the DB). Returns the number of entirely new keys added.
156 * If sendsync is true then we send out a keysync mail to our sync peers
159 int (*update_keys)(struct openpgp_publickey **keys, bool sendsync);
162 * @brief Takes a keyid and returns the primary UID for it.
163 * @param keyid The keyid to lookup.
165 * This function returns a UID for the given key. Returns NULL if the key
168 char * (*keyid2uid)(uint64_t keyid);
171 * @brief Gets a linked list of the signatures on a key.
172 * @param keyid The keyid to get the sigs for.
173 * @param revoked Is the key revoked?
175 * This function gets the list of signatures on a key. Used for key
176 * indexing and doing stats bits. If revoked is non-NULL then if the key
177 * is revoked it's set to true.
179 struct ll * (*getkeysigs)(uint64_t keyid, bool *revoked);
182 * @brief Gets the signatures on a key.
183 * @param keyid The key we want the signatures for.
185 * This function gets the signatures on a key. It's the same as the
186 * getkeysigs function above except we use the hash module to cache the
188 struct ll * (*cached_getkeysigs)(uint64_t keyid);
191 * @brief Maps a 32 bit key id to a 64 bit one.
192 * @param keyid The 32 bit keyid.
194 * This function maps a 32 bit key id to the full 64 bit one. It returns the
195 * full keyid. If the key isn't found a keyid of 0 is returned.
197 uint64_t (*getfullkeyid)(uint64_t keyid);
200 * @brief call a function once for each key in the db.
201 * @param iterfunc The function to call.
202 * @param ctx A context pointer
204 * Calls iterfunc once for each key in the database. ctx is passed
205 * unaltered to iterfunc. This function is intended to aid database dumps
206 * and statistic calculations.
208 * Returns the number of keys we iterated over.
210 int (*iterate_keys)(void (*iterfunc)(void *ctx,
211 struct openpgp_publickey *key), void *ctx);
214 #endif /* __KEYDB_H__ */