iscsi-target: Use shash and ahash
This patch replaces uses of the long obsolete hash interface with either shash (for non-SG users) or ahash. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
@@ -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");
|
||||
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);
|
||||
tfm = NULL;
|
||||
pr_err("Unable to allocate struct crypto_shash\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
sg_init_one(&sg, &chap->id, 1);
|
||||
ret = crypto_hash_update(&desc, &sg, 1);
|
||||
if (ret < 0) {
|
||||
pr_err("crypto_hash_update() failed for id\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, &auth->password, strlen(auth->password));
|
||||
ret = crypto_hash_update(&desc, &sg, strlen(auth->password));
|
||||
desc->tfm = tfm;
|
||||
desc->flags = 0;
|
||||
|
||||
ret = crypto_shash_init(desc);
|
||||
if (ret < 0) {
|
||||
pr_err("crypto_hash_update() failed for password\n");
|
||||
crypto_free_hash(tfm);
|
||||
pr_err("crypto_shash_init() failed\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, &chap->id, 1);
|
||||
if (ret < 0) {
|
||||
pr_err("crypto_hash_update() failed for challenge\n");
|
||||
crypto_free_hash(tfm);
|
||||
pr_err("crypto_shash_update() failed for id\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = crypto_hash_final(&desc, server_digest);
|
||||
ret = crypto_shash_update(desc, (char *)&auth->password,
|
||||
strlen(auth->password));
|
||||
if (ret < 0) {
|
||||
pr_err("crypto_hash_final() failed for server digest\n");
|
||||
crypto_free_hash(tfm);
|
||||
pr_err("crypto_shash_update() failed for password\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = crypto_shash_finup(desc, chap->challenge,
|
||||
CHAP_CHALLENGE_LENGTH, server_digest);
|
||||
if (ret < 0) {
|
||||
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;
|
||||
|
Reference in New Issue
Block a user