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