2013-01-11 20:32:42 +00:00
|
|
|
/* gcrypt-module.h - GNU Cryptographic Library Interface
|
|
|
|
Copyright (C) 2003, 2007 Free Software Foundation, Inc.
|
|
|
|
|
|
|
|
This file is part of Libgcrypt.
|
|
|
|
|
|
|
|
Libgcrypt 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.
|
|
|
|
|
|
|
|
Libgcrypt 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/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
This file contains the necessary declarations/definitions for
|
2013-11-07 05:35:50 +00:00
|
|
|
working with Libgcrypt modules.
|
2013-01-11 20:32:42 +00:00
|
|
|
*/
|
|
|
|
|
2013-11-07 05:35:50 +00:00
|
|
|
#ifndef _GCRYPT_MODULE_H
|
|
|
|
#define _GCRYPT_MODULE_H
|
2013-01-11 20:32:42 +00:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#if 0 /* keep Emacsens's auto-indent happy */
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* The interfaces using the module system reserve a certain range of
|
|
|
|
IDs for application use. These IDs are not valid within Libgcrypt
|
|
|
|
but Libgcrypt makes sure never to allocate such a module ID. */
|
|
|
|
#define GCRY_MODULE_ID_USER 1024
|
|
|
|
#define GCRY_MODULE_ID_USER_LAST 4095
|
|
|
|
|
|
|
|
|
|
|
|
/* This type represents a `module'. */
|
|
|
|
typedef struct gcry_module *gcry_module_t;
|
|
|
|
|
|
|
|
/* Check that the library fulfills the version requirement. */
|
|
|
|
|
|
|
|
/* Type for the cipher_setkey function. */
|
|
|
|
typedef gcry_err_code_t (*gcry_cipher_setkey_t) (void *c,
|
|
|
|
const unsigned char *key,
|
|
|
|
unsigned keylen);
|
|
|
|
|
|
|
|
/* Type for the cipher_encrypt function. */
|
|
|
|
typedef void (*gcry_cipher_encrypt_t) (void *c,
|
|
|
|
unsigned char *outbuf,
|
|
|
|
const unsigned char *inbuf);
|
|
|
|
|
|
|
|
/* Type for the cipher_decrypt function. */
|
|
|
|
typedef void (*gcry_cipher_decrypt_t) (void *c,
|
|
|
|
unsigned char *outbuf,
|
|
|
|
const unsigned char *inbuf);
|
|
|
|
|
|
|
|
/* Type for the cipher_stencrypt function. */
|
|
|
|
typedef void (*gcry_cipher_stencrypt_t) (void *c,
|
|
|
|
unsigned char *outbuf,
|
|
|
|
const unsigned char *inbuf,
|
|
|
|
unsigned int n);
|
|
|
|
|
|
|
|
/* Type for the cipher_stdecrypt function. */
|
|
|
|
typedef void (*gcry_cipher_stdecrypt_t) (void *c,
|
|
|
|
unsigned char *outbuf,
|
|
|
|
const unsigned char *inbuf,
|
|
|
|
unsigned int n);
|
|
|
|
|
|
|
|
typedef struct gcry_cipher_oid_spec
|
|
|
|
{
|
|
|
|
const char *oid;
|
|
|
|
int mode;
|
|
|
|
} gcry_cipher_oid_spec_t;
|
|
|
|
|
|
|
|
/* Module specification structure for ciphers. */
|
|
|
|
typedef struct gcry_cipher_spec
|
|
|
|
{
|
|
|
|
const char *name;
|
|
|
|
const char **aliases;
|
|
|
|
gcry_cipher_oid_spec_t *oids;
|
|
|
|
size_t blocksize;
|
|
|
|
size_t keylen;
|
|
|
|
size_t contextsize;
|
|
|
|
gcry_cipher_setkey_t setkey;
|
|
|
|
gcry_cipher_encrypt_t encrypt;
|
|
|
|
gcry_cipher_decrypt_t decrypt;
|
|
|
|
gcry_cipher_stencrypt_t stencrypt;
|
|
|
|
gcry_cipher_stdecrypt_t stdecrypt;
|
|
|
|
} gcry_cipher_spec_t;
|
|
|
|
|
2013-11-07 05:35:50 +00:00
|
|
|
/* Register a new cipher module whose specification can be found in
|
|
|
|
CIPHER. On success, a new algorithm ID is stored in ALGORITHM_ID
|
|
|
|
and a pointer representing this module is stored in MODULE. */
|
|
|
|
gcry_error_t gcry_cipher_register (gcry_cipher_spec_t *cipher,
|
|
|
|
int *algorithm_id,
|
|
|
|
gcry_module_t *module)
|
|
|
|
/* */ _GCRY_ATTR_INTERNAL;
|
|
|
|
|
|
|
|
|
|
|
|
/* Unregister the cipher identified by MODULE, which must have been
|
|
|
|
registered with gcry_cipher_register. */
|
|
|
|
void gcry_cipher_unregister (gcry_module_t module)
|
|
|
|
/* */ _GCRY_ATTR_INTERNAL;
|
2013-01-11 20:32:42 +00:00
|
|
|
|
|
|
|
/* ********************** */
|
|
|
|
|
|
|
|
/* Type for the pk_generate function. */
|
|
|
|
typedef gcry_err_code_t (*gcry_pk_generate_t) (int algo,
|
|
|
|
unsigned int nbits,
|
|
|
|
unsigned long use_e,
|
|
|
|
gcry_mpi_t *skey,
|
|
|
|
gcry_mpi_t **retfactors);
|
|
|
|
|
|
|
|
/* Type for the pk_check_secret_key function. */
|
|
|
|
typedef gcry_err_code_t (*gcry_pk_check_secret_key_t) (int algo,
|
|
|
|
gcry_mpi_t *skey);
|
|
|
|
|
|
|
|
/* Type for the pk_encrypt function. */
|
|
|
|
typedef gcry_err_code_t (*gcry_pk_encrypt_t) (int algo,
|
|
|
|
gcry_mpi_t *resarr,
|
|
|
|
gcry_mpi_t data,
|
|
|
|
gcry_mpi_t *pkey,
|
|
|
|
int flags);
|
|
|
|
|
|
|
|
/* Type for the pk_decrypt function. */
|
|
|
|
typedef gcry_err_code_t (*gcry_pk_decrypt_t) (int algo,
|
|
|
|
gcry_mpi_t *result,
|
|
|
|
gcry_mpi_t *data,
|
|
|
|
gcry_mpi_t *skey,
|
|
|
|
int flags);
|
|
|
|
|
|
|
|
/* Type for the pk_sign function. */
|
|
|
|
typedef gcry_err_code_t (*gcry_pk_sign_t) (int algo,
|
|
|
|
gcry_mpi_t *resarr,
|
|
|
|
gcry_mpi_t data,
|
|
|
|
gcry_mpi_t *skey);
|
|
|
|
|
|
|
|
/* Type for the pk_verify function. */
|
|
|
|
typedef gcry_err_code_t (*gcry_pk_verify_t) (int algo,
|
|
|
|
gcry_mpi_t hash,
|
|
|
|
gcry_mpi_t *data,
|
|
|
|
gcry_mpi_t *pkey,
|
|
|
|
int (*cmp) (void *, gcry_mpi_t),
|
|
|
|
void *opaquev);
|
|
|
|
|
|
|
|
/* Type for the pk_get_nbits function. */
|
|
|
|
typedef unsigned (*gcry_pk_get_nbits_t) (int algo, gcry_mpi_t *pkey);
|
|
|
|
|
|
|
|
/* Module specification structure for message digests. */
|
|
|
|
typedef struct gcry_pk_spec
|
|
|
|
{
|
|
|
|
const char *name;
|
|
|
|
const char **aliases;
|
|
|
|
const char *elements_pkey;
|
|
|
|
const char *elements_skey;
|
|
|
|
const char *elements_enc;
|
|
|
|
const char *elements_sig;
|
|
|
|
const char *elements_grip;
|
|
|
|
int use;
|
|
|
|
gcry_pk_generate_t generate;
|
|
|
|
gcry_pk_check_secret_key_t check_secret_key;
|
|
|
|
gcry_pk_encrypt_t encrypt;
|
|
|
|
gcry_pk_decrypt_t decrypt;
|
|
|
|
gcry_pk_sign_t sign;
|
|
|
|
gcry_pk_verify_t verify;
|
|
|
|
gcry_pk_get_nbits_t get_nbits;
|
|
|
|
} gcry_pk_spec_t;
|
|
|
|
|
2013-11-07 05:35:50 +00:00
|
|
|
/* Register a new pubkey module whose specification can be found in
|
|
|
|
PUBKEY. On success, a new algorithm ID is stored in ALGORITHM_ID
|
|
|
|
and a pointer representhing this module is stored in MODULE. */
|
|
|
|
gcry_error_t gcry_pk_register (gcry_pk_spec_t *pubkey,
|
|
|
|
unsigned int *algorithm_id,
|
|
|
|
gcry_module_t *module)
|
|
|
|
/* */ _GCRY_ATTR_INTERNAL;
|
|
|
|
|
|
|
|
/* Unregister the pubkey identified by ID, which must have been
|
|
|
|
registered with gcry_pk_register. */
|
|
|
|
void gcry_pk_unregister (gcry_module_t module)
|
|
|
|
/* */ _GCRY_ATTR_INTERNAL;
|
2013-01-11 20:32:42 +00:00
|
|
|
|
|
|
|
/* ********************** */
|
|
|
|
|
|
|
|
/* Type for the md_init function. */
|
|
|
|
typedef void (*gcry_md_init_t) (void *c);
|
|
|
|
|
|
|
|
/* Type for the md_write function. */
|
|
|
|
typedef void (*gcry_md_write_t) (void *c, const void *buf, size_t nbytes);
|
|
|
|
|
|
|
|
/* Type for the md_final function. */
|
|
|
|
typedef void (*gcry_md_final_t) (void *c);
|
|
|
|
|
|
|
|
/* Type for the md_read function. */
|
|
|
|
typedef unsigned char *(*gcry_md_read_t) (void *c);
|
|
|
|
|
|
|
|
typedef struct gcry_md_oid_spec
|
|
|
|
{
|
|
|
|
const char *oidstring;
|
|
|
|
} gcry_md_oid_spec_t;
|
|
|
|
|
|
|
|
/* Module specification structure for message digests. */
|
|
|
|
typedef struct gcry_md_spec
|
|
|
|
{
|
|
|
|
const char *name;
|
|
|
|
unsigned char *asnoid;
|
|
|
|
int asnlen;
|
|
|
|
gcry_md_oid_spec_t *oids;
|
|
|
|
int mdlen;
|
|
|
|
gcry_md_init_t init;
|
|
|
|
gcry_md_write_t write;
|
|
|
|
gcry_md_final_t final;
|
|
|
|
gcry_md_read_t read;
|
|
|
|
size_t contextsize; /* allocate this amount of context */
|
|
|
|
} gcry_md_spec_t;
|
|
|
|
|
2013-11-07 05:35:50 +00:00
|
|
|
/* Register a new digest module whose specification can be found in
|
|
|
|
DIGEST. On success, a new algorithm ID is stored in ALGORITHM_ID
|
|
|
|
and a pointer representhing this module is stored in MODULE. */
|
|
|
|
gcry_error_t gcry_md_register (gcry_md_spec_t *digest,
|
|
|
|
unsigned int *algorithm_id,
|
|
|
|
gcry_module_t *module)
|
|
|
|
/* */ _GCRY_ATTR_INTERNAL;
|
|
|
|
|
|
|
|
/* Unregister the digest identified by ID, which must have been
|
|
|
|
registered with gcry_digest_register. */
|
|
|
|
void gcry_md_unregister (gcry_module_t module)
|
|
|
|
/* */ _GCRY_ATTR_INTERNAL;
|
|
|
|
|
2013-01-11 20:32:42 +00:00
|
|
|
#if 0 /* keep Emacsens's auto-indent happy */
|
|
|
|
{
|
|
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
2013-11-07 05:35:50 +00:00
|
|
|
#endif
|