Merge tag 'armsoc-dt' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[deliverable/linux.git] / drivers / target / iscsi / iscsi_target_auth.c
index 47e249dccb5fe7d9652bea77bddc00b35dd98429..667406fcf4d3daf03acf84b24be9d6538c95f20e 100644 (file)
@@ -16,9 +16,9 @@
  * GNU General Public License for more details.
  ******************************************************************************/
 
+#include <crypto/hash.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
-#include <linux/crypto.h>
 #include <linux/err.h>
 #include <linux/scatterlist.h>
 
@@ -185,9 +185,8 @@ static int chap_server_compute_md5(
        unsigned char chap_n[MAX_CHAP_N_SIZE], chap_r[MAX_RESPONSE_LENGTH];
        size_t compare_len;
        struct iscsi_chap *chap = conn->auth_protocol;
-       struct crypto_hash *tfm;
-       struct hash_desc desc;
-       struct scatterlist sg;
+       struct crypto_shash *tfm = NULL;
+       struct shash_desc *desc = NULL;
        int auth_ret = -1, ret, challenge_len;
 
        memset(identifier, 0, 10);
@@ -245,52 +244,47 @@ static int chap_server_compute_md5(
        pr_debug("[server] Got CHAP_R=%s\n", chap_r);
        chap_string_to_hex(client_digest, chap_r, strlen(chap_r));
 
-       tfm = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC);
+       tfm = crypto_alloc_shash("md5", 0, 0);
        if (IS_ERR(tfm)) {
-               pr_err("Unable to allocate struct crypto_hash\n");
+               tfm = NULL;
+               pr_err("Unable to allocate struct crypto_shash\n");
                goto out;
        }
-       desc.tfm = tfm;
-       desc.flags = 0;
 
-       ret = crypto_hash_init(&desc);
-       if (ret < 0) {
-               pr_err("crypto_hash_init() failed\n");
-               crypto_free_hash(tfm);
+       desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(tfm), GFP_KERNEL);
+       if (!desc) {
+               pr_err("Unable to allocate struct shash_desc\n");
                goto out;
        }
 
-       sg_init_one(&sg, &chap->id, 1);
-       ret = crypto_hash_update(&desc, &sg, 1);
+       desc->tfm = tfm;
+       desc->flags = 0;
+
+       ret = crypto_shash_init(desc);
        if (ret < 0) {
-               pr_err("crypto_hash_update() failed for id\n");
-               crypto_free_hash(tfm);
+               pr_err("crypto_shash_init() failed\n");
                goto out;
        }
 
-       sg_init_one(&sg, &auth->password, strlen(auth->password));
-       ret = crypto_hash_update(&desc, &sg, strlen(auth->password));
+       ret = crypto_shash_update(desc, &chap->id, 1);
        if (ret < 0) {
-               pr_err("crypto_hash_update() failed for password\n");
-               crypto_free_hash(tfm);
+               pr_err("crypto_shash_update() failed for id\n");
                goto out;
        }
 
-       sg_init_one(&sg, chap->challenge, CHAP_CHALLENGE_LENGTH);
-       ret = crypto_hash_update(&desc, &sg, CHAP_CHALLENGE_LENGTH);
+       ret = crypto_shash_update(desc, (char *)&auth->password,
+                                 strlen(auth->password));
        if (ret < 0) {
-               pr_err("crypto_hash_update() failed for challenge\n");
-               crypto_free_hash(tfm);
+               pr_err("crypto_shash_update() failed for password\n");
                goto out;
        }
 
-       ret = crypto_hash_final(&desc, server_digest);
+       ret = crypto_shash_finup(desc, chap->challenge,
+                                CHAP_CHALLENGE_LENGTH, server_digest);
        if (ret < 0) {
-               pr_err("crypto_hash_final() failed for server digest\n");
-               crypto_free_hash(tfm);
+               pr_err("crypto_shash_finup() failed for challenge\n");
                goto out;
        }
-       crypto_free_hash(tfm);
 
        chap_binaryhex_to_asciihex(response, server_digest, MD5_SIGNATURE_SIZE);
        pr_debug("[server] MD5 Server Digest: %s\n", response);
@@ -306,9 +300,8 @@ static int chap_server_compute_md5(
         * authentication is not enabled.
         */
        if (!auth->authenticate_target) {
-               kfree(challenge);
-               kfree(challenge_binhex);
-               return 0;
+               auth_ret = 0;
+               goto out;
        }
        /*
         * Get CHAP_I.
@@ -372,58 +365,37 @@ static int chap_server_compute_md5(
        /*
         * Generate CHAP_N and CHAP_R for mutual authentication.
         */
-       tfm = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC);
-       if (IS_ERR(tfm)) {
-               pr_err("Unable to allocate struct crypto_hash\n");
-               goto out;
-       }
-       desc.tfm = tfm;
-       desc.flags = 0;
-
-       ret = crypto_hash_init(&desc);
+       ret = crypto_shash_init(desc);
        if (ret < 0) {
-               pr_err("crypto_hash_init() failed\n");
-               crypto_free_hash(tfm);
+               pr_err("crypto_shash_init() failed\n");
                goto out;
        }
 
        /* To handle both endiannesses */
        id_as_uchar = id;
-       sg_init_one(&sg, &id_as_uchar, 1);
-       ret = crypto_hash_update(&desc, &sg, 1);
+       ret = crypto_shash_update(desc, &id_as_uchar, 1);
        if (ret < 0) {
-               pr_err("crypto_hash_update() failed for id\n");
-               crypto_free_hash(tfm);
+               pr_err("crypto_shash_update() failed for id\n");
                goto out;
        }
 
-       sg_init_one(&sg, auth->password_mutual,
-                               strlen(auth->password_mutual));
-       ret = crypto_hash_update(&desc, &sg, strlen(auth->password_mutual));
+       ret = crypto_shash_update(desc, auth->password_mutual,
+                                 strlen(auth->password_mutual));
        if (ret < 0) {
-               pr_err("crypto_hash_update() failed for"
+               pr_err("crypto_shash_update() failed for"
                                " password_mutual\n");
-               crypto_free_hash(tfm);
                goto out;
        }
        /*
         * Convert received challenge to binary hex.
         */
-       sg_init_one(&sg, challenge_binhex, challenge_len);
-       ret = crypto_hash_update(&desc, &sg, challenge_len);
+       ret = crypto_shash_finup(desc, challenge_binhex, challenge_len,
+                                digest);
        if (ret < 0) {
-               pr_err("crypto_hash_update() failed for ma challenge\n");
-               crypto_free_hash(tfm);
+               pr_err("crypto_shash_finup() failed for ma challenge\n");
                goto out;
        }
 
-       ret = crypto_hash_final(&desc, digest);
-       if (ret < 0) {
-               pr_err("crypto_hash_final() failed for ma digest\n");
-               crypto_free_hash(tfm);
-               goto out;
-       }
-       crypto_free_hash(tfm);
        /*
         * Generate CHAP_N and CHAP_R.
         */
@@ -440,6 +412,8 @@ static int chap_server_compute_md5(
        pr_debug("[server] Sending CHAP_R=0x%s\n", response);
        auth_ret = 0;
 out:
+       kzfree(desc);
+       crypto_free_shash(tfm);
        kfree(challenge);
        kfree(challenge_binhex);
        return auth_ret;
This page took 0.028319 seconds and 5 git commands to generate.