[pacman-dev,05/23] doc: document signatures

Message ID 20201207221956.667322-6-morganamilo@archlinux.org
State Accepted, archived
Headers show
Series Docs Docs Docs 2: electric boogaloo | expand

Commit Message

morganamilo Dec. 7, 2020, 10:19 p.m. UTC
---
 lib/libalpm/alpm.h | 282 +++++++++++++++++++++++++++------------------
 1 file changed, 167 insertions(+), 115 deletions(-)

Patch

diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 178c8f6a..43a47d54 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -265,7 +265,7 @@  alpm_handle_t *alpm_initialize(const char *root, const char *dbpath,
  * This should be the last alpm call you make.
  * After this returns, handle should be considered invalid and cannot be reused
  * in any way.
- * @param myhandle the context handle
+ * @param handle the context handle
  * @return 0 on success, -1 on error
  */
 int alpm_release(alpm_handle_t *handle);
@@ -275,6 +275,172 @@  int alpm_release(alpm_handle_t *handle);
 
 typedef int64_t alpm_time_t;
 
+/** @addtogroup alpm_sig Signature checking
+ * @brief Functions to check signatures
+ * @{
+ */
+
+/** PGP signature verification options */
+typedef enum _alpm_siglevel_t {
+	/** Packages require a signature */
+	ALPM_SIG_PACKAGE = (1 << 0),
+	/** Packages do not require a signature,
+	 * but check packages that do have signatures */
+	ALPM_SIG_PACKAGE_OPTIONAL = (1 << 1),
+	/* Allow packages with signatures that are marginal trust */
+	ALPM_SIG_PACKAGE_MARGINAL_OK = (1 << 2),
+	/** Allow packages with signatues that are unknown trust */
+	ALPM_SIG_PACKAGE_UNKNOWN_OK = (1 << 3),
+
+	/** Databases require a signature */
+	ALPM_SIG_DATABASE = (1 << 10),
+	/** Databases do not require a signature,
+	 * but check databases that do have signatures */
+	ALPM_SIG_DATABASE_OPTIONAL = (1 << 11),
+	/** Allow databases with signatures that are marginal trust */
+	ALPM_SIG_DATABASE_MARGINAL_OK = (1 << 12),
+	/** Allow databases with signatues that are unknown trust */
+	ALPM_SIG_DATABASE_UNKNOWN_OK = (1 << 13),
+
+	/** The Default siglevel */
+	ALPM_SIG_USE_DEFAULT = (1 << 30)
+} alpm_siglevel_t;
+
+/** PGP signature verification status return codes */
+typedef enum _alpm_sigstatus_t {
+	/** Signature is valid */
+	ALPM_SIGSTATUS_VALID,
+	/** The key has expired */
+	ALPM_SIGSTATUS_KEY_EXPIRED,
+	/** The signature has expired */
+	ALPM_SIGSTATUS_SIG_EXPIRED,
+	/** The key is not in the keyring */
+	ALPM_SIGSTATUS_KEY_UNKNOWN,
+	/** The key has been disabled */
+	ALPM_SIGSTATUS_KEY_DISABLED,
+	/** The signature is invalid */
+	ALPM_SIGSTATUS_INVALID
+} alpm_sigstatus_t;
+
+
+/** The trust level of a PGP key */
+typedef enum _alpm_sigvalidity_t {
+	/** The signature is fully trusted */
+	ALPM_SIGVALIDITY_FULL,
+	/** The signature is marginally trusted */
+	ALPM_SIGVALIDITY_MARGINAL,
+	/** The signature is never trusted */
+	ALPM_SIGVALIDITY_NEVER,
+	/** The signature has unknown trust */
+	ALPM_SIGVALIDITY_UNKNOWN
+} alpm_sigvalidity_t;
+
+/** A PGP key */
+typedef struct _alpm_pgpkey_t {
+	/** The actual key data */
+	void *data;
+	/** The key's fingerprint */
+	char *fingerprint;
+	/** UID of the key */
+	char *uid;
+	/** Name of the key's owner */
+	char *name;
+	/** Email of the key's owner */
+	char *email;
+	/** When the key was created */
+	alpm_time_t created;
+	/** When the key expires */
+	alpm_time_t expires;
+	/** The length of the key */
+	unsigned int length;
+	/** has the key been revoked */
+	unsigned int revoked;
+	/** A character representing the  encryption algorithm used by the public key
+	 *
+	 * ? = unknown
+	 * R = RSA
+	 * D = DSA
+	 * E = EDDSA
+	 */
+	char pubkey_algo;
+} alpm_pgpkey_t;
+
+/**
+ * Signature result. Contains the key, status, and validity of a given
+ * signature.
+ */
+typedef struct _alpm_sigresult_t {
+	/** The key of the signature */
+	alpm_pgpkey_t key;
+	/** The status of the signature */
+	alpm_sigstatus_t status;
+	/** The validity of the signature */
+	alpm_sigvalidity_t validity;
+} alpm_sigresult_t;
+
+/**
+ * Signature list. Contains the number of signatures found and a pointer to an
+ * array of results. The array is of size count.
+ */
+typedef struct _alpm_siglist_t {
+	/** The amount of results in the array */
+	size_t count;
+	/** An array of sigresults */
+	alpm_sigresult_t *results;
+} alpm_siglist_t;
+
+/**
+ * Check the PGP signature for the given package file.
+ * @param pkg the package to check
+ * @param siglist a pointer to storage for signature results
+ * @return a int value : 0 (valid), 1 (invalid), -1 (an error occurred)
+ */
+int alpm_pkg_check_pgp_signature(alpm_pkg_t *pkg, alpm_siglist_t *siglist);
+
+/**
+ * Check the PGP signature for the given database.
+ * @param db the database to check
+ * @param siglist a pointer to storage for signature results
+ * @return a int value : 0 (valid), 1 (invalid), -1 (an error occurred)
+ */
+int alpm_db_check_pgp_signature(alpm_db_t *db, alpm_siglist_t *siglist);
+
+/**
+ * Clean up and free a signature result list.
+ * Note that this does not free the siglist object itself in case that
+ * was allocated on the stack; this is the responsibility of the caller.
+ * @param siglist a pointer to storage for signature results
+ * @return 0 on success, -1 on error
+ */
+int alpm_siglist_cleanup(alpm_siglist_t *siglist);
+
+/**
+ * Decode a loaded signature in base64 form.
+ * @param base64_data the signature to attempt to decode
+ * @param data the decoded data; must be freed by the caller
+ * @param data_len the length of the returned data
+ * @return 0 on success, -1 on failure to properly decode
+ */
+int alpm_decode_signature(const char *base64_data,
+		unsigned char **data, size_t *data_len);
+
+/**
+ * Extract the Issuer Key ID from a signature
+ * @param handle the context handle
+ * @param identifier the identifier of the key.
+ * This may be the name of the package or the path to the package.
+ * @param sig PGP signature
+ * @param len length of signature
+ * @param keys a pointer to storage for key IDs
+ * @return 0 on success, -1 on error
+ */
+int alpm_extract_keyid(alpm_handle_t *handle, const char *identifier,
+		const unsigned char *sig, const size_t len, alpm_list_t **keys);
+
+/* End of alpm_sig */
+/** @} */
+
+
 /*
  * Enumerations
  * These ones are used in multiple contexts, so are forward-declared.
@@ -330,39 +496,6 @@  typedef enum _alpm_fileconflicttype_t {
 	ALPM_FILECONFLICT_FILESYSTEM
 } alpm_fileconflicttype_t;
 
-/** PGP signature verification options */
-typedef enum _alpm_siglevel_t {
-	ALPM_SIG_PACKAGE = (1 << 0),
-	ALPM_SIG_PACKAGE_OPTIONAL = (1 << 1),
-	ALPM_SIG_PACKAGE_MARGINAL_OK = (1 << 2),
-	ALPM_SIG_PACKAGE_UNKNOWN_OK = (1 << 3),
-
-	ALPM_SIG_DATABASE = (1 << 10),
-	ALPM_SIG_DATABASE_OPTIONAL = (1 << 11),
-	ALPM_SIG_DATABASE_MARGINAL_OK = (1 << 12),
-	ALPM_SIG_DATABASE_UNKNOWN_OK = (1 << 13),
-
-	ALPM_SIG_USE_DEFAULT = (1 << 30)
-} alpm_siglevel_t;
-
-/** PGP signature verification status return codes */
-typedef enum _alpm_sigstatus_t {
-	ALPM_SIGSTATUS_VALID,
-	ALPM_SIGSTATUS_KEY_EXPIRED,
-	ALPM_SIGSTATUS_SIG_EXPIRED,
-	ALPM_SIGSTATUS_KEY_UNKNOWN,
-	ALPM_SIGSTATUS_KEY_DISABLED,
-	ALPM_SIGSTATUS_INVALID
-} alpm_sigstatus_t;
-
-/** PGP signature verification status return codes */
-typedef enum _alpm_sigvalidity_t {
-	ALPM_SIGVALIDITY_FULL,
-	ALPM_SIGVALIDITY_MARGINAL,
-	ALPM_SIGVALIDITY_NEVER,
-	ALPM_SIGVALIDITY_UNKNOWN
-} alpm_sigvalidity_t;
-
 /*
  * Structures
  */
@@ -428,39 +561,6 @@  typedef struct _alpm_backup_t {
 	char *hash;
 } alpm_backup_t;
 
-typedef struct _alpm_pgpkey_t {
-	void *data;
-	char *fingerprint;
-	char *uid;
-	char *name;
-	char *email;
-	alpm_time_t created;
-	alpm_time_t expires;
-	unsigned int length;
-	unsigned int revoked;
-	char pubkey_algo;
-} alpm_pgpkey_t;
-
-/**
- * Signature result. Contains the key, status, and validity of a given
- * signature.
- */
-typedef struct _alpm_sigresult_t {
-	alpm_pgpkey_t key;
-	alpm_sigstatus_t status;
-	alpm_sigvalidity_t validity;
-} alpm_sigresult_t;
-
-/**
- * Signature list. Contains the number of signatures found and a pointer to an
- * array of results. The array is of size count.
- */
-typedef struct _alpm_siglist_t {
-	size_t count;
-	alpm_sigresult_t *results;
-} alpm_siglist_t;
-
-
 /*
  * Hooks
  */
@@ -1653,54 +1753,6 @@  int alpm_pkg_set_reason(alpm_pkg_t *pkg, alpm_pkgreason_t reason);
  */
 alpm_file_t *alpm_filelist_contains(alpm_filelist_t *filelist, const char *path);
 
-/*
- * Signatures
- */
-
-/**
- * Check the PGP signature for the given package file.
- * @param pkg the package to check
- * @param siglist a pointer to storage for signature results
- * @return a int value : 0 (valid), 1 (invalid), -1 (an error occurred)
- */
-int alpm_pkg_check_pgp_signature(alpm_pkg_t *pkg, alpm_siglist_t *siglist);
-
-/**
- * Check the PGP signature for the given database.
- * @param db the database to check
- * @param siglist a pointer to storage for signature results
- * @return a int value : 0 (valid), 1 (invalid), -1 (an error occurred)
- */
-int alpm_db_check_pgp_signature(alpm_db_t *db, alpm_siglist_t *siglist);
-
-/**
- * Clean up and free a signature result list.
- * Note that this does not free the siglist object itself in case that
- * was allocated on the stack; this is the responsibility of the caller.
- * @param siglist a pointer to storage for signature results
- * @return 0 on success, -1 on error
- */
-int alpm_siglist_cleanup(alpm_siglist_t *siglist);
-
-/**
- * Decode a loaded signature in base64 form.
- * @param base64_data the signature to attempt to decode
- * @param data the decoded data; must be freed by the caller
- * @param data_len the length of the returned data
- * @return 0 on success, -1 on failure to properly decode
- */
-int alpm_decode_signature(const char *base64_data,
-		unsigned char **data, size_t *data_len);
-
-/**
- * Extract the Issuer Key ID from a signature
- * @param sig PGP signature
- * @param len length of signature
- * @param keys a pointer to storage for key IDs
- * @return 0 on success, -1 on error
- */
-int alpm_extract_keyid(alpm_handle_t *handle, const char *identifier,
-		const unsigned char *sig, const size_t len, alpm_list_t **keys);
 
 /*
  * Groups