1 | /** @file
|
---|
2 | The Interfaces of IPsec debug information printing.
|
---|
3 |
|
---|
4 | Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
|
---|
5 |
|
---|
6 | This program and the accompanying materials
|
---|
7 | are licensed and made available under the terms and conditions of the BSD License
|
---|
8 | which accompanies this distribution. The full text of the license may be found at
|
---|
9 | http://opensource.org/licenses/bsd-license.php.
|
---|
10 |
|
---|
11 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
---|
12 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
---|
13 |
|
---|
14 | **/
|
---|
15 |
|
---|
16 | #include "IpSecImpl.h"
|
---|
17 | #include "IpSecDebug.h"
|
---|
18 |
|
---|
19 | //
|
---|
20 | // The print title for IKEv1 variety phase.
|
---|
21 | //
|
---|
22 | CHAR8 *mIkev1StateStr[] = {
|
---|
23 | "IKEv1_MAIN_1",
|
---|
24 | "IKEv1_MAIN_2",
|
---|
25 | "IKEv1_MAIN_3",
|
---|
26 | "IKEv1_MAIN_ESTABLISHED",
|
---|
27 | "IKEv1_QUICK_1",
|
---|
28 | "IKEv1_QUICK_2",
|
---|
29 | "IKEv1_QUICK_ESTABLISHED"
|
---|
30 | };
|
---|
31 |
|
---|
32 | //
|
---|
33 | // The print title for IKEv2 variety phase.
|
---|
34 | //
|
---|
35 | CHAR8 *mIkev2StateStr[] = {
|
---|
36 | "IKEv2_STATE_INIT",
|
---|
37 | "IKEv2_STATE_AUTH",
|
---|
38 | "IKEv2_STATE_SA_ESTABLISH",
|
---|
39 | "IKEv2_STATE_CREATE_CHILD",
|
---|
40 | "IKEv2_STATE_SA_REKEYING",
|
---|
41 | "IKEv2_STATE_CHILD_SA_ESTABLISHED",
|
---|
42 | "IKEv2_STATE_SA_DELETING"
|
---|
43 | };
|
---|
44 |
|
---|
45 | //
|
---|
46 | // The print title for IKEv1 variety Exchagne.
|
---|
47 | //
|
---|
48 | CHAR8 *mExchangeStr[] = {
|
---|
49 | "IKEv1 Main Exchange",
|
---|
50 | "IKEv1 Info Exchange",
|
---|
51 | "IKEv1 Quick Exchange",
|
---|
52 | "IKEv2 Initial Exchange",
|
---|
53 | "IKEv2 Auth Exchange",
|
---|
54 | "IKEv2 Create Child Exchange",
|
---|
55 | "IKEv2 Info Exchange",
|
---|
56 | "IKE Unknow Exchange"
|
---|
57 | };
|
---|
58 |
|
---|
59 | //
|
---|
60 | // The print title for IKEv1 variety Payload.
|
---|
61 | //
|
---|
62 | CHAR8 *mIkev1PayloadStr[] = {
|
---|
63 | "IKEv1 None Payload",
|
---|
64 | "IKEv1 SA Payload",
|
---|
65 | "IKEv1 Proposal Payload",
|
---|
66 | "IKEv1 Transform Payload",
|
---|
67 | "IKEv1 KE Payload",
|
---|
68 | "IKEv1 ID Payload",
|
---|
69 | "IKEv1 Certificate Payload",
|
---|
70 | "IKEv1 Certificate Request Payload",
|
---|
71 | "IKEv1 Hash Payload",
|
---|
72 | "IKEv1 Signature Payload",
|
---|
73 | "IKEv1 Nonce Payload",
|
---|
74 | "IKEv1 Notify Payload",
|
---|
75 | "IKEv1 Delete Payload",
|
---|
76 | "IKEv1 Vendor Payload"
|
---|
77 | };
|
---|
78 |
|
---|
79 | //
|
---|
80 | // The print title for IKEv2 variety Payload.
|
---|
81 | //
|
---|
82 | CHAR8* mIkev2PayloadStr[] = {
|
---|
83 | "IKEv2 SA Payload",
|
---|
84 | "IKEv2 Key Payload",
|
---|
85 | "IKEv2 Identity Initial Payload",
|
---|
86 | "IKEv2 Identity Respond Payload",
|
---|
87 | "IKEv2 Certificate Payload",
|
---|
88 | "IKEv2 Certificate Request Payload",
|
---|
89 | "IKEv2 Auth Payload",
|
---|
90 | "IKEv2 Nonce Payload",
|
---|
91 | "IKEv2 Notify Payload",
|
---|
92 | "IKEv2 Delet Payload",
|
---|
93 | "IKEv2 Vendor Payload",
|
---|
94 | "IKEv2 Traffic Selector Initiator Payload",
|
---|
95 | "IKEv2 Traffic Selector Respond Payload",
|
---|
96 | "IKEv2 Encrypt Payload",
|
---|
97 | "IKEv2 Configuration Payload",
|
---|
98 | "IKEv2 Extensible Authentication Payload"
|
---|
99 | };
|
---|
100 |
|
---|
101 | /**
|
---|
102 | Print the IP address.
|
---|
103 |
|
---|
104 | @param[in] Level Debug print error level. Pass to DEBUG().
|
---|
105 | @param[in] Ip Point to a specified IP address.
|
---|
106 | @param[in] IpVersion The IP Version.
|
---|
107 |
|
---|
108 | **/
|
---|
109 | VOID
|
---|
110 | IpSecDumpAddress (
|
---|
111 | IN UINTN Level,
|
---|
112 | IN EFI_IP_ADDRESS *Ip,
|
---|
113 | IN UINT8 IpVersion
|
---|
114 | )
|
---|
115 | {
|
---|
116 | if (IpVersion == IP_VERSION_6) {
|
---|
117 | DEBUG (
|
---|
118 | (Level,
|
---|
119 | "%x%x:%x%x:%x%x:%x%x",
|
---|
120 | Ip->v6.Addr[0],
|
---|
121 | Ip->v6.Addr[1],
|
---|
122 | Ip->v6.Addr[2],
|
---|
123 | Ip->v6.Addr[3],
|
---|
124 | Ip->v6.Addr[4],
|
---|
125 | Ip->v6.Addr[5],
|
---|
126 | Ip->v6.Addr[6],
|
---|
127 | Ip->v6.Addr[7])
|
---|
128 | );
|
---|
129 | DEBUG (
|
---|
130 | (Level,
|
---|
131 | ":%x%x:%x%x:%x%x:%x%x\n",
|
---|
132 | Ip->v6.Addr[8],
|
---|
133 | Ip->v6.Addr[9],
|
---|
134 | Ip->v6.Addr[10],
|
---|
135 | Ip->v6.Addr[11],
|
---|
136 | Ip->v6.Addr[12],
|
---|
137 | Ip->v6.Addr[13],
|
---|
138 | Ip->v6.Addr[14],
|
---|
139 | Ip->v6.Addr[15])
|
---|
140 | );
|
---|
141 | } else {
|
---|
142 | DEBUG (
|
---|
143 | (Level,
|
---|
144 | "%d.%d.%d.%d\n",
|
---|
145 | Ip->v4.Addr[0],
|
---|
146 | Ip->v4.Addr[1],
|
---|
147 | Ip->v4.Addr[2],
|
---|
148 | Ip->v4.Addr[3])
|
---|
149 | );
|
---|
150 | }
|
---|
151 |
|
---|
152 | }
|
---|
153 |
|
---|
154 | /**
|
---|
155 | Print IKE Current states.
|
---|
156 |
|
---|
157 | @param[in] Previous The Previous state of IKE.
|
---|
158 | @param[in] Current The current state of IKE.
|
---|
159 | @param[in] IkeVersion The version of IKE.
|
---|
160 |
|
---|
161 | **/
|
---|
162 | VOID
|
---|
163 | IkeDumpState (
|
---|
164 | IN UINT32 Previous,
|
---|
165 | IN UINT32 Current,
|
---|
166 | IN UINT8 IkeVersion
|
---|
167 | )
|
---|
168 | {
|
---|
169 |
|
---|
170 | if (Previous == Current) {
|
---|
171 | if (IkeVersion == 1) {
|
---|
172 | DEBUG ((DEBUG_INFO, "\n****Current state is %a\n", mIkev1StateStr[Previous]));
|
---|
173 | } else if (IkeVersion == 2) {
|
---|
174 | DEBUG ((DEBUG_INFO, "\n****Current state is %a\n", mIkev2StateStr[Previous]));
|
---|
175 | }
|
---|
176 |
|
---|
177 | } else {
|
---|
178 | if (IkeVersion == 1) {
|
---|
179 | DEBUG ((DEBUG_INFO, "\n****Change state from %a to %a\n", mIkev1StateStr[Previous], mIkev1StateStr[Current]));
|
---|
180 | } else {
|
---|
181 | DEBUG ((DEBUG_INFO, "\n****Change state from %a to %a\n", mIkev2StateStr[Previous], mIkev2StateStr[Current]));
|
---|
182 | }
|
---|
183 |
|
---|
184 | }
|
---|
185 |
|
---|
186 | }
|
---|
187 |
|
---|
188 | /**
|
---|
189 | Print the IKE Packet.
|
---|
190 |
|
---|
191 | @param[in] Packet Point to IKE packet to be printed.
|
---|
192 | @param[in] Direction Point to the IKE packet is inbound or outbound.
|
---|
193 | @param[in] IpVersion Specified IP Version.
|
---|
194 |
|
---|
195 | **/
|
---|
196 | VOID
|
---|
197 | IpSecDumpPacket (
|
---|
198 | IN IKE_PACKET *Packet,
|
---|
199 | IN EFI_IPSEC_TRAFFIC_DIR Direction,
|
---|
200 | IN UINT8 IpVersion
|
---|
201 | )
|
---|
202 | {
|
---|
203 | CHAR8 *TypeStr;
|
---|
204 | UINTN PacketSize;
|
---|
205 | UINT64 InitCookie;
|
---|
206 | UINT64 RespCookie;
|
---|
207 |
|
---|
208 | ASSERT (Packet != NULL);
|
---|
209 |
|
---|
210 | PacketSize = Packet->PayloadTotalSize + sizeof (IKE_HEADER);
|
---|
211 | InitCookie = (Direction == EfiIPsecOutBound) ? HTONLL (Packet->Header->InitiatorCookie) : Packet->Header->InitiatorCookie;
|
---|
212 | RespCookie = (Direction == EfiIPsecOutBound) ? HTONLL (Packet->Header->ResponderCookie) : Packet->Header->ResponderCookie;
|
---|
213 |
|
---|
214 | switch (Packet->Header->ExchangeType) {
|
---|
215 | case IKE_XCG_TYPE_IDENTITY_PROTECT:
|
---|
216 | TypeStr = mExchangeStr[0];
|
---|
217 | break;
|
---|
218 |
|
---|
219 | case IKE_XCG_TYPE_INFO:
|
---|
220 | TypeStr = mExchangeStr[1];
|
---|
221 | break;
|
---|
222 |
|
---|
223 | case IKE_XCG_TYPE_QM:
|
---|
224 | TypeStr = mExchangeStr[2];
|
---|
225 | break;
|
---|
226 |
|
---|
227 | case IKE_XCG_TYPE_SA_INIT:
|
---|
228 | TypeStr = mExchangeStr[3];
|
---|
229 | break;
|
---|
230 |
|
---|
231 | case IKE_XCG_TYPE_AUTH:
|
---|
232 | TypeStr = mExchangeStr[4];
|
---|
233 | break;
|
---|
234 |
|
---|
235 | case IKE_XCG_TYPE_CREATE_CHILD_SA:
|
---|
236 | TypeStr = mExchangeStr[5];
|
---|
237 | break;
|
---|
238 |
|
---|
239 | case IKE_XCG_TYPE_INFO2:
|
---|
240 | TypeStr = mExchangeStr[6];
|
---|
241 | break;
|
---|
242 |
|
---|
243 | default:
|
---|
244 | TypeStr = mExchangeStr[7];
|
---|
245 | break;
|
---|
246 | }
|
---|
247 |
|
---|
248 | if (Direction == EfiIPsecOutBound) {
|
---|
249 | DEBUG ((DEBUG_INFO, "\n>>>Sending %d bytes %a to ", PacketSize, TypeStr));
|
---|
250 | } else {
|
---|
251 | DEBUG ((DEBUG_INFO, "\n>>>Receiving %d bytes %a from ", PacketSize, TypeStr));
|
---|
252 | }
|
---|
253 |
|
---|
254 | IpSecDumpAddress (DEBUG_INFO, &Packet->RemotePeerIp, IpVersion);
|
---|
255 |
|
---|
256 | DEBUG ((DEBUG_INFO, " InitiatorCookie:0x%lx ResponderCookie:0x%lx\n", InitCookie, RespCookie));
|
---|
257 | DEBUG (
|
---|
258 | (DEBUG_INFO,
|
---|
259 | " Version: 0x%x Flags:0x%x ExchangeType:0x%x\n",
|
---|
260 | Packet->Header->Version,
|
---|
261 | Packet->Header->Flags,
|
---|
262 | Packet->Header->ExchangeType)
|
---|
263 | );
|
---|
264 | DEBUG (
|
---|
265 | (DEBUG_INFO,
|
---|
266 | " MessageId:0x%x NextPayload:0x%x\n",
|
---|
267 | Packet->Header->MessageId,
|
---|
268 | Packet->Header->NextPayload)
|
---|
269 | );
|
---|
270 |
|
---|
271 | }
|
---|
272 |
|
---|
273 | /**
|
---|
274 | Print the IKE Paylolad.
|
---|
275 |
|
---|
276 | @param[in] IkePayload Point to payload to be printed.
|
---|
277 | @param[in] IkeVersion The specified version of IKE.
|
---|
278 |
|
---|
279 | **/
|
---|
280 | VOID
|
---|
281 | IpSecDumpPayload (
|
---|
282 | IN IKE_PAYLOAD *IkePayload,
|
---|
283 | IN UINT8 IkeVersion
|
---|
284 | )
|
---|
285 | {
|
---|
286 | if (IkeVersion == 1) {
|
---|
287 | DEBUG ((DEBUG_INFO, "+%a\n", mIkev1PayloadStr[IkePayload->PayloadType]));
|
---|
288 | } else {
|
---|
289 | //
|
---|
290 | // For IKEV2 the first Payload type is started from 33.
|
---|
291 | //
|
---|
292 | DEBUG ((DEBUG_INFO, "+%a\n", mIkev2PayloadStr[IkePayload->PayloadType - 33]));
|
---|
293 | }
|
---|
294 | IpSecDumpBuf ("Payload data", IkePayload->PayloadBuf, IkePayload->PayloadSize);
|
---|
295 | }
|
---|
296 |
|
---|
297 | /**
|
---|
298 | Print the buffer in form of Hex.
|
---|
299 |
|
---|
300 | @param[in] Title The strings to be printed before the data of the buffer.
|
---|
301 | @param[in] Data Points to buffer to be printed.
|
---|
302 | @param[in] DataSize The size of the buffer to be printed.
|
---|
303 |
|
---|
304 | **/
|
---|
305 | VOID
|
---|
306 | IpSecDumpBuf (
|
---|
307 | IN CHAR8 *Title,
|
---|
308 | IN UINT8 *Data,
|
---|
309 | IN UINTN DataSize
|
---|
310 | )
|
---|
311 | {
|
---|
312 | UINTN Index;
|
---|
313 | UINTN DataIndex;
|
---|
314 | UINTN BytesRemaining;
|
---|
315 | UINTN BytesToPrint;
|
---|
316 |
|
---|
317 | DataIndex = 0;
|
---|
318 | BytesRemaining = DataSize;
|
---|
319 |
|
---|
320 | DEBUG ((DEBUG_INFO, "==%a %d bytes==\n", Title, DataSize));
|
---|
321 |
|
---|
322 | while (BytesRemaining > 0) {
|
---|
323 |
|
---|
324 | BytesToPrint = (BytesRemaining > IPSEC_DEBUG_BYTE_PER_LINE) ? IPSEC_DEBUG_BYTE_PER_LINE : BytesRemaining;
|
---|
325 |
|
---|
326 | for (Index = 0; Index < BytesToPrint; Index++) {
|
---|
327 | DEBUG ((DEBUG_INFO, " 0x%02x,", Data[DataIndex++]));
|
---|
328 | }
|
---|
329 |
|
---|
330 | DEBUG ((DEBUG_INFO, "\n"));
|
---|
331 | BytesRemaining -= BytesToPrint;
|
---|
332 | }
|
---|
333 |
|
---|
334 | }
|
---|