doc: document signatures
Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
parent
ab431f6810
commit
5e9635317b
1 changed files with 167 additions and 115 deletions
|
@ -264,7 +264,7 @@ alpm_handle_t *alpm_initialize(const char *root, const char *dbpath,
|
||||||
* This should be the last alpm call you make.
|
* This should be the last alpm call you make.
|
||||||
* After this returns, handle should be considered invalid and cannot be reused
|
* After this returns, handle should be considered invalid and cannot be reused
|
||||||
* in any way.
|
* in any way.
|
||||||
* @param myhandle the context handle
|
* @param handle the context handle
|
||||||
* @return 0 on success, -1 on error
|
* @return 0 on success, -1 on error
|
||||||
*/
|
*/
|
||||||
int alpm_release(alpm_handle_t *handle);
|
int alpm_release(alpm_handle_t *handle);
|
||||||
|
@ -274,6 +274,172 @@ int alpm_release(alpm_handle_t *handle);
|
||||||
|
|
||||||
typedef int64_t alpm_time_t;
|
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
|
* Enumerations
|
||||||
* These ones are used in multiple contexts, so are forward-declared.
|
* These ones are used in multiple contexts, so are forward-declared.
|
||||||
|
@ -329,39 +495,6 @@ typedef enum _alpm_fileconflicttype_t {
|
||||||
ALPM_FILECONFLICT_FILESYSTEM
|
ALPM_FILECONFLICT_FILESYSTEM
|
||||||
} alpm_fileconflicttype_t;
|
} 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
|
* Structures
|
||||||
*/
|
*/
|
||||||
|
@ -427,39 +560,6 @@ typedef struct _alpm_backup_t {
|
||||||
char *hash;
|
char *hash;
|
||||||
} alpm_backup_t;
|
} 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
|
* Hooks
|
||||||
*/
|
*/
|
||||||
|
@ -1652,54 +1752,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);
|
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
|
* Groups
|
||||||
|
|
Loading…
Add table
Reference in a new issue