コード例 #1
0
ファイル: ipsec_doi.c プロジェクト: 1309578252/Openswan
const char *
init_pluto_vendorid(void)
{
    MD5_CTX hc;
    unsigned char hash[MD5_DIGEST_SIZE];
    const char *v = ipsec_version_string();
    int i;

    if(pluto_vendorid_built) {
	return pluto_vendorid;
    }

    osMD5Init(&hc);
    osMD5Update(&hc, (const unsigned char *)v, strlen(v));
    osMD5Update(&hc, (const unsigned char *)compile_time_interop_options
	, strlen(compile_time_interop_options));
    osMD5Final(hash, &hc);

    pluto_vendorid[0] = 'O';
    pluto_vendorid[1] = 'S';
    pluto_vendorid[2] = 'W';

#if PLUTO_VENDORID_SIZE - 3 <= MD5_DIGEST_SIZE
    /* truncate hash to fit our vendor ID */
    memcpy(pluto_vendorid + 3, hash, PLUTO_VENDORID_SIZE - 3);
#else
    /* pad to fill our vendor ID */
    memcpy(pluto_vendorid + 3, hash, MD5_DIGEST_SIZE);
    memset(pluto_vendorid + 3 + MD5_DIGEST_SIZE, '\0'
	, PLUTO_VENDORID_SIZE - 3 - MD5_DIGEST_SIZE);
#endif

    /* Make it printable!  Hahaha - MCR */
    for (i = 0; i < PLUTO_VENDORID_SIZE; i++)
    {
	/* Reset bit 7, force bit 6.  Puts it into 64-127 range */
	pluto_vendorid[i] &= 0x7f;
	pluto_vendorid[i] |= 0x40;
        if(pluto_vendorid[i]==127) pluto_vendorid[i]='_';  /* omit RUBOUT */
    }
    pluto_vendorid[PLUTO_VENDORID_SIZE] = '\0';
    pluto_vendorid_built = TRUE;

    return pluto_vendorid;
}
コード例 #2
0
ファイル: vendor.c プロジェクト: millken/zhuxianB30
/*****************************************************************************************   
函数名称: init_vendorid
功能描述: 初始化_vid_tab中的vid结构,根据_vid_tab中的flag标记填充vid与vid_len
				以及descr,若vid->flags仅仅标识为VID_KEEP,
				表示在_vid_tab中已经填充好各个字段,不用再处理
				在进程开启时调用。
输入参数:无
输出参数:无   
返 回 值:无
-------------------------------------------------------------------------------------------    
最近一次修改记录 :  适配flag类型的删减
修改作者:刘东		
修改目的:   
修改日期: 2012年6月23日
********************************************************************************************/
void init_vendorid(void)
{
	struct vid_struct *vid;
	MD5_CTX ctx;
	

	for (vid = _vid_tab; vid->id; vid++) 
	{		
	    if (vid->flags & VID_STRING) 
		{
			/** VendorID is a string **/
			vid->vid = strdup(vid->data);
			vid->vid_len = strlen(vid->data);
	    }
	    else if (vid->flags & VID_MD5HASH) 
		{
			/** VendorID is a string to hash with MD5 **/
			unsigned char *vidm =  malloc(MD5_DIGEST_SIZE);
			vid->vid = (char *)vidm;
			if (vidm) 
			{
			    unsigned const char *d = (unsigned const char *)vid->data;
			    osMD5Init(&ctx);
			    osMD5Update(&ctx, d, strlen(vid->data));
			    osMD5Final(vidm, &ctx);
			    vid->vid_len = MD5_DIGEST_SIZE;
			}
	    }
    
	    if (vid->descr == NULL) 
		{
			/** Find something to display **/
			vid->descr = vid->data;
	    }
	}
}
コード例 #3
0
ファイル: vendor.c プロジェクト: hydromet/libreswan
/*
 * Setup VendorID structs, and populate them
 * FIXME: This functions leaks a little bit, but these are one time leaks:
 * leak: 3 * vid->data, item size: 6
 * leak: self-vendor ID, item size: 37
 * leak: init_pluto_vendorid, item size: 13
 * leak: 2 * vid->data, item size: 13
 */
void init_vendorid(void)
{
	struct vid_struct *vid;

	for (vid = vid_tab; vid->id; vid++) {
		if (vid->flags & VID_SELF) {
			char *d;

			vid->vid = clone_str(
				ipsec_version_vendorid(), "init_pluto_vendorid");
			/* cut terminating NULL which won't go over the wire */
			vid->vid_len = strlen(vid->vid);
			d = alloc_bytes(strlen(vid->descr) + 256 +
					strlen(ipsec_version_vendorid()),
					"self-vendor ID");
			sprintf(d, "%s %s", vid->descr, ipsec_version_code());
			vid->descr = (const char *)d;
		} else if (vid->flags & VID_STRING) {
			/** VendorID is a string **/
			vid->vid = clone_str(vid->data, "vid->data");
			vid->vid_len = strlen(vid->data);
		} else if (vid->flags & VID_MD5HASH) {
			/** VendorID is a string to hash with MD5 **/
			unsigned char *vidm =  alloc_bytes(MD5_DIGEST_SIZE,
							   "VendorID MD5");
			vid->vid = (char *)vidm;
			if (vidm) {
				unsigned const char *d =
					(unsigned const char *)vid->data;
				MD5_CTX ctx;

				osMD5Init(&ctx);
				osMD5Update(&ctx, d, strlen(vid->data));
				osMD5Final(vidm, &ctx);
				vid->vid_len = MD5_DIGEST_SIZE;
			}
		} else if (vid->flags & VID_FSWAN_HASH) {
			/** FreeS/WAN 2.00+ specific hash **/
#define FSWAN_VID_SIZE 12
			unsigned char hash[MD5_DIGEST_SIZE];
			char *vidm =  alloc_bytes(FSWAN_VID_SIZE, "fswan VID");

			vid->vid = vidm;
			if (vidm) {
				MD5_CTX ctx;
				int i;

				osMD5Init(&ctx);
				osMD5Update(&ctx,
					    (const unsigned char *)vid->data, strlen(
						    vid->data));
				osMD5Final(hash, &ctx);
				vidm[0] = 'O';
				vidm[1] = 'E';
#if FSWAN_VID_SIZE <= 2 + MD5_DIGEST_SIZE
				memcpy(vidm + 2, hash, FSWAN_VID_SIZE - 2);	/* truncate hash */
#else
				memcpy(vidm + 2, hash, MD5_DIGEST_SIZE);
				memset(vidm + 2 + MD5_DIGEST_SIZE, '\0',
				       FSWAN_VID_SIZE - (2 + MD5_DIGEST_SIZE));	/* pad hash */
#endif
				for (i = 2; i < FSWAN_VID_SIZE; i++) {
					vidm[i] &= 0x7f;
					vidm[i] |= 0x40;
				}
				vid->vid_len = FSWAN_VID_SIZE;
			}
#undef FSWAN_VID_SIZE
		}

		if (vid->descr == NULL) {
			/** Find something to display **/
			vid->descr = vid->data;
		}
#if 1
		DBG_log("init_vendorid: %d [%s]",
			vid->id,
			vid->descr ? vid->descr : ""
			);
		if (vid->vid)
			DBG_dump("VID:", vid->vid, vid->vid_len);
#endif
	}
	vid_struct_init = 1;
}