diff options
Diffstat (limited to 'include/crypto/internal')
| -rw-r--r-- | include/crypto/internal/aead.h | 21 | ||||
| -rw-r--r-- | include/crypto/internal/geniv.h | 2 | ||||
| -rw-r--r-- | include/crypto/internal/hash.h | 12 | ||||
| -rw-r--r-- | include/crypto/internal/kpp.h | 64 | ||||
| -rw-r--r-- | include/crypto/internal/rsa.h | 42 | ||||
| -rw-r--r-- | include/crypto/internal/skcipher.h | 122 | 
6 files changed, 211 insertions, 52 deletions
| diff --git a/include/crypto/internal/aead.h b/include/crypto/internal/aead.h index da3864991d4c..6ad8e31d3868 100644 --- a/include/crypto/internal/aead.h +++ b/include/crypto/internal/aead.h @@ -159,6 +159,27 @@ static inline struct aead_request *aead_get_backlog(struct aead_queue *queue)  	return req ? container_of(req, struct aead_request, base) : NULL;  } +static inline unsigned int crypto_aead_alg_chunksize(struct aead_alg *alg) +{ +	return alg->chunksize; +} + +/** + * crypto_aead_chunksize() - obtain chunk size + * @tfm: cipher handle + * + * The block size is set to one for ciphers such as CCM.  However, + * you still need to provide incremental updates in multiples of + * the underlying block size as the IV does not have sub-block + * granularity.  This is known in this API as the chunk size. + * + * Return: chunk size in bytes + */ +static inline unsigned int crypto_aead_chunksize(struct crypto_aead *tfm) +{ +	return crypto_aead_alg_chunksize(crypto_aead_alg(tfm)); +} +  int crypto_register_aead(struct aead_alg *alg);  void crypto_unregister_aead(struct aead_alg *alg);  int crypto_register_aeads(struct aead_alg *algs, int count); diff --git a/include/crypto/internal/geniv.h b/include/crypto/internal/geniv.h index 59333635e712..2bcfb931bc5b 100644 --- a/include/crypto/internal/geniv.h +++ b/include/crypto/internal/geniv.h @@ -20,7 +20,7 @@  struct aead_geniv_ctx {  	spinlock_t lock;  	struct crypto_aead *child; -	struct crypto_blkcipher *null; +	struct crypto_skcipher *sknull;  	u8 salt[] __attribute__ ((aligned(__alignof__(u32))));  }; diff --git a/include/crypto/internal/hash.h b/include/crypto/internal/hash.h index 49dae16f8929..1d4f365d8f03 100644 --- a/include/crypto/internal/hash.h +++ b/include/crypto/internal/hash.h @@ -114,14 +114,10 @@ int shash_ahash_update(struct ahash_request *req, struct shash_desc *desc);  int shash_ahash_finup(struct ahash_request *req, struct shash_desc *desc);  int shash_ahash_digest(struct ahash_request *req, struct shash_desc *desc); -int shash_ahash_mcryptd_update(struct ahash_request *req, -			       struct shash_desc *desc); -int shash_ahash_mcryptd_final(struct ahash_request *req, -			      struct shash_desc *desc); -int shash_ahash_mcryptd_finup(struct ahash_request *req, -			      struct shash_desc *desc); -int shash_ahash_mcryptd_digest(struct ahash_request *req, -			       struct shash_desc *desc); +int ahash_mcryptd_update(struct ahash_request *desc); +int ahash_mcryptd_final(struct ahash_request *desc); +int ahash_mcryptd_finup(struct ahash_request *desc); +int ahash_mcryptd_digest(struct ahash_request *desc);  int crypto_init_shash_ops_async(struct crypto_tfm *tfm); diff --git a/include/crypto/internal/kpp.h b/include/crypto/internal/kpp.h new file mode 100644 index 000000000000..ad3acf3649be --- /dev/null +++ b/include/crypto/internal/kpp.h @@ -0,0 +1,64 @@ +/* + * Key-agreement Protocol Primitives (KPP) + * + * Copyright (c) 2016, Intel Corporation + * Authors: Salvatore Benedetto <[email protected]> + * + * 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 _CRYPTO_KPP_INT_H +#define _CRYPTO_KPP_INT_H +#include <crypto/kpp.h> +#include <crypto/algapi.h> + +/* + * Transform internal helpers. + */ +static inline void *kpp_request_ctx(struct kpp_request *req) +{ +	return req->__ctx; +} + +static inline void *kpp_tfm_ctx(struct crypto_kpp *tfm) +{ +	return tfm->base.__crt_ctx; +} + +static inline void kpp_request_complete(struct kpp_request *req, int err) +{ +	req->base.complete(&req->base, err); +} + +static inline const char *kpp_alg_name(struct crypto_kpp *tfm) +{ +	return crypto_kpp_tfm(tfm)->__crt_alg->cra_name; +} + +/** + * crypto_register_kpp() -- Register key-agreement protocol primitives algorithm + * + * Function registers an implementation of a key-agreement protocol primitive + * algorithm + * + * @alg:	algorithm definition + * + * Return: zero on success; error code in case of error + */ +int crypto_register_kpp(struct kpp_alg *alg); + +/** + * crypto_unregister_kpp() -- Unregister key-agreement protocol primitive + * algorithm + * + * Function unregisters an implementation of a key-agreement protocol primitive + * algorithm + * + * @alg:	algorithm definition + */ +void crypto_unregister_kpp(struct kpp_alg *alg); + +#endif diff --git a/include/crypto/internal/rsa.h b/include/crypto/internal/rsa.h index c7585bdecbc2..9e8f1590de98 100644 --- a/include/crypto/internal/rsa.h +++ b/include/crypto/internal/rsa.h @@ -12,12 +12,44 @@   */  #ifndef _RSA_HELPER_  #define _RSA_HELPER_ -#include <linux/mpi.h> +#include <linux/types.h> +/** + * rsa_key - RSA key structure + * @n           : RSA modulus raw byte stream + * @e           : RSA public exponent raw byte stream + * @d           : RSA private exponent raw byte stream + * @p           : RSA prime factor p of n raw byte stream + * @q           : RSA prime factor q of n raw byte stream + * @dp          : RSA exponent d mod (p - 1) raw byte stream + * @dq          : RSA exponent d mod (q - 1) raw byte stream + * @qinv        : RSA CRT coefficient q^(-1) mod p raw byte stream + * @n_sz        : length in bytes of RSA modulus n + * @e_sz        : length in bytes of RSA public exponent + * @d_sz        : length in bytes of RSA private exponent + * @p_sz        : length in bytes of p field + * @q_sz        : length in bytes of q field + * @dp_sz       : length in bytes of dp field + * @dq_sz       : length in bytes of dq field + * @qinv_sz     : length in bytes of qinv field + */  struct rsa_key { -	MPI n; -	MPI e; -	MPI d; +	const u8 *n; +	const u8 *e; +	const u8 *d; +	const u8 *p; +	const u8 *q; +	const u8 *dp; +	const u8 *dq; +	const u8 *qinv; +	size_t n_sz; +	size_t e_sz; +	size_t d_sz; +	size_t p_sz; +	size_t q_sz; +	size_t dp_sz; +	size_t dq_sz; +	size_t qinv_sz;  };  int rsa_parse_pub_key(struct rsa_key *rsa_key, const void *key, @@ -26,7 +58,5 @@ int rsa_parse_pub_key(struct rsa_key *rsa_key, const void *key,  int rsa_parse_priv_key(struct rsa_key *rsa_key, const void *key,  		       unsigned int key_len); -void rsa_free_key(struct rsa_key *rsa_key); -  extern struct crypto_template rsa_pkcs1pad_tmpl;  #endif diff --git a/include/crypto/internal/skcipher.h b/include/crypto/internal/skcipher.h index 2cf7a61ece59..a21a95e1a375 100644 --- a/include/crypto/internal/skcipher.h +++ b/include/crypto/internal/skcipher.h @@ -19,12 +19,46 @@  struct rtattr; +struct skcipher_instance { +	void (*free)(struct skcipher_instance *inst); +	union { +		struct { +			char head[offsetof(struct skcipher_alg, base)]; +			struct crypto_instance base; +		} s; +		struct skcipher_alg alg; +	}; +}; +  struct crypto_skcipher_spawn {  	struct crypto_spawn base;  };  extern const struct crypto_type crypto_givcipher_type; +static inline struct crypto_instance *skcipher_crypto_instance( +	struct skcipher_instance *inst) +{ +	return &inst->s.base; +} + +static inline struct skcipher_instance *skcipher_alg_instance( +	struct crypto_skcipher *skcipher) +{ +	return container_of(crypto_skcipher_alg(skcipher), +			    struct skcipher_instance, alg); +} + +static inline void *skcipher_instance_ctx(struct skcipher_instance *inst) +{ +	return crypto_instance_ctx(skcipher_crypto_instance(inst)); +} + +static inline void skcipher_request_complete(struct skcipher_request *req, int err) +{ +	req->base.complete(&req->base, err); +} +  static inline void crypto_set_skcipher_spawn(  	struct crypto_skcipher_spawn *spawn, struct crypto_instance *inst)  { @@ -34,6 +68,12 @@ static inline void crypto_set_skcipher_spawn(  int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn, const char *name,  			 u32 type, u32 mask); +static inline int crypto_grab_skcipher2(struct crypto_skcipher_spawn *spawn, +					const char *name, u32 type, u32 mask) +{ +	return crypto_grab_skcipher(spawn, name, type, mask); +} +  struct crypto_alg *crypto_lookup_skcipher(const char *name, u32 type, u32 mask);  static inline void crypto_drop_skcipher(struct crypto_skcipher_spawn *spawn) @@ -41,54 +81,42 @@ static inline void crypto_drop_skcipher(struct crypto_skcipher_spawn *spawn)  	crypto_drop_spawn(&spawn->base);  } -static inline struct crypto_alg *crypto_skcipher_spawn_alg( +static inline struct skcipher_alg *crypto_skcipher_spawn_alg(  	struct crypto_skcipher_spawn *spawn)  { -	return spawn->base.alg; +	return container_of(spawn->base.alg, struct skcipher_alg, base);  } -static inline struct crypto_ablkcipher *crypto_spawn_skcipher( +static inline struct skcipher_alg *crypto_spawn_skcipher_alg(  	struct crypto_skcipher_spawn *spawn)  { -	return __crypto_ablkcipher_cast( -		crypto_spawn_tfm(&spawn->base, crypto_skcipher_type(0), -				 crypto_skcipher_mask(0))); +	return crypto_skcipher_spawn_alg(spawn);  } -int skcipher_null_givencrypt(struct skcipher_givcrypt_request *req); -int skcipher_null_givdecrypt(struct skcipher_givcrypt_request *req); -const char *crypto_default_geniv(const struct crypto_alg *alg); - -struct crypto_instance *skcipher_geniv_alloc(struct crypto_template *tmpl, -					     struct rtattr **tb, u32 type, -					     u32 mask); -void skcipher_geniv_free(struct crypto_instance *inst); -int skcipher_geniv_init(struct crypto_tfm *tfm); -void skcipher_geniv_exit(struct crypto_tfm *tfm); - -static inline struct crypto_ablkcipher *skcipher_geniv_cipher( -	struct crypto_ablkcipher *geniv) +static inline struct crypto_skcipher *crypto_spawn_skcipher( +	struct crypto_skcipher_spawn *spawn)  { -	return crypto_ablkcipher_crt(geniv)->base; +	return crypto_spawn_tfm2(&spawn->base);  } -static inline int skcipher_enqueue_givcrypt( -	struct crypto_queue *queue, struct skcipher_givcrypt_request *request) +static inline struct crypto_skcipher *crypto_spawn_skcipher2( +	struct crypto_skcipher_spawn *spawn)  { -	return ablkcipher_enqueue_request(queue, &request->creq); +	return crypto_spawn_skcipher(spawn);  } -static inline struct skcipher_givcrypt_request *skcipher_dequeue_givcrypt( -	struct crypto_queue *queue) +static inline void crypto_skcipher_set_reqsize( +	struct crypto_skcipher *skcipher, unsigned int reqsize)  { -	return skcipher_givcrypt_cast(crypto_dequeue_request(queue)); +	skcipher->reqsize = reqsize;  } -static inline void *skcipher_givcrypt_reqctx( -	struct skcipher_givcrypt_request *req) -{ -	return ablkcipher_request_ctx(&req->creq); -} +int crypto_register_skcipher(struct skcipher_alg *alg); +void crypto_unregister_skcipher(struct skcipher_alg *alg); +int crypto_register_skciphers(struct skcipher_alg *algs, int count); +void crypto_unregister_skciphers(struct skcipher_alg *algs, int count); +int skcipher_register_instance(struct crypto_template *tmpl, +			       struct skcipher_instance *inst);  static inline void ablkcipher_request_complete(struct ablkcipher_request *req,  					       int err) @@ -96,12 +124,6 @@ static inline void ablkcipher_request_complete(struct ablkcipher_request *req,  	req->base.complete(&req->base, err);  } -static inline void skcipher_givcrypt_complete( -	struct skcipher_givcrypt_request *req, int err) -{ -	ablkcipher_request_complete(&req->creq, err); -} -  static inline u32 ablkcipher_request_flags(struct ablkcipher_request *req)  {  	return req->base.flags; @@ -122,5 +144,31 @@ static inline u32 skcipher_request_flags(struct skcipher_request *req)  	return req->base.flags;  } +static inline unsigned int crypto_skcipher_alg_min_keysize( +	struct skcipher_alg *alg) +{ +	if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) == +	    CRYPTO_ALG_TYPE_BLKCIPHER) +		return alg->base.cra_blkcipher.min_keysize; + +	if (alg->base.cra_ablkcipher.encrypt) +		return alg->base.cra_ablkcipher.min_keysize; + +	return alg->min_keysize; +} + +static inline unsigned int crypto_skcipher_alg_max_keysize( +	struct skcipher_alg *alg) +{ +	if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) == +	    CRYPTO_ALG_TYPE_BLKCIPHER) +		return alg->base.cra_blkcipher.max_keysize; + +	if (alg->base.cra_ablkcipher.encrypt) +		return alg->base.cra_ablkcipher.max_keysize; + +	return alg->max_keysize; +} +  #endif	/* _CRYPTO_INTERNAL_SKCIPHER_H */ |