Trusted Solaris 開発ガイド

バイナリレベルの上下限の確認

次の 2 つの例は、blevel_t 型の 2 つの変数間の最高値と最低値を見つけます。このインタフェースでは、2 つのレベルを比較し、それら 2 つのレベルによって定められた範囲において、blminimum(3) ルーチンにより最高の下限のレベル、blmaximum(3) ルーチンにより最低の上限のレベルを見つけることができます。レベルは、機密ラベル、認可上限、または biltolev() ルーチンでレベルに変換された情報ラベルです。

この例では、senslabel (機密ラベル) は ADMIN_LOW で、plabel (プロセスの機密ラベル) は Confidentialです。このコードは、この 2 つのレベルにより設定される範囲においてもっとも高い下限ともっとも低い上限を見つけます。最初の例では、blmaximum() ルーチンに渡される 2 つの変数のうち、格付けの大きな方、およびすべてのコンパートメントの中でもっとも高いものを見つけ、その値を最初のパラメータに入れます。この処理は、「もっとも低い上限の確認」と言います。それは、ルーチンに渡される 2 つのパラメータ値で指定される元のラベルよりも優位でもっとも低いレベルを見つけるためです。

#include <tsol/label.h>

 main()
 {
 	int			retval, length = 0;
 	char			*string = (char *)0, *string1 = (char *)0;
 	bslabel_t			senslabel, plabel;
 	bclabel_t			pCMWlabel;

/* ラベルを ADMIN_LOW に初期化する */
 	bsllow(&senslabel);

/* プロセスの機密ラベルを得る */
 	retval = getcmwplabel(&pCMWlabel);
 	getcsl(&plabel, &pCMWlabel);

 	blmaximum(&senslabel, &plabel);
 	retval = bsltos(&senslabel, &string, length, LONG_WORDS);
 	printf("Maximum = %s¥n", string);

printf 文によって、次のように出力されます。CONFIDENTIAL は、Confidential と ADMIN_LOW よりも優位なレベルのうち、もっとも低いものです。

Maximum = CONFIDENTIAL

次の例は、 blminimum() ルーチンに渡される 2 つのパラメータの機密ラベルにおいて、他方より低い格付けと両方の機密ラベルに含まれるコンパートメントの中でもっとも低いコンパートメントを見つけ、その値を最初のパラメータに入れます。この処理は、「もっとも高い下限の確認」と言います。それは、ルーチンに渡される 2 つのパラメータ値で指定される元のラベルより優位でなくもっとも低いレベルを見つけるためです。

	bsllow(&senslabel);

 	blminimum(&senslabel, &plabel);
 	retval = bsltos(&senslabel, &string1, length, LONG_WORDS);
 	printf("Minimum = %s¥n", string1);
 }

printf 文によって、次のように出力されます。ADMIN_LOW は、ADMIN_LOW と Confidential よりも劣位の (優位でない) レベルの中でもっとも高いものです。

Minimum = ADMIN_LOW