You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (39 commits) random: Reorder struct entropy_store to remove padding on 64bits padata: update API documentation padata: Remove padata_get_cpumask crypto: pcrypt - Update pcrypt cpumask according to the padata cpumask notifier crypto: pcrypt - Rename pcrypt_instance padata: Pass the padata cpumasks to the cpumask_change_notifier chain padata: Rearrange set_cpumask functions padata: Rename padata_alloc functions crypto: pcrypt - Dont calulate a callback cpu on empty callback cpumask padata: Check for valid cpumasks padata: Allocate cpumask dependend recources in any case padata: Fix cpu index counting crypto: geode_aes - Convert pci_table entries to PCI_VDEVICE (if PCI_ANY_ID is used) pcrypt: Added sysfs interface to pcrypt padata: Added sysfs primitives to padata subsystem padata: Make two separate cpumasks padata: update documentation padata: simplify serialization mechanism padata: make padata_do_parallel to return zero on success padata: Handle empty padata cpumasks ...
This commit is contained in:
+75
-22
@@ -1,5 +1,5 @@
|
|||||||
The padata parallel execution mechanism
|
The padata parallel execution mechanism
|
||||||
Last updated for 2.6.34
|
Last updated for 2.6.36
|
||||||
|
|
||||||
Padata is a mechanism by which the kernel can farm work out to be done in
|
Padata is a mechanism by which the kernel can farm work out to be done in
|
||||||
parallel on multiple CPUs while retaining the ordering of tasks. It was
|
parallel on multiple CPUs while retaining the ordering of tasks. It was
|
||||||
@@ -13,31 +13,86 @@ overall control of how tasks are to be run:
|
|||||||
|
|
||||||
#include <linux/padata.h>
|
#include <linux/padata.h>
|
||||||
|
|
||||||
struct padata_instance *padata_alloc(const struct cpumask *cpumask,
|
struct padata_instance *padata_alloc(struct workqueue_struct *wq,
|
||||||
struct workqueue_struct *wq);
|
const struct cpumask *pcpumask,
|
||||||
|
const struct cpumask *cbcpumask);
|
||||||
|
|
||||||
The cpumask describes which processors will be used to execute work
|
The pcpumask describes which processors will be used to execute work
|
||||||
submitted to this instance. The workqueue wq is where the work will
|
submitted to this instance in parallel. The cbcpumask defines which
|
||||||
actually be done; it should be a multithreaded queue, naturally.
|
processors are allowed to use as the serialization callback processor.
|
||||||
|
The workqueue wq is where the work will actually be done; it should be
|
||||||
|
a multithreaded queue, naturally.
|
||||||
|
|
||||||
|
To allocate a padata instance with the cpu_possible_mask for both
|
||||||
|
cpumasks this helper function can be used:
|
||||||
|
|
||||||
|
struct padata_instance *padata_alloc_possible(struct workqueue_struct *wq);
|
||||||
|
|
||||||
|
Note: Padata maintains two kinds of cpumasks internally. The user supplied
|
||||||
|
cpumasks, submitted by padata_alloc/padata_alloc_possible and the 'usable'
|
||||||
|
cpumasks. The usable cpumasks are always the subset of active cpus in the
|
||||||
|
user supplied cpumasks, these are the cpumasks padata actually use. So
|
||||||
|
it is legal to supply a cpumask to padata that contains offline cpus.
|
||||||
|
Once a offline cpu in the user supplied cpumask comes online, padata
|
||||||
|
is going to use it.
|
||||||
|
|
||||||
There are functions for enabling and disabling the instance:
|
There are functions for enabling and disabling the instance:
|
||||||
|
|
||||||
void padata_start(struct padata_instance *pinst);
|
int padata_start(struct padata_instance *pinst);
|
||||||
void padata_stop(struct padata_instance *pinst);
|
void padata_stop(struct padata_instance *pinst);
|
||||||
|
|
||||||
These functions literally do nothing beyond setting or clearing the
|
These functions are setting or clearing the "PADATA_INIT" flag;
|
||||||
"padata_start() was called" flag; if that flag is not set, other functions
|
if that flag is not set, other functions will refuse to work.
|
||||||
will refuse to work.
|
padata_start returns zero on success (flag set) or -EINVAL if the
|
||||||
|
padata cpumask contains no active cpu (flag not set).
|
||||||
|
padata_stop clears the flag and blocks until the padata instance
|
||||||
|
is unused.
|
||||||
|
|
||||||
The list of CPUs to be used can be adjusted with these functions:
|
The list of CPUs to be used can be adjusted with these functions:
|
||||||
|
|
||||||
int padata_set_cpumask(struct padata_instance *pinst,
|
int padata_set_cpumasks(struct padata_instance *pinst,
|
||||||
|
cpumask_var_t pcpumask,
|
||||||
|
cpumask_var_t cbcpumask);
|
||||||
|
int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
|
||||||
cpumask_var_t cpumask);
|
cpumask_var_t cpumask);
|
||||||
int padata_add_cpu(struct padata_instance *pinst, int cpu);
|
int padata_add_cpu(struct padata_instance *pinst, int cpu, int mask);
|
||||||
int padata_remove_cpu(struct padata_instance *pinst, int cpu);
|
int padata_remove_cpu(struct padata_instance *pinst, int cpu, int mask);
|
||||||
|
|
||||||
Changing the CPU mask has the look of an expensive operation, though, so it
|
Changing the CPU masks are expensive operations, though, so it should not be
|
||||||
probably should not be done with great frequency.
|
done with great frequency.
|
||||||
|
|
||||||
|
It's possible to change both cpumasks of a padata instance with
|
||||||
|
padata_set_cpumasks by specifying the cpumasks for parallel execution (pcpumask)
|
||||||
|
and for the serial callback function (cbcpumask). padata_set_cpumask is to
|
||||||
|
change just one of the cpumasks. Here cpumask_type is one of PADATA_CPU_SERIAL,
|
||||||
|
PADATA_CPU_PARALLEL and cpumask specifies the new cpumask to use.
|
||||||
|
To simply add or remove one cpu from a certain cpumask the functions
|
||||||
|
padata_add_cpu/padata_remove_cpu are used. cpu specifies the cpu to add or
|
||||||
|
remove and mask is one of PADATA_CPU_SERIAL, PADATA_CPU_PARALLEL.
|
||||||
|
|
||||||
|
If a user is interested in padata cpumask changes, he can register to
|
||||||
|
the padata cpumask change notifier:
|
||||||
|
|
||||||
|
int padata_register_cpumask_notifier(struct padata_instance *pinst,
|
||||||
|
struct notifier_block *nblock);
|
||||||
|
|
||||||
|
To unregister from that notifier:
|
||||||
|
|
||||||
|
int padata_unregister_cpumask_notifier(struct padata_instance *pinst,
|
||||||
|
struct notifier_block *nblock);
|
||||||
|
|
||||||
|
The padata cpumask change notifier notifies about changes of the usable
|
||||||
|
cpumasks, i.e. the subset of active cpus in the user supplied cpumask.
|
||||||
|
|
||||||
|
Padata calls the notifier chain with:
|
||||||
|
|
||||||
|
blocking_notifier_call_chain(&pinst->cpumask_change_notifier,
|
||||||
|
notification_mask,
|
||||||
|
&pd_new->cpumask);
|
||||||
|
|
||||||
|
Here cpumask_change_notifier is registered notifier, notification_mask
|
||||||
|
is one of PADATA_CPU_SERIAL, PADATA_CPU_PARALLEL and cpumask is a pointer
|
||||||
|
to a struct padata_cpumask that contains the new cpumask informations.
|
||||||
|
|
||||||
Actually submitting work to the padata instance requires the creation of a
|
Actually submitting work to the padata instance requires the creation of a
|
||||||
padata_priv structure:
|
padata_priv structure:
|
||||||
@@ -50,7 +105,7 @@ padata_priv structure:
|
|||||||
|
|
||||||
This structure will almost certainly be embedded within some larger
|
This structure will almost certainly be embedded within some larger
|
||||||
structure specific to the work to be done. Most its fields are private to
|
structure specific to the work to be done. Most its fields are private to
|
||||||
padata, but the structure should be zeroed at initialization time, and the
|
padata, but the structure should be zeroed at initialisation time, and the
|
||||||
parallel() and serial() functions should be provided. Those functions will
|
parallel() and serial() functions should be provided. Those functions will
|
||||||
be called in the process of getting the work done as we will see
|
be called in the process of getting the work done as we will see
|
||||||
momentarily.
|
momentarily.
|
||||||
@@ -63,12 +118,10 @@ The submission of work is done with:
|
|||||||
The pinst and padata structures must be set up as described above; cb_cpu
|
The pinst and padata structures must be set up as described above; cb_cpu
|
||||||
specifies which CPU will be used for the final callback when the work is
|
specifies which CPU will be used for the final callback when the work is
|
||||||
done; it must be in the current instance's CPU mask. The return value from
|
done; it must be in the current instance's CPU mask. The return value from
|
||||||
padata_do_parallel() is a little strange; zero is an error return
|
padata_do_parallel() is zero on success, indicating that the work is in
|
||||||
indicating that the caller forgot the padata_start() formalities. -EBUSY
|
progress. -EBUSY means that somebody, somewhere else is messing with the
|
||||||
means that somebody, somewhere else is messing with the instance's CPU
|
instance's CPU mask, while -EINVAL is a complaint about cb_cpu not being
|
||||||
mask, while -EINVAL is a complaint about cb_cpu not being in that CPU mask.
|
in that CPU mask or about a not running instance.
|
||||||
If all goes well, this function will return -EINPROGRESS, indicating that
|
|
||||||
the work is in progress.
|
|
||||||
|
|
||||||
Each task submitted to padata_do_parallel() will, in turn, be passed to
|
Each task submitted to padata_do_parallel() will, in turn, be passed to
|
||||||
exactly one call to the above-mentioned parallel() function, on one CPU, so
|
exactly one call to the above-mentioned parallel() function, on one CPU, so
|
||||||
|
|||||||
@@ -5,6 +5,6 @@
|
|||||||
obj-$(CONFIG_CRYPTO_SHA1_S390) += sha1_s390.o sha_common.o
|
obj-$(CONFIG_CRYPTO_SHA1_S390) += sha1_s390.o sha_common.o
|
||||||
obj-$(CONFIG_CRYPTO_SHA256_S390) += sha256_s390.o sha_common.o
|
obj-$(CONFIG_CRYPTO_SHA256_S390) += sha256_s390.o sha_common.o
|
||||||
obj-$(CONFIG_CRYPTO_SHA512_S390) += sha512_s390.o sha_common.o
|
obj-$(CONFIG_CRYPTO_SHA512_S390) += sha512_s390.o sha_common.o
|
||||||
obj-$(CONFIG_CRYPTO_DES_S390) += des_s390.o des_check_key.o
|
obj-$(CONFIG_CRYPTO_DES_S390) += des_s390.o
|
||||||
obj-$(CONFIG_CRYPTO_AES_S390) += aes_s390.o
|
obj-$(CONFIG_CRYPTO_AES_S390) += aes_s390.o
|
||||||
obj-$(CONFIG_S390_PRNG) += prng.o
|
obj-$(CONFIG_S390_PRNG) += prng.o
|
||||||
|
|||||||
@@ -15,4 +15,4 @@
|
|||||||
|
|
||||||
extern int crypto_des_check_key(const u8*, unsigned int, u32*);
|
extern int crypto_des_check_key(const u8*, unsigned int, u32*);
|
||||||
|
|
||||||
#endif //__CRYPTO_DES_H__
|
#endif /*__CRYPTO_DES_H__*/
|
||||||
|
|||||||
+21
-217
@@ -14,32 +14,21 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <crypto/algapi.h>
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/crypto.h>
|
||||||
|
#include <crypto/algapi.h>
|
||||||
|
#include <crypto/des.h>
|
||||||
|
|
||||||
#include "crypt_s390.h"
|
#include "crypt_s390.h"
|
||||||
#include "crypto_des.h"
|
|
||||||
|
|
||||||
#define DES_BLOCK_SIZE 8
|
|
||||||
#define DES_KEY_SIZE 8
|
|
||||||
|
|
||||||
#define DES3_128_KEY_SIZE (2 * DES_KEY_SIZE)
|
|
||||||
#define DES3_128_BLOCK_SIZE DES_BLOCK_SIZE
|
|
||||||
|
|
||||||
#define DES3_192_KEY_SIZE (3 * DES_KEY_SIZE)
|
#define DES3_192_KEY_SIZE (3 * DES_KEY_SIZE)
|
||||||
#define DES3_192_BLOCK_SIZE DES_BLOCK_SIZE
|
|
||||||
|
|
||||||
struct crypt_s390_des_ctx {
|
struct crypt_s390_des_ctx {
|
||||||
u8 iv[DES_BLOCK_SIZE];
|
u8 iv[DES_BLOCK_SIZE];
|
||||||
u8 key[DES_KEY_SIZE];
|
u8 key[DES_KEY_SIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct crypt_s390_des3_128_ctx {
|
|
||||||
u8 iv[DES_BLOCK_SIZE];
|
|
||||||
u8 key[DES3_128_KEY_SIZE];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct crypt_s390_des3_192_ctx {
|
struct crypt_s390_des3_192_ctx {
|
||||||
u8 iv[DES_BLOCK_SIZE];
|
u8 iv[DES_BLOCK_SIZE];
|
||||||
u8 key[DES3_192_KEY_SIZE];
|
u8 key[DES3_192_KEY_SIZE];
|
||||||
@@ -50,13 +39,16 @@ static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
|
|||||||
{
|
{
|
||||||
struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm);
|
struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm);
|
||||||
u32 *flags = &tfm->crt_flags;
|
u32 *flags = &tfm->crt_flags;
|
||||||
int ret;
|
u32 tmp[DES_EXPKEY_WORDS];
|
||||||
|
|
||||||
/* test if key is valid (not a weak key) */
|
/* check for weak keys */
|
||||||
ret = crypto_des_check_key(key, keylen, flags);
|
if (!des_ekey(tmp, key) && (*flags & CRYPTO_TFM_REQ_WEAK_KEY)) {
|
||||||
if (ret == 0)
|
*flags |= CRYPTO_TFM_RES_WEAK_KEY;
|
||||||
memcpy(dctx->key, key, keylen);
|
return -EINVAL;
|
||||||
return ret;
|
}
|
||||||
|
|
||||||
|
memcpy(dctx->key, key, keylen);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void des_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
|
static void des_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
|
||||||
@@ -230,165 +222,6 @@ static struct crypto_alg cbc_des_alg = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* RFC2451:
|
|
||||||
*
|
|
||||||
* For DES-EDE3, there is no known need to reject weak or
|
|
||||||
* complementation keys. Any weakness is obviated by the use of
|
|
||||||
* multiple keys.
|
|
||||||
*
|
|
||||||
* However, if the two independent 64-bit keys are equal,
|
|
||||||
* then the DES3 operation is simply the same as DES.
|
|
||||||
* Implementers MUST reject keys that exhibit this property.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int des3_128_setkey(struct crypto_tfm *tfm, const u8 *key,
|
|
||||||
unsigned int keylen)
|
|
||||||
{
|
|
||||||
int i, ret;
|
|
||||||
struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm);
|
|
||||||
const u8 *temp_key = key;
|
|
||||||
u32 *flags = &tfm->crt_flags;
|
|
||||||
|
|
||||||
if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE)) &&
|
|
||||||
(*flags & CRYPTO_TFM_REQ_WEAK_KEY)) {
|
|
||||||
*flags |= CRYPTO_TFM_RES_WEAK_KEY;
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
for (i = 0; i < 2; i++, temp_key += DES_KEY_SIZE) {
|
|
||||||
ret = crypto_des_check_key(temp_key, DES_KEY_SIZE, flags);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
memcpy(dctx->key, key, keylen);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void des3_128_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
|
||||||
{
|
|
||||||
struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm);
|
|
||||||
|
|
||||||
crypt_s390_km(KM_TDEA_128_ENCRYPT, dctx->key, dst, (void*)src,
|
|
||||||
DES3_128_BLOCK_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void des3_128_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
|
||||||
{
|
|
||||||
struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm);
|
|
||||||
|
|
||||||
crypt_s390_km(KM_TDEA_128_DECRYPT, dctx->key, dst, (void*)src,
|
|
||||||
DES3_128_BLOCK_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct crypto_alg des3_128_alg = {
|
|
||||||
.cra_name = "des3_ede128",
|
|
||||||
.cra_driver_name = "des3_ede128-s390",
|
|
||||||
.cra_priority = CRYPT_S390_PRIORITY,
|
|
||||||
.cra_flags = CRYPTO_ALG_TYPE_CIPHER,
|
|
||||||
.cra_blocksize = DES3_128_BLOCK_SIZE,
|
|
||||||
.cra_ctxsize = sizeof(struct crypt_s390_des3_128_ctx),
|
|
||||||
.cra_module = THIS_MODULE,
|
|
||||||
.cra_list = LIST_HEAD_INIT(des3_128_alg.cra_list),
|
|
||||||
.cra_u = {
|
|
||||||
.cipher = {
|
|
||||||
.cia_min_keysize = DES3_128_KEY_SIZE,
|
|
||||||
.cia_max_keysize = DES3_128_KEY_SIZE,
|
|
||||||
.cia_setkey = des3_128_setkey,
|
|
||||||
.cia_encrypt = des3_128_encrypt,
|
|
||||||
.cia_decrypt = des3_128_decrypt,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static int ecb_des3_128_encrypt(struct blkcipher_desc *desc,
|
|
||||||
struct scatterlist *dst,
|
|
||||||
struct scatterlist *src, unsigned int nbytes)
|
|
||||||
{
|
|
||||||
struct crypt_s390_des3_128_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
|
|
||||||
struct blkcipher_walk walk;
|
|
||||||
|
|
||||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
|
||||||
return ecb_desall_crypt(desc, KM_TDEA_128_ENCRYPT, sctx->key, &walk);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ecb_des3_128_decrypt(struct blkcipher_desc *desc,
|
|
||||||
struct scatterlist *dst,
|
|
||||||
struct scatterlist *src, unsigned int nbytes)
|
|
||||||
{
|
|
||||||
struct crypt_s390_des3_128_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
|
|
||||||
struct blkcipher_walk walk;
|
|
||||||
|
|
||||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
|
||||||
return ecb_desall_crypt(desc, KM_TDEA_128_DECRYPT, sctx->key, &walk);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct crypto_alg ecb_des3_128_alg = {
|
|
||||||
.cra_name = "ecb(des3_ede128)",
|
|
||||||
.cra_driver_name = "ecb-des3_ede128-s390",
|
|
||||||
.cra_priority = CRYPT_S390_COMPOSITE_PRIORITY,
|
|
||||||
.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
|
|
||||||
.cra_blocksize = DES3_128_BLOCK_SIZE,
|
|
||||||
.cra_ctxsize = sizeof(struct crypt_s390_des3_128_ctx),
|
|
||||||
.cra_type = &crypto_blkcipher_type,
|
|
||||||
.cra_module = THIS_MODULE,
|
|
||||||
.cra_list = LIST_HEAD_INIT(
|
|
||||||
ecb_des3_128_alg.cra_list),
|
|
||||||
.cra_u = {
|
|
||||||
.blkcipher = {
|
|
||||||
.min_keysize = DES3_128_KEY_SIZE,
|
|
||||||
.max_keysize = DES3_128_KEY_SIZE,
|
|
||||||
.setkey = des3_128_setkey,
|
|
||||||
.encrypt = ecb_des3_128_encrypt,
|
|
||||||
.decrypt = ecb_des3_128_decrypt,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static int cbc_des3_128_encrypt(struct blkcipher_desc *desc,
|
|
||||||
struct scatterlist *dst,
|
|
||||||
struct scatterlist *src, unsigned int nbytes)
|
|
||||||
{
|
|
||||||
struct crypt_s390_des3_128_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
|
|
||||||
struct blkcipher_walk walk;
|
|
||||||
|
|
||||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
|
||||||
return cbc_desall_crypt(desc, KMC_TDEA_128_ENCRYPT, sctx->iv, &walk);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cbc_des3_128_decrypt(struct blkcipher_desc *desc,
|
|
||||||
struct scatterlist *dst,
|
|
||||||
struct scatterlist *src, unsigned int nbytes)
|
|
||||||
{
|
|
||||||
struct crypt_s390_des3_128_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
|
|
||||||
struct blkcipher_walk walk;
|
|
||||||
|
|
||||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
|
||||||
return cbc_desall_crypt(desc, KMC_TDEA_128_DECRYPT, sctx->iv, &walk);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct crypto_alg cbc_des3_128_alg = {
|
|
||||||
.cra_name = "cbc(des3_ede128)",
|
|
||||||
.cra_driver_name = "cbc-des3_ede128-s390",
|
|
||||||
.cra_priority = CRYPT_S390_COMPOSITE_PRIORITY,
|
|
||||||
.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
|
|
||||||
.cra_blocksize = DES3_128_BLOCK_SIZE,
|
|
||||||
.cra_ctxsize = sizeof(struct crypt_s390_des3_128_ctx),
|
|
||||||
.cra_type = &crypto_blkcipher_type,
|
|
||||||
.cra_module = THIS_MODULE,
|
|
||||||
.cra_list = LIST_HEAD_INIT(
|
|
||||||
cbc_des3_128_alg.cra_list),
|
|
||||||
.cra_u = {
|
|
||||||
.blkcipher = {
|
|
||||||
.min_keysize = DES3_128_KEY_SIZE,
|
|
||||||
.max_keysize = DES3_128_KEY_SIZE,
|
|
||||||
.ivsize = DES3_128_BLOCK_SIZE,
|
|
||||||
.setkey = des3_128_setkey,
|
|
||||||
.encrypt = cbc_des3_128_encrypt,
|
|
||||||
.decrypt = cbc_des3_128_decrypt,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RFC2451:
|
* RFC2451:
|
||||||
*
|
*
|
||||||
@@ -405,9 +238,7 @@ static struct crypto_alg cbc_des3_128_alg = {
|
|||||||
static int des3_192_setkey(struct crypto_tfm *tfm, const u8 *key,
|
static int des3_192_setkey(struct crypto_tfm *tfm, const u8 *key,
|
||||||
unsigned int keylen)
|
unsigned int keylen)
|
||||||
{
|
{
|
||||||
int i, ret;
|
|
||||||
struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);
|
struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);
|
||||||
const u8 *temp_key = key;
|
|
||||||
u32 *flags = &tfm->crt_flags;
|
u32 *flags = &tfm->crt_flags;
|
||||||
|
|
||||||
if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) &&
|
if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) &&
|
||||||
@@ -417,11 +248,6 @@ static int des3_192_setkey(struct crypto_tfm *tfm, const u8 *key,
|
|||||||
*flags |= CRYPTO_TFM_RES_WEAK_KEY;
|
*flags |= CRYPTO_TFM_RES_WEAK_KEY;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
for (i = 0; i < 3; i++, temp_key += DES_KEY_SIZE) {
|
|
||||||
ret = crypto_des_check_key(temp_key, DES_KEY_SIZE, flags);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
memcpy(dctx->key, key, keylen);
|
memcpy(dctx->key, key, keylen);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -431,7 +257,7 @@ static void des3_192_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
|||||||
struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);
|
struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);
|
||||||
|
|
||||||
crypt_s390_km(KM_TDEA_192_ENCRYPT, dctx->key, dst, (void*)src,
|
crypt_s390_km(KM_TDEA_192_ENCRYPT, dctx->key, dst, (void*)src,
|
||||||
DES3_192_BLOCK_SIZE);
|
DES_BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void des3_192_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
static void des3_192_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
||||||
@@ -439,7 +265,7 @@ static void des3_192_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
|
|||||||
struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);
|
struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);
|
||||||
|
|
||||||
crypt_s390_km(KM_TDEA_192_DECRYPT, dctx->key, dst, (void*)src,
|
crypt_s390_km(KM_TDEA_192_DECRYPT, dctx->key, dst, (void*)src,
|
||||||
DES3_192_BLOCK_SIZE);
|
DES_BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct crypto_alg des3_192_alg = {
|
static struct crypto_alg des3_192_alg = {
|
||||||
@@ -447,7 +273,7 @@ static struct crypto_alg des3_192_alg = {
|
|||||||
.cra_driver_name = "des3_ede-s390",
|
.cra_driver_name = "des3_ede-s390",
|
||||||
.cra_priority = CRYPT_S390_PRIORITY,
|
.cra_priority = CRYPT_S390_PRIORITY,
|
||||||
.cra_flags = CRYPTO_ALG_TYPE_CIPHER,
|
.cra_flags = CRYPTO_ALG_TYPE_CIPHER,
|
||||||
.cra_blocksize = DES3_192_BLOCK_SIZE,
|
.cra_blocksize = DES_BLOCK_SIZE,
|
||||||
.cra_ctxsize = sizeof(struct crypt_s390_des3_192_ctx),
|
.cra_ctxsize = sizeof(struct crypt_s390_des3_192_ctx),
|
||||||
.cra_module = THIS_MODULE,
|
.cra_module = THIS_MODULE,
|
||||||
.cra_list = LIST_HEAD_INIT(des3_192_alg.cra_list),
|
.cra_list = LIST_HEAD_INIT(des3_192_alg.cra_list),
|
||||||
@@ -489,7 +315,7 @@ static struct crypto_alg ecb_des3_192_alg = {
|
|||||||
.cra_driver_name = "ecb-des3_ede-s390",
|
.cra_driver_name = "ecb-des3_ede-s390",
|
||||||
.cra_priority = CRYPT_S390_COMPOSITE_PRIORITY,
|
.cra_priority = CRYPT_S390_COMPOSITE_PRIORITY,
|
||||||
.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
|
.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
|
||||||
.cra_blocksize = DES3_192_BLOCK_SIZE,
|
.cra_blocksize = DES_BLOCK_SIZE,
|
||||||
.cra_ctxsize = sizeof(struct crypt_s390_des3_192_ctx),
|
.cra_ctxsize = sizeof(struct crypt_s390_des3_192_ctx),
|
||||||
.cra_type = &crypto_blkcipher_type,
|
.cra_type = &crypto_blkcipher_type,
|
||||||
.cra_module = THIS_MODULE,
|
.cra_module = THIS_MODULE,
|
||||||
@@ -533,7 +359,7 @@ static struct crypto_alg cbc_des3_192_alg = {
|
|||||||
.cra_driver_name = "cbc-des3_ede-s390",
|
.cra_driver_name = "cbc-des3_ede-s390",
|
||||||
.cra_priority = CRYPT_S390_COMPOSITE_PRIORITY,
|
.cra_priority = CRYPT_S390_COMPOSITE_PRIORITY,
|
||||||
.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
|
.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
|
||||||
.cra_blocksize = DES3_192_BLOCK_SIZE,
|
.cra_blocksize = DES_BLOCK_SIZE,
|
||||||
.cra_ctxsize = sizeof(struct crypt_s390_des3_192_ctx),
|
.cra_ctxsize = sizeof(struct crypt_s390_des3_192_ctx),
|
||||||
.cra_type = &crypto_blkcipher_type,
|
.cra_type = &crypto_blkcipher_type,
|
||||||
.cra_module = THIS_MODULE,
|
.cra_module = THIS_MODULE,
|
||||||
@@ -543,7 +369,7 @@ static struct crypto_alg cbc_des3_192_alg = {
|
|||||||
.blkcipher = {
|
.blkcipher = {
|
||||||
.min_keysize = DES3_192_KEY_SIZE,
|
.min_keysize = DES3_192_KEY_SIZE,
|
||||||
.max_keysize = DES3_192_KEY_SIZE,
|
.max_keysize = DES3_192_KEY_SIZE,
|
||||||
.ivsize = DES3_192_BLOCK_SIZE,
|
.ivsize = DES_BLOCK_SIZE,
|
||||||
.setkey = des3_192_setkey,
|
.setkey = des3_192_setkey,
|
||||||
.encrypt = cbc_des3_192_encrypt,
|
.encrypt = cbc_des3_192_encrypt,
|
||||||
.decrypt = cbc_des3_192_decrypt,
|
.decrypt = cbc_des3_192_decrypt,
|
||||||
@@ -553,10 +379,9 @@ static struct crypto_alg cbc_des3_192_alg = {
|
|||||||
|
|
||||||
static int des_s390_init(void)
|
static int des_s390_init(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret;
|
||||||
|
|
||||||
if (!crypt_s390_func_available(KM_DEA_ENCRYPT) ||
|
if (!crypt_s390_func_available(KM_DEA_ENCRYPT) ||
|
||||||
!crypt_s390_func_available(KM_TDEA_128_ENCRYPT) ||
|
|
||||||
!crypt_s390_func_available(KM_TDEA_192_ENCRYPT))
|
!crypt_s390_func_available(KM_TDEA_192_ENCRYPT))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
@@ -569,17 +394,6 @@ static int des_s390_init(void)
|
|||||||
ret = crypto_register_alg(&cbc_des_alg);
|
ret = crypto_register_alg(&cbc_des_alg);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto cbc_des_err;
|
goto cbc_des_err;
|
||||||
|
|
||||||
ret = crypto_register_alg(&des3_128_alg);
|
|
||||||
if (ret)
|
|
||||||
goto des3_128_err;
|
|
||||||
ret = crypto_register_alg(&ecb_des3_128_alg);
|
|
||||||
if (ret)
|
|
||||||
goto ecb_des3_128_err;
|
|
||||||
ret = crypto_register_alg(&cbc_des3_128_alg);
|
|
||||||
if (ret)
|
|
||||||
goto cbc_des3_128_err;
|
|
||||||
|
|
||||||
ret = crypto_register_alg(&des3_192_alg);
|
ret = crypto_register_alg(&des3_192_alg);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto des3_192_err;
|
goto des3_192_err;
|
||||||
@@ -589,7 +403,6 @@ static int des_s390_init(void)
|
|||||||
ret = crypto_register_alg(&cbc_des3_192_alg);
|
ret = crypto_register_alg(&cbc_des3_192_alg);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto cbc_des3_192_err;
|
goto cbc_des3_192_err;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -598,12 +411,6 @@ cbc_des3_192_err:
|
|||||||
ecb_des3_192_err:
|
ecb_des3_192_err:
|
||||||
crypto_unregister_alg(&des3_192_alg);
|
crypto_unregister_alg(&des3_192_alg);
|
||||||
des3_192_err:
|
des3_192_err:
|
||||||
crypto_unregister_alg(&cbc_des3_128_alg);
|
|
||||||
cbc_des3_128_err:
|
|
||||||
crypto_unregister_alg(&ecb_des3_128_alg);
|
|
||||||
ecb_des3_128_err:
|
|
||||||
crypto_unregister_alg(&des3_128_alg);
|
|
||||||
des3_128_err:
|
|
||||||
crypto_unregister_alg(&cbc_des_alg);
|
crypto_unregister_alg(&cbc_des_alg);
|
||||||
cbc_des_err:
|
cbc_des_err:
|
||||||
crypto_unregister_alg(&ecb_des_alg);
|
crypto_unregister_alg(&ecb_des_alg);
|
||||||
@@ -613,21 +420,18 @@ des_err:
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit des_s390_fini(void)
|
static void __exit des_s390_exit(void)
|
||||||
{
|
{
|
||||||
crypto_unregister_alg(&cbc_des3_192_alg);
|
crypto_unregister_alg(&cbc_des3_192_alg);
|
||||||
crypto_unregister_alg(&ecb_des3_192_alg);
|
crypto_unregister_alg(&ecb_des3_192_alg);
|
||||||
crypto_unregister_alg(&des3_192_alg);
|
crypto_unregister_alg(&des3_192_alg);
|
||||||
crypto_unregister_alg(&cbc_des3_128_alg);
|
|
||||||
crypto_unregister_alg(&ecb_des3_128_alg);
|
|
||||||
crypto_unregister_alg(&des3_128_alg);
|
|
||||||
crypto_unregister_alg(&cbc_des_alg);
|
crypto_unregister_alg(&cbc_des_alg);
|
||||||
crypto_unregister_alg(&ecb_des_alg);
|
crypto_unregister_alg(&ecb_des_alg);
|
||||||
crypto_unregister_alg(&des_alg);
|
crypto_unregister_alg(&des_alg);
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(des_s390_init);
|
module_init(des_s390_init);
|
||||||
module_exit(des_s390_fini);
|
module_exit(des_s390_exit);
|
||||||
|
|
||||||
MODULE_ALIAS("des");
|
MODULE_ALIAS("des");
|
||||||
MODULE_ALIAS("des3_ede");
|
MODULE_ALIAS("des3_ede");
|
||||||
|
|||||||
+14
-1
@@ -79,6 +79,11 @@ config CRYPTO_RNG2
|
|||||||
select CRYPTO_ALGAPI2
|
select CRYPTO_ALGAPI2
|
||||||
|
|
||||||
config CRYPTO_PCOMP
|
config CRYPTO_PCOMP
|
||||||
|
tristate
|
||||||
|
select CRYPTO_PCOMP2
|
||||||
|
select CRYPTO_ALGAPI
|
||||||
|
|
||||||
|
config CRYPTO_PCOMP2
|
||||||
tristate
|
tristate
|
||||||
select CRYPTO_ALGAPI2
|
select CRYPTO_ALGAPI2
|
||||||
|
|
||||||
@@ -94,7 +99,15 @@ config CRYPTO_MANAGER2
|
|||||||
select CRYPTO_AEAD2
|
select CRYPTO_AEAD2
|
||||||
select CRYPTO_HASH2
|
select CRYPTO_HASH2
|
||||||
select CRYPTO_BLKCIPHER2
|
select CRYPTO_BLKCIPHER2
|
||||||
select CRYPTO_PCOMP
|
select CRYPTO_PCOMP2
|
||||||
|
|
||||||
|
config CRYPTO_MANAGER_TESTS
|
||||||
|
bool "Run algolithms' self-tests"
|
||||||
|
default y
|
||||||
|
depends on CRYPTO_MANAGER2
|
||||||
|
help
|
||||||
|
Run cryptomanager's tests for the new crypto algorithms being
|
||||||
|
registered.
|
||||||
|
|
||||||
config CRYPTO_GF128MUL
|
config CRYPTO_GF128MUL
|
||||||
tristate "GF(2^128) multiplication functions (EXPERIMENTAL)"
|
tristate "GF(2^128) multiplication functions (EXPERIMENTAL)"
|
||||||
|
|||||||
+2
-2
@@ -26,7 +26,7 @@ crypto_hash-objs += ahash.o
|
|||||||
crypto_hash-objs += shash.o
|
crypto_hash-objs += shash.o
|
||||||
obj-$(CONFIG_CRYPTO_HASH2) += crypto_hash.o
|
obj-$(CONFIG_CRYPTO_HASH2) += crypto_hash.o
|
||||||
|
|
||||||
obj-$(CONFIG_CRYPTO_PCOMP) += pcompress.o
|
obj-$(CONFIG_CRYPTO_PCOMP2) += pcompress.o
|
||||||
|
|
||||||
cryptomgr-objs := algboss.o testmgr.o
|
cryptomgr-objs := algboss.o testmgr.o
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ obj-$(CONFIG_CRYPTO_CRYPTD) += cryptd.o
|
|||||||
obj-$(CONFIG_CRYPTO_DES) += des_generic.o
|
obj-$(CONFIG_CRYPTO_DES) += des_generic.o
|
||||||
obj-$(CONFIG_CRYPTO_FCRYPT) += fcrypt.o
|
obj-$(CONFIG_CRYPTO_FCRYPT) += fcrypt.o
|
||||||
obj-$(CONFIG_CRYPTO_BLOWFISH) += blowfish.o
|
obj-$(CONFIG_CRYPTO_BLOWFISH) += blowfish.o
|
||||||
obj-$(CONFIG_CRYPTO_TWOFISH) += twofish.o
|
obj-$(CONFIG_CRYPTO_TWOFISH) += twofish_generic.o
|
||||||
obj-$(CONFIG_CRYPTO_TWOFISH_COMMON) += twofish_common.o
|
obj-$(CONFIG_CRYPTO_TWOFISH_COMMON) += twofish_common.o
|
||||||
obj-$(CONFIG_CRYPTO_SERPENT) += serpent.o
|
obj-$(CONFIG_CRYPTO_SERPENT) += serpent.o
|
||||||
obj-$(CONFIG_CRYPTO_AES) += aes_generic.o
|
obj-$(CONFIG_CRYPTO_AES) += aes_generic.o
|
||||||
|
|||||||
@@ -206,6 +206,7 @@ err:
|
|||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_CRYPTO_MANAGER_TESTS
|
||||||
static int cryptomgr_test(void *data)
|
static int cryptomgr_test(void *data)
|
||||||
{
|
{
|
||||||
struct crypto_test_param *param = data;
|
struct crypto_test_param *param = data;
|
||||||
@@ -266,6 +267,7 @@ err_put_module:
|
|||||||
err:
|
err:
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_CRYPTO_MANAGER_TESTS */
|
||||||
|
|
||||||
static int cryptomgr_notify(struct notifier_block *this, unsigned long msg,
|
static int cryptomgr_notify(struct notifier_block *this, unsigned long msg,
|
||||||
void *data)
|
void *data)
|
||||||
@@ -273,8 +275,10 @@ static int cryptomgr_notify(struct notifier_block *this, unsigned long msg,
|
|||||||
switch (msg) {
|
switch (msg) {
|
||||||
case CRYPTO_MSG_ALG_REQUEST:
|
case CRYPTO_MSG_ALG_REQUEST:
|
||||||
return cryptomgr_schedule_probe(data);
|
return cryptomgr_schedule_probe(data);
|
||||||
|
#ifdef CONFIG_CRYPTO_MANAGER_TESTS
|
||||||
case CRYPTO_MSG_ALG_REGISTER:
|
case CRYPTO_MSG_ALG_REGISTER:
|
||||||
return cryptomgr_schedule_test(data);
|
return cryptomgr_schedule_test(data);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return NOTIFY_DONE;
|
return NOTIFY_DONE;
|
||||||
|
|||||||
+1
-1
@@ -616,7 +616,7 @@ static struct crypto_instance *crypto_authenc_alloc(struct rtattr **tb)
|
|||||||
auth = ahash_attr_alg(tb[1], CRYPTO_ALG_TYPE_HASH,
|
auth = ahash_attr_alg(tb[1], CRYPTO_ALG_TYPE_HASH,
|
||||||
CRYPTO_ALG_TYPE_AHASH_MASK);
|
CRYPTO_ALG_TYPE_AHASH_MASK);
|
||||||
if (IS_ERR(auth))
|
if (IS_ERR(auth))
|
||||||
return ERR_PTR(PTR_ERR(auth));
|
return ERR_CAST(auth);
|
||||||
|
|
||||||
auth_base = &auth->base;
|
auth_base = &auth->base;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -185,7 +185,7 @@ static struct crypto_instance *crypto_ctr_alloc(struct rtattr **tb)
|
|||||||
alg = crypto_attr_alg(tb[1], CRYPTO_ALG_TYPE_CIPHER,
|
alg = crypto_attr_alg(tb[1], CRYPTO_ALG_TYPE_CIPHER,
|
||||||
CRYPTO_ALG_TYPE_MASK);
|
CRYPTO_ALG_TYPE_MASK);
|
||||||
if (IS_ERR(alg))
|
if (IS_ERR(alg))
|
||||||
return ERR_PTR(PTR_ERR(alg));
|
return ERR_CAST(alg);
|
||||||
|
|
||||||
/* Block size must be >= 4 bytes. */
|
/* Block size must be >= 4 bytes. */
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
|
|||||||
+183
-58
@@ -24,12 +24,40 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/notifier.h>
|
||||||
|
#include <linux/kobject.h>
|
||||||
|
#include <linux/cpu.h>
|
||||||
#include <crypto/pcrypt.h>
|
#include <crypto/pcrypt.h>
|
||||||
|
|
||||||
static struct padata_instance *pcrypt_enc_padata;
|
struct padata_pcrypt {
|
||||||
static struct padata_instance *pcrypt_dec_padata;
|
struct padata_instance *pinst;
|
||||||
static struct workqueue_struct *encwq;
|
struct workqueue_struct *wq;
|
||||||
static struct workqueue_struct *decwq;
|
|
||||||
|
/*
|
||||||
|
* Cpumask for callback CPUs. It should be
|
||||||
|
* equal to serial cpumask of corresponding padata instance,
|
||||||
|
* so it is updated when padata notifies us about serial
|
||||||
|
* cpumask change.
|
||||||
|
*
|
||||||
|
* cb_cpumask is protected by RCU. This fact prevents us from
|
||||||
|
* using cpumask_var_t directly because the actual type of
|
||||||
|
* cpumsak_var_t depends on kernel configuration(particularly on
|
||||||
|
* CONFIG_CPUMASK_OFFSTACK macro). Depending on the configuration
|
||||||
|
* cpumask_var_t may be either a pointer to the struct cpumask
|
||||||
|
* or a variable allocated on the stack. Thus we can not safely use
|
||||||
|
* cpumask_var_t with RCU operations such as rcu_assign_pointer or
|
||||||
|
* rcu_dereference. So cpumask_var_t is wrapped with struct
|
||||||
|
* pcrypt_cpumask which makes possible to use it with RCU.
|
||||||
|
*/
|
||||||
|
struct pcrypt_cpumask {
|
||||||
|
cpumask_var_t mask;
|
||||||
|
} *cb_cpumask;
|
||||||
|
struct notifier_block nblock;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct padata_pcrypt pencrypt;
|
||||||
|
static struct padata_pcrypt pdecrypt;
|
||||||
|
static struct kset *pcrypt_kset;
|
||||||
|
|
||||||
struct pcrypt_instance_ctx {
|
struct pcrypt_instance_ctx {
|
||||||
struct crypto_spawn spawn;
|
struct crypto_spawn spawn;
|
||||||
@@ -42,25 +70,32 @@ struct pcrypt_aead_ctx {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int pcrypt_do_parallel(struct padata_priv *padata, unsigned int *cb_cpu,
|
static int pcrypt_do_parallel(struct padata_priv *padata, unsigned int *cb_cpu,
|
||||||
struct padata_instance *pinst)
|
struct padata_pcrypt *pcrypt)
|
||||||
{
|
{
|
||||||
unsigned int cpu_index, cpu, i;
|
unsigned int cpu_index, cpu, i;
|
||||||
|
struct pcrypt_cpumask *cpumask;
|
||||||
|
|
||||||
cpu = *cb_cpu;
|
cpu = *cb_cpu;
|
||||||
|
|
||||||
if (cpumask_test_cpu(cpu, cpu_active_mask))
|
rcu_read_lock_bh();
|
||||||
|
cpumask = rcu_dereference(pcrypt->cb_cpumask);
|
||||||
|
if (cpumask_test_cpu(cpu, cpumask->mask))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
cpu_index = cpu % cpumask_weight(cpu_active_mask);
|
if (!cpumask_weight(cpumask->mask))
|
||||||
|
goto out;
|
||||||
|
|
||||||
cpu = cpumask_first(cpu_active_mask);
|
cpu_index = cpu % cpumask_weight(cpumask->mask);
|
||||||
|
|
||||||
|
cpu = cpumask_first(cpumask->mask);
|
||||||
for (i = 0; i < cpu_index; i++)
|
for (i = 0; i < cpu_index; i++)
|
||||||
cpu = cpumask_next(cpu, cpu_active_mask);
|
cpu = cpumask_next(cpu, cpumask->mask);
|
||||||
|
|
||||||
*cb_cpu = cpu;
|
*cb_cpu = cpu;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return padata_do_parallel(pinst, padata, cpu);
|
rcu_read_unlock_bh();
|
||||||
|
return padata_do_parallel(pcrypt->pinst, padata, cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pcrypt_aead_setkey(struct crypto_aead *parent,
|
static int pcrypt_aead_setkey(struct crypto_aead *parent,
|
||||||
@@ -142,11 +177,9 @@ static int pcrypt_aead_encrypt(struct aead_request *req)
|
|||||||
req->cryptlen, req->iv);
|
req->cryptlen, req->iv);
|
||||||
aead_request_set_assoc(creq, req->assoc, req->assoclen);
|
aead_request_set_assoc(creq, req->assoc, req->assoclen);
|
||||||
|
|
||||||
err = pcrypt_do_parallel(padata, &ctx->cb_cpu, pcrypt_enc_padata);
|
err = pcrypt_do_parallel(padata, &ctx->cb_cpu, &pencrypt);
|
||||||
if (err)
|
if (!err)
|
||||||
return err;
|
return -EINPROGRESS;
|
||||||
else
|
|
||||||
err = crypto_aead_encrypt(creq);
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -186,11 +219,9 @@ static int pcrypt_aead_decrypt(struct aead_request *req)
|
|||||||
req->cryptlen, req->iv);
|
req->cryptlen, req->iv);
|
||||||
aead_request_set_assoc(creq, req->assoc, req->assoclen);
|
aead_request_set_assoc(creq, req->assoc, req->assoclen);
|
||||||
|
|
||||||
err = pcrypt_do_parallel(padata, &ctx->cb_cpu, pcrypt_dec_padata);
|
err = pcrypt_do_parallel(padata, &ctx->cb_cpu, &pdecrypt);
|
||||||
if (err)
|
if (!err)
|
||||||
return err;
|
return -EINPROGRESS;
|
||||||
else
|
|
||||||
err = crypto_aead_decrypt(creq);
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -232,11 +263,9 @@ static int pcrypt_aead_givencrypt(struct aead_givcrypt_request *req)
|
|||||||
aead_givcrypt_set_assoc(creq, areq->assoc, areq->assoclen);
|
aead_givcrypt_set_assoc(creq, areq->assoc, areq->assoclen);
|
||||||
aead_givcrypt_set_giv(creq, req->giv, req->seq);
|
aead_givcrypt_set_giv(creq, req->giv, req->seq);
|
||||||
|
|
||||||
err = pcrypt_do_parallel(padata, &ctx->cb_cpu, pcrypt_enc_padata);
|
err = pcrypt_do_parallel(padata, &ctx->cb_cpu, &pencrypt);
|
||||||
if (err)
|
if (!err)
|
||||||
return err;
|
return -EINPROGRESS;
|
||||||
else
|
|
||||||
err = crypto_aead_givencrypt(creq);
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -376,6 +405,115 @@ static void pcrypt_free(struct crypto_instance *inst)
|
|||||||
kfree(inst);
|
kfree(inst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pcrypt_cpumask_change_notify(struct notifier_block *self,
|
||||||
|
unsigned long val, void *data)
|
||||||
|
{
|
||||||
|
struct padata_pcrypt *pcrypt;
|
||||||
|
struct pcrypt_cpumask *new_mask, *old_mask;
|
||||||
|
struct padata_cpumask *cpumask = (struct padata_cpumask *)data;
|
||||||
|
|
||||||
|
if (!(val & PADATA_CPU_SERIAL))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
pcrypt = container_of(self, struct padata_pcrypt, nblock);
|
||||||
|
new_mask = kmalloc(sizeof(*new_mask), GFP_KERNEL);
|
||||||
|
if (!new_mask)
|
||||||
|
return -ENOMEM;
|
||||||
|
if (!alloc_cpumask_var(&new_mask->mask, GFP_KERNEL)) {
|
||||||
|
kfree(new_mask);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
old_mask = pcrypt->cb_cpumask;
|
||||||
|
|
||||||
|
cpumask_copy(new_mask->mask, cpumask->cbcpu);
|
||||||
|
rcu_assign_pointer(pcrypt->cb_cpumask, new_mask);
|
||||||
|
synchronize_rcu_bh();
|
||||||
|
|
||||||
|
free_cpumask_var(old_mask->mask);
|
||||||
|
kfree(old_mask);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pcrypt_sysfs_add(struct padata_instance *pinst, const char *name)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
pinst->kobj.kset = pcrypt_kset;
|
||||||
|
ret = kobject_add(&pinst->kobj, NULL, name);
|
||||||
|
if (!ret)
|
||||||
|
kobject_uevent(&pinst->kobj, KOBJ_ADD);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pcrypt_init_padata(struct padata_pcrypt *pcrypt,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
int ret = -ENOMEM;
|
||||||
|
struct pcrypt_cpumask *mask;
|
||||||
|
|
||||||
|
get_online_cpus();
|
||||||
|
|
||||||
|
pcrypt->wq = create_workqueue(name);
|
||||||
|
if (!pcrypt->wq)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
pcrypt->pinst = padata_alloc_possible(pcrypt->wq);
|
||||||
|
if (!pcrypt->pinst)
|
||||||
|
goto err_destroy_workqueue;
|
||||||
|
|
||||||
|
mask = kmalloc(sizeof(*mask), GFP_KERNEL);
|
||||||
|
if (!mask)
|
||||||
|
goto err_free_padata;
|
||||||
|
if (!alloc_cpumask_var(&mask->mask, GFP_KERNEL)) {
|
||||||
|
kfree(mask);
|
||||||
|
goto err_free_padata;
|
||||||
|
}
|
||||||
|
|
||||||
|
cpumask_and(mask->mask, cpu_possible_mask, cpu_active_mask);
|
||||||
|
rcu_assign_pointer(pcrypt->cb_cpumask, mask);
|
||||||
|
|
||||||
|
pcrypt->nblock.notifier_call = pcrypt_cpumask_change_notify;
|
||||||
|
ret = padata_register_cpumask_notifier(pcrypt->pinst, &pcrypt->nblock);
|
||||||
|
if (ret)
|
||||||
|
goto err_free_cpumask;
|
||||||
|
|
||||||
|
ret = pcrypt_sysfs_add(pcrypt->pinst, name);
|
||||||
|
if (ret)
|
||||||
|
goto err_unregister_notifier;
|
||||||
|
|
||||||
|
put_online_cpus();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
err_unregister_notifier:
|
||||||
|
padata_unregister_cpumask_notifier(pcrypt->pinst, &pcrypt->nblock);
|
||||||
|
err_free_cpumask:
|
||||||
|
free_cpumask_var(mask->mask);
|
||||||
|
kfree(mask);
|
||||||
|
err_free_padata:
|
||||||
|
padata_free(pcrypt->pinst);
|
||||||
|
err_destroy_workqueue:
|
||||||
|
destroy_workqueue(pcrypt->wq);
|
||||||
|
err:
|
||||||
|
put_online_cpus();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pcrypt_fini_padata(struct padata_pcrypt *pcrypt)
|
||||||
|
{
|
||||||
|
kobject_put(&pcrypt->pinst->kobj);
|
||||||
|
free_cpumask_var(pcrypt->cb_cpumask->mask);
|
||||||
|
kfree(pcrypt->cb_cpumask);
|
||||||
|
|
||||||
|
padata_stop(pcrypt->pinst);
|
||||||
|
padata_unregister_cpumask_notifier(pcrypt->pinst, &pcrypt->nblock);
|
||||||
|
destroy_workqueue(pcrypt->wq);
|
||||||
|
padata_free(pcrypt->pinst);
|
||||||
|
}
|
||||||
|
|
||||||
static struct crypto_template pcrypt_tmpl = {
|
static struct crypto_template pcrypt_tmpl = {
|
||||||
.name = "pcrypt",
|
.name = "pcrypt",
|
||||||
.alloc = pcrypt_alloc,
|
.alloc = pcrypt_alloc,
|
||||||
@@ -385,52 +523,39 @@ static struct crypto_template pcrypt_tmpl = {
|
|||||||
|
|
||||||
static int __init pcrypt_init(void)
|
static int __init pcrypt_init(void)
|
||||||
{
|
{
|
||||||
encwq = create_workqueue("pencrypt");
|
int err = -ENOMEM;
|
||||||
if (!encwq)
|
|
||||||
|
pcrypt_kset = kset_create_and_add("pcrypt", NULL, kernel_kobj);
|
||||||
|
if (!pcrypt_kset)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
decwq = create_workqueue("pdecrypt");
|
err = pcrypt_init_padata(&pencrypt, "pencrypt");
|
||||||
if (!decwq)
|
if (err)
|
||||||
goto err_destroy_encwq;
|
goto err_unreg_kset;
|
||||||
|
|
||||||
|
err = pcrypt_init_padata(&pdecrypt, "pdecrypt");
|
||||||
|
if (err)
|
||||||
|
goto err_deinit_pencrypt;
|
||||||
|
|
||||||
pcrypt_enc_padata = padata_alloc(cpu_possible_mask, encwq);
|
padata_start(pencrypt.pinst);
|
||||||
if (!pcrypt_enc_padata)
|
padata_start(pdecrypt.pinst);
|
||||||
goto err_destroy_decwq;
|
|
||||||
|
|
||||||
pcrypt_dec_padata = padata_alloc(cpu_possible_mask, decwq);
|
|
||||||
if (!pcrypt_dec_padata)
|
|
||||||
goto err_free_padata;
|
|
||||||
|
|
||||||
padata_start(pcrypt_enc_padata);
|
|
||||||
padata_start(pcrypt_dec_padata);
|
|
||||||
|
|
||||||
return crypto_register_template(&pcrypt_tmpl);
|
return crypto_register_template(&pcrypt_tmpl);
|
||||||
|
|
||||||
err_free_padata:
|
err_deinit_pencrypt:
|
||||||
padata_free(pcrypt_enc_padata);
|
pcrypt_fini_padata(&pencrypt);
|
||||||
|
err_unreg_kset:
|
||||||
err_destroy_decwq:
|
kset_unregister(pcrypt_kset);
|
||||||
destroy_workqueue(decwq);
|
|
||||||
|
|
||||||
err_destroy_encwq:
|
|
||||||
destroy_workqueue(encwq);
|
|
||||||
|
|
||||||
err:
|
err:
|
||||||
return -ENOMEM;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit pcrypt_exit(void)
|
static void __exit pcrypt_exit(void)
|
||||||
{
|
{
|
||||||
padata_stop(pcrypt_enc_padata);
|
pcrypt_fini_padata(&pencrypt);
|
||||||
padata_stop(pcrypt_dec_padata);
|
pcrypt_fini_padata(&pdecrypt);
|
||||||
|
|
||||||
destroy_workqueue(encwq);
|
|
||||||
destroy_workqueue(decwq);
|
|
||||||
|
|
||||||
padata_free(pcrypt_enc_padata);
|
|
||||||
padata_free(pcrypt_dec_padata);
|
|
||||||
|
|
||||||
|
kset_unregister(pcrypt_kset);
|
||||||
crypto_unregister_template(&pcrypt_tmpl);
|
crypto_unregister_template(&pcrypt_tmpl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,17 @@
|
|||||||
#include <crypto/rng.h>
|
#include <crypto/rng.h>
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
|
#ifndef CONFIG_CRYPTO_MANAGER_TESTS
|
||||||
|
|
||||||
|
/* a perfect nop */
|
||||||
|
int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
#include "testmgr.h"
|
#include "testmgr.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2530,4 +2541,7 @@ notest:
|
|||||||
non_fips_alg:
|
non_fips_alg:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_CRYPTO_MANAGER_TESTS */
|
||||||
|
|
||||||
EXPORT_SYMBOL_GPL(alg_test);
|
EXPORT_SYMBOL_GPL(alg_test);
|
||||||
|
|||||||
@@ -212,3 +212,4 @@ module_exit(twofish_mod_fini);
|
|||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_DESCRIPTION ("Twofish Cipher Algorithm");
|
MODULE_DESCRIPTION ("Twofish Cipher Algorithm");
|
||||||
|
MODULE_ALIAS("twofish");
|
||||||
+1
-1
@@ -224,7 +224,7 @@ static struct crypto_instance *alloc(struct rtattr **tb)
|
|||||||
alg = crypto_get_attr_alg(tb, CRYPTO_ALG_TYPE_CIPHER,
|
alg = crypto_get_attr_alg(tb, CRYPTO_ALG_TYPE_CIPHER,
|
||||||
CRYPTO_ALG_TYPE_MASK);
|
CRYPTO_ALG_TYPE_MASK);
|
||||||
if (IS_ERR(alg))
|
if (IS_ERR(alg))
|
||||||
return ERR_PTR(PTR_ERR(alg));
|
return ERR_CAST(alg);
|
||||||
|
|
||||||
inst = crypto_alloc_instance("xts", alg);
|
inst = crypto_alloc_instance("xts", alg);
|
||||||
if (IS_ERR(inst))
|
if (IS_ERR(inst))
|
||||||
|
|||||||
@@ -387,7 +387,7 @@ static int n2rng_init_control(struct n2rng *np)
|
|||||||
|
|
||||||
static int n2rng_data_read(struct hwrng *rng, u32 *data)
|
static int n2rng_data_read(struct hwrng *rng, u32 *data)
|
||||||
{
|
{
|
||||||
struct n2rng *np = (struct n2rng *) rng->priv;
|
struct n2rng *np = rng->priv;
|
||||||
unsigned long ra = __pa(&np->test_data);
|
unsigned long ra = __pa(&np->test_data);
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
|
|||||||
@@ -407,8 +407,8 @@ struct entropy_store {
|
|||||||
struct poolinfo *poolinfo;
|
struct poolinfo *poolinfo;
|
||||||
__u32 *pool;
|
__u32 *pool;
|
||||||
const char *name;
|
const char *name;
|
||||||
int limit;
|
|
||||||
struct entropy_store *pull;
|
struct entropy_store *pull;
|
||||||
|
int limit;
|
||||||
|
|
||||||
/* read-write data: */
|
/* read-write data: */
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
|
|||||||
@@ -573,7 +573,7 @@ geode_aes_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_device_id geode_aes_tbl[] = {
|
static struct pci_device_id geode_aes_tbl[] = {
|
||||||
{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LX_AES, PCI_ANY_ID, PCI_ANY_ID} ,
|
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_LX_AES), } ,
|
||||||
{ 0, }
|
{ 0, }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2018,7 +2018,6 @@ static void hifn_flush(struct hifn_device *dev)
|
|||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct crypto_async_request *async_req;
|
struct crypto_async_request *async_req;
|
||||||
struct hifn_context *ctx;
|
|
||||||
struct ablkcipher_request *req;
|
struct ablkcipher_request *req;
|
||||||
struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
|
struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt;
|
||||||
int i;
|
int i;
|
||||||
@@ -2035,7 +2034,6 @@ static void hifn_flush(struct hifn_device *dev)
|
|||||||
|
|
||||||
spin_lock_irqsave(&dev->lock, flags);
|
spin_lock_irqsave(&dev->lock, flags);
|
||||||
while ((async_req = crypto_dequeue_request(&dev->queue))) {
|
while ((async_req = crypto_dequeue_request(&dev->queue))) {
|
||||||
ctx = crypto_tfm_ctx(async_req->tfm);
|
|
||||||
req = container_of(async_req, struct ablkcipher_request, base);
|
req = container_of(async_req, struct ablkcipher_request, base);
|
||||||
spin_unlock_irqrestore(&dev->lock, flags);
|
spin_unlock_irqrestore(&dev->lock, flags);
|
||||||
|
|
||||||
@@ -2139,7 +2137,6 @@ static int hifn_setup_crypto_req(struct ablkcipher_request *req, u8 op,
|
|||||||
static int hifn_process_queue(struct hifn_device *dev)
|
static int hifn_process_queue(struct hifn_device *dev)
|
||||||
{
|
{
|
||||||
struct crypto_async_request *async_req, *backlog;
|
struct crypto_async_request *async_req, *backlog;
|
||||||
struct hifn_context *ctx;
|
|
||||||
struct ablkcipher_request *req;
|
struct ablkcipher_request *req;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
@@ -2156,7 +2153,6 @@ static int hifn_process_queue(struct hifn_device *dev)
|
|||||||
if (backlog)
|
if (backlog)
|
||||||
backlog->complete(backlog, -EINPROGRESS);
|
backlog->complete(backlog, -EINPROGRESS);
|
||||||
|
|
||||||
ctx = crypto_tfm_ctx(async_req->tfm);
|
|
||||||
req = container_of(async_req, struct ablkcipher_request, base);
|
req = container_of(async_req, struct ablkcipher_request, base);
|
||||||
|
|
||||||
err = hifn_handle_req(req);
|
err = hifn_handle_req(req);
|
||||||
|
|||||||
@@ -1055,20 +1055,20 @@ static int mv_probe(struct platform_device *pdev)
|
|||||||
cp->queue_th = kthread_run(queue_manag, cp, "mv_crypto");
|
cp->queue_th = kthread_run(queue_manag, cp, "mv_crypto");
|
||||||
if (IS_ERR(cp->queue_th)) {
|
if (IS_ERR(cp->queue_th)) {
|
||||||
ret = PTR_ERR(cp->queue_th);
|
ret = PTR_ERR(cp->queue_th);
|
||||||
goto err_thread;
|
goto err_unmap_sram;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = request_irq(irq, crypto_int, IRQF_DISABLED, dev_name(&pdev->dev),
|
ret = request_irq(irq, crypto_int, IRQF_DISABLED, dev_name(&pdev->dev),
|
||||||
cp);
|
cp);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_unmap_sram;
|
goto err_thread;
|
||||||
|
|
||||||
writel(SEC_INT_ACCEL0_DONE, cpg->reg + SEC_ACCEL_INT_MASK);
|
writel(SEC_INT_ACCEL0_DONE, cpg->reg + SEC_ACCEL_INT_MASK);
|
||||||
writel(SEC_CFG_STOP_DIG_ERR, cpg->reg + SEC_ACCEL_CFG);
|
writel(SEC_CFG_STOP_DIG_ERR, cpg->reg + SEC_ACCEL_CFG);
|
||||||
|
|
||||||
ret = crypto_register_alg(&mv_aes_alg_ecb);
|
ret = crypto_register_alg(&mv_aes_alg_ecb);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_reg;
|
goto err_irq;
|
||||||
|
|
||||||
ret = crypto_register_alg(&mv_aes_alg_cbc);
|
ret = crypto_register_alg(&mv_aes_alg_cbc);
|
||||||
if (ret)
|
if (ret)
|
||||||
@@ -1091,9 +1091,9 @@ static int mv_probe(struct platform_device *pdev)
|
|||||||
return 0;
|
return 0;
|
||||||
err_unreg_ecb:
|
err_unreg_ecb:
|
||||||
crypto_unregister_alg(&mv_aes_alg_ecb);
|
crypto_unregister_alg(&mv_aes_alg_ecb);
|
||||||
err_thread:
|
err_irq:
|
||||||
free_irq(irq, cp);
|
free_irq(irq, cp);
|
||||||
err_reg:
|
err_thread:
|
||||||
kthread_stop(cp->queue_th);
|
kthread_stop(cp->queue_th);
|
||||||
err_unmap_sram:
|
err_unmap_sram:
|
||||||
iounmap(cp->sram);
|
iounmap(cp->sram);
|
||||||
|
|||||||
+297
-120
File diff suppressed because it is too large
Load Diff
@@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
#define pr_fmt(fmt) "%s: " fmt, __func__
|
#define pr_fmt(fmt) "%s: " fmt, __func__
|
||||||
|
|
||||||
#include <linux/version.h>
|
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user