12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * All rights reserved. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that the following conditions 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met: 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * notice, this list of conditions and the following disclaimer. 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * documentation and/or other materials provided with the distribution. 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 3. Neither the name of the project nor the names of its contributors 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * may be used to endorse or promote products derived from this software 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * without specific prior written permission. 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SUCH DAMAGE. 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "@(#) $Header: /tcpdump/master/tcpdump/print-isakmp.c,v 1.51 2005/04/07 00:28:17 mcr Exp $ (LBL)"; 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "isakmp.h" 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ipsec_doi.h" 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "oakley.h" 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" /* must come after interface.h */ 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h" 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip6.h" 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_SOCKADDR_STORAGE 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define sockaddr_storage sockaddr 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_sa_print(const struct isakmp_gen *, 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_p_print(const struct isakmp_gen *, 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_t_print(const struct isakmp_gen *, 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_ke_print(const struct isakmp_gen *, 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_id_print(const struct isakmp_gen *, 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_cert_print(const struct isakmp_gen *, 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_cr_print(const struct isakmp_gen *, 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_sig_print(const struct isakmp_gen *, 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_hash_print(const struct isakmp_gen *, 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_nonce_print(const struct isakmp_gen *, 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_n_print(const struct isakmp_gen *, 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_d_print(const struct isakmp_gen *, 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_vid_print(const struct isakmp_gen *, 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_sub0_print(u_char, const struct isakmp_gen *, 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_sub_print(u_char, const struct isakmp_gen *, 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *, u_int32_t, u_int32_t, u_int32_t, int); 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic char *numstr(int); 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void safememcpy(void *, const void *, size_t); 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MAXINITIATORS 20 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint ninitiator = 0; 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct { 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cookie_t initiator; 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct sockaddr_storage iaddr; 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct sockaddr_storage raddr; 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} cookiecache[MAXINITIATORS]; 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* protocol id */ 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *protoidstr[] = { 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL, "isakmp", "ipsec-ah", "ipsec-esp", "ipcomp", 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* isakmp->np */ 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *npstr[] = { 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "none", "sa", "p", "t", "ke", "id", "cert", "cr", "hash", 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "sig", "nonce", "n", "d", "vid" 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* isakmp->np */ 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *(*npfunc[])(const struct isakmp_gen *, u_int, 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *, u_int32_t, u_int32_t, u_int32_t, int) = { 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL, 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_sa_print, 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_p_print, 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_t_print, 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_ke_print, 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_id_print, 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_cert_print, 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_cr_print, 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_hash_print, 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_sig_print, 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_nonce_print, 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_n_print, 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_d_print, 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_vid_print, 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* isakmp->etype */ 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *etypestr[] = { 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "none", "base", "ident", "auth", "agg", "inf", NULL, NULL, 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "oakley-quick", "oakley-newgroup", 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define STR_OR_ID(x, tab) \ 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (((x) < sizeof(tab)/sizeof(tab[0]) && tab[(x)]) ? tab[(x)] : numstr(x)) 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PROTOIDSTR(x) STR_OR_ID(x, protoidstr) 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NPSTR(x) STR_OR_ID(x, npstr) 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ETYPESTR(x) STR_OR_ID(x, etypestr) 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NPFUNC(x) \ 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (((x) < sizeof(npfunc)/sizeof(npfunc[0]) && npfunc[(x)]) \ 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? npfunc[(x)] : NULL) 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectiszero(u_char *p, size_t l) 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (l--) { 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (*p++) 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* find cookie from initiator cache */ 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcookie_find(cookie_t *in) 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < MAXINITIATORS; i++) { 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (memcmp(in, &cookiecache[i].initiator, sizeof(*in)) == 0) 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return i; 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* record initiator */ 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcookie_record(cookie_t *in, const u_char *bp2) 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ip *ip; 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct sockaddr_in *sin; 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ip6_hdr *ip6; 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct sockaddr_in6 *sin6; 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = cookie_find(in); 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (0 <= i) { 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ninitiator = (i + 1) % MAXINITIATORS; 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip = (struct ip *)bp2; 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (IP_V(ip)) { 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 4: 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&cookiecache[ninitiator].iaddr, 0, 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sizeof(cookiecache[ninitiator].iaddr)); 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&cookiecache[ninitiator].raddr, 0, 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sizeof(cookiecache[ninitiator].raddr)); 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin = (struct sockaddr_in *)&cookiecache[ninitiator].iaddr; 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin->sin_len = sizeof(struct sockaddr_in); 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin->sin_family = AF_INET; 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&sin->sin_addr, &ip->ip_src, sizeof(ip->ip_src)); 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin = (struct sockaddr_in *)&cookiecache[ninitiator].raddr; 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin->sin_len = sizeof(struct sockaddr_in); 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin->sin_family = AF_INET; 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&sin->sin_addr, &ip->ip_dst, sizeof(ip->ip_dst)); 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 6: 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&cookiecache[ninitiator].iaddr, 0, 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sizeof(cookiecache[ninitiator].iaddr)); 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&cookiecache[ninitiator].raddr, 0, 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sizeof(cookiecache[ninitiator].raddr)); 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6 = (struct ip6_hdr *)bp2; 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin6 = (struct sockaddr_in6 *)&cookiecache[ninitiator].iaddr; 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin6->sin6_len = sizeof(struct sockaddr_in6); 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin6->sin6_family = AF_INET6; 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src)); 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin6 = (struct sockaddr_in6 *)&cookiecache[ninitiator].raddr; 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin6->sin6_len = sizeof(struct sockaddr_in6); 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin6->sin6_family = AF_INET6; 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&sin6->sin6_addr, &ip6->ip6_dst, sizeof(ip6->ip6_dst)); 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&cookiecache[ninitiator].initiator, in, sizeof(*in)); 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ninitiator = (ninitiator + 1) % MAXINITIATORS; 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define cookie_isinitiator(x, y) cookie_sidecheck((x), (y), 1) 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define cookie_isresponder(x, y) cookie_sidecheck((x), (y), 0) 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcookie_sidecheck(int i, const u_char *bp2, int initiator) 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct sockaddr_storage ss; 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct sockaddr *sa; 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ip *ip; 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct sockaddr_in *sin; 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ip6_hdr *ip6; 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct sockaddr_in6 *sin6; 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int salen; 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&ss, 0, sizeof(ss)); 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip = (struct ip *)bp2; 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (IP_V(ip)) { 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 4: 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin = (struct sockaddr_in *)&ss; 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin->sin_len = sizeof(struct sockaddr_in); 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin->sin_family = AF_INET; 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&sin->sin_addr, &ip->ip_src, sizeof(ip->ip_src)); 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 6: 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6 = (struct ip6_hdr *)bp2; 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin6 = (struct sockaddr_in6 *)&ss; 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin6->sin6_len = sizeof(struct sockaddr_in6); 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sin6->sin6_family = AF_INET6; 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src)); 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sa = (struct sockaddr *)&ss; 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (initiator) { 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sa->sa_family != ((struct sockaddr *)&cookiecache[i].iaddr)->sa_family) 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project salen = sa->sa_len; 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sa->sa_family == AF_INET6) 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project salen = sizeof(struct sockaddr_in6); 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project salen = sizeof(struct sockaddr); 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project salen = sizeof(struct sockaddr); 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (memcmp(&ss, &cookiecache[i].iaddr, salen) == 0) 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sa->sa_family != ((struct sockaddr *)&cookiecache[i].raddr)->sa_family) 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project salen = sa->sa_len; 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sa->sa_family == AF_INET6) 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project salen = sizeof(struct sockaddr_in6); 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project salen = sizeof(struct sockaddr); 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project salen = sizeof(struct sockaddr); 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (memcmp(&ss, &cookiecache[i].raddr, salen) == 0) 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrawprint(caddr_t loc, size_t len) 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static u_char *p; 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project size_t i; 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*loc, len); 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = (u_char *)loc; 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < len; i++) 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%02x", p[i] & 0xff); 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct attrmap { 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *type; 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int nvalue; 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *value[30]; /*XXX*/ 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_attrmap_print(const u_char *p, const u_char *ep, 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct attrmap *map, size_t nmap) 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t *q; 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int totlen; 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t t, v; 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project q = (u_int16_t *)p; 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (p[0] & 0x80) 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project totlen = 4; 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project totlen = 4 + EXTRACT_16BITS(&q[1]); 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ep < p + totlen) { 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|attr]"); 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return ep + 1; 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("("); 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project t = EXTRACT_16BITS(&q[0]) & 0x7fff; 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (map && t < nmap && map[t].type) 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("type=%s ", map[t].type); 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("type=#%d ", t); 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (p[0] & 0x80) { 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("value="); 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project v = EXTRACT_16BITS(&q[1]); 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (map && t < nmap && v < map[t].nvalue && map[t].value[v]) 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", map[t].value[v]); 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rawprint((caddr_t)&q[1], 2); 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("len=%d value=", EXTRACT_16BITS(&q[1])); 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rawprint((caddr_t)&p[4], EXTRACT_16BITS(&q[1])); 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(")"); 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return p + totlen; 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_attr_print(const u_char *p, const u_char *ep) 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t *q; 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int totlen; 3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t t; 3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project q = (u_int16_t *)p; 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (p[0] & 0x80) 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project totlen = 4; 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project totlen = 4 + EXTRACT_16BITS(&q[1]); 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ep < p + totlen) { 3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|attr]"); 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return ep + 1; 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("("); 4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project t = EXTRACT_16BITS(&q[0]) & 0x7fff; 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("type=#%d ", t); 4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (p[0] & 0x80) { 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("value="); 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project t = q[1]; 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rawprint((caddr_t)&q[1], 2); 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("len=%d value=", EXTRACT_16BITS(&q[1])); 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rawprint((caddr_t)&p[2], EXTRACT_16BITS(&q[1])); 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(")"); 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return p + totlen; 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_sa_print(const struct isakmp_gen *ext, 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int item_len _U_, 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep, u_int32_t phase, u_int32_t doi0 _U_, 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto0, int depth) 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct isakmp_pl_sa *p; 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_pl_sa sa; 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int32_t *q; 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t doi, sit, ident; 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *cp, *np; 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int t; 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_SA)); 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = (struct isakmp_pl_sa *)ext; 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*p); 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&sa, ext, sizeof(sa)); 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project doi = ntohl(sa.doi); 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sit = ntohl(sa.sit); 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (doi != 1) { 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" doi=%d", doi); 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" situation=%u", (u_int32_t)ntohl(sa.sit)); 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (u_char *)(p + 1); 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" doi=ipsec"); 4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project q = (u_int32_t *)&sa.sit; 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" situation="); 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project t = 0; 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sit & 0x01) { 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("identity"); 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project t++; 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sit & 0x02) { 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ssecrecy", t ? "+" : ""); 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project t++; 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sit & 0x04) 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%sintegrity", t ? "+" : ""); 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project np = (u_char *)ext + sizeof(sa); 4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sit != 0x01) { 4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*(ext + 1), sizeof(ident)); 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&ident, ext + 1, sizeof(ident)); 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" ident=%u", (u_int32_t)ntohl(ident)); 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project np += sizeof(ident); 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ext = (struct isakmp_gen *)np; 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ext); 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = isakmp_sub_print(ISAKMP_NPTYPE_P, ext, ep, phase, doi, proto0, 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project depth); 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return cp; 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_SA)); 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_p_print(const struct isakmp_gen *ext, u_int item_len _U_, 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep, u_int32_t phase, u_int32_t doi0, 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto0 _U_, int depth) 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct isakmp_pl_p *p; 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_pl_p prop; 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *cp; 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_P)); 4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = (struct isakmp_pl_p *)ext; 4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*p); 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&prop, ext, sizeof(prop)); 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" #%d protoid=%s transform=%d", 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project prop.p_no, PROTOIDSTR(prop.prot_id), prop.num_t); 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (prop.spi_size) { 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" spi="); 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!rawprint((caddr_t)(p + 1), prop.spi_size)) 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ext = (struct isakmp_gen *)((u_char *)(p + 1) + prop.spi_size); 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ext); 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = isakmp_sub_print(ISAKMP_NPTYPE_T, ext, ep, phase, doi0, 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project prop.prot_id, depth); 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return cp; 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_P)); 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *isakmp_p_map[] = { 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL, "ike", 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *ah_p_map[] = { 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL, "(reserved)", "md5", "sha", "1des", 5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "sha2-256", "sha2-384", "sha2-512", 5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *esp_p_map[] = { 5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL, "1des-iv64", "1des", "3des", "rc5", "idea", "cast", 5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "blowfish", "3idea", "1des-iv32", "rc4", "null", "aes" 5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *ipcomp_p_map[] = { 5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL, "oui", "deflate", "lzs", 5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst struct attrmap ipsec_t_map[] = { 5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { NULL, 0, { NULL } }, 5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "lifetype", 3, { NULL, "sec", "kb", }, }, 5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "life", 0, { NULL } }, 5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "group desc", 5, { NULL, "modp768", "modp1024", "EC2N 2^155", 5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "EC2N 2^185", }, }, 5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "enc mode", 3, { NULL, "tunnel", "transport", }, }, 5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "auth", 5, { NULL, "hmac-md5", "hmac-sha1", "1des-mac", "keyed", }, }, 5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "keylen", 0, { NULL } }, 5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "rounds", 0, { NULL } }, 5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "dictsize", 0, { NULL } }, 5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "privalg", 0, { NULL } }, 5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst struct attrmap oakley_t_map[] = { 5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { NULL, 0, { NULL } }, 5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "enc", 8, { NULL, "1des", "idea", "blowfish", "rc5", 5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "3des", "cast", "aes", }, }, 5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "hash", 7, { NULL, "md5", "sha1", "tiger", 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "sha2-256", "sha2-384", "sha2-512", }, }, 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "auth", 6, { NULL, "preshared", "dss", "rsa sig", "rsa enc", 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "rsa enc revised", }, }, 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "group desc", 5, { NULL, "modp768", "modp1024", "EC2N 2^155", 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "EC2N 2^185", }, }, 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "group type", 4, { NULL, "MODP", "ECP", "EC2N", }, }, 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "group prime", 0, { NULL } }, 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "group gen1", 0, { NULL } }, 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "group gen2", 0, { NULL } }, 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "group curve A", 0, { NULL } }, 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "group curve B", 0, { NULL } }, 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "lifetype", 3, { NULL, "sec", "kb", }, }, 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "lifeduration", 0, { NULL } }, 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "prf", 0, { NULL } }, 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "keylen", 0, { NULL } }, 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "field", 0, { NULL } }, 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { "order", 0, { NULL } }, 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_t_print(const struct isakmp_gen *ext, u_int item_len, 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep, u_int32_t phase _U_, u_int32_t doi _U_, 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto, int depth _U_) 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct isakmp_pl_t *p; 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_pl_t t; 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *cp; 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *idstr; 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct attrmap *map; 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project size_t nmap; 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep2; 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_T)); 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = (struct isakmp_pl_t *)ext; 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*p); 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&t, ext, sizeof(t)); 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (proto) { 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 1: 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project idstr = STR_OR_ID(t.t_id, isakmp_p_map); 5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project map = oakley_t_map; 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]); 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 2: 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project idstr = STR_OR_ID(t.t_id, ah_p_map); 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project map = ipsec_t_map; 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]); 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 3: 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project idstr = STR_OR_ID(t.t_id, esp_p_map); 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project map = ipsec_t_map; 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]); 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 4: 6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project idstr = STR_OR_ID(t.t_id, ipcomp_p_map); 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project map = ipsec_t_map; 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]); 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project idstr = NULL; 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project map = NULL; 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nmap = 0; 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (idstr) 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" #%d id=%s ", t.t_no, idstr); 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" #%d id=%d ", t.t_no, t.t_id); 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = (u_char *)(p + 1); 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ep2 = (u_char *)p + item_len; 6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (cp < ep && cp < ep2) { 6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (map && nmap) { 6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = isakmp_attrmap_print(cp, (ep < ep2) ? ep : ep2, 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project map, nmap); 6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = isakmp_attr_print(cp, (ep < ep2) ? ep : ep2); 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ep < ep2) 6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("..."); 6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return cp; 6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_T)); 6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_ke_print(const struct isakmp_gen *ext, u_int item_len _U_, 6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi _U_, 6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto _U_, int depth _U_) 6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_gen e; 6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_KE)); 6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ext); 6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&e, ext, sizeof(e)); 6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" key len=%d", ntohs(e.len) - 4); 6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (2 < vflag && 4 < ntohs(e.len)) { 6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" "); 6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4)) 6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (u_char *)ext + ntohs(e.len); 6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_KE)); 6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_id_print(const struct isakmp_gen *ext, u_int item_len _U_, 6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep _U_, u_int32_t phase, u_int32_t doi _U_, 6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto _U_, int depth _U_) 6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define USE_IPSECDOI_IN_PHASE1 1 6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct isakmp_pl_id *p; 6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_pl_id id; 6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static const char *idtypestr[] = { 6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "IPv4", "IPv4net", "IPv6", "IPv6net", 6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static const char *ipsecidtypestr[] = { 6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL, "IPv4", "FQDN", "user FQDN", "IPv4net", "IPv6", 6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "IPv6net", "IPv4range", "IPv6range", "ASN1 DN", "ASN1 GN", 6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "keyid", 6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int len; 6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *data; 6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_ID)); 6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = (struct isakmp_pl_id *)ext; 6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*p); 6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&id, ext, sizeof(id)); 6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sizeof(*p) < item_len) { 6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project data = (u_char *)(p + 1); 6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = item_len - sizeof(*p); 6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project data = NULL; 6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = 0; 6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0 /*debug*/ 6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [phase=%d doi=%d proto=%d]", phase, doi, proto); 6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (phase) { 6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef USE_IPSECDOI_IN_PHASE1 6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 1: 6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" idtype=%s", STR_OR_ID(id.d.id_type, idtypestr)); 7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" doi_data=%u", 7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (u_int32_t)(ntohl(id.d.doi_data) & 0xffffff)); 7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_IPSECDOI_IN_PHASE1 7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 1: 7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 2: 7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct ipsecdoi_id *p; 7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ipsecdoi_id id; 7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct protoent *pe; 7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = (struct ipsecdoi_id *)ext; 7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*p); 7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&id, ext, sizeof(id)); 7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" idtype=%s", STR_OR_ID(id.type, ipsecidtypestr)); 7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (id.proto_id) { 7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32 7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project // not supported on android 7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project //setprotoent(1); 7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */ 7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pe = getprotobynumber(id.proto_id); 7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pe) 7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" protoid=%s", pe->p_name); 7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32 7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project // not supported on android 7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project //endprotoent(); 7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */ 7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* it DOES NOT mean IPPROTO_IP! */ 7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" protoid=%s", "0"); 7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" port=%d", ntohs(id.port)); 7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!len) 7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (data == NULL) 7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*data, len); 7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (id.type) { 7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_ID_IPV4_ADDR: 7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len < 4) 7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d [bad: < 4]", len); 7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d %s", len, ipaddr_string(data)); 7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = 0; 7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_ID_FQDN: 7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_ID_USER_FQDN: 7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d ", len); 7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < len; i++) 7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safeputchar(data[i]); 7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = 0; 7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_ID_IPV4_ADDR_SUBNET: 7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *mask; 7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len < 8) 7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d [bad: < 8]", len); 7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mask = data + sizeof(struct in_addr); 7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d %s/%u.%u.%u.%u", len, 7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(data), 7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mask[0], mask[1], mask[2], mask[3]); 7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = 0; 7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_ID_IPV6_ADDR: 7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len < 16) 7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d [bad: < 16]", len); 7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d %s", len, ip6addr_string(data)); 7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = 0; 7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_ID_IPV6_ADDR_SUBNET: 7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int32_t *mask; 7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len < 20) 7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d [bad: < 20]", len); 7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mask = (u_int32_t *)(data + sizeof(struct in6_addr)); 7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /*XXX*/ 7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d %s/0x%08x%08x%08x%08x", len, 7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6addr_string(data), 7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mask[0], mask[1], mask[2], mask[3]); 7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = 0; 7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/ 7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_ID_IPV4_ADDR_RANGE: 7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len < 8) 7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d [bad: < 8]", len); 7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d %s-%s", len, 8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(data), 8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(data + sizeof(struct in_addr))); 8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = 0; 8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_ID_IPV6_ADDR_RANGE: 8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len < 32) 8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d [bad: < 32]", len); 8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d %s-%s", len, 8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6addr_string(data), 8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6addr_string(data + sizeof(struct in6_addr))); 8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = 0; 8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/ 8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_ID_DER_ASN1_DN: 8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_ID_DER_ASN1_GN: 8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_ID_KEY_ID: 8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (data && len) { 8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d", len); 8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (2 < vflag) { 8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" "); 8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!rawprint((caddr_t)data, len)) 8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (u_char *)ext + item_len; 8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 8352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_ID)); 8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_cert_print(const struct isakmp_gen *ext, u_int item_len _U_, 8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep _U_, u_int32_t phase _U_, 8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t doi0 _U_, 8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto0 _U_, int depth _U_) 8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct isakmp_pl_cert *p; 8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_pl_cert cert; 8472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static const char *certstr[] = { 8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "none", "pkcs7", "pgp", "dns", 8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "x509sign", "x509ke", "kerberos", "crl", 8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "arl", "spki", "x509attr", 8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_CERT)); 8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = (struct isakmp_pl_cert *)ext; 8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*p); 8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&cert, ext, sizeof(cert)); 8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d", item_len - 4); 8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" type=%s", STR_OR_ID((cert.encode), certstr)); 8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (2 < vflag && 4 < item_len) { 8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" "); 8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!rawprint((caddr_t)(ext + 1), item_len - 4)) 8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (u_char *)ext + item_len; 8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_CERT)); 8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_cr_print(const struct isakmp_gen *ext, u_int item_len _U_, 8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi0 _U_, 8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto0 _U_, int depth _U_) 8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct isakmp_pl_cert *p; 8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_pl_cert cert; 8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static const char *certstr[] = { 8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "none", "pkcs7", "pgp", "dns", 8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "x509sign", "x509ke", "kerberos", "crl", 8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "arl", "spki", "x509attr", 8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_CR)); 8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = (struct isakmp_pl_cert *)ext; 8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*p); 8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&cert, ext, sizeof(cert)); 8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d", item_len - 4); 8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" type=%s", STR_OR_ID((cert.encode), certstr)); 8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (2 < vflag && 4 < item_len) { 8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" "); 8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!rawprint((caddr_t)(ext + 1), item_len - 4)) 8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (u_char *)ext + item_len; 8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_CR)); 8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_hash_print(const struct isakmp_gen *ext, u_int item_len _U_, 9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi _U_, 9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto _U_, int depth _U_) 9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_gen e; 9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_HASH)); 9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ext); 9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&e, ext, sizeof(e)); 9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d", ntohs(e.len) - 4); 9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (2 < vflag && 4 < ntohs(e.len)) { 9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" "); 9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4)) 9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (u_char *)ext + ntohs(e.len); 9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_HASH)); 9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_sig_print(const struct isakmp_gen *ext, u_int item_len _U_, 9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi _U_, 9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto _U_, int depth _U_) 9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_gen e; 9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_SIG)); 9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ext); 9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&e, ext, sizeof(e)); 9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d", ntohs(e.len) - 4); 9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (2 < vflag && 4 < ntohs(e.len)) { 9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" "); 9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4)) 9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (u_char *)ext + ntohs(e.len); 9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_SIG)); 9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_nonce_print(const struct isakmp_gen *ext, 9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int item_len _U_, 9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep _U_, 9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t phase _U_, u_int32_t doi _U_, 9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto _U_, int depth _U_) 9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_gen e; 9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_NONCE)); 9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ext); 9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&e, ext, sizeof(e)); 9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" n len=%d", ntohs(e.len) - 4); 9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (2 < vflag && 4 < ntohs(e.len)) { 9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" "); 9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4)) 9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (u_char *)ext + ntohs(e.len); 9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_NONCE)); 9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_n_print(const struct isakmp_gen *ext, u_int item_len, 9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep, u_int32_t phase, u_int32_t doi0 _U_, 9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto0 _U_, int depth) 9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_pl_n *p, n; 9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *cp; 9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_char *ep2; 9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t doi; 9822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto; 9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static const char *notify_error_str[] = { 9842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL, "INVALID-PAYLOAD-TYPE", 9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "DOI-NOT-SUPPORTED", "SITUATION-NOT-SUPPORTED", 9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "INVALID-COOKIE", "INVALID-MAJOR-VERSION", 9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "INVALID-MINOR-VERSION", "INVALID-EXCHANGE-TYPE", 9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "INVALID-FLAGS", "INVALID-MESSAGE-ID", 9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "INVALID-PROTOCOL-ID", "INVALID-SPI", 9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "INVALID-TRANSFORM-ID", "ATTRIBUTES-NOT-SUPPORTED", 9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "NO-PROPOSAL-CHOSEN", "BAD-PROPOSAL-SYNTAX", 9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "PAYLOAD-MALFORMED", "INVALID-KEY-INFORMATION", 9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "INVALID-ID-INFORMATION", "INVALID-CERT-ENCODING", 9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "INVALID-CERTIFICATE", "CERT-TYPE-UNSUPPORTED", 9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "INVALID-CERT-AUTHORITY", "INVALID-HASH-INFORMATION", 9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "AUTHENTICATION-FAILED", "INVALID-SIGNATURE", 9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "ADDRESS-NOTIFICATION", "NOTIFY-SA-LIFETIME", 9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "CERTIFICATE-UNAVAILABLE", "UNSUPPORTED-EXCHANGE-TYPE", 9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "UNEQUAL-PAYLOAD-LENGTHS", 10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static const char *ipsec_notify_error_str[] = { 10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "RESERVED", 10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static const char *notify_status_str[] = { 10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "CONNECTED", 10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static const char *ipsec_notify_status_str[] = { 10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "RESPONDER-LIFETIME", "REPLAY-STATUS", 10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "INITIAL-CONTACT", 10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* NOTE: these macro must be called with x in proper range */ 10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 0 - 8191 */ 10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NOTIFY_ERROR_STR(x) \ 10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project STR_OR_ID((x), notify_error_str) 10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 8192 - 16383 */ 10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IPSEC_NOTIFY_ERROR_STR(x) \ 10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project STR_OR_ID((u_int)((x) - 8192), ipsec_notify_error_str) 10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 16384 - 24575 */ 10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NOTIFY_STATUS_STR(x) \ 10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project STR_OR_ID((u_int)((x) - 16384), notify_status_str) 10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 24576 - 32767 */ 10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IPSEC_NOTIFY_STATUS_STR(x) \ 10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project STR_OR_ID((u_int)((x) - 24576), ipsec_notify_status_str) 10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_N)); 10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = (struct isakmp_pl_n *)ext; 10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*p); 10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&n, ext, sizeof(n)); 10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project doi = ntohl(n.doi); 10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project proto = n.prot_id; 10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (doi != 1) { 10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" doi=%d", doi); 10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" proto=%d", proto); 10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ntohs(n.type) < 8192) 10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" type=%s", NOTIFY_ERROR_STR(ntohs(n.type))); 10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (ntohs(n.type) < 16384) 10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" type=%s", numstr(ntohs(n.type))); 10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (ntohs(n.type) < 24576) 10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" type=%s", NOTIFY_STATUS_STR(ntohs(n.type))); 10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" type=%s", numstr(ntohs(n.type))); 10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (n.spi_size) { 10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" spi="); 10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!rawprint((caddr_t)(p + 1), n.spi_size)) 10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (u_char *)(p + 1) + n.spi_size; 10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" doi=ipsec"); 10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" proto=%s", PROTOIDSTR(proto)); 10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ntohs(n.type) < 8192) 10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" type=%s", NOTIFY_ERROR_STR(ntohs(n.type))); 10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (ntohs(n.type) < 16384) 10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" type=%s", IPSEC_NOTIFY_ERROR_STR(ntohs(n.type))); 10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (ntohs(n.type) < 24576) 10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" type=%s", NOTIFY_STATUS_STR(ntohs(n.type))); 10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (ntohs(n.type) < 32768) 10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" type=%s", IPSEC_NOTIFY_STATUS_STR(ntohs(n.type))); 10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" type=%s", numstr(ntohs(n.type))); 10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (n.spi_size) { 10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" spi="); 10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!rawprint((caddr_t)(p + 1), n.spi_size)) 10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = (u_char *)(p + 1) + n.spi_size; 10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ep2 = (u_char *)p + item_len; 10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp < ep) { 10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" orig=("); 10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (ntohs(n.type)) { 10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_NTYPE_RESPONDER_LIFETIME: 10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct attrmap *map = oakley_t_map; 10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project size_t nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]); 10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (cp < ep && cp < ep2) { 10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = isakmp_attrmap_print(cp, 10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (ep < ep2) ? ep : ep2, map, nmap); 10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IPSECDOI_NTYPE_REPLAY_STATUS: 10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("replay detection %sabled", 10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (*(u_int32_t *)cp) ? "en" : "dis"); 10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN: 10942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (isakmp_sub_print(ISAKMP_NPTYPE_SA, 10952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (struct isakmp_gen *)cp, ep, phase, doi, proto, 10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project depth) == NULL) 10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* NULL is dummy */ 11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_print(gndo, cp, 11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project item_len - sizeof(*p) - n.spi_size, 11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL); 11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(")"); 11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (u_char *)ext + item_len; 11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_N)); 11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_d_print(const struct isakmp_gen *ext, u_int item_len _U_, 11152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi0 _U_, 11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto0 _U_, int depth _U_) 11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 11182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct isakmp_pl_d *p; 11192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_pl_d d; 11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int8_t *q; 11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t doi; 11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto; 11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_D)); 11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = (struct isakmp_pl_d *)ext; 11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*p); 11292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&d, ext, sizeof(d)); 11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project doi = ntohl(d.doi); 11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project proto = d.prot_id; 11322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (doi != 1) { 11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" doi=%u", doi); 11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" proto=%u", proto); 11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" doi=ipsec"); 11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" proto=%s", PROTOIDSTR(proto)); 11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" spilen=%u", d.spi_size); 11402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" nspi=%u", ntohs(d.num_spi)); 11412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" spi="); 11422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project q = (u_int8_t *)(p + 1); 11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < ntohs(d.num_spi); i++) { 11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i != 0) 11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(","); 11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!rawprint((caddr_t)q, d.spi_size)) 11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project q += d.spi_size; 11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return q; 11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_D)); 11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 11542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 11552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 11572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_vid_print(const struct isakmp_gen *ext, 11582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int item_len _U_, const u_char *ep _U_, 11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t phase _U_, u_int32_t doi _U_, 11602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto _U_, int depth _U_) 11612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 11622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_gen e; 11632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s:", NPSTR(ISAKMP_NPTYPE_VID)); 11652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ext); 11672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&e, ext, sizeof(e)); 11682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" len=%d", ntohs(e.len) - 4); 11692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (2 < vflag && 4 < ntohs(e.len)) { 11702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" "); 11712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4)) 11722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 11732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (u_char *)ext + ntohs(e.len); 11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_VID)); 11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 11782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 11792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_sub0_print(u_char np, const struct isakmp_gen *ext, const u_char *ep, 11822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t phase, u_int32_t doi, u_int32_t proto, int depth) 11832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 11842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *cp; 11852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_gen e; 11862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int item_len; 11872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = (u_char *)ext; 11892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ext); 11902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&e, ext, sizeof(e)); 11912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 11932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Since we can't have a payload length of less than 4 bytes, 11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * we need to bail out here if the generic header is nonsensical 11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or truncated, otherwise we could loop forever processing 11962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * zero-length items or otherwise misdissect the packet. 11972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 11982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project item_len = ntohs(e.len); 11992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (item_len <= 4) 12002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 12012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (NPFUNC(np)) { 12032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 12042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * XXX - what if item_len is too short, or too long, 12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * for this payload type? 12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 12072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = (*npfunc[np])(ext, item_len, ep, phase, doi, proto, depth); 12082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 12092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", NPSTR(np)); 12102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += item_len; 12112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return cp; 12142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 12152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|isakmp]"); 12162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 12172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 12182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 12202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_sub_print(u_char np, const struct isakmp_gen *ext, const u_char *ep, 12212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t phase, u_int32_t doi, u_int32_t proto, int depth) 12222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 12232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *cp; 12242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 12252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp_gen e; 12262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = (const u_char *)ext; 12282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (np) { 12302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*ext); 12312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&e, ext, sizeof(e)); 12332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*ext, ntohs(e.len)); 12352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project depth++; 12372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n"); 12382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < depth; i++) 12392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" "); 12402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("("); 12412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = isakmp_sub0_print(np, ext, ep, phase, doi, proto, depth); 12422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(")"); 12432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project depth--; 12442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp == NULL) { 12462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Zero-length subitem */ 12472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 12482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project np = e.np; 12512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ext = (struct isakmp_gen *)cp; 12522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return cp; 12542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 12552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(np)); 12562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 12572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 12582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic char * 12602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnumstr(int x) 12612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 12622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static char buf[20]; 12632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, sizeof(buf), "#%d", x); 12642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return buf; 12652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 12662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 12682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * some compiler tries to optimize memcpy(), using the alignment constraint 12692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * on the argument pointer type. by using this function, we try to avoid the 12702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * optimization. 12712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 12722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 12732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsafememcpy(void *p, const void *q, size_t l) 12742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 12752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(p, q, l); 12762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 12772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 12792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_print(netdissect_options *ndo, 12802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *bp, u_int length, 12812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *bp2) 12822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 12832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct isakmp *p; 12842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct isakmp base; 12852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep; 12862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_char np; 12872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 12882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int phase; 12892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int major, minor; 12902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = (const struct isakmp *)bp; 12922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ep = ndo->ndo_snapend; 12932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((struct isakmp *)ep < p + 1) { 12952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|isakmp]"); 12962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 12972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safememcpy(&base, p, sizeof(base)); 13002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("isakmp"); 13022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) { 13032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project major = (base.vers & ISAKMP_VERS_MAJOR) 13042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project >> ISAKMP_VERS_MAJOR_SHIFT; 13052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project minor = (base.vers & ISAKMP_VERS_MINOR) 13062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project >> ISAKMP_VERS_MINOR_SHIFT; 13072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %d.%d", major, minor); 13082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) { 13112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" msgid "); 13122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rawprint((caddr_t)&base.msgid, sizeof(base.msgid)); 13132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (1 < vflag) { 13162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" cookie "); 13172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rawprint((caddr_t)&base.i_ck, sizeof(base.i_ck)); 13182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("->"); 13192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rawprint((caddr_t)&base.r_ck, sizeof(base.r_ck)); 13202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(":"); 13222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project phase = (*(u_int32_t *)base.msgid == 0) ? 1 : 2; 13242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (phase == 1) 13252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" phase %d", phase); 13262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 13272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" phase %d/others", phase); 13282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = cookie_find(&base.i_ck); 13302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i < 0) { 13312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (iszero((u_char *)&base.r_ck, sizeof(base.r_ck))) { 13322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* the first packet */ 13332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" I"); 13342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp2) 13352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cookie_record(&base.i_ck, bp2); 13362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 13372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" ?"); 13382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 13392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp2 && cookie_isinitiator(i, bp2)) 13402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" I"); 13412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (bp2 && cookie_isresponder(i, bp2)) 13422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" R"); 13432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 13442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" ?"); 13452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %s", ETYPESTR(base.etype)); 13482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (base.flags) { 13492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[%s%s]", base.flags & ISAKMP_FLAG_E ? "E" : "", 13502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project base.flags & ISAKMP_FLAG_C ? "C" : ""); 13512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) { 13542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct isakmp_gen *ext; 13552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int nparen; 13562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CHECKLEN(p, np) \ 13582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ep < (u_char *)(p)) { \ 13592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [|%s]", NPSTR(np)); \ 13602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto done; \ 13612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(":"); 13642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* regardless of phase... */ 13662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (base.flags & ISAKMP_FLAG_E) { 13672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 13682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * encrypted, nothing we can do right now. 13692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * we hope to decrypt the packet in the future... 13702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 13712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [encrypted %s]", NPSTR(base.np)); 13722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto done; 13732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nparen = 0; 13762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project CHECKLEN(p + 1, base.np) 13772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project np = base.np; 13792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ext = (struct isakmp_gen *)(p + 1); 13802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_sub_print(np, ext, ep, phase, 0, 0, 0); 13812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdone: 13842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) { 13852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ntohl(base.len) != length) { 13862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (len mismatch: isakmp %u/ip %u)", 13872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (u_int32_t)ntohl(base.len), length); 13882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 13912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 13932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_rfc3948_print(netdissect_options *ndo, 13942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *bp, u_int length, 13952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *bp2) 13962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 13972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep; 13982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ep = ndo->ndo_snapend; 13992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(length == 1 && bp[0]==0xff) { 14012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ND_PRINT((ndo, "isakmp-nat-keep-alive")); 14022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 14032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 14042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(length < 4) { 14062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 14072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 14082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 14102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * see if this is an IKE packet 14112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 14122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(bp[0]==0 && bp[1]==0 && bp[2]==0 && bp[3]==0) { 14132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ND_PRINT((ndo, "NONESP-encap: ")); 14142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isakmp_print(ndo, bp+4, length-4, bp2); 14152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 14162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 14172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* must be an ESP packet */ 14192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 14202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int nh, enh, padlen; 14212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int advance; 14222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ND_PRINT((ndo, "UDP-encap: ")); 14242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project advance = esp_print(ndo, bp, length, bp2, &enh, &padlen); 14262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(advance <= 0) 14272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 14282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += advance; 14302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= advance + padlen; 14312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nh = enh & 0xff; 14322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip_print_inner(ndo, bp, length, nh, bp2); 14342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 14352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 14362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 14382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|isakmp]"); 14392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 14402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 14412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 14432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Local Variables: 14442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-style: whitesmith 14452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-basic-offset: 8 14462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * End: 14472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1448