vendorid.c revision c91307af2622f6625525f3c1f9c954376df950ad
1c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh/* $NetBSD: vendorid.c,v 1.4 2006/09/09 16:22:10 manu Exp $ */ 20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Id: vendorid.c,v 1.10 2006/02/22 16:10:21 vanhu Exp */ 40a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 50a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 60a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 70a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * All rights reserved. 80a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 90a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Redistribution and use in source and binary forms, with or without 100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * modification, are permitted provided that the following conditions 110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * are met: 120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 1. Redistributions of source code must retain the above copyright 130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * notice, this list of conditions and the following disclaimer. 140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 2. Redistributions in binary form must reproduce the above copyright 150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * notice, this list of conditions and the following disclaimer in the 160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * documentation and/or other materials provided with the distribution. 170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 3. Neither the name of the project nor the names of its contributors 180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * may be used to endorse or promote products derived from this software 190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * without specific prior written permission. 200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * SUCH DAMAGE. 320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "config.h" 350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/types.h> 370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/param.h> 380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdlib.h> 400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdio.h> 410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <string.h> 420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <errno.h> 430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <ctype.h> 440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "var.h" 460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "misc.h" 470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "vmbuf.h" 480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "plog.h" 490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "debug.h" 500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "localconf.h" 520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_var.h" 530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp.h" 540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "vendorid.h" 550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "crypto_openssl.h" 560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic struct vendor_id all_vendor_ids[] = { 580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_IPSEC_TOOLS, "IPSec-Tools" }, 590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_GSSAPI_LONG, "A GSS-API Authentication Method for IKE" }, 600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_GSSAPI , "GSSAPI" }, 610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_MS_NT5 , "MS NT5 ISAKMPOAKLEY" }, 620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_NATT_00 , "draft-ietf-ipsec-nat-t-ike-00" }, 630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_NATT_01 , "draft-ietf-ipsec-nat-t-ike-01" }, 640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_NATT_02 , "draft-ietf-ipsec-nat-t-ike-02" }, 650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_NATT_02_N , "draft-ietf-ipsec-nat-t-ike-02\n" }, 660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_NATT_03 , "draft-ietf-ipsec-nat-t-ike-03" }, 670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_NATT_04 , "draft-ietf-ipsec-nat-t-ike-04" }, 680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_NATT_05 , "draft-ietf-ipsec-nat-t-ike-05" }, 690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_NATT_06 , "draft-ietf-ipsec-nat-t-ike-06" }, 700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_NATT_07 , "draft-ietf-ipsec-nat-t-ike-07" }, 710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_NATT_08 , "draft-ietf-ipsec-nat-t-ike-08" }, 720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_NATT_RFC , "RFC 3947" }, 730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_XAUTH , "draft-ietf-ipsra-isakmp-xauth-06.txt" }, 740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_UNITY , "CISCO-UNITY" }, 750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_FRAG , "FRAGMENTATION" }, 760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Just a readable string for DPD ... */ 770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_DPD , "DPD" }, 780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Other known Vendor IDs */ 790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ VENDORID_KAME , "KAME/racoon" }, 800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}; 810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define NUMVENDORIDS (sizeof(all_vendor_ids)/sizeof(all_vendor_ids[0])) 830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define DPD_MAJOR_VERSION 0x01 850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define DPD_MINOR_VERSION 0x00 860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangconst char vendorid_dpd_hash[] = { 880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 0xAF, 0xCA, 0xD7, 0x13, 890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 0x68, 0xA1, 0xF1, 0xC9, 900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 0x6B, 0x86, 0x96, 0xFC, 910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 0x77, 0x57, DPD_MAJOR_VERSION, DPD_MINOR_VERSION 920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}; 930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *vendorid_fixup(int, vchar_t *t); 960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic struct vendor_id * 980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanglookup_vendor_id_by_id (int id) 990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 1010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < NUMVENDORIDS; i++) 1030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (all_vendor_ids[i].id == id) 1040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return &all_vendor_ids[i]; 1050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 1070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangconst char * 1100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvid_string_by_id (int id) 1110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct vendor_id *current; 1130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (id == VENDORID_DPD) 1150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return vendorid_dpd_hash; 1160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang current = lookup_vendor_id_by_id(id); 1180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return current ? current->string : NULL; 1200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic struct vendor_id * 1230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanglookup_vendor_id_by_hash (const char *hash) 1240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 1260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang unsigned char *h = (unsigned char *)hash; 1270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < NUMVENDORIDS; i++) 1290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (strncmp(all_vendor_ids[i].hash->v, hash, 1300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang all_vendor_ids[i].hash->l) == 0) 1310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return &all_vendor_ids[i]; 1320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 1340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 1370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangcompute_vendorids (void) 1380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 1400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t vid; 1410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < NUMVENDORIDS; i++) { 1430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* VENDORID_DPD is not a MD5 sum... */ 1440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(all_vendor_ids[i].id == VENDORID_DPD){ 1450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang all_vendor_ids[i].hash = vmalloc(sizeof(vendorid_dpd_hash)); 1460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (all_vendor_ids[i].hash == NULL) { 1470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 1480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "unable to get memory for VID hash\n"); 1490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang exit(1); /* this really shouldn't happen */ 1500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(all_vendor_ids[i].hash->v, vendorid_dpd_hash, 1520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sizeof(vendorid_dpd_hash)); 1530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang continue; 1540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vid.v = (char *) all_vendor_ids[i].string; 1570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vid.l = strlen(vid.v); 1580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang all_vendor_ids[i].hash = eay_md5_one(&vid); 1600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (all_vendor_ids[i].hash == NULL) 1610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 1620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "unable to hash vendor ID string\n"); 1630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Special cases */ 1650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang all_vendor_ids[i].hash = 1660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vendorid_fixup(all_vendor_ids[i].id, 1670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang all_vendor_ids[i].hash); 1680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 1720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * set hashed vendor id. 1730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * hash function is always MD5. 1740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 1750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvchar_t * 1760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangset_vendorid(int vendorid) 1770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct vendor_id *current; 1790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t vid, *new; 1800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (vendorid == VENDORID_UNKNOWN) { 1820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 1830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * The default unknown ID gets translated to 1840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * KAME/racoon. 1850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 1860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vendorid = VENDORID_DEFAULT; 1870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang current = lookup_vendor_id_by_id(vendorid); 1900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (current == NULL) { 1910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 1920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "invalid vendor ID index: %d\n", vendorid); 1930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return (NULL); 1940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* The rest of racoon expects a private copy 1970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * of the VID that could be free'd after use. 1980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * That's why we don't return the original pointer. */ 1990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return vdup(current->hash); 2000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 2030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Check the vendor ID payload -- return the vendor ID index 2040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * if we find a recognized one, or UNKNOWN if we don't. 2050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 2060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * gen ... points to Vendor ID payload. 2070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 208c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehint 2090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangcheck_vendorid(struct isakmp_gen *gen) 2100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t vid, *vidhash; 2120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i, vidlen; 2130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct vendor_id *current; 2140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (gen == NULL) 2160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return (VENDORID_UNKNOWN); 2170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vidlen = ntohs(gen->len) - sizeof(*gen); 2190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang current = lookup_vendor_id_by_hash((char *)(gen + 1)); 2210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (!current) 2220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto unknown; 2230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (current->hash->l < vidlen) 2250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_INFO, LOCATION, NULL, 2260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "received broken Microsoft ID: %s\n", 2270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang current->string); 2280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 2290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_INFO, LOCATION, NULL, 2300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "received Vendor ID: %s\n", 2310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang current->string); 2320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return current->id; 2340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangunknown: 2360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, "received unknown Vendor ID\n"); 2370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plogdump(LLV_DEBUG, (char *)(gen + 1), vidlen); 2380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return (VENDORID_UNKNOWN); 2390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 2420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvendorid_fixup(vendorid, vidhash) 2430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int vendorid; 2440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *vidhash; 2450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch(vendorid) { 2470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case VENDORID_XAUTH: { /* The vendor Id is truncated */ 2480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *tmp; 2490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((tmp = vmalloc(8)) == NULL) { 2510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 2520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "unable to hash vendor ID string\n"); 2530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 2540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(tmp->v, vidhash->v, 8); 2570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(vidhash); 2580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vidhash = tmp; 2590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case VENDORID_UNITY: /* Two bytes tweak */ 2630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vidhash->v[14] = 0x01; 2640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vidhash->v[15] = 0x00; 2650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 2680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return vidhash; 2720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 273