crypto.h

来自「linux 内核源代码」· C头文件 代码 · 共 1,243 行 · 第 1/3 页

H
1,243
字号
/* * Scatterlist Cryptographic API. * * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> * Copyright (c) 2002 David S. Miller (davem@redhat.com) * Copyright (c) 2005 Herbert Xu <herbert@gondor.apana.org.au> * * Portions derived from Cryptoapi, by Alexander Kjeldaas <astor@fast.no> * and Nettle, by Niels Möller. *  * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option)  * any later version. * */#ifndef _LINUX_CRYPTO_H#define _LINUX_CRYPTO_H#include <asm/atomic.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/list.h>#include <linux/slab.h>#include <linux/string.h>#include <linux/uaccess.h>/* * Algorithm masks and types. */#define CRYPTO_ALG_TYPE_MASK		0x0000000f#define CRYPTO_ALG_TYPE_CIPHER		0x00000001#define CRYPTO_ALG_TYPE_DIGEST		0x00000002#define CRYPTO_ALG_TYPE_HASH		0x00000003#define CRYPTO_ALG_TYPE_BLKCIPHER	0x00000004#define CRYPTO_ALG_TYPE_COMPRESS	0x00000005#define CRYPTO_ALG_TYPE_AEAD		0x00000006#define CRYPTO_ALG_TYPE_HASH_MASK	0x0000000e#define CRYPTO_ALG_LARVAL		0x00000010#define CRYPTO_ALG_DEAD			0x00000020#define CRYPTO_ALG_DYING		0x00000040#define CRYPTO_ALG_ASYNC		0x00000080/* * Set this bit if and only if the algorithm requires another algorithm of * the same type to handle corner cases. */#define CRYPTO_ALG_NEED_FALLBACK	0x00000100/* * Transform masks and values (for crt_flags). */#define CRYPTO_TFM_REQ_MASK		0x000fff00#define CRYPTO_TFM_RES_MASK		0xfff00000#define CRYPTO_TFM_REQ_WEAK_KEY		0x00000100#define CRYPTO_TFM_REQ_MAY_SLEEP	0x00000200#define CRYPTO_TFM_REQ_MAY_BACKLOG	0x00000400#define CRYPTO_TFM_RES_WEAK_KEY		0x00100000#define CRYPTO_TFM_RES_BAD_KEY_LEN   	0x00200000#define CRYPTO_TFM_RES_BAD_KEY_SCHED 	0x00400000#define CRYPTO_TFM_RES_BAD_BLOCK_LEN 	0x00800000#define CRYPTO_TFM_RES_BAD_FLAGS 	0x01000000/* * Miscellaneous stuff. */#define CRYPTO_MAX_ALG_NAME		64/* * The macro CRYPTO_MINALIGN_ATTR (along with the void * type in the actual * declaration) is used to ensure that the crypto_tfm context structure is * aligned correctly for the given architecture so that there are no alignment * faults for C data types.  In particular, this is required on platforms such * as arm where pointers are 32-bit aligned but there are data types such as * u64 which require 64-bit alignment. */#if defined(ARCH_KMALLOC_MINALIGN)#define CRYPTO_MINALIGN ARCH_KMALLOC_MINALIGN#elif defined(ARCH_SLAB_MINALIGN)#define CRYPTO_MINALIGN ARCH_SLAB_MINALIGN#endif#ifdef CRYPTO_MINALIGN#define CRYPTO_MINALIGN_ATTR __attribute__ ((__aligned__(CRYPTO_MINALIGN)))#else#define CRYPTO_MINALIGN_ATTR#endifstruct scatterlist;struct crypto_ablkcipher;struct crypto_async_request;struct crypto_aead;struct crypto_blkcipher;struct crypto_hash;struct crypto_tfm;struct crypto_type;typedef void (*crypto_completion_t)(struct crypto_async_request *req, int err);struct crypto_async_request {	struct list_head list;	crypto_completion_t complete;	void *data;	struct crypto_tfm *tfm;	u32 flags;};struct ablkcipher_request {	struct crypto_async_request base;	unsigned int nbytes;	void *info;	struct scatterlist *src;	struct scatterlist *dst;	void *__ctx[] CRYPTO_MINALIGN_ATTR;};/** *	struct aead_request - AEAD request *	@base: Common attributes for async crypto requests *	@assoclen: Length in bytes of associated data for authentication *	@cryptlen: Length of data to be encrypted or decrypted *	@iv: Initialisation vector *	@assoc: Associated data *	@src: Source data *	@dst: Destination data *	@__ctx: Start of private context data */struct aead_request {	struct crypto_async_request base;	unsigned int assoclen;	unsigned int cryptlen;	u8 *iv;	struct scatterlist *assoc;	struct scatterlist *src;	struct scatterlist *dst;	void *__ctx[] CRYPTO_MINALIGN_ATTR;};struct blkcipher_desc {	struct crypto_blkcipher *tfm;	void *info;	u32 flags;};struct cipher_desc {	struct crypto_tfm *tfm;	void (*crfn)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);	unsigned int (*prfn)(const struct cipher_desc *desc, u8 *dst,			     const u8 *src, unsigned int nbytes);	void *info;};struct hash_desc {	struct crypto_hash *tfm;	u32 flags;};/* * Algorithms: modular crypto algorithm implementations, managed * via crypto_register_alg() and crypto_unregister_alg(). */struct ablkcipher_alg {	int (*setkey)(struct crypto_ablkcipher *tfm, const u8 *key,	              unsigned int keylen);	int (*encrypt)(struct ablkcipher_request *req);	int (*decrypt)(struct ablkcipher_request *req);	unsigned int min_keysize;	unsigned int max_keysize;	unsigned int ivsize;};struct aead_alg {	int (*setkey)(struct crypto_aead *tfm, const u8 *key,	              unsigned int keylen);	int (*encrypt)(struct aead_request *req);	int (*decrypt)(struct aead_request *req);	unsigned int ivsize;	unsigned int authsize;};struct blkcipher_alg {	int (*setkey)(struct crypto_tfm *tfm, const u8 *key,	              unsigned int keylen);	int (*encrypt)(struct blkcipher_desc *desc,		       struct scatterlist *dst, struct scatterlist *src,		       unsigned int nbytes);	int (*decrypt)(struct blkcipher_desc *desc,		       struct scatterlist *dst, struct scatterlist *src,		       unsigned int nbytes);	unsigned int min_keysize;	unsigned int max_keysize;	unsigned int ivsize;};struct cipher_alg {	unsigned int cia_min_keysize;	unsigned int cia_max_keysize;	int (*cia_setkey)(struct crypto_tfm *tfm, const u8 *key,	                  unsigned int keylen);	void (*cia_encrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);	void (*cia_decrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);};struct digest_alg {	unsigned int dia_digestsize;	void (*dia_init)(struct crypto_tfm *tfm);	void (*dia_update)(struct crypto_tfm *tfm, const u8 *data,			   unsigned int len);	void (*dia_final)(struct crypto_tfm *tfm, u8 *out);	int (*dia_setkey)(struct crypto_tfm *tfm, const u8 *key,	                  unsigned int keylen);};struct hash_alg {	int (*init)(struct hash_desc *desc);	int (*update)(struct hash_desc *desc, struct scatterlist *sg,		      unsigned int nbytes);	int (*final)(struct hash_desc *desc, u8 *out);	int (*digest)(struct hash_desc *desc, struct scatterlist *sg,		      unsigned int nbytes, u8 *out);	int (*setkey)(struct crypto_hash *tfm, const u8 *key,		      unsigned int keylen);	unsigned int digestsize;};struct compress_alg {	int (*coa_compress)(struct crypto_tfm *tfm, const u8 *src,			    unsigned int slen, u8 *dst, unsigned int *dlen);	int (*coa_decompress)(struct crypto_tfm *tfm, const u8 *src,			      unsigned int slen, u8 *dst, unsigned int *dlen);};#define cra_ablkcipher	cra_u.ablkcipher#define cra_aead	cra_u.aead#define cra_blkcipher	cra_u.blkcipher#define cra_cipher	cra_u.cipher#define cra_digest	cra_u.digest#define cra_hash	cra_u.hash#define cra_compress	cra_u.compressstruct crypto_alg {	struct list_head cra_list;	struct list_head cra_users;	u32 cra_flags;	unsigned int cra_blocksize;	unsigned int cra_ctxsize;	unsigned int cra_alignmask;	int cra_priority;	atomic_t cra_refcnt;	char cra_name[CRYPTO_MAX_ALG_NAME];	char cra_driver_name[CRYPTO_MAX_ALG_NAME];	const struct crypto_type *cra_type;	union {		struct ablkcipher_alg ablkcipher;		struct aead_alg aead;		struct blkcipher_alg blkcipher;		struct cipher_alg cipher;		struct digest_alg digest;		struct hash_alg hash;		struct compress_alg compress;	} cra_u;	int (*cra_init)(struct crypto_tfm *tfm);	void (*cra_exit)(struct crypto_tfm *tfm);	void (*cra_destroy)(struct crypto_alg *alg);		struct module *cra_module;};/* * Algorithm registration interface. */int crypto_register_alg(struct crypto_alg *alg);int crypto_unregister_alg(struct crypto_alg *alg);/* * Algorithm query interface. */#ifdef CONFIG_CRYPTOint crypto_has_alg(const char *name, u32 type, u32 mask);#elsestatic inline int crypto_has_alg(const char *name, u32 type, u32 mask){	return 0;}#endif/* * Transforms: user-instantiated objects which encapsulate algorithms * and core processing logic.  Managed via crypto_alloc_*() and * crypto_free_*(), as well as the various helpers below. */struct ablkcipher_tfm {	int (*setkey)(struct crypto_ablkcipher *tfm, const u8 *key,	              unsigned int keylen);	int (*encrypt)(struct ablkcipher_request *req);	int (*decrypt)(struct ablkcipher_request *req);	unsigned int ivsize;	unsigned int reqsize;};struct aead_tfm {	int (*setkey)(struct crypto_aead *tfm, const u8 *key,	              unsigned int keylen);	int (*encrypt)(struct aead_request *req);	int (*decrypt)(struct aead_request *req);	unsigned int ivsize;	unsigned int authsize;	unsigned int reqsize;};struct blkcipher_tfm {	void *iv;	int (*setkey)(struct crypto_tfm *tfm, const u8 *key,		      unsigned int keylen);	int (*encrypt)(struct blkcipher_desc *desc, struct scatterlist *dst,		       struct scatterlist *src, unsigned int nbytes);	int (*decrypt)(struct blkcipher_desc *desc, struct scatterlist *dst,		       struct scatterlist *src, unsigned int nbytes);};struct cipher_tfm {	int (*cit_setkey)(struct crypto_tfm *tfm,	                  const u8 *key, unsigned int keylen);	void (*cit_encrypt_one)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);	void (*cit_decrypt_one)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);};struct hash_tfm {	int (*init)(struct hash_desc *desc);	int (*update)(struct hash_desc *desc,		      struct scatterlist *sg, unsigned int nsg);	int (*final)(struct hash_desc *desc, u8 *out);	int (*digest)(struct hash_desc *desc, struct scatterlist *sg,		      unsigned int nsg, u8 *out);	int (*setkey)(struct crypto_hash *tfm, const u8 *key,		      unsigned int keylen);	unsigned int digestsize;};struct compress_tfm {	int (*cot_compress)(struct crypto_tfm *tfm,	                    const u8 *src, unsigned int slen,	                    u8 *dst, unsigned int *dlen);	int (*cot_decompress)(struct crypto_tfm *tfm,	                      const u8 *src, unsigned int slen,	                      u8 *dst, unsigned int *dlen);};#define crt_ablkcipher	crt_u.ablkcipher#define crt_aead	crt_u.aead#define crt_blkcipher	crt_u.blkcipher#define crt_cipher	crt_u.cipher#define crt_hash	crt_u.hash#define crt_compress	crt_u.compressstruct crypto_tfm {	u32 crt_flags;		union {		struct ablkcipher_tfm ablkcipher;		struct aead_tfm aead;		struct blkcipher_tfm blkcipher;		struct cipher_tfm cipher;		struct hash_tfm hash;		struct compress_tfm compress;	} crt_u;		struct crypto_alg *__crt_alg;	void *__crt_ctx[] CRYPTO_MINALIGN_ATTR;};struct crypto_ablkcipher {	struct crypto_tfm base;};struct crypto_aead {	struct crypto_tfm base;};struct crypto_blkcipher {	struct crypto_tfm base;};struct crypto_cipher {	struct crypto_tfm base;};struct crypto_comp {	struct crypto_tfm base;};

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?