|
@@ -71,6 +71,40 @@ static void chap_gen_challenge(
|
|
challenge_asciihex);
|
|
challenge_asciihex);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int chap_check_algorithm(const char *a_str)
|
|
|
|
+{
|
|
|
|
+ char *tmp, *orig, *token;
|
|
|
|
+
|
|
|
|
+ tmp = kstrdup(a_str, GFP_KERNEL);
|
|
|
|
+ if (!tmp) {
|
|
|
|
+ pr_err("Memory allocation failed for CHAP_A temporary buffer\n");
|
|
|
|
+ return CHAP_DIGEST_UNKNOWN;
|
|
|
|
+ }
|
|
|
|
+ orig = tmp;
|
|
|
|
+
|
|
|
|
+ token = strsep(&tmp, "=");
|
|
|
|
+ if (!token)
|
|
|
|
+ goto out;
|
|
|
|
+
|
|
|
|
+ if (strcmp(token, "CHAP_A")) {
|
|
|
|
+ pr_err("Unable to locate CHAP_A key\n");
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+ while (token) {
|
|
|
|
+ token = strsep(&tmp, ",");
|
|
|
|
+ if (!token)
|
|
|
|
+ goto out;
|
|
|
|
+
|
|
|
|
+ if (!strncmp(token, "5", 1)) {
|
|
|
|
+ pr_debug("Selected MD5 Algorithm\n");
|
|
|
|
+ kfree(orig);
|
|
|
|
+ return CHAP_DIGEST_MD5;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+out:
|
|
|
|
+ kfree(orig);
|
|
|
|
+ return CHAP_DIGEST_UNKNOWN;
|
|
|
|
+}
|
|
|
|
|
|
static struct iscsi_chap *chap_server_open(
|
|
static struct iscsi_chap *chap_server_open(
|
|
struct iscsi_conn *conn,
|
|
struct iscsi_conn *conn,
|
|
@@ -79,6 +113,7 @@ static struct iscsi_chap *chap_server_open(
|
|
char *aic_str,
|
|
char *aic_str,
|
|
unsigned int *aic_len)
|
|
unsigned int *aic_len)
|
|
{
|
|
{
|
|
|
|
+ int ret;
|
|
struct iscsi_chap *chap;
|
|
struct iscsi_chap *chap;
|
|
|
|
|
|
if (!(auth->naf_flags & NAF_USERID_SET) ||
|
|
if (!(auth->naf_flags & NAF_USERID_SET) ||
|
|
@@ -93,21 +128,24 @@ static struct iscsi_chap *chap_server_open(
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
chap = conn->auth_protocol;
|
|
chap = conn->auth_protocol;
|
|
- /*
|
|
|
|
- * We only support MD5 MDA presently.
|
|
|
|
- */
|
|
|
|
- if (strncmp(a_str, "CHAP_A=5", 8)) {
|
|
|
|
- pr_err("CHAP_A is not MD5.\n");
|
|
|
|
|
|
+ ret = chap_check_algorithm(a_str);
|
|
|
|
+ switch (ret) {
|
|
|
|
+ case CHAP_DIGEST_MD5:
|
|
|
|
+ pr_debug("[server] Got CHAP_A=5\n");
|
|
|
|
+ /*
|
|
|
|
+ * Send back CHAP_A set to MD5.
|
|
|
|
+ */
|
|
|
|
+ *aic_len = sprintf(aic_str, "CHAP_A=5");
|
|
|
|
+ *aic_len += 1;
|
|
|
|
+ chap->digest_type = CHAP_DIGEST_MD5;
|
|
|
|
+ pr_debug("[server] Sending CHAP_A=%d\n", chap->digest_type);
|
|
|
|
+ break;
|
|
|
|
+ case CHAP_DIGEST_UNKNOWN:
|
|
|
|
+ default:
|
|
|
|
+ pr_err("Unsupported CHAP_A value\n");
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
- pr_debug("[server] Got CHAP_A=5\n");
|
|
|
|
- /*
|
|
|
|
- * Send back CHAP_A set to MD5.
|
|
|
|
- */
|
|
|
|
- *aic_len = sprintf(aic_str, "CHAP_A=5");
|
|
|
|
- *aic_len += 1;
|
|
|
|
- chap->digest_type = CHAP_DIGEST_MD5;
|
|
|
|
- pr_debug("[server] Sending CHAP_A=%d\n", chap->digest_type);
|
|
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Set Identifier.
|
|
* Set Identifier.
|
|
*/
|
|
*/
|