GSS-API のプログラミング

ラップ解除と検証

ラップされたメッセージを受信した後は、gss_unwrap() でメッセージをラップ解除する必要があります。gss_unwrap() は、ラップされたメッセージに埋め込まれている MIC に対してメッセージを自動的に検証します。送信側がメッセージをラップしなかったが、gss_get_mic() で MIC を生成している場合は、gss_verify_mic() で、その MIC に対して受信したメッセージを検証できます。後者の場合、受け入れ側はメッセージと MIC の両方を受信するようアレンジする必要があります。

gss_unwrap()

次に、gss_unwrap() の形式を示します。


OM_uint32 gss_unwrap (
OM_uint32          *minor_status,
const gss_ctx_id_t context_handle,
const gss_buffer_t input_message_buffer,
gss_buffer_t       output_message_buffer,
int                *conf_state
gss_qop_t          *qop_state)
minor_status

実際の機構から戻される状態コード。

context_handle

このメッセージが送信されるコンテキスト。

input_message_buffer

ラップされたメッセージ。この引数は gss_buffer_desc オブジェクトの形式である必要があります (文字列および類似のデータを参照)。使用し終わったときには、gss_release_buffer() で解放する必要があります。

output_message_buffer

ラップ解除したメッセージ用のバッファ。アプリケーションがラップ解除したメッセージを処理した後には、gss_release_buffer() でこのバッファを解放する必要があります。この引数も gss_buffer_desc オブジェクトです。

conf_state

機密性が適用されたかどうかを示すフラグ。0 以外の場合、機密性、メッセージ起点認証、および整合性サービスが適用されたことを示します。0 の場合、メッセージ起点認証と整合性だけが適用されたことを示します。必要ない場合は、NULL を指定します。

qop_state

使用する QOP (保護品質)。MIC を生成するときと暗号化を行うときに使用される暗号化アルゴリズムです。必要ない場合は、NULL を指定します。

メッセージが正常にラップ解除された場合、gss_unwrap()GSS_S_COMPLETE を戻します。MIC に対してメッセージを検証できなかった場合、gss_unwrap()GSS_S_BAD_SIG を戻します。

gss_verify_mic()

メッセージがラップ解除された場合、あるいは、初めからメッセージがラップされていない場合は、gss_verify_mic() でメッセージを検証できます。次に、gss_verify_mic() の形式を示します。


OM_uint32 gss_verify_mic (
OM_uint32          *minor_status,
const gss_ctx_id_t context_handle,
const gss_buffer_t message_buffer,
const gss_buffer_t token_buffer,
gss_qop_t          qop_state)
minor_status

実際の機構から戻される状態コード。

context_handle

メッセージが送信されるコンテキスト。

message_buffer

受信したメッセージ。この引数は gss_buffer_desc オブジェクトの形式である必要があります (文字列および類似のデータを参照)。アプリケ-ションが使用し終わったときには、gss_release_buffer() で解放する必要があります。

token_buffer

受信した MIC が入っているトークン。この引数は gss_buffer_desc オブジェクトの形式である必要があります ( 文字列および類似のデータを参照)。アプリケーションが使用し終わったときには、gss_release_buffer() で解放する必要があります。

qop_state

MIC を生成するときに適用される QOP (保護品質)。必要ない場合は、NULL を指定します。

メッセージが正常に検証された場合、gss_verify_mic()GSS_S_COMPLETE を戻します。MIC に対してメッセージを検証できなかった場合、gss_verify_mic()GSS_S_BAD_SIG を戻します。

転送の確認 (任意)

転送されたメッセージをラップ解除または検証した後、受信側は送信側に確認を送信することもできます。つまり、そのメッセージの MIC を返送します。送信側がラップはしなかったが gss_get_mic() で MIC をタグ付けしているメッセージの場合を考えます。図 1–14 に、このプロセスの様子を示します。

  1. 起動側は gss_get_mic() でメッセージにタグ付けします。

  2. 起動側はメッセージと MIC を受け入れ側に送信します。

  3. 受け入れ側は gss_verify_mic() でメッセージを検証します。

  4. 受け入れ側は MIC を起動側に返送します。

  5. 起動側は gss_verify_mic() で、オリジナルのメッセージに対して受信した MIC を検証します。

図 1–14 MIC 付きデータの確認

Graphic

ラップされたデータの場合、gss_unwrap() 関数はメッセージと MIC を別々に生成しません。したがって、受信側は、受信した (およびラップ解除した) メッセージから MIC を生成する必要があります。図 1–15 に、このプロセスの様子を示します。

  1. 起動側は gss_wrap() でメッセージをラップします。

  2. 起動側はラップしたメッセージを送信します。

  3. 受け入れ側は gss_unwrap() でメッセージをラップ解除します。

  4. 受け入れ側は gss_get_mic() でラップ解除されたメッセージの MIC を生成します。

  5. 受け入れ側は抽出した MIC を起動側に返信します。

  6. 起動側は gss_verify_mic() で、オリジナルのメッセージに対して受信した MIC を検証します。

図 1–15 ラップされたデータの確認

Graphic