00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #ifndef _RADIUSMSG_H_
00050 #define _RADIUSMSG_H_
00051
00052 #include "UDPSocket.h"
00053
00054 #define RADIUS_AUTHENTICATOR_LENGTH 16
00055 #define RADIUS_PASSWORD_BLOCK_SIZE 16
00056 #define RADIUS_HEADER_LENGTH 20
00057
00058
00059 #define RADIUS_MAX_SIZE 1000
00060 #define RADIUS_MAX_ATTRIBUTE_SIZE 253
00061 typedef uint8_t RadiusAuthenticator[RADIUS_AUTHENTICATOR_LENGTH];
00062
00063
00064 typedef enum
00065 {
00066 RadiusCodeAccessRequest = 1,
00067 RadiusCodeAccessAccept = 2,
00068 RadiusCodeAccessReject = 3,
00069 RadiusCodeAccountingRequest = 4,
00070 RadiusCodeAccountingResponse = 5,
00071 RadiusCodeAccountingStatus = 6,
00072 RadiusCodeAccessPasswordRequest = 7,
00073 RadiusCodeAccessPasswordAck = 8,
00074 RadiusCodeAccessPasswordReject = 9,
00075 RadiusCodeAccountingMessage = 10,
00076 RadiusCodeAccessChallenge = 11,
00077 RadiusCodeStatusServer = 12,
00078 RadiusCodeStatusClient = 13,
00079 RadiusCodeResourceFreeRequest = 21,
00080 RadiusCodeResourceFreeResponse = 22,
00081 RadiusCodeResourceQueryRequest = 23,
00082 RadiusCodeResourceQueryResponse = 24,
00083 RadiusCodeAlternateResourceReclaimRequest = 25,
00084 RadiusCodeNASRebootRequest = 26,
00085 RadiusCodeNASRebootResponse = 27,
00086 RadiusCodeAscendAccessNextCode = 29,
00087 RadiusCodeAscendAccessNewPin = 30,
00088 RadiusCodeAscendTerminateSession = 31,
00089 RadiusCodeAscendPasswordExpired = 32,
00090 RadiusCodeAscendAccessEventRequest = 33,
00091 RadiusCodeAscendAccessEventResponse = 34,
00092 RadiusCodeDisconnectRequest = 40,
00093 RadiusCodeDisconnectRequestACKed = 41,
00094 RadiusCodeDisconnectRequestNAKed = 42,
00095 RadiusCodeChangeFilterRequest = 43,
00096 RadiusCodeChangeFilterRequestACKed = 44,
00097 RadiusCodeChangeFilterRequestNAKed = 45,
00098 RadiusCodeIPAddressAllocate = 50,
00099 RadiusCodeIPAddressRelease = 51,
00100
00101 RadiusCodeStartInvalidCodes = 52
00102 } RadiusCode;
00103
00104 const unsigned RadiusAttrUserName = 1;
00105 const unsigned RadiusAttrUserPassword = 2;
00106 const unsigned RadiusAttrChapPassword = 3;
00107 const unsigned RadiusAttrNasIPAddress = 4;
00108 const unsigned RadiusAttrNASPort = 5;
00109 const unsigned RadiusAttrServiceType = 6;
00110 const unsigned RadiusAttrFramedProtocol = 7;
00111 const unsigned RadiusAttrFramedIPAddress = 8;
00112 const unsigned RadiusAttrFramedIPNetmask = 9;
00113 const unsigned RadiusAttrFramedRouting = 10;
00114 const unsigned RadiusAttrFilterId = 11;
00115 const unsigned RadiusAttrFramedMTU = 12;
00116 const unsigned RadiusAttrFramedCompression = 13;
00117 const unsigned RadiusAttrLoginIPHost = 14;
00118 const unsigned RadiusAttrLoginService = 15;
00119 const unsigned RadiusAttrLoginTCPPort = 16;
00120 const unsigned RadiusAttrOldPassword = 17;
00121 const unsigned RadiusAttrReplyMessage = 18;
00122 const unsigned RadiusAttrCallbackNumber = 19;
00123 const unsigned RadiusAttrCallbackId = 20;
00124 const unsigned RadiusAttrAscendPWExpiration = 21;
00125 const unsigned RadiusAttrFramedRoute = 22;
00126 const unsigned RadiusAttrFramedIPXNetwork = 23;
00127 const unsigned RadiusAttrState = 24;
00128 const unsigned RadiusAttrClass = 25;
00129 const unsigned RadiusAttrVendorSpecific = 26;
00130 const unsigned RadiusAttrSessionTimeout = 27;
00131 const unsigned RadiusAttrIdleTimeout = 28;
00132 const unsigned RadiusAttrTerminationAction = 29;
00133 const unsigned RadiusAttrCalledStationId = 30;
00134 const unsigned RadiusAttrCallingStationId = 31;
00135 const unsigned RadiusAttrNASIdentifier = 32;
00136 const unsigned RadiusAttrProxyState = 33;
00137 const unsigned RadiusAttrLoginLATService = 34;
00138 const unsigned RadiusAttrLoginLATNode = 35;
00139 const unsigned RadiusAttrLoginLATGroup = 36;
00140 const unsigned RadiusAttrFramedAppleTalkLink = 37;
00141 const unsigned RadiusAttrFramedAppleTalkNetwork = 38;
00142 const unsigned RadiusAttrFramedAppleTalkZone = 39;
00143 const unsigned RadiusAttrAcctStatusType = 40;
00144 const unsigned RadiusAttrAcctDelayTime = 41;
00145 const unsigned RadiusAttrAcctInputOctets = 42;
00146 const unsigned RadiusAttrAcctOutputOctets = 43;
00147 const unsigned RadiusAttrAcctSessionId = 44;
00148 const unsigned RadiusAttrAcctAuthentic = 45;
00149 const unsigned RadiusAttrAcctSessionTime = 46;
00150 const unsigned RadiusAttrAcctInputPackets = 47;
00151 const unsigned RadiusAttrAcctOutputPackets = 48;
00152 const unsigned RadiusAttrAcctTerminateCause = 49;
00153 const unsigned RadiusAttrAcctMultiSessionId = 50;
00154 const unsigned RadiusAttrAcctLinkCount = 51;
00155 const unsigned RadiusAttrAcctInputGigawords = 52;
00156 const unsigned RadiusAttrAcctOutputGigawords = 53;
00157
00158 const unsigned RadiusAttrEventTimestamp = 55;
00159 const unsigned RadiusAttrEgressVLANID = 56;
00160 const unsigned RadiusAttrIngressFilters = 57;
00161 const unsigned RadiusAttrEgressVLANName = 58;
00162 const unsigned RadiusAttrUserPriorityTable = 59;
00163 const unsigned RadiusAttrCHAPChallenge = 60;
00164 const unsigned RadiusAttrNASPortType = 61;
00165 const unsigned RadiusAttrPortLimit = 62;
00166 const unsigned RadiusAttrLoginLATPort = 63;
00167 const unsigned RadiusAttrTunnelType = 64;
00168 const unsigned RadiusAttrTunnelMediumType = 65;
00169 const unsigned RadiusAttrTunnelClientEndpoint = 66;
00170 const unsigned RadiusAttrTunnelServerEndpoint = 67;
00171 const unsigned RadiusAttrTunnelID = 68;
00172 const unsigned RadiusAttrTunnelPassword = 69;
00173 const unsigned RadiusAttrARAPPassword = 70;
00174 const unsigned RadiusAttrARAPFeatures = 71;
00175 const unsigned RadiusAttrARAPZoneAccess = 72;
00176 const unsigned RadiusAttrARAPSecurity = 73;
00177 const unsigned RadiusAttrARAPSecurityData = 74;
00178 const unsigned RadiusAttrPasswordRetry = 75;
00179 const unsigned RadiusAttrPrompt = 76;
00180 const unsigned RadiusAttrConnectInfo = 77;
00181 const unsigned RadiusAttrConfigurationToken = 78;
00182 const unsigned RadiusAttrEAPMessage = 79;
00183 const unsigned RadiusAttrMessageAuthenticator = 80;
00184 const unsigned RadiusAttrTunnelPrivateGroupID = 81;
00185 const unsigned RadiusAttrTunnelAssignmentID = 82;
00186 const unsigned RadiusAttrTunnelPreference = 83;
00187 const unsigned RadiusAttrARAPChallengeResponse = 84;
00188 const unsigned RadiusAttrAcctInterimInterval = 85;
00189 const unsigned RadiusAttrAcctTunnelPacketsLost = 86;
00190 const unsigned RadiusAttrNASPortId = 87;
00191 const unsigned RadiusAttrFramedPool = 88;
00192 const unsigned RadiusAttrChargeableUserIdentity = 89;
00193 const unsigned RadiusAttrTunnelClientAuthID = 90;
00194 const unsigned RadiusAttrTunnelServerAuthID = 91;
00195 const unsigned RadiusAttrNASFilterRule = 92;
00196 const unsigned RadiusAttrOriginatingLineInfo = 94;
00197 const unsigned RadiusAttrNASIPv6Address = 95;
00198 const unsigned RadiusAttrFramedInterfaceId = 96;
00199 const unsigned RadiusAttrFramedIPv6Prefix = 97;
00200 const unsigned RadiusAttrLoginIPv6Host = 98;
00201 const unsigned RadiusAttrFramedIPv6Route = 99;
00202 const unsigned RadiusAttrFramedIPv6Pool = 100;
00203 const unsigned RadiusAttrErrorCause = 101;
00204 const unsigned RadiusAttrEAPKeyName = 102;
00205 const unsigned RadiusAttrTimestamp = 103;
00206
00207 const unsigned RadiusAttrDelegatedIPv6Prefix = 123;
00208
00209
00210 const unsigned RadiusValueAcctStatusTypeStart = 1;
00211 const unsigned RadiusValueAcctStatusTypeStop = 2;
00212 const unsigned RadiusValueAcctStatusTypeAlive = 3;
00213 const unsigned RadiusValueAcctStatusTypeModemStart = 4;
00214 const unsigned RadiusValueAcctStatusTypeModemStop = 5;
00215 const unsigned RadiusValueAcctStatusTypeCancel = 6;
00216 const unsigned RadiusValueAcctStatusTypeAccountingOn = 7;
00217 const unsigned RadiusValueAcctStatusTypeAccountingOff = 8;
00218 const unsigned RadiusValueAcctStatusTypeTunnelStart = 9;
00219 const unsigned RadiusValueAcctStatusTypeTunnelStop = 10;
00220 const unsigned RadiusValueAcctStatusTypeTunnelReject = 11;
00221 const unsigned RadiusValueAcctStatusTypeTunnelLinkStart = 12;
00222 const unsigned RadiusValueAcctStatusTypeTunnelLinkStop = 13;
00223 const unsigned RadiusValueAcctStatusTypeTunnelLinkReject = 14;
00224 const unsigned RadiusValueAcctStatusTypeFailed = 15;
00225
00226
00227 const unsigned RadiusVendorCisco = 9;
00228 const unsigned RadiusVendorMicrosoft = 311;
00229 const unsigned RadiusVendorBreezecom = 710;
00230 const unsigned RadiusVendorNortelAptis = 2637;
00231 const unsigned RadiusVendorOpenSystemConsultants = 9048;
00232
00233
00234 const unsigned RadiusVendorCiscoAttrCiscoAvpair = 1;
00235
00236
00237 const unsigned RadiusVendorMicrosoftAttrMSCHAPResponse = 1;
00238 const unsigned RadiusVendorMicrosoftAttrMSCHAPChallenge = 11;
00239 const unsigned RadiusVendorMicrosoftAttrMSCHAPMPPEKeys = 12;
00240 const unsigned RadiusVendorMicrosoftAttrMSMPPESendKey = 16;
00241 const unsigned RadiusVendorMicrosoftAttrMSMPPERecvKey = 17;
00242 const unsigned RadiusVendorMicrosoftAttrMSCHAP2Response = 25;
00243
00244
00245
00246
00247
00248
00249 typedef struct
00250 {
00251
00252 uint8_t code;
00253
00254
00255 uint8_t identifier;
00256
00257
00258 uint16_t length;
00259
00260
00261 uint8_t authenticator[RADIUS_AUTHENTICATOR_LENGTH];
00262
00263
00264 uint8_t attrs[RADIUS_MAX_SIZE - RADIUS_HEADER_LENGTH];
00265
00266 } RadiusPacket;
00267
00268
00269
00270
00271 typedef struct
00272 {
00273
00274 uint8_t type;
00275
00276
00277 uint8_t length;
00278
00279
00280 uint8_t value[RADIUS_MAX_ATTRIBUTE_SIZE];
00281
00282 } RadiusAttrHeader;
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300 class RadiusMsg
00301 {
00302 private:
00303
00304 RadiusPacket packet;
00305
00306
00307 uint16_t packetLength;
00308
00309
00310 uint8_t retries;
00311
00312
00313 uint8_t timeout;
00314
00315
00316 IP4Address peerAddress;
00317
00318
00319 uint16_t peerPort;
00320
00321 public:
00322
00323 RadiusMsg();
00324
00325
00326 RadiusMsg(RadiusCode code);
00327
00328
00329
00330 uint8_t code();
00331
00332
00333
00334
00335
00336
00337 void addAttr(unsigned type, unsigned vendor, uint8_t* value, uint8_t length);
00338
00339
00340
00341
00342
00343
00344 void addAttr(unsigned type, unsigned vendor, const char* value);
00345
00346
00347
00348
00349
00350 void addAttr(unsigned type, unsigned vendor, uint32_t value);
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363 uint8_t getAttr(unsigned type, unsigned vendor, uint8_t* value, uint8_t* length, uint8_t skip = 0);
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373 uint8_t getAttr(unsigned type, unsigned vendor, uint32_t* value, uint8_t skip = 0);
00374
00375
00376
00377
00378
00379
00380
00381 void sign(uint8_t* secret, uint8_t secretLength, RadiusMsg* original = 0);
00382
00383
00384
00385
00386
00387
00388 uint16_t sendto(UDPSocket* socket, IP4Address peer, uint16_t port);
00389
00390
00391
00392
00393
00394
00395
00396 void encryptPassword(uint8_t* data, uint8_t length, uint8_t* secret, uint8_t secretLength, uint8_t* iv);
00397
00398
00399
00400
00401
00402
00403 uint16_t recv(UDPSocket* socket);
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414 uint8_t sendWaitReply(UDPSocket* socket, IP4Address server, uint16_t port, RadiusMsg* reply);
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424 uint8_t checkAuthenticatorsWithOriginal(uint8_t* secret, uint8_t secretLength, RadiusMsg* original);
00425 };
00426
00427
00428 #endif