summaryrefslogtreecommitdiff
path: root/lib/opencdk/opencdk.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/opencdk/opencdk.h')
-rw-r--r--lib/opencdk/opencdk.h963
1 files changed, 0 insertions, 963 deletions
diff --git a/lib/opencdk/opencdk.h b/lib/opencdk/opencdk.h
deleted file mode 100644
index 094a90ba47..0000000000
--- a/lib/opencdk/opencdk.h
+++ /dev/null
@@ -1,963 +0,0 @@
-/* opencdk.h - Open Crypto Development Kit (OpenCDK)
- * Copyright (C) 2001-2012 Free Software Foundation, Inc.
- *
- * Author: Timo Schulz
- *
- * This file is part of OpenCDK.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-#ifndef OPENCDK_H
-#define OPENCDK_H
-
-#include <config.h>
-#include "gnutls_int.h"
-#include <stddef.h> /* for size_t */
-#include <stdarg.h>
-#include <mem.h>
-#include <gnutls/gnutls.h>
-#include "errors.h"
-#include <hash_int.h>
-
-/* The OpenCDK version as a string. */
-#define OPENCDK_VERSION "0.6.6"
-
-/* The OpenCDK version as integer components major.minor.path */
-#define OPENCDK_VERSION_MAJOR 0
-#define OPENCDK_VERSION_MINOR 6
-#define OPENCDK_VERSION_PATCH 6
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* General contexts */
-
-/* 'Session' handle to support the various options and run-time
- information. */
- struct cdk_ctx_s;
- typedef struct cdk_ctx_s *cdk_ctx_t;
-
-/* A generic context to store list of strings. */
- struct cdk_strlist_s;
- typedef struct cdk_strlist_s *cdk_strlist_t;
-
-/* Context used to list keys of a keyring. */
- struct cdk_listkey_s;
- typedef struct cdk_listkey_s *cdk_listkey_t;
-
-/* Opaque String to Key (S2K) handle. */
- struct cdk_s2k_s;
- typedef struct cdk_s2k_s *cdk_s2k_t;
-
-/* Abstract I/O object, a stream, which is used for most operations. */
- struct cdk_stream_s;
- typedef struct cdk_stream_s *cdk_stream_t;
-
-/* Opaque handle for the user ID preferences. */
- struct cdk_prefitem_s;
- typedef struct cdk_prefitem_s *cdk_prefitem_t;
-
-/* Node to store a single key node packet. */
- struct cdk_kbnode_s;
- typedef struct cdk_kbnode_s *cdk_kbnode_t;
-
-/* Key database handle. */
- struct cdk_keydb_hd_s;
- typedef struct cdk_keydb_hd_s *cdk_keydb_hd_t;
-
- struct cdk_keydb_search_s;
- typedef struct cdk_keydb_search_s *cdk_keydb_search_t;
-
-/* Context to store a list of recipient keys. */
- struct cdk_keylist_s;
- typedef struct cdk_keylist_s *cdk_keylist_t;
-
-/* Context to encapsulate a single sub packet of a signature. */
- struct cdk_subpkt_s;
- typedef struct cdk_subpkt_s *cdk_subpkt_t;
-
-/* Context used to generate key pairs. */
- struct cdk_keygen_ctx_s;
- typedef struct cdk_keygen_ctx_s *cdk_keygen_ctx_t;
-
-/* Handle for a single designated revoker. */
- struct cdk_desig_revoker_s;
- typedef struct cdk_desig_revoker_s *cdk_desig_revoker_t;
-
-/* Alias for backward compatibility. */
- typedef bigint_t cdk_mpi_t;
-
-
-/* All valid error constants. */
- typedef enum {
- CDK_EOF = -1,
- CDK_Success = 0,
- CDK_General_Error = 1,
- CDK_File_Error = 2,
- CDK_Bad_Sig = 3,
- CDK_Inv_Packet = 4,
- CDK_Inv_Algo = 5,
- CDK_Not_Implemented = 6,
- CDK_Armor_Error = 8,
- CDK_Armor_CRC_Error = 9,
- CDK_MPI_Error = 10,
- CDK_Inv_Value = 11,
- CDK_Error_No_Key = 12,
- CDK_Chksum_Error = 13,
- CDK_Time_Conflict = 14,
- CDK_Zlib_Error = 15,
- CDK_Weak_Key = 16,
- CDK_Out_Of_Core = 17,
- CDK_Wrong_Seckey = 18,
- CDK_Bad_MDC = 19,
- CDK_Inv_Mode = 20,
- CDK_Error_No_Keyring = 21,
- CDK_Wrong_Format = 22,
- CDK_Inv_Packet_Ver = 23,
- CDK_Too_Short = 24,
- CDK_Unusable_Key = 25,
- CDK_No_Data = 26,
- CDK_No_Passphrase = 27,
- CDK_Network_Error = 28
- } cdk_error_t;
-
-
- enum cdk_control_flags {
- CDK_CTLF_SET = 0, /* Value to set an option */
- CDK_CTLF_GET = 1, /* Value to get an option */
- CDK_CTL_DIGEST = 10, /* Option to set the digest algorithm. */
- CDK_CTL_ARMOR = 12, /* Option to enable armor output. */
- CDK_CTL_COMPRESS = 13, /* Option to enable compression. */
- CDK_CTL_COMPAT = 14, /* Option to switch in compat mode. */
- CDK_CTL_OVERWRITE = 15, /* Option to enable file overwritting. */
- CDK_CTL_S2K = 16, /* Option to set S2K values. */
- CDK_CTL_FORCE_DIGEST = 19, /* Force the use of a digest algorithm. */
- CDK_CTL_BLOCKMODE_ON = 20 /* Enable partial body lengths */
- };
-
-
-/* Specifies all valid log levels. */
- enum cdk_log_level_t {
- CDK_LOG_NONE = 0, /* No log message will be shown. */
- CDK_LOG_INFO = 1,
- CDK_LOG_DEBUG = 2,
- CDK_LOG_DEBUG_PKT = 3
- };
-
-
-/* All valid compression algorithms in OpenPGP */
- enum cdk_compress_algo_t {
- CDK_COMPRESS_NONE = 0,
- CDK_COMPRESS_ZIP = 1,
- CDK_COMPRESS_ZLIB = 2,
- CDK_COMPRESS_BZIP2 = 3 /* Not supported in this version */
- };
-
-/* All valid public key algorithms valid in OpenPGP */
- enum cdk_pubkey_algo_t {
- CDK_PK_UNKNOWN = 0,
- CDK_PK_RSA = 1,
- CDK_PK_RSA_E = 2, /* RSA-E and RSA-S are deprecated use RSA instead */
- CDK_PK_RSA_S = 3, /* and use the key flags in the self signatures. */
- CDK_PK_ELG_E = 16,
- CDK_PK_DSA = 17
- };
-
-/* The valid 'String-To-Key' modes */
- enum cdk_s2k_type_t {
- CDK_S2K_SIMPLE = 0,
- CDK_S2K_SALTED = 1,
- CDK_S2K_ITERSALTED = 3,
- CDK_S2K_GNU_EXT = 101
- /* GNU extensions: refer to DETAILS from GnuPG:
- http://cvs.gnupg.org/cgi-bin/viewcvs.cgi/trunk/doc/DETAILS?root=GnuPG
- */
- };
-
-/* The different kind of user ID preferences. */
- enum cdk_pref_type_t {
- CDK_PREFTYPE_NONE = 0,
- CDK_PREFTYPE_SYM = 1, /* Symmetric ciphers */
- CDK_PREFTYPE_HASH = 2, /* Message digests */
- CDK_PREFTYPE_ZIP = 3 /* Compression algorithms */
- };
-
-
-/* All valid sub packet types. */
- enum cdk_sig_subpacket_t {
- CDK_SIGSUBPKT_NONE = 0,
- CDK_SIGSUBPKT_SIG_CREATED = 2,
- CDK_SIGSUBPKT_SIG_EXPIRE = 3,
- CDK_SIGSUBPKT_EXPORTABLE = 4,
- CDK_SIGSUBPKT_TRUST = 5,
- CDK_SIGSUBPKT_REGEXP = 6,
- CDK_SIGSUBPKT_REVOCABLE = 7,
- CDK_SIGSUBPKT_KEY_EXPIRE = 9,
- CDK_SIGSUBPKT_PREFS_SYM = 11,
- CDK_SIGSUBPKT_REV_KEY = 12,
- CDK_SIGSUBPKT_ISSUER = 16,
- CDK_SIGSUBPKT_NOTATION = 20,
- CDK_SIGSUBPKT_PREFS_HASH = 21,
- CDK_SIGSUBPKT_PREFS_ZIP = 22,
- CDK_SIGSUBPKT_KS_FLAGS = 23,
- CDK_SIGSUBPKT_PREF_KS = 24,
- CDK_SIGSUBPKT_PRIMARY_UID = 25,
- CDK_SIGSUBPKT_POLICY = 26,
- CDK_SIGSUBPKT_KEY_FLAGS = 27,
- CDK_SIGSUBPKT_SIGNERS_UID = 28,
- CDK_SIGSUBPKT_REVOC_REASON = 29,
- CDK_SIGSUBPKT_FEATURES = 30
- };
-
-
-/* All valid armor types. */
- enum cdk_armor_type_t {
- CDK_ARMOR_MESSAGE = 0,
- CDK_ARMOR_PUBKEY = 1,
- CDK_ARMOR_SECKEY = 2,
- CDK_ARMOR_SIGNATURE = 3,
- CDK_ARMOR_CLEARSIG = 4
- };
-
- enum cdk_keydb_flag_t {
- /* Valid database search modes */
- CDK_DBSEARCH_EXACT = 1, /* Exact string search */
- CDK_DBSEARCH_SUBSTR = 2, /* Sub string search */
- CDK_DBSEARCH_SHORT_KEYID = 3, /* 32-bit keyid search */
- CDK_DBSEARCH_KEYID = 4, /* 64-bit keyid search */
- CDK_DBSEARCH_FPR = 5, /* 160-bit fingerprint search */
- CDK_DBSEARCH_NEXT = 6, /* Enumerate all keys */
- CDK_DBSEARCH_AUTO = 7, /* Try to classify the string */
- /* Valid database types */
- CDK_DBTYPE_PK_KEYRING = 100, /* A file with one or more public keys */
- CDK_DBTYPE_SK_KEYRING = 101, /* A file with one or more secret keys */
- CDK_DBTYPE_DATA = 102, /* A buffer with at least one public key */
- };
-
-
-/* All valid modes for cdk_data_transform() */
- enum cdk_crypto_mode_t {
- CDK_CRYPTYPE_NONE = 0,
- CDK_CRYPTYPE_ENCRYPT = 1,
- CDK_CRYPTYPE_DECRYPT = 2,
- CDK_CRYPTYPE_SIGN = 3,
- CDK_CRYPTYPE_VERIFY = 4,
- CDK_CRYPTYPE_EXPORT = 5,
- CDK_CRYPTYPE_IMPORT = 6
- };
-
-#define CDK_KEY_USG_ENCR (CDK_KEY_USG_COMM_ENCR | CDK_KEY_USG_STORAGE_ENCR)
-#define CDK_KEY_USG_SIGN (CDK_KEY_USG_DATA_SIGN | CDK_KEY_USG_CERT_SIGN)
-/* A list of valid public key usages. */
- enum cdk_key_usage_t {
- CDK_KEY_USG_CERT_SIGN = 1,
- CDK_KEY_USG_DATA_SIGN = 2,
- CDK_KEY_USG_COMM_ENCR = 4,
- CDK_KEY_USG_STORAGE_ENCR = 8,
- CDK_KEY_USG_SPLIT_KEY = 16,
- CDK_KEY_USG_AUTH = 32,
- CDK_KEY_USG_SHARED_KEY = 128
- };
-
-
-/* Valid flags for keys. */
- enum cdk_key_flag_t {
- CDK_KEY_VALID = 0,
- CDK_KEY_INVALID = 1, /* Missing or wrong self signature */
- CDK_KEY_EXPIRED = 2, /* Key is expired. */
- CDK_KEY_REVOKED = 4, /* Key has been revoked. */
- CDK_KEY_NOSIGNER = 8
- };
-
-
-/* Trust values and flags for keys and user IDs */
- enum cdk_trust_flag_t {
- CDK_TRUST_UNKNOWN = 0,
- CDK_TRUST_EXPIRED = 1,
- CDK_TRUST_UNDEFINED = 2,
- CDK_TRUST_NEVER = 3,
- CDK_TRUST_MARGINAL = 4,
- CDK_TRUST_FULLY = 5,
- CDK_TRUST_ULTIMATE = 6,
- /* trust flags */
- CDK_TFLAG_REVOKED = 32,
- CDK_TFLAG_SUB_REVOKED = 64,
- CDK_TFLAG_DISABLED = 128
- };
-
-
-/* Signature states and the signature modes. */
- enum cdk_signature_stat_t {
- /* Signature status */
- CDK_SIGSTAT_NONE = 0,
- CDK_SIGSTAT_GOOD = 1,
- CDK_SIGSTAT_BAD = 2,
- CDK_SIGSTAT_NOKEY = 3,
- CDK_SIGSTAT_VALID = 4, /* True if made with a valid key. */
- /* FIXME: We need indicators for revoked/expires signatures. */
-
- /* Signature modes */
- CDK_SIGMODE_NORMAL = 100,
- CDK_SIGMODE_DETACHED = 101,
- CDK_SIGMODE_CLEAR = 102
- };
-
-
-/* Key flags. */
- typedef enum {
- CDK_FLAG_KEY_REVOKED = 256,
- CDK_FLAG_KEY_EXPIRED = 512,
- CDK_FLAG_SIG_EXPIRED = 1024
- } cdk_key_flags_t;
-
-
-/* Possible format for the literal data. */
- typedef enum {
- CDK_LITFMT_BINARY = 0,
- CDK_LITFMT_TEXT = 1,
- CDK_LITFMT_UNICODE = 2
- } cdk_lit_format_t;
-
-/* Valid OpenPGP packet types and their IDs */
- typedef enum {
- CDK_PKT_RESERVED = 0,
- CDK_PKT_PUBKEY_ENC = 1,
- CDK_PKT_SIGNATURE = 2,
- CDK_PKT_ONEPASS_SIG = 4,
- CDK_PKT_SECRET_KEY = 5,
- CDK_PKT_PUBLIC_KEY = 6,
- CDK_PKT_SECRET_SUBKEY = 7,
- CDK_PKT_COMPRESSED = 8,
- CDK_PKT_MARKER = 10,
- CDK_PKT_LITERAL = 11,
- CDK_PKT_RING_TRUST = 12,
- CDK_PKT_USER_ID = 13,
- CDK_PKT_PUBLIC_SUBKEY = 14,
- CDK_PKT_OLD_COMMENT = 16,
- CDK_PKT_ATTRIBUTE = 17,
- CDK_PKT_MDC = 19
- } cdk_packet_type_t;
-
-/* Define the maximal number of multiprecion integers for
- a public key. */
-#define MAX_CDK_PK_PARTS 4
-
-/* Define the maximal number of multiprecision integers for
- a signature/encrypted blob issued by a secret key. */
-#define MAX_CDK_DATA_PARTS 2
-
-
-/* Helper macro to figure out if the packet is encrypted */
-#define CDK_PKT_IS_ENCRYPTED(pkttype) (\
- ((pkttype)==CDK_PKT_ENCRYPTED_MDC) \
- || ((pkttype)==CDK_PKT_ENCRYPTED))
-
-
- struct cdk_pkt_signature_s {
- unsigned char version;
- unsigned char sig_class;
- unsigned int timestamp;
- unsigned int expiredate;
- unsigned int keyid[2];
- unsigned char pubkey_algo;
- unsigned char digest_algo;
- unsigned char digest_start[2];
- unsigned short hashed_size;
- cdk_subpkt_t hashed;
- unsigned short unhashed_size;
- cdk_subpkt_t unhashed;
- bigint_t mpi[MAX_CDK_DATA_PARTS];
- cdk_desig_revoker_t revkeys;
- struct {
- unsigned exportable:1;
- unsigned revocable:1;
- unsigned policy_url:1;
- unsigned notation:1;
- unsigned expired:1;
- unsigned checked:1;
- unsigned valid:1;
- unsigned missing_key:1;
- } flags;
- unsigned int key[2]; /* only valid for key signatures */
- };
- typedef struct cdk_pkt_signature_s *cdk_pkt_signature_t;
-
-
- struct cdk_pkt_userid_s {
- unsigned int len;
- unsigned is_primary:1;
- unsigned is_revoked:1;
- unsigned mdc_feature:1;
- cdk_prefitem_t prefs;
- size_t prefs_size;
- unsigned char *attrib_img; /* Tag 17 if not null */
- size_t attrib_len;
- cdk_pkt_signature_t selfsig;
- char *name;
- };
- typedef struct cdk_pkt_userid_s *cdk_pkt_userid_t;
-
-
- struct cdk_pkt_pubkey_s {
- unsigned char version;
- unsigned char pubkey_algo;
- unsigned char fpr[20];
- unsigned int keyid[2];
- unsigned int main_keyid[2];
- unsigned int timestamp;
- unsigned int expiredate;
- bigint_t mpi[MAX_CDK_PK_PARTS];
- unsigned is_revoked:1;
- unsigned is_invalid:1;
- unsigned has_expired:1;
- int pubkey_usage;
- cdk_pkt_userid_t uid;
- cdk_prefitem_t prefs;
- size_t prefs_size;
- cdk_desig_revoker_t revkeys;
- };
- typedef struct cdk_pkt_pubkey_s *cdk_pkt_pubkey_t;
-
-/* Alias to define a generic public key context. */
- typedef cdk_pkt_pubkey_t cdk_pubkey_t;
-
-
- struct cdk_pkt_seckey_s {
- cdk_pkt_pubkey_t pk;
- unsigned int expiredate;
- int version;
- int pubkey_algo;
- unsigned int keyid[2];
- unsigned int main_keyid[2];
- unsigned char s2k_usage;
- struct {
- unsigned char algo;
- unsigned char sha1chk; /* SHA1 is used instead of a 16 bit checksum */
- cdk_s2k_t s2k;
- unsigned char iv[16];
- unsigned char ivlen;
- } protect;
- unsigned short csum;
- bigint_t mpi[MAX_CDK_PK_PARTS];
- unsigned char *encdata;
- size_t enclen;
- unsigned char is_protected;
- unsigned is_primary:1;
- unsigned has_expired:1;
- unsigned is_revoked:1;
- };
- typedef struct cdk_pkt_seckey_s *cdk_pkt_seckey_t;
-
-/* Alias to define a generic secret key context. */
- typedef cdk_pkt_seckey_t cdk_seckey_t;
-
-
- struct cdk_pkt_onepass_sig_s {
- unsigned char version;
- unsigned int keyid[2];
- unsigned char sig_class;
- unsigned char digest_algo;
- unsigned char pubkey_algo;
- unsigned char last;
- };
- typedef struct cdk_pkt_onepass_sig_s *cdk_pkt_onepass_sig_t;
-
-
- struct cdk_pkt_pubkey_enc_s {
- unsigned char version;
- unsigned int keyid[2];
- int throw_keyid;
- unsigned char pubkey_algo;
- bigint_t mpi[MAX_CDK_DATA_PARTS];
- };
- typedef struct cdk_pkt_pubkey_enc_s *cdk_pkt_pubkey_enc_t;
-
- struct cdk_pkt_encrypted_s {
- unsigned int len;
- int extralen;
- unsigned char mdc_method;
- cdk_stream_t buf;
- };
- typedef struct cdk_pkt_encrypted_s *cdk_pkt_encrypted_t;
-
-
- struct cdk_pkt_mdc_s {
- unsigned char hash[20];
- };
- typedef struct cdk_pkt_mdc_s *cdk_pkt_mdc_t;
-
-
- struct cdk_pkt_literal_s {
- unsigned int len;
- cdk_stream_t buf;
- int mode;
- unsigned int timestamp;
- int namelen;
- char *name;
- };
- typedef struct cdk_pkt_literal_s *cdk_pkt_literal_t;
-
-
- struct cdk_pkt_compressed_s {
- unsigned int len;
- int algorithm;
- cdk_stream_t buf;
- };
- typedef struct cdk_pkt_compressed_s *cdk_pkt_compressed_t;
-
-
-/* Structure which represents a single OpenPGP packet. */
- struct cdk_packet_s {
- size_t pktlen; /* real packet length */
- size_t pktsize; /* length with all headers */
- int old_ctb; /* 1 if RFC1991 mode is used */
- cdk_packet_type_t pkttype;
- union {
- cdk_pkt_mdc_t mdc;
- cdk_pkt_userid_t user_id;
- cdk_pkt_pubkey_t public_key;
- cdk_pkt_seckey_t secret_key;
- cdk_pkt_signature_t signature;
- cdk_pkt_pubkey_enc_t pubkey_enc;
- cdk_pkt_compressed_t compressed;
- cdk_pkt_encrypted_t encrypted;
- cdk_pkt_literal_t literal;
- cdk_pkt_onepass_sig_t onepass_sig;
- } pkt;
- };
- typedef struct cdk_packet_s *cdk_packet_t;
-
-/* Allocate a new packet or a new packet with the given packet type. */
- cdk_error_t cdk_pkt_new(cdk_packet_t * r_pkt);
- cdk_error_t cdk_pkt_alloc(cdk_packet_t * r_pkt,
- cdk_packet_type_t pkttype);
-
-/* Only release the contents of the packet but not @PKT itself. */
- void cdk_pkt_free(cdk_packet_t pkt);
-
-/* Release the packet contents and the packet structure @PKT itself. */
- void cdk_pkt_release(cdk_packet_t pkt);
-
-/* Read or write the given output from or to the stream. */
- cdk_error_t cdk_pkt_read(cdk_stream_t inp, cdk_packet_t pkt, unsigned public);
- cdk_error_t cdk_pkt_write(cdk_stream_t out, cdk_packet_t pkt);
-
-/* Sub packet routines */
- cdk_subpkt_t cdk_subpkt_new(size_t size);
- void cdk_subpkt_free(cdk_subpkt_t ctx);
- cdk_subpkt_t cdk_subpkt_find(cdk_subpkt_t ctx, size_t type);
- cdk_subpkt_t cdk_subpkt_find_next(cdk_subpkt_t root, size_t type);
- size_t cdk_subpkt_type_count(cdk_subpkt_t ctx, size_t type);
- cdk_subpkt_t cdk_subpkt_find_nth(cdk_subpkt_t ctx, size_t type,
- size_t index);
- cdk_error_t cdk_subpkt_add(cdk_subpkt_t root, cdk_subpkt_t node);
- const unsigned char *cdk_subpkt_get_data(cdk_subpkt_t ctx,
- size_t * r_type,
- size_t * r_nbytes);
- void cdk_subpkt_init(cdk_subpkt_t node, size_t type,
- const void *buf, size_t buflen);
-
-/* Designated Revoker routines */
- const unsigned char *cdk_key_desig_revoker_walk(cdk_desig_revoker_t
- root,
- cdk_desig_revoker_t
- * ctx,
- int *r_class,
- int *r_algid);
-
-#define is_RSA(a) ((a) == CDK_PK_RSA \
- || (a) == CDK_PK_RSA_E \
- || (a) == CDK_PK_RSA_S)
-#define is_ELG(a) ((a) == CDK_PK_ELG_E)
-#define is_DSA(a) ((a) == CDK_PK_DSA)
-
-/* Encrypt the given session key @SK with the public key @PK
- and write the contents into the packet @PKE. */
- cdk_error_t cdk_pk_encrypt(cdk_pubkey_t pk,
- cdk_pkt_pubkey_enc_t pke, bigint_t sk);
-
-/* Decrypt the given encrypted session key in @PKE with the secret key
- @SK and store it in @R_SK. */
- cdk_error_t cdk_pk_decrypt(cdk_seckey_t sk,
- cdk_pkt_pubkey_enc_t pke,
- bigint_t * r_sk);
-
-/* Sign the given message digest @MD with the secret key @SK and
- store the signature in the packet @SIG. */
- cdk_error_t cdk_pk_sign(cdk_seckey_t sk, cdk_pkt_signature_t sig,
- const unsigned char *md);
-
-/* Verify the given signature in @SIG with the public key @PK
- and compare it against the message digest @MD. */
- cdk_error_t cdk_pk_verify(cdk_pubkey_t pk, cdk_pkt_signature_t sig,
- const unsigned char *md);
-
-/* Use cdk_pk_get_npkey() and cdk_pk_get_nskey to find out how much
- multiprecision integers a key consists of. */
-
-/* Return a multi precision integer of the public key with the index @IDX
- in the buffer @BUF. @R_NWRITTEN will contain the length in octets.
- Optional @R_NBITS may contain the size in bits. */
- cdk_error_t cdk_pk_get_mpi(cdk_pubkey_t pk, size_t idx,
- unsigned char *buf, size_t buflen,
- size_t * r_nwritten, size_t * r_nbits);
-
-/* Same as the function above but of the secret key. */
- cdk_error_t cdk_sk_get_mpi(cdk_seckey_t sk, size_t idx,
- unsigned char *buf, size_t buflen,
- size_t * r_nwritten, size_t * r_nbits);
-
-/* Helper to get the exact number of multi precision integers
- for the given object. */
- int cdk_pk_get_nbits(cdk_pubkey_t pk);
- int cdk_pk_get_npkey(int algo);
- int cdk_pk_get_nskey(int algo);
- int cdk_pk_get_nsig(int algo);
- int cdk_pk_get_nenc(int algo);
-
-/* Fingerprint and key ID routines. */
-
-/* Calculate the fingerprint of the given public key.
- the FPR parameter must be at least 20 octets to hold the SHA1 hash. */
- cdk_error_t cdk_pk_get_fingerprint(cdk_pubkey_t pk,
- unsigned char *fpr);
-
-/* Same as above, but with additional sanity checks of the buffer size. */
- cdk_error_t cdk_pk_to_fingerprint(cdk_pubkey_t pk,
- unsigned char *fpr,
- size_t fprlen, size_t * r_nout);
-
-/* Derive the keyid from the fingerprint. This is only possible for
- modern, version 4 keys. */
- unsigned int cdk_pk_fingerprint_get_keyid(const unsigned char *fpr,
- size_t fprlen,
- unsigned int *keyid);
-
-/* Various functions to get the keyid from the specific packet type. */
- unsigned int cdk_pk_get_keyid(cdk_pubkey_t pk,
- unsigned int *keyid);
- unsigned int cdk_sk_get_keyid(cdk_seckey_t sk,
- unsigned int *keyid);
- unsigned int cdk_sig_get_keyid(cdk_pkt_signature_t sig,
- unsigned int *keyid);
-
-/* Key release functions. */
- void cdk_pk_release(cdk_pubkey_t pk);
- void cdk_sk_release(cdk_seckey_t sk);
-
-/* Create a public key with the data from the secret key @SK. */
- cdk_error_t cdk_pk_from_secret_key(cdk_seckey_t sk,
- cdk_pubkey_t * ret_pk);
-
-/* Sexp conversion of keys. */
- cdk_error_t cdk_pubkey_to_sexp(cdk_pubkey_t pk, char **sexp,
- size_t * len);
- cdk_error_t cdk_seckey_to_sexp(cdk_seckey_t sk, char **sexp,
- size_t * len);
-
-
-/* String to Key routines. */
- cdk_error_t cdk_s2k_new(cdk_s2k_t * ret_s2k, int mode,
- int digest_algo,
- const unsigned char *salt);
- void cdk_s2k_free(cdk_s2k_t s2k);
-
-/* Protect the inbuf with ASCII armor of the specified type.
- If @outbuf and @outlen are NULL, the function returns the calculated
- size of the base64 encoded data in @nwritten. */
- cdk_error_t cdk_armor_encode_buffer(const unsigned char *inbuf,
- size_t inlen, char *outbuf,
- size_t outlen,
- size_t * nwritten, int type);
-
-
-/* This context contain user callbacks for different stream operations.
- Some of these callbacks might be NULL to indicate that the callback
- is not used. */
- struct cdk_stream_cbs_s {
- cdk_error_t(*open) (void *);
- cdk_error_t(*release) (void *);
- int (*read) (void *, void *buf, size_t);
- int (*write) (void *, const void *buf, size_t);
- int (*seek) (void *, off_t);
- };
- typedef struct cdk_stream_cbs_s *cdk_stream_cbs_t;
-
- int cdk_stream_is_compressed(cdk_stream_t s);
-
-/* Return a stream object which is associated to a socket. */
- cdk_error_t cdk_stream_sockopen(const char *host,
- unsigned short port,
- cdk_stream_t * ret_out);
-
-/* Return a stream object which is associated to an existing file. */
- cdk_error_t cdk_stream_open(const char *file,
- cdk_stream_t * ret_s);
-
-/* Return a stream object which is associated to a file which will
- be created when the stream is closed. */
- cdk_error_t cdk_stream_new(const char *file, cdk_stream_t * ret_s);
-
-/* Return a stream object with custom callback functions for the
- various core operations. */
- cdk_error_t cdk_stream_new_from_cbs(cdk_stream_cbs_t cbs,
- void *opa,
- cdk_stream_t * ret_s);
- cdk_error_t cdk_stream_create(const char *file,
- cdk_stream_t * ret_s);
- cdk_error_t cdk_stream_tmp_new(cdk_stream_t * r_out);
- cdk_error_t cdk_stream_tmp_from_mem(const void *buf, size_t buflen,
- cdk_stream_t * r_out);
- void cdk_stream_tmp_set_mode(cdk_stream_t s, int val);
- cdk_error_t cdk_stream_flush(cdk_stream_t s);
- cdk_error_t cdk_stream_enable_cache(cdk_stream_t s, int val);
- cdk_error_t cdk_stream_filter_disable(cdk_stream_t s, int type);
- cdk_error_t cdk_stream_close(cdk_stream_t s);
- off_t cdk_stream_get_length(cdk_stream_t s);
- int cdk_stream_read(cdk_stream_t s, void *buf, size_t count);
- int cdk_stream_write(cdk_stream_t s, const void *buf,
- size_t count);
- int cdk_stream_putc(cdk_stream_t s, int c);
- int cdk_stream_getc(cdk_stream_t s);
- int cdk_stream_eof(cdk_stream_t s);
- off_t cdk_stream_tell(cdk_stream_t s);
- cdk_error_t cdk_stream_seek(cdk_stream_t s, off_t offset);
- cdk_error_t cdk_stream_set_armor_flag(cdk_stream_t s, int type);
-
-/* Push the literal filter for the given stream. */
- cdk_error_t cdk_stream_set_literal_flag(cdk_stream_t s,
- cdk_lit_format_t mode,
- const char *fname);
-
- cdk_error_t cdk_stream_set_compress_flag(cdk_stream_t s, int algo,
- int level);
- cdk_error_t cdk_stream_set_hash_flag(cdk_stream_t s, int algo);
- cdk_error_t cdk_stream_set_text_flag(cdk_stream_t s,
- const char *lf);
- cdk_error_t cdk_stream_kick_off(cdk_stream_t inp,
- cdk_stream_t out);
- cdk_error_t cdk_stream_mmap(cdk_stream_t s,
- unsigned char **ret_buf,
- size_t * ret_buflen);
- cdk_error_t cdk_stream_mmap_part(cdk_stream_t s, off_t off,
- size_t len,
- unsigned char **ret_buf,
- size_t * ret_buflen);
-
-/* Read from the stream but restore the file pointer after reading
- the requested amount of bytes. */
- int cdk_stream_peek(cdk_stream_t inp, unsigned char *buf,
- size_t buflen);
-
-/* Create a new key db handle from a memory buffer. */
- cdk_error_t cdk_keydb_new_from_mem(cdk_keydb_hd_t * r_hd,
- int secret, int armor,
- const void *data,
- size_t datlen);
-
-/* Check that a secret key with the given key ID is available. */
- cdk_error_t cdk_keydb_check_sk(cdk_keydb_hd_t hd,
- unsigned int *keyid);
-
-/* Prepare the key db search. */
- cdk_error_t cdk_keydb_search_start(cdk_keydb_search_t * st,
- cdk_keydb_hd_t db, int type,
- void *desc);
-
- void cdk_keydb_search_release(cdk_keydb_search_t st);
-
-/* Return a key which matches a valid description given in
- cdk_keydb_search_start(). */
- cdk_error_t cdk_keydb_search(cdk_keydb_search_t st,
- cdk_keydb_hd_t hd,
- cdk_kbnode_t * ret_key);
-
-/* Release the key db handle and all its resources. */
- void cdk_keydb_free(cdk_keydb_hd_t hd);
-
-/* The following functions will try to find a key in the given key
- db handle either by keyid, by fingerprint or by some pattern. */
- cdk_error_t cdk_keydb_get_bykeyid(cdk_keydb_hd_t hd,
- unsigned int *keyid,
- cdk_kbnode_t * ret_pk);
- cdk_error_t cdk_keydb_get_byfpr(cdk_keydb_hd_t hd,
- const unsigned char *fpr,
- cdk_kbnode_t * ret_pk);
- cdk_error_t cdk_keydb_get_bypattern(cdk_keydb_hd_t hd,
- const char *patt,
- cdk_kbnode_t * ret_pk);
-
-/* These function, in contrast to most other key db functions, only
- return the public or secret key packet without the additional
- signatures and user IDs. */
- cdk_error_t cdk_keydb_get_pk(cdk_keydb_hd_t khd,
- unsigned int *keyid,
- cdk_pubkey_t * ret_pk);
- cdk_error_t cdk_keydb_get_sk(cdk_keydb_hd_t khd,
- unsigned int *keyid,
- cdk_seckey_t * ret_sk);
-
-/* Try to read the next key block from the given input stream.
- The key will be returned in @RET_KEY on success. */
- cdk_error_t cdk_keydb_get_keyblock(cdk_stream_t inp,
- cdk_kbnode_t * ret_key,
- unsigned public);
-
-/* Rebuild the key db index if possible. */
- cdk_error_t cdk_keydb_idx_rebuild(cdk_keydb_hd_t db,
- cdk_keydb_search_t dbs);
-
-/* Export one or more keys from the given key db handle into
- the stream @OUT. The export is done by substring search and
- uses the string list @REMUSR for the pattern. */
- cdk_error_t cdk_keydb_export(cdk_keydb_hd_t hd, cdk_stream_t out,
- cdk_strlist_t remusr);
-
-/* Import the given key node @knode into the key db. */
- cdk_error_t cdk_keydb_import(cdk_keydb_hd_t hd,
- cdk_kbnode_t knode);
-
-
-/* List or enumerate keys from a given key db handle. */
-
-/* Start the key list process. Either use @PATT for a pattern search
- or @FPATT for a list of pattern. */
- cdk_error_t cdk_listkey_start(cdk_listkey_t * r_ctx,
- cdk_keydb_hd_t db, const char *patt,
- cdk_strlist_t fpatt);
- void cdk_listkey_close(cdk_listkey_t ctx);
-
-/* Return the next key which matches the pattern. */
- cdk_error_t cdk_listkey_next(cdk_listkey_t ctx,
- cdk_kbnode_t * ret_key);
-
- cdk_kbnode_t cdk_kbnode_new(cdk_packet_t pkt);
- cdk_error_t cdk_kbnode_read_from_mem(cdk_kbnode_t * ret_node,
- int armor,
- const unsigned char *buf,
- size_t buflen, unsigned public);
- cdk_error_t cdk_kbnode_write_to_mem(cdk_kbnode_t node,
- unsigned char *buf,
- size_t * r_nbytes);
- cdk_error_t cdk_kbnode_write_to_mem_alloc(cdk_kbnode_t node,
- unsigned char **r_buf,
- size_t * r_buflen);
-
- void cdk_kbnode_release(cdk_kbnode_t node);
- void cdk_kbnode_delete(cdk_kbnode_t node);
- void cdk_kbnode_insert(cdk_kbnode_t root, cdk_kbnode_t node,
- cdk_packet_type_t pkttype);
- int cdk_kbnode_commit(cdk_kbnode_t * root);
- void cdk_kbnode_remove(cdk_kbnode_t * root, cdk_kbnode_t node);
- void cdk_kbnode_move(cdk_kbnode_t * root, cdk_kbnode_t node,
- cdk_kbnode_t where);
- cdk_kbnode_t cdk_kbnode_walk(cdk_kbnode_t root, cdk_kbnode_t * ctx,
- int all);
- cdk_packet_t cdk_kbnode_find_packet(cdk_kbnode_t node,
- cdk_packet_type_t pkttype);
- cdk_packet_t cdk_kbnode_get_packet(cdk_kbnode_t node);
- cdk_kbnode_t cdk_kbnode_find(cdk_kbnode_t node,
- cdk_packet_type_t pkttype);
- cdk_kbnode_t cdk_kbnode_find_prev(cdk_kbnode_t root,
- cdk_kbnode_t node,
- cdk_packet_type_t pkttype);
- cdk_kbnode_t cdk_kbnode_find_next(cdk_kbnode_t node,
- cdk_packet_type_t pkttype);
- cdk_error_t cdk_kbnode_hash(cdk_kbnode_t node, digest_hd_st * md,
- int is_v4, cdk_packet_type_t pkttype,
- int flags);
-
-/* Check each signature in the key node and return a summary of the
- key status in @r_status. Values of cdk_key_flag_t are used. */
- cdk_error_t cdk_pk_check_sigs(cdk_kbnode_t knode,
- cdk_keydb_hd_t hd, int *r_status);
-
-/* Check the self signature of the key to make sure it is valid. */
- cdk_error_t cdk_pk_check_self_sig(cdk_kbnode_t knode,
- int *r_status);
-
-/* Return a matching algorithm from the given public key list.
- @PREFTYPE can be either sym-cipher/compress/digest. */
- int cdk_pklist_select_algo(cdk_keylist_t pkl, int preftype);
-
-/* Return 0 or 1 if the given key list is able to understand the
- MDC feature. */
- int cdk_pklist_use_mdc(cdk_keylist_t pkl);
- cdk_error_t cdk_pklist_build(cdk_keylist_t * ret_pkl,
- cdk_keydb_hd_t hd,
- cdk_strlist_t remusr, int use);
- void cdk_pklist_release(cdk_keylist_t pkl);
-
-/* Secret key lists */
- cdk_error_t cdk_sklist_build(cdk_keylist_t * ret_skl,
- cdk_keydb_hd_t db, cdk_ctx_t hd,
- cdk_strlist_t locusr,
- int unlock, unsigned int use);
- void cdk_sklist_release(cdk_keylist_t skl);
- cdk_error_t cdk_sklist_write(cdk_keylist_t skl, cdk_stream_t outp,
- digest_hd_st * mdctx, int sigclass,
- int sigver);
- cdk_error_t cdk_sklist_write_onepass(cdk_keylist_t skl,
- cdk_stream_t outp,
- int sigclass, int mdalgo);
-
-/* Encrypt the given stream @INP with the recipients given in @REMUSR.
- If @REMUSR is NULL, symmetric encryption will be used. The output
- will be written to @OUT. */
- cdk_error_t cdk_stream_encrypt(cdk_ctx_t hd, cdk_strlist_t remusr,
- cdk_stream_t inp, cdk_stream_t out);
-
-/* Decrypt the @INP stream into @OUT. */
- cdk_error_t cdk_stream_decrypt(cdk_ctx_t hd, cdk_stream_t inp,
- cdk_stream_t out);
-
-/* Same as the function above but it works on files. */
- cdk_error_t cdk_file_encrypt(cdk_ctx_t hd, cdk_strlist_t remusr,
- const char *file, const char *output);
- cdk_error_t cdk_file_decrypt(cdk_ctx_t hd, const char *file,
- const char *output);
-
-/* Generic function to transform data. The mode can be either sign,
- verify, encrypt, decrypt, import or export. The meanings of the
- parameters are similar to the functions above.
- @OUTBUF will contain the output and @OUTSIZE the length of it. */
- cdk_error_t cdk_data_transform(cdk_ctx_t hd,
- enum cdk_crypto_mode_t mode,
- cdk_strlist_t locusr,
- cdk_strlist_t remusr,
- const void *inbuf, size_t insize,
- unsigned char **outbuf,
- size_t * outsize, int modval);
-
- int cdk_trustdb_get_validity(cdk_stream_t inp, cdk_pkt_userid_t id,
- int *r_val);
- int cdk_trustdb_get_ownertrust(cdk_stream_t inp, cdk_pubkey_t pk,
- int *r_val, int *r_flags);
-
- void cdk_strlist_free(cdk_strlist_t sl);
- cdk_strlist_t cdk_strlist_add(cdk_strlist_t * list,
- const char *string);
- const char *cdk_check_version(const char *req_version);
-/* UTF8 */
- char *cdk_utf8_encode(const char *string);
- char *cdk_utf8_decode(const char *string, size_t length,
- int delim);
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* OPENCDK_H */