2 * keydb.c - Routines to store and fetch keys.
4 * Jonathan McDowell <noodles@earth.li>
6 * Copyright 2002 Project Purple
20 #include "keystructs.h"
23 #include "onak-conf.h"
27 * keydb_fetchchar - Fetches a char from a file.
29 static int keydb_fetchchar(void *fd, size_t count, unsigned char *c)
31 return !(read( *(int *) fd, c, count));
35 * keydb_putchar - Puts a char to a file.
37 static int keydb_putchar(void *fd, size_t count, unsigned char *c)
39 return !(write( *(int *) fd, c, count));
43 * initdb - Initialize the key database.
45 * This is just a no-op for flat file access.
52 * cleanupdb - De-initialize the key database.
54 * This is just a no-op for flat file access.
61 * starttrans - Start a transaction.
63 * This is just a no-op for flat file access.
71 * endtrans - End a transaction.
73 * This is just a no-op for flat file access.
81 * fetch_key - Given a keyid fetch the key from storage.
82 * @keyid: The keyid to fetch.
83 * @publickey: A pointer to a structure to return the key in.
84 * @intrans: If we're already in a transaction.
86 * We use the hex representation of the keyid as the filename to fetch the
87 * key from. The key is stored in the file as a binary OpenPGP stream of
88 * packets, so we can just use read_openpgp_stream() to read the packets
89 * in and then parse_keys() to parse the packets into a publickey
92 int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey,
95 struct openpgp_packet_list *packets = NULL;
99 snprintf(keyfile, 1023, "%s/0x%llX", config.file_dbpath,
101 fd = open(keyfile, O_RDONLY); // | O_SHLOCK);
104 read_openpgp_stream(keydb_fetchchar, &fd, &packets);
105 parse_keys(packets, publickey);
113 * store_key - Takes a key and stores it.
114 * @publickey: A pointer to the public key to store.
115 * @intrans: If we're already in a transaction.
116 * @update: If true the key exists and should be updated.
118 * Again we just use the hex representation of the keyid as the filename
119 * to store the key to. We flatten the public key to a list of OpenPGP
120 * packets and then use write_openpgp_stream() to write the stream out to
123 int store_key(struct openpgp_publickey *publickey, bool intrans, bool update)
125 struct openpgp_packet_list *packets = NULL;
126 struct openpgp_packet_list *list_end = NULL;
127 struct openpgp_publickey *next = NULL;
131 snprintf(keyfile, 1023, "%s/0x%llX", config.file_dbpath,
132 get_keyid(publickey) & 0xFFFFFFFF);
133 fd = open(keyfile, O_WRONLY | O_CREAT, 0664); // | O_EXLOCK);
136 next = publickey -> next;
137 publickey -> next = NULL;
138 flatten_publickey(publickey, &packets, &list_end);
139 publickey -> next = next;
141 write_openpgp_stream(keydb_putchar, &fd, packets);
149 * delete_key - Given a keyid delete the key from storage.
150 * @keyid: The keyid to delete.
151 * @intrans: If we're already in a transaction.
153 * This function deletes a public key from whatever storage mechanism we
154 * are using. Returns 0 if the key existed.
156 int delete_key(uint64_t keyid, bool intrans)
160 snprintf(keyfile, 1023, "%s/0x%llX", config.file_dbpath,
163 return unlink(keyfile);
167 * fetch_key_text - Trys to find the keys that contain the supplied text.
168 * @search: The text to search for.
169 * @publickey: A pointer to a structure to return the key in.
171 * This function searches for the supplied text and returns the keys that
174 * TODO: Write for flat file access. Some sort of grep?
176 int fetch_key_text(const char *search, struct openpgp_publickey **publickey)
182 * Include the basic keydb routines.
184 #define NEED_KEYID2UID 1
185 #define NEED_GETKEYSIGS 1
186 #define NEED_GETFULLKEYID 1