s390/zcrypt: enable odd RSA modulus sizes in CRT format
authorIngo Tuchscherer <ingo.tuchscherer@linux.vnet.ibm.com>
Fri, 4 Sep 2015 07:57:24 +0000 (09:57 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 14 Oct 2015 12:31:59 +0000 (14:31 +0200)
In the past only even modulus sizes were allowed for RSA keys in
CRT format. This restriction was based on limited RSA key generation
on older crypto adapters that provides only even modulus sizes. This
restriction is not valid any more.

Revoke restrictions that crypto requests can be serviced with odd
RSA modulus length in CRT format.

Signed-off-by: Ingo Tuchscherer <ingo.tuchscherer@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/crypto/zcrypt_api.c
drivers/s390/crypto/zcrypt_cca_key.h
drivers/s390/crypto/zcrypt_msgtype50.c
drivers/s390/crypto/zcrypt_pcica.c

index 4eb45546a3aaf39421e6434a181890f6145fd604..a9603ebbc1f8fdd6ca03eb9b4702d356648157b4 100644 (file)
@@ -472,8 +472,7 @@ static long zcrypt_rsa_crt(struct ica_rsa_modexpo_crt *crt)
        unsigned long long z1, z2, z3;
        int rc, copied;
 
-       if (crt->outputdatalength < crt->inputdatalength ||
-           (crt->inputdatalength & 1))
+       if (crt->outputdatalength < crt->inputdatalength)
                return -EINVAL;
        /*
         * As long as outputdatalength is big enough, we can set the
index 1f42f103c761d460426b07b8c8021a673bcb1b7e..ca0cdbe463686bc52559e2ac948863df219340e8 100644 (file)
@@ -291,7 +291,7 @@ static inline int zcrypt_type6_crt_key(struct ica_rsa_modexpo_crt *crt,
 
        memset(key, 0, sizeof(*key));
 
-       short_len = crt->inputdatalength / 2;
+       short_len = (crt->inputdatalength + 1) / 2;
        long_len = short_len + 8;
        pad_len = -(3*long_len + 2*short_len) & 7;
        key_len = 3*long_len + 2*short_len + pad_len + crt->inputdatalength;
index 334e282f255b7d9b0a6288bad94d6702a729a556..6c9af133296745dc3b4ef005ad56bdae1fa682b3 100644 (file)
@@ -248,7 +248,7 @@ static int ICACRT_msg_to_type50CRT_msg(struct zcrypt_device *zdev,
        unsigned char *p, *q, *dp, *dq, *u, *inp;
 
        mod_len = crt->inputdatalength;
-       short_len = mod_len / 2;
+       short_len = (mod_len + 1) / 2;
 
        /*
         * CEX2A and CEX3A w/o FW update can handle requests up to
index 7a743f4c646c0e46dadcaed195acc9bccf1bf183..2f220208da6352501ad97d28b5f0f5d0a69cbd94 100644 (file)
@@ -138,7 +138,7 @@ static int ICACRT_msg_to_type4CRT_msg(struct zcrypt_device *zdev,
        int mod_len, short_len, long_len;
 
        mod_len = crt->inputdatalength;
-       short_len = mod_len / 2;
+       short_len = (mod_len + 1) / 2;
        long_len = mod_len / 2 + 8;
 
        if (mod_len <= 128) {