- case ISCSI_CHAP_STEP_FOUR:\r
- ASSERT (AuthData->AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL);\r
- //\r
- // The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target.\r
- //\r
- Name = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_NAME);\r
- if (Name == NULL) {\r
- goto ON_EXIT;\r
- }\r
-\r
- Response = IScsiGetValueByKeyFromList (\r
- KeyValueList,\r
- ISCSI_KEY_CHAP_RESPONSE\r
+ if (HashIndex == ARRAY_SIZE (mChapHash)) {\r
+ //\r
+ // Unsupported algorithm is chosen by target.\r
+ //\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ //\r
+ // Remember the target's chosen hash algorithm.\r
+ //\r
+ ASSERT (AuthData->Hash == NULL);\r
+ AuthData->Hash = &mChapHash[HashIndex];\r
+\r
+ Identifier = IScsiGetValueByKeyFromList (\r
+ KeyValueList,\r
+ ISCSI_KEY_CHAP_IDENTIFIER\r
+ );\r
+ if (Identifier == NULL) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ Challenge = IScsiGetValueByKeyFromList (\r
+ KeyValueList,\r
+ ISCSI_KEY_CHAP_CHALLENGE\r
+ );\r
+ if (Challenge == NULL) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ //\r
+ // Process the CHAP identifier and CHAP Challenge from Target.\r
+ // Calculate Response value.\r
+ //\r
+ Result = IScsiNetNtoi (Identifier);\r
+ if (Result > 0xFF) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ AuthData->InIdentifier = (UINT32)Result;\r
+ AuthData->InChallengeLength = (UINT32)sizeof (AuthData->InChallenge);\r
+ Status = IScsiHexToBin (\r
+ (UINT8 *)AuthData->InChallenge,\r
+ &AuthData->InChallengeLength,\r
+ Challenge\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_PROTOCOL_ERROR;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ Status = IScsiCHAPCalculateResponse (\r
+ AuthData->InIdentifier,\r
+ AuthData->AuthConfig->CHAPSecret,\r
+ (UINT32)AsciiStrLen (AuthData->AuthConfig->CHAPSecret),\r
+ AuthData->InChallenge,\r
+ AuthData->InChallengeLength,\r
+ AuthData->Hash,\r
+ AuthData->CHAPResponse\r