53 #include "UDPSocket.h"
55 #define RADIUS_AUTHENTICATOR_LENGTH 16
56 #define RADIUS_PASSWORD_BLOCK_SIZE 16
57 #define RADIUS_HEADER_LENGTH 20
60 #define RADIUS_MAX_SIZE 1000
61 #define RADIUS_MAX_ATTRIBUTE_SIZE 253
62 typedef uint8_t RadiusAuthenticator[RADIUS_AUTHENTICATOR_LENGTH];
67 RadiusCodeAccessRequest = 1,
68 RadiusCodeAccessAccept = 2,
69 RadiusCodeAccessReject = 3,
70 RadiusCodeAccountingRequest = 4,
71 RadiusCodeAccountingResponse = 5,
72 RadiusCodeAccountingStatus = 6,
73 RadiusCodeAccessPasswordRequest = 7,
74 RadiusCodeAccessPasswordAck = 8,
75 RadiusCodeAccessPasswordReject = 9,
76 RadiusCodeAccountingMessage = 10,
77 RadiusCodeAccessChallenge = 11,
78 RadiusCodeStatusServer = 12,
79 RadiusCodeStatusClient = 13,
80 RadiusCodeResourceFreeRequest = 21,
81 RadiusCodeResourceFreeResponse = 22,
82 RadiusCodeResourceQueryRequest = 23,
83 RadiusCodeResourceQueryResponse = 24,
84 RadiusCodeAlternateResourceReclaimRequest = 25,
85 RadiusCodeNASRebootRequest = 26,
86 RadiusCodeNASRebootResponse = 27,
87 RadiusCodeAscendAccessNextCode = 29,
88 RadiusCodeAscendAccessNewPin = 30,
89 RadiusCodeAscendTerminateSession = 31,
90 RadiusCodeAscendPasswordExpired = 32,
91 RadiusCodeAscendAccessEventRequest = 33,
92 RadiusCodeAscendAccessEventResponse = 34,
93 RadiusCodeDisconnectRequest = 40,
94 RadiusCodeDisconnectRequestACKed = 41,
95 RadiusCodeDisconnectRequestNAKed = 42,
96 RadiusCodeChangeFilterRequest = 43,
97 RadiusCodeChangeFilterRequestACKed = 44,
98 RadiusCodeChangeFilterRequestNAKed = 45,
99 RadiusCodeIPAddressAllocate = 50,
100 RadiusCodeIPAddressRelease = 51,
102 RadiusCodeStartInvalidCodes = 52
105 const unsigned RadiusAttrUserName = 1;
106 const unsigned RadiusAttrUserPassword = 2;
107 const unsigned RadiusAttrChapPassword = 3;
108 const unsigned RadiusAttrNasIPAddress = 4;
109 const unsigned RadiusAttrNASPort = 5;
110 const unsigned RadiusAttrServiceType = 6;
111 const unsigned RadiusAttrFramedProtocol = 7;
112 const unsigned RadiusAttrFramedIPAddress = 8;
113 const unsigned RadiusAttrFramedIPNetmask = 9;
114 const unsigned RadiusAttrFramedRouting = 10;
115 const unsigned RadiusAttrFilterId = 11;
116 const unsigned RadiusAttrFramedMTU = 12;
117 const unsigned RadiusAttrFramedCompression = 13;
118 const unsigned RadiusAttrLoginIPHost = 14;
119 const unsigned RadiusAttrLoginService = 15;
120 const unsigned RadiusAttrLoginTCPPort = 16;
121 const unsigned RadiusAttrOldPassword = 17;
122 const unsigned RadiusAttrReplyMessage = 18;
123 const unsigned RadiusAttrCallbackNumber = 19;
124 const unsigned RadiusAttrCallbackId = 20;
125 const unsigned RadiusAttrAscendPWExpiration = 21;
126 const unsigned RadiusAttrFramedRoute = 22;
127 const unsigned RadiusAttrFramedIPXNetwork = 23;
128 const unsigned RadiusAttrState = 24;
129 const unsigned RadiusAttrClass = 25;
130 const unsigned RadiusAttrVendorSpecific = 26;
131 const unsigned RadiusAttrSessionTimeout = 27;
132 const unsigned RadiusAttrIdleTimeout = 28;
133 const unsigned RadiusAttrTerminationAction = 29;
134 const unsigned RadiusAttrCalledStationId = 30;
135 const unsigned RadiusAttrCallingStationId = 31;
136 const unsigned RadiusAttrNASIdentifier = 32;
137 const unsigned RadiusAttrProxyState = 33;
138 const unsigned RadiusAttrLoginLATService = 34;
139 const unsigned RadiusAttrLoginLATNode = 35;
140 const unsigned RadiusAttrLoginLATGroup = 36;
141 const unsigned RadiusAttrFramedAppleTalkLink = 37;
142 const unsigned RadiusAttrFramedAppleTalkNetwork = 38;
143 const unsigned RadiusAttrFramedAppleTalkZone = 39;
144 const unsigned RadiusAttrAcctStatusType = 40;
145 const unsigned RadiusAttrAcctDelayTime = 41;
146 const unsigned RadiusAttrAcctInputOctets = 42;
147 const unsigned RadiusAttrAcctOutputOctets = 43;
148 const unsigned RadiusAttrAcctSessionId = 44;
149 const unsigned RadiusAttrAcctAuthentic = 45;
150 const unsigned RadiusAttrAcctSessionTime = 46;
151 const unsigned RadiusAttrAcctInputPackets = 47;
152 const unsigned RadiusAttrAcctOutputPackets = 48;
153 const unsigned RadiusAttrAcctTerminateCause = 49;
154 const unsigned RadiusAttrAcctMultiSessionId = 50;
155 const unsigned RadiusAttrAcctLinkCount = 51;
156 const unsigned RadiusAttrAcctInputGigawords = 52;
157 const unsigned RadiusAttrAcctOutputGigawords = 53;
159 const unsigned RadiusAttrEventTimestamp = 55;
160 const unsigned RadiusAttrEgressVLANID = 56;
161 const unsigned RadiusAttrIngressFilters = 57;
162 const unsigned RadiusAttrEgressVLANName = 58;
163 const unsigned RadiusAttrUserPriorityTable = 59;
164 const unsigned RadiusAttrCHAPChallenge = 60;
165 const unsigned RadiusAttrNASPortType = 61;
166 const unsigned RadiusAttrPortLimit = 62;
167 const unsigned RadiusAttrLoginLATPort = 63;
168 const unsigned RadiusAttrTunnelType = 64;
169 const unsigned RadiusAttrTunnelMediumType = 65;
170 const unsigned RadiusAttrTunnelClientEndpoint = 66;
171 const unsigned RadiusAttrTunnelServerEndpoint = 67;
172 const unsigned RadiusAttrTunnelID = 68;
173 const unsigned RadiusAttrTunnelPassword = 69;
174 const unsigned RadiusAttrARAPPassword = 70;
175 const unsigned RadiusAttrARAPFeatures = 71;
176 const unsigned RadiusAttrARAPZoneAccess = 72;
177 const unsigned RadiusAttrARAPSecurity = 73;
178 const unsigned RadiusAttrARAPSecurityData = 74;
179 const unsigned RadiusAttrPasswordRetry = 75;
180 const unsigned RadiusAttrPrompt = 76;
181 const unsigned RadiusAttrConnectInfo = 77;
182 const unsigned RadiusAttrConfigurationToken = 78;
183 const unsigned RadiusAttrEAPMessage = 79;
184 const unsigned RadiusAttrMessageAuthenticator = 80;
185 const unsigned RadiusAttrTunnelPrivateGroupID = 81;
186 const unsigned RadiusAttrTunnelAssignmentID = 82;
187 const unsigned RadiusAttrTunnelPreference = 83;
188 const unsigned RadiusAttrARAPChallengeResponse = 84;
189 const unsigned RadiusAttrAcctInterimInterval = 85;
190 const unsigned RadiusAttrAcctTunnelPacketsLost = 86;
191 const unsigned RadiusAttrNASPortId = 87;
192 const unsigned RadiusAttrFramedPool = 88;
193 const unsigned RadiusAttrChargeableUserIdentity = 89;
194 const unsigned RadiusAttrTunnelClientAuthID = 90;
195 const unsigned RadiusAttrTunnelServerAuthID = 91;
196 const unsigned RadiusAttrNASFilterRule = 92;
197 const unsigned RadiusAttrOriginatingLineInfo = 94;
198 const unsigned RadiusAttrNASIPv6Address = 95;
199 const unsigned RadiusAttrFramedInterfaceId = 96;
200 const unsigned RadiusAttrFramedIPv6Prefix = 97;
201 const unsigned RadiusAttrLoginIPv6Host = 98;
202 const unsigned RadiusAttrFramedIPv6Route = 99;
203 const unsigned RadiusAttrFramedIPv6Pool = 100;
204 const unsigned RadiusAttrErrorCause = 101;
205 const unsigned RadiusAttrEAPKeyName = 102;
206 const unsigned RadiusAttrTimestamp = 103;
208 const unsigned RadiusAttrDelegatedIPv6Prefix = 123;
211 const unsigned RadiusValueAcctStatusTypeStart = 1;
212 const unsigned RadiusValueAcctStatusTypeStop = 2;
213 const unsigned RadiusValueAcctStatusTypeAlive = 3;
214 const unsigned RadiusValueAcctStatusTypeModemStart = 4;
215 const unsigned RadiusValueAcctStatusTypeModemStop = 5;
216 const unsigned RadiusValueAcctStatusTypeCancel = 6;
217 const unsigned RadiusValueAcctStatusTypeAccountingOn = 7;
218 const unsigned RadiusValueAcctStatusTypeAccountingOff = 8;
219 const unsigned RadiusValueAcctStatusTypeTunnelStart = 9;
220 const unsigned RadiusValueAcctStatusTypeTunnelStop = 10;
221 const unsigned RadiusValueAcctStatusTypeTunnelReject = 11;
222 const unsigned RadiusValueAcctStatusTypeTunnelLinkStart = 12;
223 const unsigned RadiusValueAcctStatusTypeTunnelLinkStop = 13;
224 const unsigned RadiusValueAcctStatusTypeTunnelLinkReject = 14;
225 const unsigned RadiusValueAcctStatusTypeFailed = 15;
228 const unsigned RadiusVendorCisco = 9;
229 const unsigned RadiusVendorMicrosoft = 311;
230 const unsigned RadiusVendorBreezecom = 710;
231 const unsigned RadiusVendorNortelAptis = 2637;
232 const unsigned RadiusVendorOpenSystemConsultants = 9048;
235 const unsigned RadiusVendorCiscoAttrCiscoAvpair = 1;
238 const unsigned RadiusVendorMicrosoftAttrMSCHAPResponse = 1;
239 const unsigned RadiusVendorMicrosoftAttrMSCHAPChallenge = 11;
240 const unsigned RadiusVendorMicrosoftAttrMSCHAPMPPEKeys = 12;
241 const unsigned RadiusVendorMicrosoftAttrMSMPPESendKey = 16;
242 const unsigned RadiusVendorMicrosoftAttrMSMPPERecvKey = 17;
243 const unsigned RadiusVendorMicrosoftAttrMSCHAP2Response = 25;
262 uint8_t authenticator[RADIUS_AUTHENTICATOR_LENGTH];
265 uint8_t attrs[RADIUS_MAX_SIZE - RADIUS_HEADER_LENGTH];
281 uint8_t value[RADIUS_MAX_ATTRIBUTE_SIZE];
308 uint16_t packetLength;
317 IP4Address peerAddress;
338 void addAttr(
unsigned type,
unsigned vendor, uint8_t* value, uint8_t length);
345 void addAttr(
unsigned type,
unsigned vendor,
const char* value);
351 void addAttr(
unsigned type,
unsigned vendor, uint32_t value);
364 uint8_t
getAttr(
unsigned type,
unsigned vendor, uint8_t* value, uint8_t* length, uint8_t skip = 0);
374 uint8_t
getAttr(
unsigned type,
unsigned vendor, uint32_t* value, uint8_t skip = 0);
382 void sign(uint8_t* secret, uint8_t secretLength,
RadiusMsg* original = 0);
397 void encryptPassword(uint8_t* data, uint8_t length, uint8_t* secret, uint8_t secretLength, uint8_t* iv);