mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 18:47:22 +00:00
Fixed many endian-ness problems. Removed commented-out code.
This commit is contained in:
parent
cf563a2e18
commit
1e043d1188
@ -50,6 +50,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
#include <ipmitool/helper.h>
|
#include <ipmitool/helper.h>
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
#include <ipmitool/md5.h>
|
#include <ipmitool/md5.h>
|
||||||
@ -534,7 +535,6 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
|
|||||||
read_ipmi_response(rsp, &offset);
|
read_ipmi_response(rsp, &offset);
|
||||||
|
|
||||||
if (verbose > 2) {
|
if (verbose > 2) {
|
||||||
//printbuf(rsp->data, offset, "ipmi message header");
|
|
||||||
printf("<< IPMI Response Session Header\n");
|
printf("<< IPMI Response Session Header\n");
|
||||||
printf("<< Authtype : %s\n",
|
printf("<< Authtype : %s\n",
|
||||||
val2str(rsp->session.authtype, ipmi_authtype_vals));
|
val2str(rsp->session.authtype, ipmi_authtype_vals));
|
||||||
@ -751,9 +751,6 @@ void read_rakp2_message(struct ipmi_rs * rsp, int offset, unsigned char auth_alg
|
|||||||
for (i = 0; i < 20; ++i)
|
for (i = 0; i < 20; ++i)
|
||||||
rsp->payload.rakp2_message.key_exchange_auth_code[i] =
|
rsp->payload.rakp2_message.key_exchange_auth_code[i] =
|
||||||
rsp->data[offset + 40 + i];
|
rsp->data[offset + 40 + i];
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
lanplus_swap(rsp->payload.rakp2_message.key_exchange_auth_code, 20);
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IPMI_AUTH_RAKP_HMAC_MD5:
|
case IPMI_AUTH_RAKP_HMAC_MD5:
|
||||||
@ -813,11 +810,6 @@ void read_rakp4_message(struct ipmi_rs * rsp, int offset, unsigned char integrit
|
|||||||
for (i = 0; i < 12; ++i)
|
for (i = 0; i < 12; ++i)
|
||||||
rsp->payload.rakp4_message.integrity_check_value[i] =
|
rsp->payload.rakp4_message.integrity_check_value[i] =
|
||||||
rsp->data[offset + 8 + i];
|
rsp->data[offset + 8 + i];
|
||||||
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
lanplus_swap(rsp->payload.rakp4_message.integrity_check_value, 12);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IPMI_INTEGRITY_HMAC_MD5_128:
|
case IPMI_INTEGRITY_HMAC_MD5_128:
|
||||||
@ -882,27 +874,13 @@ void read_session_data_v2x(struct ipmi_rs * rsp,
|
|||||||
int * offset,
|
int * offset,
|
||||||
struct ipmi_session * s)
|
struct ipmi_session * s)
|
||||||
{
|
{
|
||||||
//rsp->session.authtype = rsp->data[*offset];
|
|
||||||
rsp->session.authtype = rsp->data[(*offset)++];
|
rsp->session.authtype = rsp->data[(*offset)++];
|
||||||
|
|
||||||
rsp->session.bEncrypted = (rsp->data[*offset] & 0x80 ? 1 : 0);
|
rsp->session.bEncrypted = (rsp->data[*offset] & 0x80 ? 1 : 0);
|
||||||
rsp->session.bAuthenticated = (rsp->data[*offset] & 0x40 ? 1 : 0);
|
rsp->session.bAuthenticated = (rsp->data[*offset] & 0x40 ? 1 : 0);
|
||||||
//++(*offset);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We don't yet support encrypted or authenticated messages
|
|
||||||
*/
|
|
||||||
//if (rsp->session.bEncrypted || rsp->session.bAuthenticated)
|
|
||||||
//{
|
|
||||||
// printf("Encryted : %d, Authenticated : %d, not supported\n",
|
|
||||||
// rsp->session.bEncrypted, rsp->session.bAuthenticated);
|
|
||||||
// assert(0);
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
/* Payload type */
|
/* Payload type */
|
||||||
//rsp->session.payloadtype = rsp->data[(*offset)++];
|
|
||||||
rsp->session.payloadtype = rsp->data[(*offset)++] & 0x3F;
|
rsp->session.payloadtype = rsp->data[(*offset)++] & 0x3F;
|
||||||
|
|
||||||
/* Session ID */
|
/* Session ID */
|
||||||
@ -935,126 +913,12 @@ void read_session_data_v2x(struct ipmi_rs * rsp,
|
|||||||
memcpy(&rsp->session.msglen, rsp->data + *offset, 2);
|
memcpy(&rsp->session.msglen, rsp->data + *offset, 2);
|
||||||
*offset += 2;
|
*offset += 2;
|
||||||
#if WORDS_BIGENDIAN
|
#if WORDS_BIGENDIAN
|
||||||
rsp->session.msglen = BSWAP_32(rsp->session.msglen);
|
rsp->session.msglen = BSWAP_16(rsp->session.msglen);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* read_session_data_v2x
|
|
||||||
*
|
|
||||||
* Initialize the ipmi_rsp from the v2.x session header of the packet.
|
|
||||||
*
|
|
||||||
* The offset should point to the first byte of the the IPMI session when this
|
|
||||||
* function is called. When this function exits, offset will point to the
|
|
||||||
* start of payload.
|
|
||||||
*
|
|
||||||
* This function decrypts the packet if encryption is enabled, and checks the
|
|
||||||
* authcode if there is a specified integrity algorithm.
|
|
||||||
*
|
|
||||||
* param rsp [in/out] we read from the data buffer and populate the session
|
|
||||||
* specific fields.
|
|
||||||
* param offset [in/out] should point to the beginning of the session when this
|
|
||||||
* function is called. The offset will be adjusted to point to the
|
|
||||||
* end of the session when this function exits.
|
|
||||||
* param s holds our session state
|
|
||||||
*/
|
|
||||||
void read_session_data_v2x2(struct ipmi_rs * rsp,
|
|
||||||
int * offset,
|
|
||||||
struct ipmi_session * s)
|
|
||||||
{
|
|
||||||
rsp->session.authtype = rsp->data[*offset];
|
|
||||||
|
|
||||||
rsp->session.bEncrypted = (rsp->data[*offset] & 0x80 ? 1 : 0);
|
|
||||||
rsp->session.bAuthenticated = (rsp->data[*offset] & 0x40 ? 1 : 0);
|
|
||||||
++(*offset);
|
|
||||||
|
|
||||||
|
|
||||||
/* Payload type */
|
|
||||||
rsp->session.payloadtype = rsp->data[(*offset)++];
|
|
||||||
|
|
||||||
/* Session ID */
|
|
||||||
memcpy(&rsp->session.id, rsp->data + *offset, 4);
|
|
||||||
*offset += 4;
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
rsp->session.id = BSWAP_32(rsp->session.id);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Verify that the session ID is what we think it should be
|
|
||||||
*/
|
|
||||||
if ((s->v2_data.session_state == LANPLUS_STATE_ACTIVE) &&
|
|
||||||
(rsp->session.id != s->v2_data.console_id))
|
|
||||||
{
|
|
||||||
printf("packet session id 0x%x does not match active session 0x%0x\n",
|
|
||||||
rsp->session.id, s->v2_data.console_id);
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Ignored, so far */
|
|
||||||
memcpy(&rsp->session.seq, rsp->data + *offset, 4);
|
|
||||||
*offset += 4;
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
rsp->session.seq = BSWAP_32(rsp->session.seq);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
memcpy(&rsp->session.msglen, rsp->data + *offset, 2);
|
|
||||||
*offset += 2;
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
rsp->session.msglen = BSWAP_32(rsp->session.msglen);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Confidentiality Header */
|
|
||||||
//if (rsp->session.bEncrypted)
|
|
||||||
//{
|
|
||||||
/*
|
|
||||||
* Some work here involved in decrypting the payload
|
|
||||||
*/
|
|
||||||
//printf("ERROR. We don't support encryption");
|
|
||||||
//assert(0);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* BTW, when we decyrpt our packet, we should put the decyrpted
|
|
||||||
* version in the same place it would be if the payload were
|
|
||||||
* not encrypted, so that we can keep our code simple, below.
|
|
||||||
*/
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
/* PAYLOAD WOULD BE HERE */
|
|
||||||
|
|
||||||
|
|
||||||
/* Confidentiality trailer */
|
|
||||||
//if (rsp->session.bEncrypted)
|
|
||||||
//{
|
|
||||||
/*
|
|
||||||
* Some work here involved in decrypting the payload
|
|
||||||
*/
|
|
||||||
// printf("ERROR: we don't support encryption");
|
|
||||||
// assert(0);
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Session Trailer
|
|
||||||
*/
|
|
||||||
//if (rsp->session.bEncrypted && (rsp->session.id != 0))
|
|
||||||
//{
|
|
||||||
/*
|
|
||||||
* Some work here involved in validating the packet
|
|
||||||
*/
|
|
||||||
// printf("ERROR: we don't support encryption");
|
|
||||||
// assert(0);
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* read_session_data_v15
|
* read_session_data_v15
|
||||||
*
|
*
|
||||||
@ -1123,78 +987,6 @@ void read_ipmi_response(struct ipmi_rs * rsp, int * offset)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getIpmiPayloadWireRepOld
|
|
||||||
*
|
|
||||||
* Place the IPMI request in proper wire representation, starting at
|
|
||||||
* msg[len]. Encyrpt the request according to crypt_alg, the output
|
|
||||||
* includes the confidentiality header and and trailer if appropriate.
|
|
||||||
*
|
|
||||||
* param msg [out] will contain our wire representation
|
|
||||||
* param len [in, out] is our index, where we start writing
|
|
||||||
* param req [in] is the IPMI request to be written
|
|
||||||
* param crypt_alg [in] specifies the encryption to use
|
|
||||||
* param rq_seq [in] is the IPMI command sequence number.
|
|
||||||
*/
|
|
||||||
/* void getIpmiPayloadWireRepOld(char * msg, */
|
|
||||||
/* int * len, */
|
|
||||||
/* struct ipmi_rq * req, */
|
|
||||||
/* unsigned char crypt_alg, */
|
|
||||||
/* unsigned char * k2, */
|
|
||||||
/* unsigned char rq_seq) */
|
|
||||||
/* { */
|
|
||||||
/* // Write our plaintext output to a buffer and call */
|
|
||||||
/* // lanplus_encrypt. We should probably create our session */
|
|
||||||
/* // header here -- with the IV. */
|
|
||||||
/* // The confidentiality trailer is encrypted, so make room for it, too. */
|
|
||||||
|
|
||||||
/* int cs, mp, tmp; */
|
|
||||||
|
|
||||||
/* /\* IPMI Message Header -- Figure 13-4 of the IPMI v2.0 spec *\/ */
|
|
||||||
/* cs = mp = *len; */
|
|
||||||
|
|
||||||
/* /\* rsAddr *\/ */
|
|
||||||
/* msg[(*len)++] = IPMI_BMC_SLAVE_ADDR; */
|
|
||||||
|
|
||||||
/* /\* net Fn *\/ */
|
|
||||||
/* msg[(*len)++] = req->msg.netfn << 2; */
|
|
||||||
/* tmp = *len - cs; */
|
|
||||||
|
|
||||||
/* /\* checkSum *\/ */
|
|
||||||
/* msg[(*len)++] = ipmi_csum(msg+cs, tmp); */
|
|
||||||
/* cs = (*len); */
|
|
||||||
|
|
||||||
/* /\* rqAddr *\/ */
|
|
||||||
/* msg[(*len)++] = IPMI_REMOTE_SWID; */
|
|
||||||
|
|
||||||
/* /\* rqSeq / rqLUN *\/ */
|
|
||||||
/* msg[(*len)++] = rq_seq << 2; */
|
|
||||||
|
|
||||||
/* /\* cmd *\/ */
|
|
||||||
/* msg[(*len)++] = req->msg.cmd; */
|
|
||||||
|
|
||||||
/* /\* message data *\/ */
|
|
||||||
/* if (req->msg.data_len) { */
|
|
||||||
/* memcpy(msg + *len, */
|
|
||||||
/* req->msg.data, */
|
|
||||||
/* req->msg.data_len); */
|
|
||||||
/* *len += req->msg.data_len; */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
/* /\* second checksum *\/ */
|
|
||||||
/* tmp = *len - cs; */
|
|
||||||
/* msg[(*len)++] = ipmi_csum(msg+cs, tmp); */
|
|
||||||
|
|
||||||
|
|
||||||
/* /\* Encrypt if necessary *\/ */
|
|
||||||
/* if (crypt_alg != IPMI_CRYPT_NONE) */
|
|
||||||
/* { */
|
|
||||||
/* printf("unknown encryption type"); */
|
|
||||||
/* assert(0); */
|
|
||||||
/* } */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* getIpmiPayloadWireRep
|
* getIpmiPayloadWireRep
|
||||||
*
|
*
|
||||||
@ -1298,7 +1090,7 @@ void
|
|||||||
.seq = 0xff,
|
.seq = 0xff,
|
||||||
};
|
};
|
||||||
|
|
||||||
// msg will hold the entire message to be sent
|
/* msg will hold the entire message to be sent */
|
||||||
unsigned char * msg;
|
unsigned char * msg;
|
||||||
|
|
||||||
int len = 0;
|
int len = 0;
|
||||||
@ -1380,12 +1172,6 @@ void
|
|||||||
switch (payload->payload_type)
|
switch (payload->payload_type)
|
||||||
{
|
{
|
||||||
case IPMI_PAYLOAD_TYPE_IPMI:
|
case IPMI_PAYLOAD_TYPE_IPMI:
|
||||||
//getIpmiPayloadWireRep(msg, /* out */
|
|
||||||
// &len, /* in/out */
|
|
||||||
// payload->payload.ipmi_request.request, /* in */
|
|
||||||
// session->v2_data.crypt_alg, /* in */
|
|
||||||
// session->v2_data.k2, /* in */
|
|
||||||
// payload->payload.ipmi_request.rq_seq); /* in */
|
|
||||||
getIpmiPayloadWireRep(msg + IPMI_LANPLUS_OFFSET_PAYLOAD,
|
getIpmiPayloadWireRep(msg + IPMI_LANPLUS_OFFSET_PAYLOAD,
|
||||||
payload->payload.ipmi_request.request,
|
payload->payload.ipmi_request.request,
|
||||||
payload->payload.ipmi_request.rq_seq);
|
payload->payload.ipmi_request.rq_seq);
|
||||||
@ -1462,7 +1248,6 @@ void
|
|||||||
IPMI_LANPLUS_OFFSET_PAYLOAD +
|
IPMI_LANPLUS_OFFSET_PAYLOAD +
|
||||||
payload->payload_length;
|
payload->payload_length;
|
||||||
|
|
||||||
//printf("authcode sees payload size of %d\n", payload->payload_length);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine the required integrity pad length. We have to make the
|
* Determine the required integrity pad length. We have to make the
|
||||||
@ -2341,9 +2126,6 @@ static int ipmi_lanplus_rakp3(struct ipmi_intf * intf)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Success */
|
/* Success */
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
lanplus_swap(msg + 8, auth_length);
|
|
||||||
#endif
|
|
||||||
v2_payload.payload_length += auth_length;
|
v2_payload.payload_length += auth_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2686,6 +2468,7 @@ void test_crypt2()
|
|||||||
int lanplus_intf_setup(struct ipmi_intf ** intf)
|
int lanplus_intf_setup(struct ipmi_intf ** intf)
|
||||||
{
|
{
|
||||||
//test_crypt1();
|
//test_crypt1();
|
||||||
|
assert("lanplus_intf_setup");
|
||||||
|
|
||||||
if (lanplus_seed_prng(16))
|
if (lanplus_seed_prng(16))
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user