This appendix describes in pseudocode how the basic operations (add, get, index, delete, since) of the key server are implemented. The code itself is more complex, since it has to deal with error checking and the general overhead of C memory management.
add(keyring) ::= for key in keyring dbkey = read-entry(key-db, keyid(key)) if found then (key, newkeys) = merge-keys(dbkey, key) write-entry(key-db, keyid(key), key) for word in userids(key) keyid-list = read-entry(word-db, word) add-to-list(keyid-list, keyid(key)) write-entry(word-db, word, keyid-list) end write-entry(time-db, now, keyid(key)) allnewkeys = allnewkeys + newkeys end return(allnewkeys) delete(keyid) ::= keyid-list = search(userid) for keyid in keyid-list key = read-entry(key-db, keyid(key)) for word in userids(key) keyid-list = read-entry(word-db, word) delete-from-list(keyid-list, keyid(key)) write-entry(word-db, word, keyid-list) end delete-entry(key-db, keyid(key)) end get(userid) ::= keyid-list = search(userid) for keyid in keyid-list keyring = keyring + read-entry(key-db, keyid) end return(ascii-armor(keyring)) index(userid,verbose,fingerprint) ::= keyid-list = search(userid) for keyid in keyid-list keyring = keyring + read-entry(key-db, keyid) end return(index(keyring,verbose,fingerprint)) since(time) ::= keyid-list = read-range(time-db, from time to end) for keyid in keyid-list keyring = keyring + read-entry(key-db, keyid) end return(ascii-armor(keyring))
The above pseudocode uses a few functions whose implementation is not trivial. These are defined here.
search(userid) ::= if (is-keyid-format(userid)) return(userid) for word in userid keyid-list = read-entry(word-db, word) if (output-list is empty) output-list = keyid-list else output-list = intersect(keyid-list, output-list) fi end return(output-list)