この例では、次の手順によって、msg とともに送信する機密ラベルと認可上限の新しい属性値を設定します。
定義済みの機密ラベルと認可上限だけを使用して、マスク (sendmask) を定義する
sendmask を使用してセキュリティ属性構造 sendattrs を割り当て、属性構造がこれら 2 つの属性だけの領域を含むようにする
sendattrs 内の機密ラベルと認可上限に、Top Secret の属性値を設定する
通信終端との通信を設定する
msg をセキュリティ属性とともに通信終端へ送信する
msg を送信するプロセスは Confidential であるため、認可上限と機密ラベルを変更するために、有効セットに net_setclr と net_upgrade_sl 特権が必要です。新しい機密ラベルと認可上限は、送信プロセスから受け取った msg の機密ラベルと認可上限を無効にします。コード内のコメントは、第 3 章「特権」で説明している特権ブラケットが必要な位置を示します。
#include <tsix/t6attrs.h>
#include <tsol/label.h>
main()
{
int retval, sock, error;
t6attr_t sendattrs
t6mask_t sendmask;
char *msg = "Hello World!";
bslabel_t senslabel;
bclear_t clearance;
/* 機密ラベルとプロセスの認可上限のセキュリティ属性フィールドを */
/* 使用してマスクを初期化する */
sendmask = T6M_SL | T6M_CLEARANCE;
/* マスクを使用して 2 つのセキュリティ属性構造体に */
/* 必要なだけの領域を割り当てる */
sendattrs = t6alloc_blk(sendmask);
/* 機密ラベルと認可上限を Top Secret に初期化する */
stobsl("TOP SECRET", &senslabel, NEW_LABEL, &error);
stobclear("TOP SECRET", &clearance, NEW_LABEL, &error);
/* メッセージと一緒に送られるセキュリティ属性フィールドの属性値を */
/* 設定する */
retval = t6set_attr(T6_SL, &senslabel, sendattrs);
printf("Retval1 = %d¥n", retval);
retval = t6set_attr(T6_CLEARANCE, &clearance, sendattrs);
printf("Retval2 = %d¥n", retval);
/* ソケット通信を設定する */
/* ... */
/* 変更されたセキュリティ属性をメッセージと一緒に送る */
/* 有効セット内で net_setclr と net_upgrade_sl をオン (有効) にする */
retval = t6sendto(sock, msg, sizeof(msg), 0, 0, 0, &sendattrs);
/* net_setclr と net_upgrade_sl をオフ (無効) にする */
printf("Retval3 = %d¥n bytes", retval);
}
printf 文によって、次のように出力されます。
Retval1 = 0
Retval2 = 0
Retval3 = 4 bytes