diff options
Diffstat (limited to 'g10/keydb.h')
-rw-r--r-- | g10/keydb.h | 342 |
1 files changed, 336 insertions, 6 deletions
diff --git a/g10/keydb.h b/g10/keydb.h index 67af5fbeb..680af1c61 100644 --- a/g10/keydb.h +++ b/g10/keydb.h @@ -70,7 +70,7 @@ enum resource_type { /**************** - * A data structre to hold information about the external position + * A data structure to hold information about the external position * of a keyblock. */ struct keyblock_pos_struct { @@ -398,50 +398,380 @@ char *gpg_format_keydesc (PKT_public_key *pk, int mode, int escaped); /*-- getkey.c --*/ + +/* Cache a copy of a public key in the public key cache. PK is not + cached if caching is disabled (via getkey_disable_caches), if + PK->FLAGS.DONT_CACHE is set, we don't know how to derive a key id + from the public key (e.g., unsupported algorithm), or a key with + the key id is already in the cache. + + The public key packet is copied into the cache using + copy_public_key. Thus, any secret parts are not copied, for + instance. + + This cache is filled by get_pubkey and is read by get_pubkey and + get_pubkey_fast. */ void cache_public_key( PKT_public_key *pk ); + +/* Disable and drop the public key cache (which is filled by + cache_public_key and get_pubkey). Note: there is currently no way + to reenable this cache. */ void getkey_disable_caches(void); + +/* Return the public key with the key id KEYID and store it in *PK. + The resources in *PK should be released using + release_public_key_parts(). This function also stores a copy of + the public key in the user id cache (see cache_public_key). + + If PK is NULL, this function just stores the public key in the + cache and returns the usual return code. + + PK->REQ_USAGE (which is a mask of PUBKEY_USAGE_SIG, + PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT) is passed through to the + lookup function. If this is non-zero, only keys with the specified + usage will be returned. As such, it is essential that + PK->REQ_USAGE be correctly initialized! + + Returns 0 on success, GPG_ERR_NO_PUBKEY if there is no public key + with the specified key id, or another error code if an error + occurs. + + If the data was not read from the cache, then the self-signed data + has definately been merged into the public key using + merge_selfsigs. */ int get_pubkey( PKT_public_key *pk, u32 *keyid ); + +/* Similar to get_pubkey, but it does not take PK->REQ_USAGE into + account nor does it merge in the self-signed data. This function + also only considers primary keys. It is intended to be used as a + quick check of the key to avoid recursion. It should only be used + in very certain cases. Like get_pubkey and unlike any of the other + lookup functions, this function also consults the user id cache + (see cache_public_key). + + Return the public key in *PK. The resources in *PK should be + released using release_public_key_parts(). */ int get_pubkey_fast ( PKT_public_key *pk, u32 *keyid ); + +/* Return the key block for the key with key id KEYID or NULL, if an + error occurs. Use release_kbnode() to release the key block. + + The self-signed data has already been merged into the public key + using merge_selfsigs. */ KBNODE get_pubkeyblock( u32 *keyid ); + +/* Find a public key identified by the name NAME. + + If name appears to be a valid valid RFC822 mailbox (i.e., email + address) and auto key lookup is enabled (no_akl == 0), then the + specified auto key lookup methods (--auto-key-lookup) are used to + import the key into the local keyring. Otherwise, just the local + keyring is consulted. + + + If RETCTX is not NULL, then the constructed context is returned in + *RETCTX so that getpubkey_next can be used to get subsequent + results. In this case, getkey_end() must be used to free the + search context. If RETCTX is not NULL, then RET_KDBHD must be + NULL. + + If PK is not NULL, the public key of the first result is returned + in *PK. Note: PK->REQ_USAGE must be valid!!! PK->REQ_USAGE is + passed through to the lookup function and is a mask of + PUBKEY_USAGE_SIG, PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT. If this + is non-zero, only keys with the specified usage will be returned. + Note: The self-signed data has already been merged into the public + key using merge_selfsigs. Free *PK by calling + release_public_key_parts (or, if PK was allocated using xfree, you + can use free_public_key, which calls release_public_key_parts(PK) + and then xfree(PK)). + + NAME is a string, which is turned into a search query using + classify_user_id. + + If RET_KEYBLOCK is not NULL, the keyblock is returned in + *RET_KEYBLOCK. This should be freed using release_kbnode(). + + If RET_KDBHD is not NULL, then the new database handle used to + conduct the search is returned in *RET_KDBHD. This can be used to + get subsequent results using keydb_search_next or to modify the + returned record. Note: in this case, no advanced filtering is done + for subsequent results (e.g., PK->REQ_USAGE is not respected). + Unlike RETCTX, this is always returned. + + If INCLUDE_UNUSABLE is set, then unusable keys (see the + documentation for skip_unusable for an exact definition) are + skipped unless they are looked up by key id or by fingerprint. + + If NO_AKL is set, then the auto key locate functionality is + disabled and only the local key ring is considered. Note: the + local key ring is consulted even if local is not in the + --auto-key-locate option list! + + This function returns 0 on success. Otherwise, an error code is + returned. In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY + (if want_secret is set) is returned if the key is not found. */ int get_pubkey_byname (ctrl_t ctrl, - GETKEY_CTX *rx, PKT_public_key *pk, const char *name, + GETKEY_CTX *retctx, PKT_public_key *pk, + const char *name, KBNODE *ret_keyblock, KEYDB_HANDLE *ret_kdbhd, int include_unusable, int no_akl ); + +/* Return the public key with the key id KEYID and store it in *PK. + The resources should be released using release_public_key_parts(). + + Unlike other lookup functions, PK may not be NULL. PK->REQ_USAGE + is passed through to the lookup function and is a mask of + PUBKEY_USAGE_SIG, PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT. Thus, it + must be valid! If this is non-zero, only keys with the specified + usage will be returned. + + Returns 0 on success. If a public key with the specified key id is + not found or a secret key is not available for that public key, an + error code is returned. Note: this function ignores legacy keys. + An error code is also return if an error occurs. + + The self-signed data has already been merged into the public key + using merge_selfsigs. */ gpg_error_t get_seckey (PKT_public_key *pk, u32 *keyid); + +/* Lookup a key with the specified fingerprint. + + If PK is not NULL, the public key of the first result is returned + in *PK. Note: this function does an exact search and thus the + returned public key may be a subkey rather than the primary key. + Note: The self-signed data has already been merged into the public + key using merge_selfsigs. Free *PK by calling + release_public_key_parts (or, if PK was allocated using xfree, you + can use free_public_key, which calls release_public_key_parts(PK) + and then xfree(PK)). + + If PK->REQ_USAGE is set, it is used to filter the search results. + (Thus, if PK is not NULL, PK->REQ_USAGE must be valid!!!) See the + documentation for finish_lookup to understand exactly how this is + used. + + If R_KEYBLOCK is not NULL, then the first result's keyblock is + returned in *R_KEYBLOCK. This should be freed using + release_kbnode(). + + FPRINT is a byte array whose contents is the fingerprint to use as + the search term. FPRINT_LEN specifies the length of the + fingerprint (in bytes). Currently, only 16 and 20-byte + fingerprints are supported. */ int get_pubkey_byfprint (PKT_public_key *pk, kbnode_t *r_keyblock, const byte *fprint, size_t fprint_len); + +/* This function is similar to get_pubkey_byfprint, but it doesn't + merge the self-signed data into the public key and subkeys or into + the user ids. It also doesn't add the key to the user id cache. + Further, this function ignores PK->REQ_USAGE. + + This function is intended to avoid recursion and, as such, should + only be used in very specific situations. + + Like get_pubkey_byfprint, PK may be NULL. In that case, this + function effectively just checks for the existence of the key. */ int get_pubkey_byfprint_fast (PKT_public_key *pk, const byte *fprint, size_t fprint_len); /* Return whether a secret key is available for the public key with - key id KEYID. Note: this is just a fast check and does not tell us - whether the secret key is valid; this check merely indicates - whether there is some secret key with the specified key id. */ + key id KEYID. This function ignores legacy keys. Note: this is + just a fast check and does not tell us whether the secret key is + valid; this check merely indicates whether there is some secret key + with the specified key id. */ int have_secret_key_with_kid (u32 *keyid); +/* Look up a secret key. + + If PK is not NULL, the public key of the first result is returned + in *PK. Note: PK->REQ_USAGE must be valid!!! If PK->REQ_USAGE is + set, it is used to filter the search results. See the + documentation for finish_lookup to understand exactly how this is + used. Note: The self-signed data has already been merged into the + public key using merge_selfsigs. Free *PK by calling + release_public_key_parts (or, if PK was allocated using xfree, you + can use free_public_key, which calls release_public_key_parts(PK) + and then xfree(PK)). + + If --default-key was set, then the specified key is looked up. (In + this case, the default key is returned even if it is considered + unusable. See the documentation for skip_unusable for exactly what + this means.) + + Otherwise, this initiates a DB scan that returns all keys that are + usable (see previous paragraph for exactly what usable means) and + for which a secret key is available. + + This function returns the first match. Additional results can be + returned using getkey_next. */ gpg_error_t get_seckey_default (PKT_public_key *pk); +/* Search for keys matching some criteria. + + If RETCTX is not NULL, then the constructed context is returned in + *RETCTX so that getpubkey_next can be used to get subsequent + results. In this case, getkey_end() must be used to free the + search context. If RETCTX is not NULL, then RET_KDBHD must be + NULL. + + If PK is not NULL, the public key of the first result is returned + in *PK. Note: PK->REQ_USAGE must be valid!!! If PK->REQ_USAGE is + set, it is used to filter the search results. See the + documentation for finish_lookup to understand exactly how this is + used. Note: The self-signed data has already been merged into the + public key using merge_selfsigs. Free *PK by calling + release_public_key_parts (or, if PK was allocated using xfree, you + can use free_public_key, which calls release_public_key_parts(PK) + and then xfree(PK)). + + If NAMES is not NULL, then a search query is constructed using + classify_user_id on each of the strings in the list. (Recall: the + database does an OR of the terms, not an AND.) If NAMES is + NULL, then all results are returned. + + If WANT_SECRET is set, then only keys with an available secret key + (either locally or via key registered on a smartcard) are returned. + + This function does not skip unusable keys (see the documentation + for skip_unusable for an exact definition). + + If RET_KEYBLOCK is not NULL, the keyblock is returned in + *RET_KEYBLOCK. This should be freed using release_kbnode(). + + This function returns 0 on success. Otherwise, an error code is + returned. In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY + (if want_secret is set) is returned if the key is not found. */ gpg_error_t getkey_bynames (getkey_ctx_t *retctx, PKT_public_key *pk, strlist_t names, int want_secret, kbnode_t *ret_keyblock); + +/* Search for keys matching some criteria. + + If RETCTX is not NULL, then the constructed context is returned in + *RETCTX so that getpubkey_next can be used to get subsequent + results. In this case, getkey_end() must be used to free the + search context. If RETCTX is not NULL, then RET_KDBHD must be + NULL. + + If PK is not NULL, the public key of the first result is returned + in *PK. Note: PK->REQ_USAGE must be valid!!! If PK->REQ_USAGE is + set, it is used to filter the search results. See the + documentation for finish_lookup to understand exactly how this is + used. Note: The self-signed data has already been merged into the + public key using merge_selfsigs. Free *PK by calling + release_public_key_parts (or, if PK was allocated using xfree, you + can use free_public_key, which calls release_public_key_parts(PK) + and then xfree(PK)). + + If NAME is not NULL, then a search query is constructed using + classify_user_id on the string. In this case, even unusable keys + (see the documentation for skip_unusable for an exact definition of + unusable) are returned. Otherwise, if --default-key was set, then + that key is returned (even if it is unusable). If neither of these + conditions holds, then the first usable key is returned. + + If WANT_SECRET is set, then only keys with an available secret key + (either locally or via key registered on a smartcard) are returned. + + This function does not skip unusable keys (see the documentation + for skip_unusable for an exact definition). + + If RET_KEYBLOCK is not NULL, the keyblock is returned in + *RET_KEYBLOCK. This should be freed using release_kbnode(). + + This function returns 0 on success. Otherwise, an error code is + returned. In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY + (if want_secret is set) is returned if the key is not found. + + FIXME: We also have the get_pubkey_byname function which has a + different semantic. Should be merged with this one. */ gpg_error_t getkey_byname (getkey_ctx_t *retctx, PKT_public_key *pk, const char *name, int want_secret, kbnode_t *ret_keyblock); + +/* Return the next search result. + + If PK is not NULL, the public key of the next result is returned in + *PK. Note: The self-signed data has already been merged into the + public key using merge_selfsigs. Free *PK by calling + release_public_key_parts (or, if PK was allocated using xfree, you + can use free_public_key, which calls release_public_key_parts(PK) + and then xfree(PK)). + + The self-signed data has already been merged into the public key + using merge_selfsigs. */ gpg_error_t getkey_next (getkey_ctx_t ctx, PKT_public_key *pk, kbnode_t *ret_keyblock); + +/* Release any resources used by a key listing content. This must be + called on the context returned by, e.g., getkey_byname. */ void getkey_end (getkey_ctx_t ctx); +/* Return the database handle used by this context. The context still + owns the handle. */ +KEYDB_HANDLE get_ctx_handle(GETKEY_CTX ctx); + +/* Enumerate some secret keys (specifically, those specified with + --default-key and --try-secret-key). Use the following procedure: + + 1) Initialize a void pointer to NULL + 2) Pass a reference to this pointer to this function (content) + and provide space for the secret key (sk) + 3) Call this function as long as it does not return an error (or + until you are done). The error code GPG_ERR_EOF indicates the + end of the listing. + 4) Call this function a last time with SK set to NULL, + so that can free it's context. + + In pseudo-code: + + void *ctx = NULL; + PKT_public_key *sk = xmalloc_clear (sizeof (*sk)); + gpg_error_t err; + + while ((err = enum_secret_keys (&ctx, sk))) + { + // Process SK. + + if (done) + break; + + free_public_key (sk); + sk = xmalloc_clear (sizeof (*sk)); + } + + // Release any resources used by CTX. + enum_secret_keys (&ctx, NULL); + free_public_key (sk); + + if (gpg_err_code (err) != GPG_ERR_EOF) + ; // An error occured. + */ gpg_error_t enum_secret_keys (void **context, PKT_public_key *pk); +/* Set the mainkey_id fields for all keys in KEYBLOCK. This is + usually done by merge_selfsigs but at some places we only need the + main_kid not a full merge. The function also guarantees that all + pk->keyids are computed. */ void setup_main_keyids (kbnode_t keyblock); + +/* KEYBLOCK corresponds to a public key block. This function merges + much of the information from the self-signed data into the public + key, public subkey and user id data structures. If you use the + high-level search API (e.g., get_pubkey) for looking up key blocks, + then you don't need to call this function. This function is + useful, however, if you change the keyblock, e.g., by adding or + removing a self-signed data packet. */ void merge_keys_and_selfsig( KBNODE keyblock ); + char*get_user_id_string_native( u32 *keyid ); char*get_long_user_id_string( u32 *keyid ); char*get_user_id( u32 *keyid, size_t *rn ); char*get_user_id_native( u32 *keyid ); char *get_user_id_byfpr (const byte *fpr, size_t *rn); char *get_user_id_byfpr_native (const byte *fpr); -KEYDB_HANDLE get_ctx_handle(GETKEY_CTX ctx); + void release_akl(void); int parse_auto_key_locate(char *options); |