⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cipso_ipv4.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
 * @doi_def: the DOI definition * @enumcat: category list * @enumcat_len: length of the category list in bytes * * Description: * Checks the given categories against the given DOI definition and returns a * negative value if any of the categories do not have a valid mapping and a * zero value if all of the categories are valid. * */static int cipso_v4_map_cat_enum_valid(const struct cipso_v4_doi *doi_def,				       const unsigned char *enumcat,				       u32 enumcat_len){	u16 cat;	int cat_prev = -1;	u32 iter;	if (doi_def->type != CIPSO_V4_MAP_PASS || enumcat_len & 0x01)		return -EFAULT;	for (iter = 0; iter < enumcat_len; iter += 2) {		cat = ntohs(get_unaligned((__be16 *)&enumcat[iter]));		if (cat <= cat_prev)			return -EFAULT;		cat_prev = cat;	}	return 0;}/** * cipso_v4_map_cat_enum_hton - Perform a category mapping from host to network * @doi_def: the DOI definition * @secattr: the security attributes * @net_cat: the zero'd out category list in network/CIPSO format * @net_cat_len: the length of the CIPSO category list in bytes * * Description: * Perform a label mapping to translate a local MLS category bitmap to the * correct CIPSO category list using the given DOI definition.   Returns the * size in bytes of the network category bitmap on success, negative values * otherwise. * */static int cipso_v4_map_cat_enum_hton(const struct cipso_v4_doi *doi_def,				      const struct netlbl_lsm_secattr *secattr,				      unsigned char *net_cat,				      u32 net_cat_len){	int cat = -1;	u32 cat_iter = 0;	for (;;) {		cat = netlbl_secattr_catmap_walk(secattr->mls_cat, cat + 1);		if (cat < 0)			break;		if ((cat_iter + 2) > net_cat_len)			return -ENOSPC;		*((__be16 *)&net_cat[cat_iter]) = htons(cat);		cat_iter += 2;	}	return cat_iter;}/** * cipso_v4_map_cat_enum_ntoh - Perform a category mapping from network to host * @doi_def: the DOI definition * @net_cat: the category list in network/CIPSO format * @net_cat_len: the length of the CIPSO bitmap in bytes * @secattr: the security attributes * * Description: * Perform a label mapping to translate a CIPSO category list to the correct * local MLS category bitmap using the given DOI definition.  Returns zero on * success, negative values on failure. * */static int cipso_v4_map_cat_enum_ntoh(const struct cipso_v4_doi *doi_def,				      const unsigned char *net_cat,				      u32 net_cat_len,				      struct netlbl_lsm_secattr *secattr){	int ret_val;	u32 iter;	for (iter = 0; iter < net_cat_len; iter += 2) {		ret_val = netlbl_secattr_catmap_setbit(secattr->mls_cat,				ntohs(get_unaligned((__be16 *)&net_cat[iter])),				GFP_ATOMIC);		if (ret_val != 0)			return ret_val;	}	return 0;}/** * cipso_v4_map_cat_rng_valid - Checks to see if the categories are valid * @doi_def: the DOI definition * @rngcat: category list * @rngcat_len: length of the category list in bytes * * Description: * Checks the given categories against the given DOI definition and returns a * negative value if any of the categories do not have a valid mapping and a * zero value if all of the categories are valid. * */static int cipso_v4_map_cat_rng_valid(const struct cipso_v4_doi *doi_def,				      const unsigned char *rngcat,				      u32 rngcat_len){	u16 cat_high;	u16 cat_low;	u32 cat_prev = CIPSO_V4_MAX_REM_CATS + 1;	u32 iter;	if (doi_def->type != CIPSO_V4_MAP_PASS || rngcat_len & 0x01)		return -EFAULT;	for (iter = 0; iter < rngcat_len; iter += 4) {		cat_high = ntohs(get_unaligned((__be16 *)&rngcat[iter]));		if ((iter + 4) <= rngcat_len)			cat_low = ntohs(				get_unaligned((__be16 *)&rngcat[iter + 2]));		else			cat_low = 0;		if (cat_high > cat_prev)			return -EFAULT;		cat_prev = cat_low;	}	return 0;}/** * cipso_v4_map_cat_rng_hton - Perform a category mapping from host to network * @doi_def: the DOI definition * @secattr: the security attributes * @net_cat: the zero'd out category list in network/CIPSO format * @net_cat_len: the length of the CIPSO category list in bytes * * Description: * Perform a label mapping to translate a local MLS category bitmap to the * correct CIPSO category list using the given DOI definition.   Returns the * size in bytes of the network category bitmap on success, negative values * otherwise. * */static int cipso_v4_map_cat_rng_hton(const struct cipso_v4_doi *doi_def,				     const struct netlbl_lsm_secattr *secattr,				     unsigned char *net_cat,				     u32 net_cat_len){	int iter = -1;	u16 array[CIPSO_V4_TAG_RNG_CAT_MAX * 2];	u32 array_cnt = 0;	u32 cat_size = 0;	/* make sure we don't overflow the 'array[]' variable */	if (net_cat_len >	    (CIPSO_V4_OPT_LEN_MAX - CIPSO_V4_HDR_LEN - CIPSO_V4_TAG_RNG_BLEN))		return -ENOSPC;	for (;;) {		iter = netlbl_secattr_catmap_walk(secattr->mls_cat, iter + 1);		if (iter < 0)			break;		cat_size += (iter == 0 ? 0 : sizeof(u16));		if (cat_size > net_cat_len)			return -ENOSPC;		array[array_cnt++] = iter;		iter = netlbl_secattr_catmap_walk_rng(secattr->mls_cat, iter);		if (iter < 0)			return -EFAULT;		cat_size += sizeof(u16);		if (cat_size > net_cat_len)			return -ENOSPC;		array[array_cnt++] = iter;	}	for (iter = 0; array_cnt > 0;) {		*((__be16 *)&net_cat[iter]) = htons(array[--array_cnt]);		iter += 2;		array_cnt--;		if (array[array_cnt] != 0) {			*((__be16 *)&net_cat[iter]) = htons(array[array_cnt]);			iter += 2;		}	}	return cat_size;}/** * cipso_v4_map_cat_rng_ntoh - Perform a category mapping from network to host * @doi_def: the DOI definition * @net_cat: the category list in network/CIPSO format * @net_cat_len: the length of the CIPSO bitmap in bytes * @secattr: the security attributes * * Description: * Perform a label mapping to translate a CIPSO category list to the correct * local MLS category bitmap using the given DOI definition.  Returns zero on * success, negative values on failure. * */static int cipso_v4_map_cat_rng_ntoh(const struct cipso_v4_doi *doi_def,				     const unsigned char *net_cat,				     u32 net_cat_len,				     struct netlbl_lsm_secattr *secattr){	int ret_val;	u32 net_iter;	u16 cat_low;	u16 cat_high;	for (net_iter = 0; net_iter < net_cat_len; net_iter += 4) {		cat_high = ntohs(get_unaligned((__be16 *)&net_cat[net_iter]));		if ((net_iter + 4) <= net_cat_len)			cat_low = ntohs(			      get_unaligned((__be16 *)&net_cat[net_iter + 2]));		else			cat_low = 0;		ret_val = netlbl_secattr_catmap_setrng(secattr->mls_cat,						       cat_low,						       cat_high,						       GFP_ATOMIC);		if (ret_val != 0)			return ret_val;	}	return 0;}/* * Protocol Handling Functions *//** * cipso_v4_gentag_hdr - Generate a CIPSO option header * @doi_def: the DOI definition * @len: the total tag length in bytes, not including this header * @buf: the CIPSO option buffer * * Description: * Write a CIPSO header into the beginning of @buffer. * */static void cipso_v4_gentag_hdr(const struct cipso_v4_doi *doi_def,				unsigned char *buf,				u32 len){	buf[0] = IPOPT_CIPSO;	buf[1] = CIPSO_V4_HDR_LEN + len;	*(__be32 *)&buf[2] = htonl(doi_def->doi);}/** * cipso_v4_gentag_rbm - Generate a CIPSO restricted bitmap tag (type #1) * @doi_def: the DOI definition * @secattr: the security attributes * @buffer: the option buffer * @buffer_len: length of buffer in bytes * * Description: * Generate a CIPSO option using the restricted bitmap tag, tag type #1.  The * actual buffer length may be larger than the indicated size due to * translation between host and network category bitmaps.  Returns the size of * the tag on success, negative values on failure. * */static int cipso_v4_gentag_rbm(const struct cipso_v4_doi *doi_def,			       const struct netlbl_lsm_secattr *secattr,			       unsigned char *buffer,			       u32 buffer_len){	int ret_val;	u32 tag_len;	u32 level;	if ((secattr->flags & NETLBL_SECATTR_MLS_LVL) == 0)		return -EPERM;	ret_val = cipso_v4_map_lvl_hton(doi_def, secattr->mls_lvl, &level);	if (ret_val != 0)		return ret_val;	if (secattr->flags & NETLBL_SECATTR_MLS_CAT) {		ret_val = cipso_v4_map_cat_rbm_hton(doi_def,						    secattr,						    &buffer[4],						    buffer_len - 4);		if (ret_val < 0)			return ret_val;		/* This will send packets using the "optimized" format when		 * possibile as specified in  section 3.4.2.6 of the		 * CIPSO draft. */		if (cipso_v4_rbm_optfmt && ret_val > 0 && ret_val <= 10)			tag_len = 14;		else			tag_len = 4 + ret_val;	} else		tag_len = 4;	buffer[0] = 0x01;	buffer[1] = tag_len;	buffer[3] = level;	return tag_len;}/** * cipso_v4_parsetag_rbm - Parse a CIPSO restricted bitmap tag * @doi_def: the DOI definition * @tag: the CIPSO tag * @secattr: the security attributes * * Description: * Parse a CIPSO restricted bitmap tag (tag type #1) and return the security * attributes in @secattr.  Return zero on success, negatives values on * failure. * */static int cipso_v4_parsetag_rbm(const struct cipso_v4_doi *doi_def,				 const unsigned char *tag,				 struct netlbl_lsm_secattr *secattr){	int ret_val;	u8 tag_len = tag[1];	u32 level;	ret_val = cipso_v4_map_lvl_ntoh(doi_def, tag[3], &level);	if (ret_val != 0)		return ret_val;	secattr->mls_lvl = level;	secattr->flags |= NETLBL_SECATTR_MLS_LVL;	if (tag_len > 4) {		secattr->mls_cat = netlbl_secattr_catmap_alloc(GFP_ATOMIC);		if (secattr->mls_cat == NULL)			return -ENOMEM;		ret_val = cipso_v4_map_cat_rbm_ntoh(doi_def,						    &tag[4],						    tag_len - 4,						    secattr);		if (ret_val != 0) {			netlbl_secattr_catmap_free(secattr->mls_cat);			return ret_val;		}		secattr->flags |= NETLBL_SECATTR_MLS_CAT;	}	return 0;}/** * cipso_v4_gentag_enum - Generate a CIPSO enumerated tag (type #2) * @doi_def: the DOI definition * @secattr: the security attributes * @buffer: the option buffer * @buffer_len: length of buffer in bytes * * Description: * Generate a CIPSO option using the enumerated tag, tag type #2.  Returns the * size of the tag on success, negative values on failure. * */static int cipso_v4_gentag_enum(const struct cipso_v4_doi *doi_def,				const struct netlbl_lsm_secattr *secattr,				unsigned char *buffer,				u32 buffer_len){	int ret_val;	u32 tag_len;	u32 level;	if (!(secattr->flags & NETLBL_SECATTR_MLS_LVL))		return -EPERM;	ret_val = cipso_v4_map_lvl_hton(doi_def, secattr->mls_lvl, &level);	if (ret_val != 0)		return ret_val;	if (secattr->flags & NETLBL_SECATTR_MLS_CAT) {		ret_val = cipso_v4_map_cat_enum_hton(doi_def,						     secattr,						     &buffer[4],						     buffer_len - 4);		if (ret_val < 0)			return ret_val;		tag_len = 4 + ret_val;	} else		tag_len = 4;	buffer[0] = 0x02;	buffer[1] = tag_len;	buffer[3] = level;	return tag_len;}/** * cipso_v4_parsetag_enum - Parse a CIPSO enumerated tag * @doi_def: the DOI definition * @tag: the CIPSO tag * @secattr: the security attributes * * Description: * Parse a CIPSO enumerated tag (tag type #2) and return the security * attributes in @secattr.  Return zero on success, negatives values on * failure. * */static int cipso_v4_parsetag_enum(const struct cipso_v4_doi *doi_def,				  const unsigned char *tag,				  struct netlbl_lsm_secattr *secattr){	int ret_val;	u8 tag_len = tag[1];	u32 level;	ret_val = cipso_v4_map_lvl_ntoh(doi_def, tag[3], &level);	if (ret_val != 0)		return ret_val;	secattr->mls_lvl = level;	secattr->flags |= NETLBL_SECATTR_MLS_LVL;	if (tag_len > 4) {		secattr->mls_cat = netlbl_secattr_catmap_alloc(GFP_ATOMIC);		if (secattr->mls_cat == NULL)			return -ENOMEM;		ret_val = cipso_v4_map_cat_enum_ntoh(doi_def,						     &tag[4],						     tag_len - 4,						     secattr);		if (ret_val != 0) {			netlbl_secattr_catmap_free(secattr->mls_cat);			return ret_val;		}		secattr->flags |= NETLBL_SECATTR_MLS_CAT;	}	return 0;}/** * cipso_v4_gentag_rng - Generate a CIPSO ranged tag (type #5) * @doi_def: the DOI definition * @secattr: the security attributes * @buffer: the option buffer * @buffer_len: length of buffer in bytes * * Description: * Generate a CIPSO option using the ranged tag, tag type #5.  Returns the * size of the tag on success, negative values on failure. * */static int cipso_v4_gentag_rng(const struct cipso_v4_doi *doi_def,			       const struct netlbl_lsm_secattr *secattr,			       unsigned char *buffer,			       u32 buffer_len){	int ret_val;	u32 tag_len;	u32 level;	if (!(secattr->flags & NETLBL_SECATTR_MLS_LVL))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -