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; }
/***************************************************************************************** 函数名称: 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; } } }
/* * 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; }