david/ipxe
Archived
1
0

[iscsi] Rewrite unrelicensable portions of iscsi.c

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2015-03-02 20:37:24 +00:00
parent 2d707ac964
commit c1ac466838

View File

@ -15,14 +15,19 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*
* You can also choose to distribute this program under the terms of
* the Unmodified Binary Distribution Licence (as given in the file
* COPYING.UBDL), provided that you have satisfied its requirements.
*/
FILE_LICENCE ( GPL2_OR_LATER );
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <errno.h>
#include <assert.h>
#include <byteswap.h>
@ -127,7 +132,7 @@ FEATURE ( FEATURE_PROTOCOL, "iSCSI", DHCP_EB_FEATURE_ISCSI, 1 );
#define EPROTO_INVALID_LARGE_BINARY \
__einfo_error ( EINFO_EPROTO_INVALID_LARGE_BINARY )
#define EINFO_EPROTO_INVALID_LARGE_BINARY \
__einfo_uniqify ( EINFO_EPROTO, 0x03, "Invalid large binary" )
__einfo_uniqify ( EINFO_EPROTO, 0x03, "Invalid large binary value" )
#define EPROTO_INVALID_CHAP_RESPONSE \
__einfo_error ( EINFO_EPROTO_INVALID_CHAP_RESPONSE )
#define EINFO_EPROTO_INVALID_CHAP_RESPONSE \
@ -823,17 +828,6 @@ static int iscsi_tx_login_request ( struct iscsi_session *iscsi ) {
return xfer_deliver_iob ( &iscsi->socket, iobuf );
}
/**
* Calculate maximum length of decoded large binary value
*
* @v encoded Encoded large binary value
* @v max_raw_len Maximum length of raw data
*/
static inline size_t
iscsi_large_binary_decoded_max_len ( const char *encoded ) {
return ( strlen ( encoded ) ); /* Decoding never expands data */
}
/**
* Decode large binary value
*
@ -843,19 +837,17 @@ iscsi_large_binary_decoded_max_len ( const char *encoded ) {
*/
static int iscsi_large_binary_decode ( const char *encoded, uint8_t *raw ) {
if ( encoded[0] != '0' )
return -EPROTO_INVALID_LARGE_BINARY;
switch ( encoded[1] ) {
case 'x' :
case 'X' :
return base16_decode ( ( encoded + 2 ), raw );
case 'b' :
case 'B' :
return base64_decode ( ( encoded + 2 ), raw );
default:
return -EPROTO_INVALID_LARGE_BINARY;
/* Check for initial '0x' or '0b' and decode as appropriate */
if ( *(encoded++) == '0' ) {
switch ( tolower ( *(encoded++) ) ) {
case 'x' :
return base16_decode ( encoded, raw );
case 'b' :
return base64_decode ( encoded, raw );
}
}
return -EPROTO_INVALID_LARGE_BINARY;
}
/**
@ -982,19 +974,19 @@ static int iscsi_handle_chap_i_value ( struct iscsi_session *iscsi,
*/
static int iscsi_handle_chap_c_value ( struct iscsi_session *iscsi,
const char *value ) {
uint8_t buf[ iscsi_large_binary_decoded_max_len ( value ) ];
uint8_t buf[ strlen ( value ) ]; /* Decoding never expands data */
unsigned int i;
size_t len;
int len;
int rc;
/* Process challenge */
rc = iscsi_large_binary_decode ( value, buf );
if ( rc < 0 ) {
len = iscsi_large_binary_decode ( value, buf );
if ( len < 0 ) {
rc = len;
DBGC ( iscsi, "iSCSI %p invalid CHAP challenge \"%s\": %s\n",
iscsi, value, strerror ( rc ) );
return rc;
}
len = rc;
chap_update ( &iscsi->chap, buf, len );
/* Build CHAP response */
@ -1052,8 +1044,8 @@ static int iscsi_handle_chap_n_value ( struct iscsi_session *iscsi,
*/
static int iscsi_handle_chap_r_value ( struct iscsi_session *iscsi,
const char *value ) {
uint8_t buf[ iscsi_large_binary_decoded_max_len ( value ) ];
size_t len;
uint8_t buf[ strlen ( value ) ]; /* Decoding never expands data */
int len;
int rc;
/* Generate CHAP response for verification */
@ -1073,16 +1065,16 @@ static int iscsi_handle_chap_r_value ( struct iscsi_session *iscsi,
chap_respond ( &iscsi->chap );
/* Process response */
rc = iscsi_large_binary_decode ( value, buf );
if ( rc < 0 ) {
len = iscsi_large_binary_decode ( value, buf );
if ( len < 0 ) {
rc = len;
DBGC ( iscsi, "iSCSI %p invalid CHAP response \"%s\": %s\n",
iscsi, value, strerror ( rc ) );
return rc;
}
len = rc;
/* Check CHAP response */
if ( len != iscsi->chap.response_len ) {
if ( len != ( int ) iscsi->chap.response_len ) {
DBGC ( iscsi, "iSCSI %p invalid CHAP response length\n",
iscsi );
return -EPROTO_INVALID_CHAP_RESPONSE;