diff options
author | Jan Glauber <jang@linux.vnet.ibm.com> | 2011-04-19 15:29:14 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2011-05-04 01:05:49 -0400 |
commit | 1822bc9093e05059e4144d6041b0f5450ad275e1 (patch) | |
tree | ceb599625dd6ff3f93f9cf1c1070f4c0c576f718 | |
parent | ba0e14acc417eceb895efda1ff46366f4d1728f8 (diff) |
crypto: s390 - extend crypto facility check
The specification which crypto facility is required for an algorithm is added
as a parameter to the availability check which is done before an algorithm is
registered. With this change it is easier to add new algorithms that require
different facilities.
Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | arch/s390/crypto/aes_s390.c | 6 | ||||
-rw-r--r-- | arch/s390/crypto/crypt_s390.h | 14 | ||||
-rw-r--r-- | arch/s390/crypto/des_s390.c | 4 | ||||
-rw-r--r-- | arch/s390/crypto/prng.c | 2 | ||||
-rw-r--r-- | arch/s390/crypto/sha1_s390.c | 2 | ||||
-rw-r--r-- | arch/s390/crypto/sha256_s390.c | 2 | ||||
-rw-r--r-- | arch/s390/crypto/sha512_s390.c | 2 |
7 files changed, 20 insertions, 12 deletions
diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c index 58f46734465..fc97b949254 100644 --- a/arch/s390/crypto/aes_s390.c +++ b/arch/s390/crypto/aes_s390.c | |||
@@ -508,11 +508,11 @@ static int __init aes_s390_init(void) | |||
508 | { | 508 | { |
509 | int ret; | 509 | int ret; |
510 | 510 | ||
511 | if (crypt_s390_func_available(KM_AES_128_ENCRYPT)) | 511 | if (crypt_s390_func_available(KM_AES_128_ENCRYPT, CRYPT_S390_MSA)) |
512 | keylen_flag |= AES_KEYLEN_128; | 512 | keylen_flag |= AES_KEYLEN_128; |
513 | if (crypt_s390_func_available(KM_AES_192_ENCRYPT)) | 513 | if (crypt_s390_func_available(KM_AES_192_ENCRYPT, CRYPT_S390_MSA)) |
514 | keylen_flag |= AES_KEYLEN_192; | 514 | keylen_flag |= AES_KEYLEN_192; |
515 | if (crypt_s390_func_available(KM_AES_256_ENCRYPT)) | 515 | if (crypt_s390_func_available(KM_AES_256_ENCRYPT, CRYPT_S390_MSA)) |
516 | keylen_flag |= AES_KEYLEN_256; | 516 | keylen_flag |= AES_KEYLEN_256; |
517 | 517 | ||
518 | if (!keylen_flag) | 518 | if (!keylen_flag) |
diff --git a/arch/s390/crypto/crypt_s390.h b/arch/s390/crypto/crypt_s390.h index 7ee9a1b4ad9..4b8c96cab25 100644 --- a/arch/s390/crypto/crypt_s390.h +++ b/arch/s390/crypto/crypt_s390.h | |||
@@ -24,6 +24,10 @@ | |||
24 | #define CRYPT_S390_PRIORITY 300 | 24 | #define CRYPT_S390_PRIORITY 300 |
25 | #define CRYPT_S390_COMPOSITE_PRIORITY 400 | 25 | #define CRYPT_S390_COMPOSITE_PRIORITY 400 |
26 | 26 | ||
27 | #define CRYPT_S390_MSA 0x1 | ||
28 | #define CRYPT_S390_MSA3 0x2 | ||
29 | #define CRYPT_S390_MSA4 0x4 | ||
30 | |||
27 | /* s390 cryptographic operations */ | 31 | /* s390 cryptographic operations */ |
28 | enum crypt_s390_operations { | 32 | enum crypt_s390_operations { |
29 | CRYPT_S390_KM = 0x0100, | 33 | CRYPT_S390_KM = 0x0100, |
@@ -291,13 +295,17 @@ static inline int crypt_s390_kmac(long func, void *param, | |||
291 | * | 295 | * |
292 | * Returns 1 if func available; 0 if func or op in general not available | 296 | * Returns 1 if func available; 0 if func or op in general not available |
293 | */ | 297 | */ |
294 | static inline int crypt_s390_func_available(int func) | 298 | static inline int crypt_s390_func_available(int func, |
299 | unsigned int facility_mask) | ||
295 | { | 300 | { |
296 | unsigned char status[16]; | 301 | unsigned char status[16]; |
297 | int ret; | 302 | int ret; |
298 | 303 | ||
299 | /* check if CPACF facility (bit 17) is available */ | 304 | if (facility_mask & CRYPT_S390_MSA && !test_facility(17)) |
300 | if (!test_facility(17)) | 305 | return 0; |
306 | if (facility_mask & CRYPT_S390_MSA3 && !test_facility(76)) | ||
307 | return 0; | ||
308 | if (facility_mask & CRYPT_S390_MSA4 && !test_facility(77)) | ||
301 | return 0; | 309 | return 0; |
302 | 310 | ||
303 | switch (func & CRYPT_S390_OP_MASK) { | 311 | switch (func & CRYPT_S390_OP_MASK) { |
diff --git a/arch/s390/crypto/des_s390.c b/arch/s390/crypto/des_s390.c index cc542011839..1121e73115a 100644 --- a/arch/s390/crypto/des_s390.c +++ b/arch/s390/crypto/des_s390.c | |||
@@ -381,8 +381,8 @@ static int des_s390_init(void) | |||
381 | { | 381 | { |
382 | int ret; | 382 | int ret; |
383 | 383 | ||
384 | if (!crypt_s390_func_available(KM_DEA_ENCRYPT) || | 384 | if (!crypt_s390_func_available(KM_DEA_ENCRYPT, CRYPT_S390_MSA) || |
385 | !crypt_s390_func_available(KM_TDEA_192_ENCRYPT)) | 385 | !crypt_s390_func_available(KM_TDEA_192_ENCRYPT, CRYPT_S390_MSA)) |
386 | return -EOPNOTSUPP; | 386 | return -EOPNOTSUPP; |
387 | 387 | ||
388 | ret = crypto_register_alg(&des_alg); | 388 | ret = crypto_register_alg(&des_alg); |
diff --git a/arch/s390/crypto/prng.c b/arch/s390/crypto/prng.c index 975e3ab13cb..0fc8115b0ae 100644 --- a/arch/s390/crypto/prng.c +++ b/arch/s390/crypto/prng.c | |||
@@ -166,7 +166,7 @@ static int __init prng_init(void) | |||
166 | int ret; | 166 | int ret; |
167 | 167 | ||
168 | /* check if the CPU has a PRNG */ | 168 | /* check if the CPU has a PRNG */ |
169 | if (!crypt_s390_func_available(KMC_PRNG)) | 169 | if (!crypt_s390_func_available(KMC_PRNG, CRYPT_S390_MSA)) |
170 | return -EOPNOTSUPP; | 170 | return -EOPNOTSUPP; |
171 | 171 | ||
172 | if (prng_chunk_size < 8) | 172 | if (prng_chunk_size < 8) |
diff --git a/arch/s390/crypto/sha1_s390.c b/arch/s390/crypto/sha1_s390.c index f6de7826c97..e9868c6e0a0 100644 --- a/arch/s390/crypto/sha1_s390.c +++ b/arch/s390/crypto/sha1_s390.c | |||
@@ -90,7 +90,7 @@ static struct shash_alg alg = { | |||
90 | 90 | ||
91 | static int __init sha1_s390_init(void) | 91 | static int __init sha1_s390_init(void) |
92 | { | 92 | { |
93 | if (!crypt_s390_func_available(KIMD_SHA_1)) | 93 | if (!crypt_s390_func_available(KIMD_SHA_1, CRYPT_S390_MSA)) |
94 | return -EOPNOTSUPP; | 94 | return -EOPNOTSUPP; |
95 | return crypto_register_shash(&alg); | 95 | return crypto_register_shash(&alg); |
96 | } | 96 | } |
diff --git a/arch/s390/crypto/sha256_s390.c b/arch/s390/crypto/sha256_s390.c index 61a7db37212..5ed8d64fc2e 100644 --- a/arch/s390/crypto/sha256_s390.c +++ b/arch/s390/crypto/sha256_s390.c | |||
@@ -86,7 +86,7 @@ static struct shash_alg alg = { | |||
86 | 86 | ||
87 | static int sha256_s390_init(void) | 87 | static int sha256_s390_init(void) |
88 | { | 88 | { |
89 | if (!crypt_s390_func_available(KIMD_SHA_256)) | 89 | if (!crypt_s390_func_available(KIMD_SHA_256, CRYPT_S390_MSA)) |
90 | return -EOPNOTSUPP; | 90 | return -EOPNOTSUPP; |
91 | 91 | ||
92 | return crypto_register_shash(&alg); | 92 | return crypto_register_shash(&alg); |
diff --git a/arch/s390/crypto/sha512_s390.c b/arch/s390/crypto/sha512_s390.c index 4bf73d0dc52..32a81383b69 100644 --- a/arch/s390/crypto/sha512_s390.c +++ b/arch/s390/crypto/sha512_s390.c | |||
@@ -132,7 +132,7 @@ static int __init init(void) | |||
132 | { | 132 | { |
133 | int ret; | 133 | int ret; |
134 | 134 | ||
135 | if (!crypt_s390_func_available(KIMD_SHA_512)) | 135 | if (!crypt_s390_func_available(KIMD_SHA_512, CRYPT_S390_MSA)) |
136 | return -EOPNOTSUPP; | 136 | return -EOPNOTSUPP; |
137 | if ((ret = crypto_register_shash(&sha512_alg)) < 0) | 137 | if ((ret = crypto_register_shash(&sha512_alg)) < 0) |
138 | goto out; | 138 | goto out; |