/** @file | |
The header file of CHAP configuration. | |
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef _ISCSI_CHAP_H_ | |
#define _ISCSI_CHAP_H_ | |
#define ISCSI_AUTH_METHOD_CHAP "CHAP" | |
#define ISCSI_KEY_CHAP_ALGORITHM "CHAP_A" | |
#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I" | |
#define ISCSI_KEY_CHAP_CHALLENGE "CHAP_C" | |
#define ISCSI_KEY_CHAP_NAME "CHAP_N" | |
#define ISCSI_KEY_CHAP_RESPONSE "CHAP_R" | |
// | |
// Identifiers of supported CHAP hash algorithms: | |
// https://www.iana.org/assignments/ppp-numbers/ppp-numbers.xhtml#ppp-numbers-9 | |
// | |
#define ISCSI_CHAP_ALGORITHM_MD5 5 | |
#define ISCSI_CHAP_ALGORITHM_SHA256 7 | |
// | |
// Byte count of the largest digest over the above-listed | |
// ISCSI_CHAP_ALGORITHM_* hash algorithms. | |
// | |
#define ISCSI_CHAP_MAX_DIGEST_SIZE SHA256_DIGEST_SIZE | |
#define ISCSI_CHAP_STEP_ONE 1 | |
#define ISCSI_CHAP_STEP_TWO 2 | |
#define ISCSI_CHAP_STEP_THREE 3 | |
#define ISCSI_CHAP_STEP_FOUR 4 | |
#pragma pack(1) | |
typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA { | |
UINT8 CHAPType; | |
CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE]; | |
CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; | |
CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE]; | |
CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; | |
} ISCSI_CHAP_AUTH_CONFIG_NVDATA; | |
#pragma pack() | |
// | |
// Typedefs for collecting sets of hash APIs from BaseCryptLib. | |
// | |
typedef | |
UINTN | |
(EFIAPI *CHAP_HASH_GET_CONTEXT_SIZE)( | |
VOID | |
); | |
typedef | |
BOOLEAN | |
(EFIAPI *CHAP_HASH_INIT)( | |
OUT VOID *Context | |
); | |
typedef | |
BOOLEAN | |
(EFIAPI *CHAP_HASH_UPDATE)( | |
IN OUT VOID *Context, | |
IN CONST VOID *Data, | |
IN UINTN DataSize | |
); | |
typedef | |
BOOLEAN | |
(EFIAPI *CHAP_HASH_FINAL)( | |
IN OUT VOID *Context, | |
OUT UINT8 *HashValue | |
); | |
typedef struct { | |
UINT8 Algorithm; // ISCSI_CHAP_ALGORITHM_*, CHAP_A | |
UINT32 DigestSize; | |
CHAP_HASH_GET_CONTEXT_SIZE GetContextSize; | |
CHAP_HASH_INIT Init; | |
CHAP_HASH_UPDATE Update; | |
CHAP_HASH_FINAL Final; | |
} CHAP_HASH; | |
/// | |
/// ISCSI CHAP Authentication Data | |
/// | |
typedef struct _ISCSI_CHAP_AUTH_DATA { | |
ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig; | |
UINT32 InIdentifier; | |
UINT8 InChallenge[1024]; | |
UINT32 InChallengeLength; | |
// | |
// The hash algorithm (CHAP_A) that the target selects in | |
// ISCSI_CHAP_STEP_TWO. | |
// | |
CONST CHAP_HASH *Hash; | |
// | |
// Calculated CHAP Response (CHAP_R) value. | |
// | |
UINT8 CHAPResponse[ISCSI_CHAP_MAX_DIGEST_SIZE]; | |
// | |
// Auth-data to be sent out for mutual authentication. | |
// | |
// While the challenge size is technically independent of the hashing | |
// algorithm, it is good practice to avoid hashing *fewer bytes* than the | |
// digest size. In other words, it's good practice to feed *at least as many | |
// bytes* to the hashing algorithm as the hashing algorithm will output. | |
// | |
UINT32 OutIdentifier; | |
UINT8 OutChallenge[ISCSI_CHAP_MAX_DIGEST_SIZE]; | |
} ISCSI_CHAP_AUTH_DATA; | |
/** | |
This function checks the received iSCSI Login Response during the security | |
negotiation stage. | |
@param[in] Conn The iSCSI connection. | |
@retval EFI_SUCCESS The Login Response passed the CHAP validation. | |
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory. | |
@retval EFI_PROTOCOL_ERROR Some kind of protocol error occurred. | |
@retval Others Other errors as indicated. | |
**/ | |
EFI_STATUS | |
IScsiCHAPOnRspReceived ( | |
IN ISCSI_CONNECTION *Conn | |
); | |
/** | |
This function fills the CHAP authentication information into the login PDU | |
during the security negotiation stage in the iSCSI connection login. | |
@param[in] Conn The iSCSI connection. | |
@param[in, out] Pdu The PDU to send out. | |
@retval EFI_SUCCESS All check passed and the phase-related CHAP | |
authentication info is filled into the iSCSI | |
PDU. | |
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory. | |
@retval EFI_PROTOCOL_ERROR Some kind of protocol error occurred. | |
**/ | |
EFI_STATUS | |
IScsiCHAPToSendReq ( | |
IN ISCSI_CONNECTION *Conn, | |
IN OUT NET_BUF *Pdu | |
); | |
/** | |
Initialize the CHAP_A=<A1,A2...> *value* string for the entire driver, to be | |
sent by the initiator in ISCSI_CHAP_STEP_ONE. | |
This function sanity-checks the internal table of supported CHAP hashing | |
algorithms, as well. | |
**/ | |
VOID | |
IScsiCHAPInitHashList ( | |
VOID | |
); | |
#endif |