2016-03-24 14:02:30 -06:00

343 lines
15 KiB
C

/*
* Copyright (C) 2003-2015 FreeIPMI Core Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef IPMI_RMCPPLUS_INTERFACE_H
#define IPMI_RMCPPLUS_INTERFACE_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <freeipmi/fiid/fiid.h>
#include <sys/types.h>
#include <sys/socket.h>
/**************************
* IPMI 2.0 Payload Types *
**************************/
#define IPMI_PAYLOAD_TYPE_IPMI 0x00
#define IPMI_PAYLOAD_TYPE_SOL 0x01
#define IPMI_PAYLOAD_TYPE_OEM_EXPLICIT 0x02
#define IPMI_PAYLOAD_TYPE_RMCPPLUS_OPEN_SESSION_REQUEST 0x10
#define IPMI_PAYLOAD_TYPE_RMCPPLUS_OPEN_SESSION_RESPONSE 0x11
#define IPMI_PAYLOAD_TYPE_RAKP_MESSAGE_1 0x12
#define IPMI_PAYLOAD_TYPE_RAKP_MESSAGE_2 0x13
#define IPMI_PAYLOAD_TYPE_RAKP_MESSAGE_3 0x14
#define IPMI_PAYLOAD_TYPE_RAKP_MESSAGE_4 0x15
/* 20h - 27h - OEM */
/* all other reserved */
#define IPMI_PAYLOAD_TYPE_VALID(__payload_type) \
(((__payload_type) == IPMI_PAYLOAD_TYPE_IPMI \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_SOL \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_OEM_EXPLICIT \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_RMCPPLUS_OPEN_SESSION_REQUEST \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_RMCPPLUS_OPEN_SESSION_RESPONSE \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_RAKP_MESSAGE_1 \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_RAKP_MESSAGE_2 \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_RAKP_MESSAGE_3 \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_RAKP_MESSAGE_4) ? 1 : 0)
#define IPMI_PAYLOAD_TYPE_SESSION_SETUP(__payload_type) \
(((__payload_type) == IPMI_PAYLOAD_TYPE_RMCPPLUS_OPEN_SESSION_REQUEST \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_RMCPPLUS_OPEN_SESSION_RESPONSE \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_RAKP_MESSAGE_1 \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_RAKP_MESSAGE_2 \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_RAKP_MESSAGE_3 \
|| (__payload_type) == IPMI_PAYLOAD_TYPE_RAKP_MESSAGE_4) ? 1 : 0)
/**************************
* IPMI 2.0 Payload Flags *
**************************/
#define IPMI_PAYLOAD_FLAG_UNENCRYPTED 0x0
#define IPMI_PAYLOAD_FLAG_ENCRYPTED 0x1
#define IPMI_PAYLOAD_FLAG_UNAUTHENTICATED 0x0
#define IPMI_PAYLOAD_FLAG_AUTHENTICATED 0x1
#define IPMI_PAYLOAD_ENCRYPTED_FLAG_VALID(__payload_flag) \
(((__payload_flag) == IPMI_PAYLOAD_FLAG_UNENCRYPTED \
|| (__payload_flag) == IPMI_PAYLOAD_FLAG_ENCRYPTED) ? 1 : 0)
#define IPMI_PAYLOAD_AUTHENTICATED_FLAG_VALID(__payload_flag) \
(((__payload_flag) == IPMI_PAYLOAD_FLAG_UNENCRYPTED \
|| (__payload_flag) == IPMI_PAYLOAD_FLAG_ENCRYPTED) ? 1 : 0)
/*********************************************
* IPMI 2.0 Authentication Algorithm Numbers *
*********************************************/
#define IPMI_AUTHENTICATION_ALGORITHM_RAKP_NONE 0x00
#define IPMI_AUTHENTICATION_ALGORITHM_RAKP_HMAC_SHA1 0x01
#define IPMI_AUTHENTICATION_ALGORITHM_RAKP_HMAC_MD5 0x02
#define IPMI_AUTHENTICATION_ALGORITHM_RAKP_HMAC_SHA256 0x03
/* C0h - FFh - OEM */
/* all other reserved */
#define IPMI_AUTHENTICATION_ALGORITHM_VALID(__algorithm) \
(((__algorithm) == IPMI_AUTHENTICATION_ALGORITHM_RAKP_NONE \
|| (__algorithm) == IPMI_AUTHENTICATION_ALGORITHM_RAKP_HMAC_SHA1 \
|| (__algorithm) == IPMI_AUTHENTICATION_ALGORITHM_RAKP_HMAC_MD5 \
|| (__algorithm) == IPMI_AUTHENTICATION_ALGORITHM_RAKP_HMAC_SHA256) ? 1 : 0)
#define IPMI_AUTHENTICATION_ALGORITHM_SUPPORTED(__algorithm) \
(((__algorithm) == IPMI_AUTHENTICATION_ALGORITHM_RAKP_NONE \
|| (__algorithm) == IPMI_AUTHENTICATION_ALGORITHM_RAKP_HMAC_SHA1 \
|| (__algorithm) == IPMI_AUTHENTICATION_ALGORITHM_RAKP_HMAC_MD5 \
|| (__algorithm) == IPMI_AUTHENTICATION_ALGORITHM_RAKP_HMAC_SHA256) ? 1 : 0)
/****************************************
* IPMI 2.0 Integrity Algorithm Numbers *
****************************************/
#define IPMI_INTEGRITY_ALGORITHM_NONE 0x00
#define IPMI_INTEGRITY_ALGORITHM_HMAC_SHA1_96 0x01
#define IPMI_INTEGRITY_ALGORITHM_HMAC_MD5_128 0x02
#define IPMI_INTEGRITY_ALGORITHM_MD5_128 0x03
#define IPMI_INTEGRITY_ALGORITHM_HMAC_SHA256_128 0x04
/* C0h - FFh - OEM */
/* all other reserved */
#define IPMI_INTEGRITY_ALGORITHM_VALID(__algorithm) \
(((__algorithm) == IPMI_INTEGRITY_ALGORITHM_NONE \
|| (__algorithm) == IPMI_INTEGRITY_ALGORITHM_HMAC_SHA1_96 \
|| (__algorithm) == IPMI_INTEGRITY_ALGORITHM_HMAC_MD5_128 \
|| (__algorithm) == IPMI_INTEGRITY_ALGORITHM_MD5_128 \
|| (__algorithm) == IPMI_INTEGRITY_ALGORITHM_HMAC_SHA256_128) ? 1 : 0)
#define IPMI_INTEGRITY_ALGORITHM_SUPPORTED(__algorithm) \
(((__algorithm) == IPMI_INTEGRITY_ALGORITHM_NONE \
|| (__algorithm) == IPMI_INTEGRITY_ALGORITHM_HMAC_SHA1_96 \
|| (__algorithm) == IPMI_INTEGRITY_ALGORITHM_HMAC_MD5_128 \
|| (__algorithm) == IPMI_INTEGRITY_ALGORITHM_MD5_128 \
|| (__algorithm) == IPMI_INTEGRITY_ALGORITHM_HMAC_SHA256_128) ? 1 : 0)
/**********************************************
* IPMI 2.0 Confidentiality Algorithm Numbers *
**********************************************/
#define IPMI_CONFIDENTIALITY_ALGORITHM_NONE 0x00
#define IPMI_CONFIDENTIALITY_ALGORITHM_AES_CBC_128 0x01
#define IPMI_CONFIDENTIALITY_ALGORITHM_XRC4_128 0x02
#define IPMI_CONFIDENTIALITY_ALGORITHM_XRC4_40 0x03
/* 30h - 3Fh - OEM */
/* all other reserved */
#define IPMI_CONFIDENTIALITY_ALGORITHM_VALID(__algorithm) \
(((__algorithm) == IPMI_CONFIDENTIALITY_ALGORITHM_NONE \
|| (__algorithm) == IPMI_CONFIDENTIALITY_ALGORITHM_AES_CBC_128 \
|| (__algorithm) == IPMI_CONFIDENTIALITY_ALGORITHM_XRC4_128 \
|| (__algorithm) == IPMI_CONFIDENTIALITY_ALGORITHM_XRC4_40) ? 1 : 0)
#define IPMI_CONFIDENTIALITY_ALGORITHM_SUPPORTED(__algorithm) \
(((__algorithm) == IPMI_CONFIDENTIALITY_ALGORITHM_NONE \
|| (__algorithm) == IPMI_CONFIDENTIALITY_ALGORITHM_AES_CBC_128) ? 1 : 0)
/***************************************
* IPMI 2.0 Misc Flags and Definitions *
***************************************/
#define IPMI_AUTHENTICATION_PAYLOAD_TYPE 0x00
#define IPMI_AUTHENTICATION_PAYLOAD_LENGTH 0x08
#define IPMI_INTEGRITY_PAYLOAD_TYPE 0x01
#define IPMI_INTEGRITY_PAYLOAD_LENGTH 0x08
#define IPMI_CONFIDENTIALITY_PAYLOAD_TYPE 0x02
#define IPMI_CONFIDENTIALITY_PAYLOAD_LENGTH 0x08
#define IPMI_USER_NAME_PRIVILEGE_LOOKUP 0x0
#define IPMI_NAME_ONLY_LOOKUP 0x1
#define IPMI_USER_NAME_LOOKUP_VALID(__username_lookup_flag) \
(((__username_lookup_flag) == IPMI_USER_NAME_PRIVILEGE_LOOKUP \
|| (__username_lookup_flag) == IPMI_NAME_ONLY_LOOKUP) ? 1 : 0)
#define IPMI_REMOTE_CONSOLE_RANDOM_NUMBER_LENGTH 16
#define IPMI_MANAGED_SYSTEM_RANDOM_NUMBER_LENGTH 16
#define IPMI_MANAGED_SYSTEM_GUID_LENGTH 16
#define IPMI_NEXT_HEADER 0x07
#define IPMI_INTEGRITY_PAD_MULTIPLE 4
#define IPMI_INTEGRITY_PAD_DATA 0xFF
#define IPMI_MAX_PAYLOAD_LENGTH 65536
/* achu: b/c ipmi_msg_len is 2 bytes */
#define IPMI_HMAC_SHA1_DIGEST_LENGTH 20
#define IPMI_HMAC_MD5_DIGEST_LENGTH 16
#define IPMI_MD5_DIGEST_LENGTH 16
#define IPMI_HMAC_SHA1_96_DIGEST_LENGTH 12
#define IPMI_HMAC_SHA256_DIGEST_LENGTH 32
#define IPMI_HMAC_SHA1_96_AUTHENTICATION_CODE_LENGTH 12
#define IPMI_HMAC_MD5_128_AUTHENTICATION_CODE_LENGTH 16
#define IPMI_MD5_128_AUTHENTICATION_CODE_LENGTH 16
#define IPMI_HMAC_SHA256_128_AUTHENTICATION_CODE_LENGTH 16
/* Refer to table 22-19 */
/* XXX - Errata 4 defines SHA256 but not cipher suite IDs */
/* achu: Intel support says Cipher Suite 15-19 maps to 1-5 using
* SHA256 instead of SHA1 and SHA256-128 instead of SHA1-96.
*/
/* Cipher Suite 17 confirmed via DCMI 1.1 specification */
#define IPMI_CIPHER_SUITE_ID_MIN 0
#define IPMI_CIPHER_SUITE_ID_MAX 19
/*
* fill* functions return 0 on success, -1 on error.
*
* object must be for the fill function's respective fiid
* template.
*
* assemble/unassemble functions must be passed fiid objects of the
* respective expected header/trailer templates.
*
* see freeipmi/templates/ for template definitions
*/
extern fiid_template_t tmpl_rmcpplus_session_hdr;
extern fiid_template_t tmpl_rmcpplus_session_trlr;
extern fiid_template_t tmpl_rmcpplus_payload;
extern fiid_template_t tmpl_rmcpplus_open_session_request;
extern fiid_template_t tmpl_rmcpplus_open_session_response;
extern fiid_template_t tmpl_rmcpplus_rakp_message_1;
extern fiid_template_t tmpl_rmcpplus_rakp_message_2;
extern fiid_template_t tmpl_rmcpplus_rakp_message_3;
extern fiid_template_t tmpl_rmcpplus_rakp_message_4;
/* ipmi_rmcpplus_init
*
* Must be called first to initialize crypt libs. In threaded
* programs, must be called before threads are created.
*
* If errno returned == EPERM, underlying crypt library incompatible.
*
* Returns 0 on success, -1 on error.
*/
int ipmi_rmcpplus_init (void);
int fill_rmcpplus_session_hdr (uint8_t payload_type,
uint8_t payload_authenticated,
uint8_t payload_encrypted,
uint32_t oem_iana,
uint16_t oem_payload_id,
uint32_t session_id,
uint32_t session_sequence_number,
fiid_obj_t obj_rmcpplus_session_hdr);
int fill_rmcpplus_session_trlr (fiid_obj_t obj_rmcpplus_session_trlr);
int fill_rmcpplus_payload (const void *confidentiality_header,
unsigned int confidentiality_header_len,
const void *payload_data,
unsigned int payload_data_len,
const void *confidentiality_trailer,
unsigned int confidentiality_trailer_len,
fiid_obj_t obj_cmd_rq);
int fill_rmcpplus_open_session (uint8_t message_tag,
uint8_t requested_maximum_privilege_level,
uint32_t remote_console_session_id,
uint8_t authentication_algorithm,
uint8_t integrity_algorithm,
uint8_t confidentiality_algorithm,
fiid_obj_t obj_cmd_rq);
int fill_rmcpplus_rakp_message_1 (uint8_t message_tag,
uint32_t managed_system_session_id,
const void *remote_console_random_number,
unsigned int remote_console_random_number_len,
uint8_t requested_maximum_privilege_level,
uint8_t name_only_lookup_flag,
const char *username,
unsigned int username_len,
fiid_obj_t obj_cmd_rq);
int fill_rmcpplus_rakp_message_3 (uint8_t message_tag,
uint8_t rmcpplus_status_code,
uint32_t managed_system_session_id,
const void *key_exchange_authentication_code,
unsigned int key_exchange_authentication_code_len,
fiid_obj_t obj_cmd_rq);
/* returns length written to pkt on success, -1 on error */
int assemble_ipmi_rmcpplus_pkt (uint8_t authentication_algorithm,
uint8_t integrity_algorithm,
uint8_t confidentiality_algorithm,
const void *integrity_key,
unsigned int integrity_key_len,
const void *confidentiality_key,
unsigned int confidentiality_key_len,
const void *authentication_code_data,
unsigned int authentication_code_data_len,
fiid_obj_t obj_rmcp_hdr,
fiid_obj_t obj_rmcpplus_session_hdr,
fiid_obj_t obj_lan_msg_hdr,
fiid_obj_t obj_cmd,
fiid_obj_t obj_rmcpplus_session_trlr,
void *pkt,
unsigned int pkt_len,
unsigned int flags);
/* returns 1 if fully unparsed, 0 if not, -1 on error */
int unassemble_ipmi_rmcpplus_pkt (uint8_t authentication_algorithm,
uint8_t integrity_algorithm,
uint8_t confidentiality_algorithm,
const void *integrity_key,
unsigned int integrity_key_len,
const void *confidentiality_key,
unsigned int confidentiality_key_len,
const void *pkt,
unsigned int pkt_len,
fiid_obj_t obj_rmcp_hdr,
fiid_obj_t obj_rmcpplus_session_hdr,
fiid_obj_t obj_rmcpplus_payload,
fiid_obj_t obj_lan_msg_hdr,
fiid_obj_t obj_cmd,
fiid_obj_t obj_lan_msg_trlr,
fiid_obj_t obj_rmcpplus_session_trlr,
unsigned int flags);
/* returns length sent on success, -1 on error */
/* A few extra error checks, but nearly identical to system sendto() */
ssize_t ipmi_rmcpplus_sendto (int s,
const void *buf,
size_t len,
int flags,
const struct sockaddr *to,
socklen_t tolen);
/* returns length received on success, 0 on orderly shutdown, -1 on error */
/* A few extra error checks, but nearly identical to system recvfrom() */
ssize_t ipmi_rmcpplus_recvfrom (int s,
void *buf,
size_t len,
int flags,
struct sockaddr *from,
socklen_t *fromlen);
#ifdef __cplusplus
}
#endif
#endif /* IPMI_RMCPPLUS_INTERFACE_H */