|
1 /* |
|
2 * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: IKEv1 payload handling. |
|
15 * |
|
16 */ |
|
17 |
|
18 #ifndef IKEV1PAYLOADS_H |
|
19 #define IKEV1PAYLOADS_H |
|
20 |
|
21 #include <e32math.h> |
|
22 #include "ikemsgheader.h" |
|
23 #include "ikev1isakmpct.h" |
|
24 |
|
25 // |
|
26 // GENERIC PAYLOAD HEADER |
|
27 // |
|
28 class TPayloadISAKMP |
|
29 { |
|
30 public: |
|
31 TPayloadISAKMP() {u.iData32[0] = 0; } |
|
32 inline TUint8 GetPayload() const; |
|
33 inline void SetPayload(TUint8 aPayload); |
|
34 inline TUint16 GetLength() const; |
|
35 inline void SetLength(TUint16 aLength); |
|
36 inline TUint8 GetReserved() const; |
|
37 inline void SetReserved(TUint8 aVal); |
|
38 inline const TUint8 *SpecificData() const |
|
39 { return (TUint8 *)((char *)this + sizeof(*this)); } //returns a * to the specific data of this payload |
|
40 inline const TUint SpecificDataLen() const |
|
41 { return (GetLength() - sizeof(*this)); } //returns a * to the specific data of this payload |
|
42 inline const TPayloadISAKMP *Next() const |
|
43 { return (TPayloadISAKMP *)((char *)this + GetLength()); } |
|
44 |
|
45 private: |
|
46 union |
|
47 { |
|
48 TUint32 iData32[1]; |
|
49 TUint16 iData16[2]; |
|
50 TUint8 iData8[4]; |
|
51 } u; |
|
52 }; |
|
53 inline TUint8 TPayloadISAKMP::GetPayload() const { return u.iData8[0]; } |
|
54 inline void TPayloadISAKMP::SetPayload(TUint8 aPayload) { u.iData8[0] = aPayload; } |
|
55 inline TUint16 TPayloadISAKMP::GetLength() const { return (TUint16)GET16(&u.iData8[2]); } |
|
56 inline void TPayloadISAKMP::SetLength(TUint16 aLength) { PUT16(&u.iData8[2], aLength); } |
|
57 inline TUint8 TPayloadISAKMP::GetReserved() const { return u.iData8[1]; } |
|
58 inline void TPayloadISAKMP::SetReserved(TUint8 aVal) { u.iData8[1] = aVal; } |
|
59 |
|
60 // |
|
61 // SA PAYLOAD |
|
62 // |
|
63 |
|
64 |
|
65 class TProposalISAKMP; |
|
66 |
|
67 //Plus Variable field (Labeled Domain Identifier) from IPSEC DOI (included in length if present) |
|
68 //use TSAPayloadISAKMP to decodify its values; |
|
69 |
|
70 class TSAPayloadISAKMP |
|
71 { |
|
72 public: |
|
73 inline TSAPayloadISAKMP() {iReserved=0;} |
|
74 |
|
75 public: |
|
76 inline TUint16 GetLength() const { return (TUint16)GET16(&iLength); } |
|
77 inline void SetLength(TUint16 aLength) { PUT16(iLength, aLength); } |
|
78 inline TUint16 GetReserved() const { return iReserved; } //No need to swap because always 0 |
|
79 inline const TSAPayloadISAKMP *Next() const //next payload |
|
80 { return (TSAPayloadISAKMP *)((TUint8 *)this + GetLength()); } |
|
81 inline const TUint32 *Data() const |
|
82 { return (TUint32 *)(this + sizeof(*this)); } //returns the address of the data field |
|
83 |
|
84 private: |
|
85 TUint16 iLength; |
|
86 TUint16 iReserved; |
|
87 }; |
|
88 //followed by a variable size field of the length indicated |
|
89 |
|
90 class TSAISAKMP : public TPayloadISAKMP |
|
91 { |
|
92 public: |
|
93 inline TUint32 Size() const { return sizeof(TSAISAKMP); } //sizeof OK because aligned |
|
94 inline TUint32 GetDOI() const { return GET32(&iDOI); } |
|
95 inline void SetDOI(TUint32 aDOI) { PUT32(&iDOI, aDOI); } |
|
96 inline TUint32 GetSIT() const { return GET32(&iSIT); } |
|
97 inline void SetSIT(TUint32 aSIT) { PUT32(&iSIT, aSIT); } |
|
98 inline TUint GetSITLength() const |
|
99 { |
|
100 if ( GetDOI() == IPSEC_DOI) //IPSEC DOI has SPI of size 4 octets |
|
101 return 4; |
|
102 return 0; |
|
103 } |
|
104 inline TBool HasLDId() const |
|
105 { |
|
106 TUint32 sit=(IPSEC_SIT_SECRECY | IPSEC_SIT_INTEGRITY); |
|
107 if ((GetDOI()==IPSEC_DOI) && (GetSIT() & sit)) |
|
108 return ETrue; //DOI and (SECRECY or INTEGRITY) supported |
|
109 |
|
110 return EFalse; |
|
111 } |
|
112 static inline TSAISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
113 { return (TSAISAKMP *)aPayload; } |
|
114 inline TUint32 *Data() const |
|
115 { return (TUint32 *)(this + sizeof(*this)); } //returns the address of the data field following the header |
|
116 TPayloadISAKMP* Payload() const |
|
117 { |
|
118 TUint size= sizeof(*this); //fixed size |
|
119 if (!HasLDId()) |
|
120 return (TPayloadISAKMP *) ((TUint8*)this + size); |
|
121 size += 4; //Labeled Domain Identifier payload size |
|
122 TUint32 *d=Data(); |
|
123 TSAPayloadISAKMP *p = (TSAPayloadISAKMP *)++d; |
|
124 TInt32 res; |
|
125 |
|
126 for (TInt i=0; i < 4; i++) |
|
127 { |
|
128 if (i % 2==0) //Fields 1 and 3 in bytes |
|
129 Math::Int(res, p->GetLength() / 4); |
|
130 else //Fields 2, 4 in bits |
|
131 Math::Int(res, p->GetLength() / 32); |
|
132 |
|
133 size += res+1; |
|
134 } |
|
135 |
|
136 return (TPayloadISAKMP *) ((TUint8 *)this + size); |
|
137 } |
|
138 |
|
139 TUint32 iDOI; |
|
140 TUint32 iSIT; |
|
141 }; |
|
142 |
|
143 class TTransformISAKMP; |
|
144 class TProposalISAKMP : public TPayloadISAKMP |
|
145 { |
|
146 public: |
|
147 inline TUint32 Size() const { return sizeof(TProposalISAKMP); }//sizeof OK because aligned |
|
148 inline TUint8 GetNum() const { return iNum; }; |
|
149 inline void SetNum(TUint8 aPayload) { iNum = aPayload; }; |
|
150 inline TUint8 GetProtocol() const { return iProtocol; }; |
|
151 inline void SetProtocol(TUint8 aPayload) { iProtocol = aPayload; }; |
|
152 inline TUint8 GetSPISize() const { return iSPISize; }; |
|
153 inline void SetSPISize(TUint8 aPayload) { iSPISize = aPayload; }; |
|
154 inline TUint8 GetNumTrans() const { return iNumTrans; }; |
|
155 inline void SetNumTrans(TUint8 aPayload) { iNumTrans = aPayload; }; |
|
156 //inline TUint32 GetSPI() const { return iSPI; }; |
|
157 //inline void SetSPI(TUint32 aSPI) { iSPI = aSPI; }; |
|
158 static inline TProposalISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
159 { return (TProposalISAKMP *)aPayload; } |
|
160 inline const TPayloadISAKMP* Payload() const //next payload (transform) |
|
161 { return (TPayloadISAKMP*)((TUint8*)this + sizeof(*this) + GetSPISize()); } |
|
162 inline const TUint8 *SPI() {return (const TUint8 *)((TUint8*)this + sizeof(*this));} //* to the SPI |
|
163 //void String(TDes &aStr) const; |
|
164 |
|
165 //private: |
|
166 TUint8 iNum; //Proposal Number |
|
167 TUint8 iProtocol; //Protocol ID for the current negotiation PROTO_ISAKMP, PROTO_IPSEC_AH, PROTO_IPSEC_ESP, ... |
|
168 TUint8 iSPISize; //size in octets. For ISAKMP should be from 0 to 16. If >0 SPI ignored |
|
169 TUint8 iNumTrans; //Num of transformations |
|
170 //TUint32 iSPI; //Variable size (depends on protocol). No Padding. |
|
171 }; |
|
172 |
|
173 |
|
174 class TDataISAKMP; |
|
175 class TTransformISAKMP : public TPayloadISAKMP |
|
176 { |
|
177 public: |
|
178 inline TTransformISAKMP() {iReserved=0;} |
|
179 public: |
|
180 inline TUint32 Size() const { return sizeof(TTransformISAKMP); } //sizeof OK because aligned |
|
181 inline TUint8 GetNum() const { return iNum; }; |
|
182 inline void SetNum(TUint8 aPayload) { iNum = aPayload; }; |
|
183 inline TUint8 GetID() const { return iID; }; |
|
184 inline void SetID(TUint8 aPayload) { iID = aPayload; }; |
|
185 inline TUint16 GetReserved() const { return (TUint16)GET16(&iReserved); }; |
|
186 static inline TTransformISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
187 { return (TTransformISAKMP *)aPayload; } |
|
188 inline TDataISAKMP *SAAttrib() const {return (TDataISAKMP *)((TUint8*)this + sizeof(*this)); } //* to SA attributes |
|
189 //void String(TDes &aStr) const; |
|
190 |
|
191 //private: |
|
192 //TPayloadISAKMP iHdr; //Generic part |
|
193 TUint8 iNum; //Transform Number |
|
194 TUint8 iID; //Transform ID for the current negotiation AH, ESP, OSPF, TLS, ... |
|
195 TUint16 iReserved; //always set to 0 |
|
196 }; |
|
197 |
|
198 |
|
199 |
|
200 class TKeyISAKMP : public TPayloadISAKMP |
|
201 { |
|
202 public: |
|
203 static inline TKeyISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
204 { return (TKeyISAKMP *)aPayload; } |
|
205 //void String(TDes &aStr) const; |
|
206 inline TUint8 *KeyData() const {return ((TUint8*)this + sizeof(*this)); } //* to keyData |
|
207 |
|
208 }; |
|
209 |
|
210 |
|
211 //would require a few modifications for DOI != IPSECDOI |
|
212 class TIdentISAKMP : public TPayloadISAKMP |
|
213 { |
|
214 public: |
|
215 inline TUint8 GetIDType() const { return iIDType; } |
|
216 inline void SetIDType(TUint8 aIDType) { iIDType=aIDType; } |
|
217 //IPSEC DOI Specific routines |
|
218 inline TUint8 GetProtocol() const { return iProtocolID; } |
|
219 inline void SetProtocol(TUint8 aProtocolID) { iProtocolID = aProtocolID; }; |
|
220 inline TUint16 GetPort() const { return (TUint16)GET16(&iPort); } |
|
221 inline void SetPort(TUint16 aPort) { PUT16(&iPort, aPort); } |
|
222 // |
|
223 static inline TIdentISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
224 { return (TIdentISAKMP *)aPayload; } |
|
225 //TBool String(TDes &aStr,TUint aLength) const; |
|
226 inline TUint8 *IDData() const {return ((TUint8*)this + sizeof(*this)); } //* to identity data |
|
227 inline TUint16 IDDataLen() const {return (TUint16)(GetLength() - sizeof(*this)); } //Length of the payload data |
|
228 public: |
|
229 TUint8 iIDType; |
|
230 //IPSEC DOI Specific fields |
|
231 TUint8 iProtocolID; |
|
232 TUint16 iPort; |
|
233 |
|
234 }; |
|
235 |
|
236 |
|
237 |
|
238 //Used for certificate |
|
239 //WARNING:Do not use sizeof this class, better Size because size of returns aligned size and not the real. |
|
240 class TCertificateISAKMP: public TPayloadISAKMP |
|
241 { |
|
242 public: |
|
243 inline TUint8 GetEncoding() const { return iEncoding; } |
|
244 inline void SetEncoding(TUint8 aEncoding) { iEncoding = aEncoding; } |
|
245 static inline TUint16 Size() {return (sizeof(TPayloadISAKMP) + sizeof(TUint8));} //TUint8 is iEncoding |
|
246 inline TUint16 CertDataLen() const {return (TUint16)(GetLength()-Size()); } //* to certificate data |
|
247 inline TUint8 *CertData() const {return ((TUint8*)this + Size()); } |
|
248 //+1 for iEncoding.Cannot use sizeof(*this) because is not aligned and returns 8 instead of 5 |
|
249 |
|
250 static inline TCertificateISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
251 { return (TCertificateISAKMP *)aPayload; } |
|
252 |
|
253 TUint8 iEncoding; // Certificate Encoding |
|
254 |
|
255 }; |
|
256 |
|
257 |
|
258 |
|
259 //Used for certificate Request payloads |
|
260 class TCertificateReqISAKMP : public TPayloadISAKMP |
|
261 { |
|
262 public: |
|
263 inline TUint8 GetEncoding() const { return iEncoding; } |
|
264 inline void SetEncoding(TUint8 aEncoding) { iEncoding= aEncoding; } |
|
265 static inline TUint16 Size() {return (sizeof(TPayloadISAKMP) + sizeof(TUint8));} //TUint8 is iEncoding |
|
266 static inline TCertificateReqISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
267 { return (TCertificateReqISAKMP *)aPayload; } |
|
268 inline TUint16 CertReqDataLen() const {return (TUint16)(GetLength() - Size()); } //* to certificate data |
|
269 inline TUint8 *CertReqData() const {return ((TUint8*)this + Size()); } |
|
270 |
|
271 TUint8 iEncoding; // Certificate Encoding |
|
272 |
|
273 }; |
|
274 |
|
275 class THashISAKMP : public TPayloadISAKMP |
|
276 { |
|
277 public: |
|
278 static inline THashISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
279 { return (THashISAKMP *)aPayload; } |
|
280 inline TUint8 *Data() const {return ((TUint8*)this + sizeof(*this)); } //pointer to hash data |
|
281 inline TUint16 DataLen() const {return (TUint16)(GetLength() - sizeof(*this)); } //pointer to hash data |
|
282 //TBool String(TDes &aStr,TUint aLength) const; |
|
283 }; |
|
284 |
|
285 |
|
286 class TSignatureISAKMP : public TPayloadISAKMP |
|
287 { |
|
288 public: |
|
289 static inline TSignatureISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
290 { return (TSignatureISAKMP *)aPayload; } |
|
291 inline TUint16 GetDataLength() const //Length of the data part in bytes |
|
292 { return (TUint16)(GetLength() - sizeof(*this));} |
|
293 inline TUint8 *SigData() const {return ((TUint8*)this + sizeof(*this)); } //pointer to signature data |
|
294 |
|
295 }; |
|
296 |
|
297 class TNonceISAKMP : public TPayloadISAKMP |
|
298 { |
|
299 public: |
|
300 static inline TNonceISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
301 { return (TNonceISAKMP *)aPayload; } |
|
302 |
|
303 inline TUint8 *NonceData() const {return ((TUint8*)this + sizeof(*this)); } //* to Nonce Data |
|
304 inline TUint16 NonceDataLen() const {return (TUint16)(GetLength() - sizeof(*this)); } //* to Nonce Data |
|
305 }; |
|
306 |
|
307 |
|
308 |
|
309 class TNotificationISAKMP : public TPayloadISAKMP |
|
310 { |
|
311 public: |
|
312 inline TUint32 GetDOI() const { return GET32(&iDOI); }; |
|
313 inline void SetDOI(TUint32 aDOI) { PUT32(&iDOI, aDOI); }; |
|
314 inline TUint8 GetProtocol() const { return iProtocol; }; |
|
315 inline void SetProtocol(TUint8 aPayload) { iProtocol = aPayload; }; |
|
316 inline TUint8 GetSPISize() const { return iSPISize; }; |
|
317 inline void SetSPISize(TUint8 aPayload) { iSPISize = aPayload; }; |
|
318 inline TUint16 GetMsgType() const { return (TUint16)GET16(&iMsgType); }; |
|
319 inline void SetMsgType(TUint16 aMsgType) { PUT16(&iMsgType, aMsgType); }; |
|
320 inline TUint8 *GetSPI() const { return ((TUint8*)this + sizeof(*this)); }; //returns the SPI Data |
|
321 inline TUint8 *GetNotifData() const { return ((TUint8*)this + sizeof(*this) + iSPISize); }; //returns the Notification Data |
|
322 inline TUint16 GetNotifDataSize() const { return (TUint16)(GetLength() - (sizeof(*this) + iSPISize)); };//returns the Notification Data Length |
|
323 |
|
324 static inline TNotificationISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
325 { return (TNotificationISAKMP *)aPayload; } |
|
326 |
|
327 TUint32 iDOI; //Domain Of Interpretation |
|
328 TUint8 iProtocol; //Protocol ID for the current notification |
|
329 TUint8 iSPISize; //size in octets. For ISAKMP should be from 0 to 16. If >0 SPI ignored |
|
330 TUint16 iMsgType; //Notify msg type. See constants. |
|
331 //Plus the variable fields SPI and Notification Data (both included in length) |
|
332 private: |
|
333 inline void MsgTypeToStr(TDes &aBuf, TUint16 aMsgType) const |
|
334 { |
|
335 #ifdef _DEBUG |
|
336 switch (aMsgType) |
|
337 { |
|
338 //NOTIFY MESSAGES - ERROR TYPES |
|
339 case INVALID_PAYLOAD_TYPE: |
|
340 aBuf = _L("INVALID_PAYLOAD_TYPE"); |
|
341 break; |
|
342 case DOI_NOT_SUPPORTED: |
|
343 aBuf = _L("DOI_NOT_SUPPORTED"); |
|
344 break; |
|
345 case SITUATION_NOT_SUPPORTED: |
|
346 aBuf = _L("SITUATION_NOT_SUPPORTED"); |
|
347 break; |
|
348 case INVALID_COOKIE: |
|
349 aBuf = _L("INVALID_COOKIE"); |
|
350 break; |
|
351 case INVALID_MAJOR_VERSION: |
|
352 aBuf = _L("INVALID_MAJOR_VERSION"); |
|
353 break; |
|
354 case INVALID_MINOR_VERSION: |
|
355 aBuf = _L("INVALID_MINOR_VERSION"); |
|
356 break; |
|
357 case INVALID_EXCHANGE_TYPE: |
|
358 aBuf = _L("INVALID_EXCHANGE_TYPE"); |
|
359 break; |
|
360 case INVALID_FLAGS: |
|
361 aBuf = _L("INVALID_FLAGS"); |
|
362 break; |
|
363 case INVALID_MESSAGE_ID: |
|
364 aBuf = _L("INVALID_MESSAGE_ID"); |
|
365 break; |
|
366 case INVALID_PROTOCOL_ID: |
|
367 aBuf = _L("INVALID_PROTOCOL_ID"); |
|
368 break; |
|
369 case INVALID_SPI: |
|
370 aBuf = _L("INVALID_SPI"); |
|
371 break; |
|
372 case INVALID_TRANSFORM_ID: |
|
373 aBuf = _L("INVALID_SPI"); |
|
374 break; |
|
375 case ATTRIBUTES_NOT_SUPPORTED: |
|
376 aBuf = _L("ATTRIBUTES_NOT_SUPPORTED"); |
|
377 break; |
|
378 case NO_PROPOSAL_CHOSEN: |
|
379 aBuf = _L("NO_PROPOSAL_CHOSEN"); |
|
380 break; |
|
381 case BAD_PROPOSAL_SYNTAX: |
|
382 aBuf = _L("BAD_PROPOSAL_CHOSEN"); |
|
383 break; |
|
384 case PAYLOAD_MALFORMED: |
|
385 aBuf = _L("PAYLOAD_MALFORMED"); |
|
386 break; |
|
387 case INVALID_KEY_INFORMATION: |
|
388 aBuf = _L("INVALID_KEY_INFORMATION"); |
|
389 break; |
|
390 case INVALID_ID_INFORMATION: |
|
391 aBuf = _L("INVALID_ID_INFORMATION"); |
|
392 break; |
|
393 case INVALID_CERT_ENCODING: |
|
394 aBuf = _L("INVALID_CERT_ENCODING"); |
|
395 break; |
|
396 case INVALID_CERTIFICATE: |
|
397 aBuf = _L("INVALID_CERTIFICATE"); |
|
398 break; |
|
399 case CERT_TYPE_UNSUPPORTED: |
|
400 aBuf = _L("CERT_TYPE_UNSUPPORTED"); |
|
401 break; |
|
402 case INVALID_CERT_AUTHORITY: |
|
403 aBuf = _L("INVALID_CERT_AUTHORITY"); |
|
404 break; |
|
405 case INVALID_HASH_INFORMATION: |
|
406 aBuf = _L("INVALID_HASH_INFORMATION"); |
|
407 break; |
|
408 case AUTHENTICATION_FAILED: |
|
409 aBuf = _L("AUTHENTICATION_FAILED"); |
|
410 break; |
|
411 case INVALID_SIGNATURE: |
|
412 aBuf = _L("INVALID_SIGNATURE"); |
|
413 break; |
|
414 case ADDRESS_NOTIFICATION: |
|
415 aBuf = _L("ADDRESS_NOTIFICATION"); |
|
416 break; |
|
417 case NOTIFY_SA_LIFETIME: |
|
418 aBuf = _L("NOTIFY_SA_LIFETIME"); |
|
419 break; |
|
420 case CERTIFICATE_UNAVAILABLE: |
|
421 aBuf = _L("CERTIFICATE_UNAVAILABLE"); |
|
422 break; |
|
423 case UNSUPPORTED_EXCHANGE_TYPE: |
|
424 aBuf = _L("UNSUPPORTED_EXCHANGE_TYPE"); |
|
425 break; |
|
426 case UNEQUAL_PAYLOAD_LENGTHS: |
|
427 aBuf = _L("UNEQUAL_PAYLOAD_LENGTHS"); |
|
428 break; |
|
429 case CONNECTED: |
|
430 aBuf = _L("CONNECTED"); |
|
431 break; |
|
432 default: |
|
433 if ((aMsgType>30) && (aMsgType < 8192)) |
|
434 aBuf.Format(_L("ERROR RESERVED Future Use (%d)"),aMsgType); |
|
435 else if ((aMsgType>8191) && (aMsgType < 16384)) |
|
436 aBuf.Format(_L("ERROR Private Use (%d)"),aMsgType); |
|
437 else if (((aMsgType>16384) && (aMsgType < 24576)) || ((aMsgType>40959) && (aMsgType < 65536))) |
|
438 aBuf.Format(_L("STATUS RESERVED Future Use (%d)"),aMsgType); |
|
439 else if ((aMsgType>24575) && (aMsgType < 32768)) |
|
440 aBuf.Format(_L("STATUS DOI Specific (%d)"),aMsgType); |
|
441 else if ((aMsgType>32767) && (aMsgType < 40959)) |
|
442 aBuf.Format(_L("STATUS Private Use (%d)"),aMsgType); |
|
443 else |
|
444 aBuf.Format(_L("UNKNOWN ERROR (%d)"),aMsgType); |
|
445 } |
|
446 #else |
|
447 (void)aBuf; |
|
448 (void)aMsgType; |
|
449 #endif |
|
450 } |
|
451 |
|
452 inline void ProtocolToStr(TDes& aBuf, TUint16 aProtocol) const |
|
453 { |
|
454 #ifdef _DEBUG |
|
455 |
|
456 switch (aProtocol) |
|
457 { |
|
458 //Protocol number for IPSEC DOI (=1) |
|
459 case PROTO_ISAKMP: |
|
460 aBuf = _L("PROTO_ISAKMP"); |
|
461 break; |
|
462 case PROTO_IPSEC_AH: |
|
463 aBuf = _L("PROTO_IPSEC_AH"); |
|
464 break; |
|
465 case PROTO_IPSEC_ESP: |
|
466 aBuf = _L("PROTO_IPSEC_ESP"); |
|
467 break; |
|
468 case PROTO_IPCOMP: |
|
469 aBuf = _L("PROTO_IPCOMP"); |
|
470 break; |
|
471 default: |
|
472 aBuf.Format(_L("Unknown (%d) "),aProtocol); |
|
473 } |
|
474 #else |
|
475 (void)aBuf; |
|
476 (void)aProtocol; |
|
477 #endif |
|
478 } |
|
479 |
|
480 |
|
481 }; |
|
482 |
|
483 class TDeleteISAKMP : public TPayloadISAKMP |
|
484 { |
|
485 public: |
|
486 inline TUint32 DOI() const { return GET32(&iDOI); }; |
|
487 inline void SetDOI(TUint32 aDOI) { PUT32(&iDOI, aDOI); }; |
|
488 inline TUint8 Protocol() const { return iProtocol; }; |
|
489 inline void SetProtocol(TUint8 aPayload) { iProtocol = aPayload; }; |
|
490 inline TUint8 SPISize() const { return iSPISize; }; |
|
491 inline void SetSPISize(TUint8 aPayload) { iSPISize = aPayload; }; |
|
492 inline TUint16 NumSPI() const { return (TUint16)GET16(&iNumSPI); }; |
|
493 inline void SetNumSPI(TUint16 aNumSPI) { PUT16(&iNumSPI, aNumSPI); }; |
|
494 |
|
495 static inline TDeleteISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
496 { return (TDeleteISAKMP *)aPayload; } |
|
497 inline TUint8 *SPIList() const {return ((TUint8*)this + sizeof(*this)); } //* to Vendor ID Data |
|
498 inline TUint8 *SPI(TUint i) const {return ((TUint8*)this + sizeof(*this) + i * SPISize()); } //i-th SPI |
|
499 inline void String(TDes &aStr) const |
|
500 { |
|
501 #ifdef _DEBUG |
|
502 aStr.Append(_L(" Delete payload ")); |
|
503 aStr.AppendFormat(_L(" DOI= %u"), DOI()); |
|
504 aStr.AppendFormat(_L(" Prot=%u "), Protocol()); |
|
505 aStr.AppendFormat(_L(" SPIsize= %u"), SPISize()); |
|
506 aStr.AppendFormat(_L(" #SPI=%u "), NumSPI()); |
|
507 //2 variable size fields |
|
508 |
|
509 //TUint8 *p=((TUint8 *)Payload()); |
|
510 TUint8 *p; |
|
511 for (TInt i=0; i < NumSPI(); i++) |
|
512 { |
|
513 aStr.AppendFormat(_L(" #SPI(%d)="),i); |
|
514 p=SPI(i); |
|
515 for (TUint j=0 ; j < SPISize() ; j++) |
|
516 { |
|
517 if (j%4==0) |
|
518 aStr.AppendFormat(_L(" ")); |
|
519 aStr.AppendFormat(_L("%02.2x"), p[j]); //not sure SPI |
|
520 } |
|
521 } |
|
522 #else |
|
523 (void)aStr; |
|
524 #endif |
|
525 } |
|
526 |
|
527 TUint32 iDOI; //Domain Of Interpretation |
|
528 TUint8 iProtocol; //Protocol ID for the current notification |
|
529 TUint8 iSPISize; //size in octets. For ISAKMP should be from 0 to 16. If >0 SPI ignored |
|
530 TUint16 iNumSPI; //# of SPIs to be deleted |
|
531 //Plus iNumSPI variable fields SPI |
|
532 }; |
|
533 |
|
534 |
|
535 class TVendorISAKMP : public TPayloadISAKMP |
|
536 { |
|
537 public: |
|
538 static inline TVendorISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
539 { return (TVendorISAKMP *)aPayload; } |
|
540 inline TUint8 *VIDData() const {return ((TUint8*)this + sizeof(*this)); } //* to Vendor ID Data |
|
541 |
|
542 }; |
|
543 |
|
544 class TCHREISAKMP : public TPayloadISAKMP |
|
545 { |
|
546 public: |
|
547 static inline TCHREISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
548 { return (TCHREISAKMP *)aPayload; } |
|
549 inline TUint16 GetLAMtype() const { return (TUint16)GET16(&iLAMType); } |
|
550 inline void SetLAMtype(TUint16 aLength) { PUT16(&iLAMType, aLength); } |
|
551 inline TUint16 GetCHREReserved() const { return iReserved; } |
|
552 inline void SetCHREReserved() { iReserved = 0; } |
|
553 inline TDataISAKMP *CHREAttrib() const {return (TDataISAKMP *)((TUint8*)this + sizeof(*this)); } //* to CHRE attributes |
|
554 //void String(TDes &aStr) const; |
|
555 TUint16 iLAMType; //LAM type |
|
556 TUint16 iReserved; //reserved must be zero |
|
557 }; |
|
558 |
|
559 class TINTNETISAKMP : public TPayloadISAKMP |
|
560 { |
|
561 public: |
|
562 static inline TINTNETISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
563 { return (TINTNETISAKMP *)aPayload; } |
|
564 inline TDataISAKMP *INTNETAttrib() const {return (TDataISAKMP *)((TUint8*)this + sizeof(*this)); } //* to INTNET attributes |
|
565 //void String(TDes &aStr) const; |
|
566 }; |
|
567 |
|
568 class TNATDISAKMP : public TPayloadISAKMP |
|
569 { |
|
570 public: |
|
571 static inline TNATDISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
572 { return (TNATDISAKMP *)aPayload; } |
|
573 inline TUint8 *HashData() const {return ((TUint8*)this + sizeof(*this)); } //* to NAT D hash data |
|
574 inline TUint32 HashLth() const {return (GetLength() - sizeof(*this)); }; |
|
575 }; |
|
576 |
|
577 |
|
578 class TNATOaISAKMP : public TPayloadISAKMP |
|
579 { |
|
580 public: |
|
581 inline TUint8 GetIDType() const { return iIDType; } |
|
582 inline void SetIDType(TUint8 aIDType) { iIDType=aIDType; } |
|
583 inline void SetReservedFields() { iReserved8=0; PUT16(iReserved16, 0); } |
|
584 // |
|
585 static inline TNATOaISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
586 { return (TNATOaISAKMP *)aPayload; } |
|
587 |
|
588 inline TUint8 *OAData() const {return ((TUint8*)this + sizeof(*this)); } //* to identity data |
|
589 inline TUint16 OADDataLen() const {return (TUint16)(GetLength() - sizeof(*this)); } //Length of the payload data |
|
590 public: |
|
591 TUint8 iIDType; |
|
592 //IPSEC DOI Specific fields |
|
593 TUint8 iReserved8; |
|
594 TUint16 iReserved16; |
|
595 |
|
596 }; |
|
597 |
|
598 class TAttributeISAKMP : public TPayloadISAKMP |
|
599 { |
|
600 public: |
|
601 inline TUint8 CfgMsgType() const { return iCfgMsgType; } |
|
602 inline void SetCfgMsgType(TUint8 aMsgType) { iCfgMsgType=aMsgType; } |
|
603 inline void SetReservedField() { iReserved8=0;} |
|
604 inline TUint16 Identifier() const { return (TUint16)GET16(&iIdentifier);} |
|
605 inline void SetIdentifier(TUint16 aIdentifier) { PUT16(&iIdentifier, aIdentifier); } |
|
606 // |
|
607 static inline TAttributeISAKMP *Ptr(const TPayloadISAKMP *aPayload) |
|
608 { return (TAttributeISAKMP *)aPayload; } |
|
609 inline TDataISAKMP *AttrData() const {return (TDataISAKMP *)((TUint8*)this + sizeof(*this)); } //* to attribute data |
|
610 inline TInt AttrDataLen() const {return (TInt)(GetLength() - sizeof(*this)); } //Length of the payload data |
|
611 public: |
|
612 TUint8 iCfgMsgType; |
|
613 TUint8 iReserved8; |
|
614 TUint16 iIdentifier; |
|
615 |
|
616 }; |
|
617 |
|
618 |
|
619 // |
|
620 // DATA ATTRIBUTES |
|
621 // |
|
622 class TDataISAKMP |
|
623 { |
|
624 public: |
|
625 TDataISAKMP(){u.iData32[0] = 0;} |
|
626 inline TBool IsBasic() const {return ((u.iData8[0] & 0x80) != 0);} //return if basic attrib or variable |
|
627 inline void SetBasic(TBool aIsBasic) |
|
628 { |
|
629 if (aIsBasic) |
|
630 u.iData8[0] |= 0x80; |
|
631 else u.iData8[0] &= 0x7F; |
|
632 } |
|
633 inline TUint16 Type() const { return (TUint16)(GET16(&u.iData16[0]) & (TUint16)0x7FFF);} |
|
634 inline void SetType(TUint16 aType) |
|
635 { |
|
636 u.iData8[1] = (TUint8)(aType & 0x00ff); |
|
637 u.iData8[0] &= 0x80; |
|
638 u.iData8[0] |= ((TUint8)(aType >> 8)) & 0x7F; |
|
639 } |
|
640 inline TUint16 Length() const |
|
641 { |
|
642 if (!IsBasic()) |
|
643 return (TUint16)GET16(&u.iData16[1]); |
|
644 return 0; //No length needed |
|
645 } |
|
646 inline void SetLength(TUint16 aLength) { if (!IsBasic()) PUT16(&u.iData16[1], aLength); } |
|
647 inline TUint16 Value() const |
|
648 { |
|
649 if (IsBasic()) |
|
650 return (TUint16)GET16(&u.iData16[1]); |
|
651 return 0; |
|
652 } |
|
653 inline void SetValue(TUint16 aValue) { if (IsBasic()) PUT16(&u.iData16[1], aValue);} |
|
654 inline TUint8 *VarValue() const |
|
655 { |
|
656 if (!IsBasic()) |
|
657 return ((TUint8*)this + sizeof(*this)); |
|
658 return NULL; |
|
659 } |
|
660 inline TUint Size() { return (sizeof(*this) + Length());} //return attr header full size |
|
661 inline TDataISAKMP *Next() {return (TDataISAKMP *)((TUint8*)this + sizeof(*this) + Length());} //next attribute |
|
662 public: |
|
663 union |
|
664 { |
|
665 TUint32 iData32[1]; |
|
666 TUint16 iData16[2]; |
|
667 TUint8 iData8[4]; |
|
668 } u; |
|
669 }; |
|
670 //Plus Length() bytes if variable attrib; |
|
671 |
|
672 // |
|
673 // TLastIKEMsg |
|
674 // This class is used to detect possible IKE message retransmission from peer. |
|
675 // The following information is stored to object data in consturctor: |
|
676 // -- IKE message length (octets iData8[0], iData8[1] and iData8[2]) |
|
677 // -- Next payload code (iData8[3]) |
|
678 // -- IP checksum over entire IKE message (iData32[1]) |
|
679 // |
|
680 class TLastIKEMsg |
|
681 { |
|
682 public: |
|
683 inline TLastIKEMsg() { u.iData32[0] = 0; u.iData32[1] = 0;} |
|
684 inline TLastIKEMsg(const ThdrISAKMP& aHdr) |
|
685 { |
|
686 u.iData32[0] = aHdr.GetLength(); |
|
687 TUint16 *End = (TUint16*)((TUint8*)&aHdr + (u.iData32[0] & 0xfffffffe)); |
|
688 TUint16 *Ptr = (TUint16*)&aHdr; |
|
689 u.iData8[3] = aHdr.GetPayload(); // MUST NOT be stored before length value ! |
|
690 TUint32 sum = 0; |
|
691 while ( Ptr < End ) sum += *Ptr++; |
|
692 u.iData32[1] = sum; |
|
693 } |
|
694 inline TBool IsUninitialized() |
|
695 { |
|
696 if (u.iData32[0] == 0 && u.iData32[1] == 0) |
|
697 return ETrue; |
|
698 return EFalse; |
|
699 } |
|
700 inline void Store(TLastIKEMsg& aRef) |
|
701 { aRef.u.iData32[0] = u.iData32[0]; aRef.u.iData32[1] = u.iData32[1]; } |
|
702 inline TBool IsReTransmit(TLastIKEMsg& aRef) |
|
703 { return ((u.iData32[0] == aRef.u.iData32[0]) && (u.iData32[1] == aRef.u.iData32[1]));} |
|
704 private: |
|
705 union |
|
706 { |
|
707 TUint32 iData32[2]; |
|
708 TUint8 iData8[8]; |
|
709 } u; |
|
710 }; |
|
711 |
|
712 |
|
713 #endif // IKEV1PAYLOADS_H |