Annotation of embedaddon/strongswan/src/libradius/radius_message.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2009 Martin Willi
! 3: * HSR Hochschule fuer Technik Rapperswil
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the
! 7: * Free Software Foundation; either version 2 of the License, or (at your
! 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 9: *
! 10: * This program is distributed in the hope that it will be useful, but
! 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 13: * for more details.
! 14: */
! 15:
! 16: /**
! 17: * @defgroup libradius libradius
! 18: *
! 19: * @addtogroup libradius
! 20: * RADIUS protocol support library.
! 21: *
! 22: * @defgroup radius_message radius_message
! 23: * @{ @ingroup libradius
! 24: */
! 25:
! 26: #ifndef RADIUS_MESSAGE_H_
! 27: #define RADIUS_MESSAGE_H_
! 28:
! 29: #include <library.h>
! 30: #include <pen/pen.h>
! 31:
! 32: #define MAX_RADIUS_ATTRIBUTE_SIZE 253
! 33:
! 34: #define RADIUS_TUNNEL_TYPE_ESP 9
! 35:
! 36: typedef struct radius_message_t radius_message_t;
! 37: typedef enum radius_message_code_t radius_message_code_t;
! 38: typedef enum radius_attribute_type_t radius_attribute_type_t;
! 39:
! 40: /**
! 41: * RADIUS Message Codes.
! 42: */
! 43: enum radius_message_code_t {
! 44: RMC_ACCESS_REQUEST = 1,
! 45: RMC_ACCESS_ACCEPT = 2,
! 46: RMC_ACCESS_REJECT = 3,
! 47: RMC_ACCOUNTING_REQUEST = 4,
! 48: RMC_ACCOUNTING_RESPONSE = 5,
! 49: RMC_ACCESS_CHALLENGE = 11,
! 50: RMC_DISCONNECT_REQUEST = 40,
! 51: RMC_DISCONNECT_ACK = 41,
! 52: RMC_DISCONNECT_NAK = 42,
! 53: RMC_COA_REQUEST = 43,
! 54: RMC_COA_ACK = 44,
! 55: RMC_COA_NAK = 45,
! 56: };
! 57:
! 58: /**
! 59: * Enum names for radius_attribute_type_t.
! 60: */
! 61: extern enum_name_t *radius_message_code_names;
! 62:
! 63: /**
! 64: * RADIUS Attribute Types.
! 65: */
! 66: enum radius_attribute_type_t {
! 67: RAT_USER_NAME = 1,
! 68: RAT_USER_PASSWORD = 2,
! 69: RAT_CHAP_PASSWORD = 3,
! 70: RAT_NAS_IP_ADDRESS = 4,
! 71: RAT_NAS_PORT = 5,
! 72: RAT_SERVICE_TYPE = 6,
! 73: RAT_FRAMED_PROTOCOL = 7,
! 74: RAT_FRAMED_IP_ADDRESS = 8,
! 75: RAT_FRAMED_IP_NETMASK = 9,
! 76: RAT_FRAMED_ROUTING = 10,
! 77: RAT_FILTER_ID = 11,
! 78: RAT_FRAMED_MTU = 12,
! 79: RAT_FRAMED_COMPRESSION = 13,
! 80: RAT_LOGIN_IP_HOST = 14,
! 81: RAT_LOGIN_SERVICE = 15,
! 82: RAT_LOGIN_TCP_PORT = 16,
! 83: RAT_REPLY_MESSAGE = 18,
! 84: RAT_CALLBACK_NUMBER = 19,
! 85: RAT_CALLBACK_ID = 20,
! 86: RAT_FRAMED_ROUTE = 22,
! 87: RAT_FRAMED_IPX_NETWORK = 23,
! 88: RAT_STATE = 24,
! 89: RAT_CLASS = 25,
! 90: RAT_VENDOR_SPECIFIC = 26,
! 91: RAT_SESSION_TIMEOUT = 27,
! 92: RAT_IDLE_TIMEOUT = 28,
! 93: RAT_TERMINATION_ACTION = 29,
! 94: RAT_CALLED_STATION_ID = 30,
! 95: RAT_CALLING_STATION_ID = 31,
! 96: RAT_NAS_IDENTIFIER = 32,
! 97: RAT_PROXY_STATE = 33,
! 98: RAT_LOGIN_LAT_SERVICE = 34,
! 99: RAT_LOGIN_LAT_NODE = 35,
! 100: RAT_LOGIN_LAT_GROUP = 36,
! 101: RAT_FRAMED_APPLETALK_LINK = 37,
! 102: RAT_FRAMED_APPLETALK_NETWORK = 38,
! 103: RAT_FRAMED_APPLETALK_ZONE = 39,
! 104: RAT_ACCT_STATUS_TYPE = 40,
! 105: RAT_ACCT_DELAY_TIME = 41,
! 106: RAT_ACCT_INPUT_OCTETS = 42,
! 107: RAT_ACCT_OUTPUT_OCTETS = 43,
! 108: RAT_ACCT_SESSION_ID = 44,
! 109: RAT_ACCT_AUTHENTIC = 45,
! 110: RAT_ACCT_SESSION_TIME = 46,
! 111: RAT_ACCT_INPUT_PACKETS = 47,
! 112: RAT_ACCT_OUTPUT_PACKETS = 48,
! 113: RAT_ACCT_TERMINATE_CAUSE = 49,
! 114: RAT_ACCT_MULTI_SESSION_ID = 50,
! 115: RAT_ACCT_LINK_COUNT = 51,
! 116: RAT_ACCT_INPUT_GIGAWORDS = 52,
! 117: RAT_ACCT_OUTPUT_GIGAWORDS = 53,
! 118: RAT_EVENT_TIMESTAMP = 55,
! 119: RAT_EGRESS_VLANID = 56,
! 120: RAT_INGRESS_FILTERS = 57,
! 121: RAT_EGRESS_VLAN_NAME = 58,
! 122: RAT_USER_PRIORITY_TABLE = 59,
! 123: RAT_CHAP_CHALLENGE = 60,
! 124: RAT_NAS_PORT_TYPE = 61,
! 125: RAT_PORT_LIMIT = 62,
! 126: RAT_LOGIN_LAT_PORT = 63,
! 127: RAT_TUNNEL_TYPE = 64,
! 128: RAT_TUNNEL_MEDIUM_TYPE = 65,
! 129: RAT_TUNNEL_CLIENT_ENDPOINT = 66,
! 130: RAT_TUNNEL_SERVER_ENDPOINT = 67,
! 131: RAT_ACCT_TUNNEL_CONNECTION = 68,
! 132: RAT_TUNNEL_PASSWORD = 69,
! 133: RAT_ARAP_PASSWORD = 70,
! 134: RAT_ARAP_FEATURES = 71,
! 135: RAT_ARAP_ZONE_ACCESS = 72,
! 136: RAT_ARAP_SECURITY = 73,
! 137: RAT_ARAP_SECURITY_DATA = 74,
! 138: RAT_PASSWORD_RETRY = 75,
! 139: RAT_PROMPT = 76,
! 140: RAT_CONNECT_INFO = 77,
! 141: RAT_CONFIGURATION_TOKEN = 78,
! 142: RAT_EAP_MESSAGE = 79,
! 143: RAT_MESSAGE_AUTHENTICATOR = 80,
! 144: RAT_TUNNEL_PRIVATE_GROUP_ID = 81,
! 145: RAT_TUNNEL_ASSIGNMENT_ID = 82,
! 146: RAT_TUNNEL_PREFERENCE = 83,
! 147: RAT_ARAP_CHALLENGE_RESPONSE = 84,
! 148: RAT_ACCT_INTERIM_INTERVAL = 85,
! 149: RAT_ACCT_TUNNEL_PACKETS_LOST = 86,
! 150: RAT_NAS_PORT_ID = 87,
! 151: RAT_FRAMED_POOL = 88,
! 152: RAT_CUI = 89,
! 153: RAT_TUNNEL_CLIENT_AUTH_ID = 90,
! 154: RAT_TUNNEL_SERVER_AUTH_ID = 91,
! 155: RAT_NAS_FILTER_RULE = 92,
! 156: RAT_UNASSIGNED = 93,
! 157: RAT_ORIGINATING_LINE_INFO = 94,
! 158: RAT_NAS_IPV6_ADDRESS = 95,
! 159: RAT_FRAMED_INTERFACE_ID = 96,
! 160: RAT_FRAMED_IPV6_PREFIX = 97,
! 161: RAT_LOGIN_IPV6_HOST = 98,
! 162: RAT_FRAMED_IPV6_ROUTE = 99,
! 163: RAT_FRAMED_IPV6_POOL = 100,
! 164: RAT_ERROR_CAUSE = 101,
! 165: RAT_EAP_KEY_NAME = 102,
! 166: RAT_DIGEST_RESPONSE = 103,
! 167: RAT_DIGEST_REALM = 104,
! 168: RAT_DIGEST_NONCE = 105,
! 169: RAT_DIGEST_RESPONSE_AUTH = 106,
! 170: RAT_DIGEST_NEXTNONCE = 107,
! 171: RAT_DIGEST_METHOD = 108,
! 172: RAT_DIGEST_URI = 109,
! 173: RAT_DIGEST_QOP = 110,
! 174: RAT_DIGEST_ALGORITHM = 111,
! 175: RAT_DIGEST_ENTITY_BODY_HASH = 112,
! 176: RAT_DIGEST_CNONCE = 113,
! 177: RAT_DIGEST_NONCE_COUNT = 114,
! 178: RAT_DIGEST_USERNAME = 115,
! 179: RAT_DIGEST_OPAQUE = 116,
! 180: RAT_DIGEST_AUTH_PARAM = 117,
! 181: RAT_DIGEST_AKA_AUTS = 118,
! 182: RAT_DIGEST_DOMAIN = 119,
! 183: RAT_DIGEST_STALE = 120,
! 184: RAT_DIGEST_HA1 = 121,
! 185: RAT_SIP_AOR = 122,
! 186: RAT_DELEGATED_IPV6_PREFIX = 123,
! 187: RAT_MIP6_FEATURE_VECTOR = 124,
! 188: RAT_MIP6_HOME_LINK_PREFIX = 125,
! 189: RAT_FRAMED_IPV6_ADDRESS = 168,
! 190: RAT_FRAMED_IPV6_DNS_SERVER = 169,
! 191: RAT_ROUTE_IPV6_INFORMATION = 170,
! 192: RAT_DELEGATED_IPV6_PREFIX_POOL = 171,
! 193: RAT_STATEFUL_IPV6_ADDRESS_POOL = 172,
! 194: };
! 195:
! 196: /**
! 197: * Enum names for radius_attribute_type_t.
! 198: */
! 199: extern enum_name_t *radius_attribute_type_names;
! 200:
! 201: /**
! 202: * A RADIUS message, contains attributes.
! 203: */
! 204: struct radius_message_t {
! 205:
! 206: /**
! 207: * Create an enumerator over contained RADIUS attributes.
! 208: *
! 209: * @return enumerator over (int type, chunk_t data)
! 210: */
! 211: enumerator_t* (*create_enumerator)(radius_message_t *this);
! 212:
! 213: /**
! 214: * Create an enumerator over contained RADIUS Vendor-ID attributes.
! 215: *
! 216: * This enumerator parses only vendor specific attributes in the format
! 217: * recommended in RFC2865.
! 218: *
! 219: * @return enumerator over (int vendor, int type, chunk_t data)
! 220: */
! 221: enumerator_t* (*create_vendor_enumerator)(radius_message_t *this);
! 222:
! 223: /**
! 224: * Add a RADIUS attribute to the message.
! 225: *
! 226: * @param type type of attribute to add
! 227: * @param attribute data, gets cloned
! 228: */
! 229: void (*add)(radius_message_t *this, radius_attribute_type_t type,
! 230: chunk_t data);
! 231:
! 232: /**
! 233: * Get the message type (code).
! 234: *
! 235: * @return message code
! 236: */
! 237: radius_message_code_t (*get_code)(radius_message_t *this);
! 238:
! 239: /**
! 240: * Get the message identifier.
! 241: *
! 242: * @return message identifier
! 243: */
! 244: uint8_t (*get_identifier)(radius_message_t *this);
! 245:
! 246: /**
! 247: * Set the message identifier.
! 248: *
! 249: * @param identifier message identifier
! 250: */
! 251: void (*set_identifier)(radius_message_t *this, uint8_t identifier);
! 252:
! 253: /**
! 254: * Get the 16 byte authenticator.
! 255: *
! 256: * @return pointer to the Authenticator field
! 257: */
! 258: uint8_t* (*get_authenticator)(radius_message_t *this);
! 259:
! 260: /**
! 261: * Get the RADIUS message in its encoded form.
! 262: *
! 263: * @return chunk pointing to internal RADIUS message.
! 264: */
! 265: chunk_t (*get_encoding)(radius_message_t *this);
! 266:
! 267: /**
! 268: * Calculate and add the Message-Authenticator attribute to the message.
! 269: *
! 270: * @param req_auth 16 byte Authenticator of request, or NULL
! 271: * @param secret shared RADIUS secret
! 272: * @param signer HMAC-MD5 signer with secret set
! 273: * @param hasher MD5 hasher
! 274: * @param rng RNG to create Request-Authenticator, NULL to omit
! 275: * @param msg_auth calculate and add Message-Authenticator
! 276: * @return TRUE if signed successfully
! 277: */
! 278: bool (*sign)(radius_message_t *this, uint8_t *req_auth, chunk_t secret,
! 279: hasher_t *hasher, signer_t *signer, rng_t *rng, bool msg_auth);
! 280:
! 281: /**
! 282: * Verify the integrity of a received RADIUS message.
! 283: *
! 284: * @param req_auth 16 byte Authenticator of request, or NULL
! 285: * @param secret shared RADIUS secret
! 286: * @param signer HMAC-MD5 signer with secret set
! 287: * @param hasher MD5 hasher
! 288: */
! 289: bool (*verify)(radius_message_t *this, uint8_t *req_auth, chunk_t secret,
! 290: hasher_t *hasher, signer_t *signer);
! 291:
! 292: /**
! 293: * Perform RADIUS attribute en-/decryption.
! 294: *
! 295: * Performs en-/decryption by XOring the hash-extended secret into data,
! 296: * as specified in RFC 2865 5.2 and used by RFC 2548.
! 297: *
! 298: * @param salt salt to append to message authenticator, if any
! 299: * @param in data to en-/decrypt, multiple of HASH_SIZE_MD5
! 300: * @param out en-/decrypted data, length equal to in
! 301: * @param secret RADIUS secret
! 302: * @param hasher MD5 hasher
! 303: * @return TRUE if en-/decryption successful
! 304: */
! 305: bool (*crypt)(radius_message_t *this, chunk_t salt, chunk_t in, chunk_t out,
! 306: chunk_t secret, hasher_t *hasher);
! 307:
! 308: /**
! 309: * Destroy the message.
! 310: */
! 311: void (*destroy)(radius_message_t *this);
! 312: };
! 313:
! 314: /**
! 315: * Create an empty RADIUS message.
! 316: *
! 317: * @param code request type
! 318: * @return radius_message_t object
! 319: */
! 320: radius_message_t *radius_message_create(radius_message_code_t code);
! 321:
! 322: /**
! 323: * Parse and verify a received RADIUS message.
! 324: *
! 325: * @param data received message data
! 326: * @return radius_message_t object, NULL if length invalid
! 327: */
! 328: radius_message_t *radius_message_parse(chunk_t data);
! 329:
! 330: /**
! 331: * @}
! 332: * @addtogroup libradius
! 333: * @{
! 334: *
! 335: * Dummy libradius initialization function needed for integrity test
! 336: */
! 337: void libradius_init(void);
! 338:
! 339: #endif /** RADIUS_MESSAGE_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>