GSS-API のプログラミング

付録 C OID の指定

機構と QOP (Quality of Protection)

できるだけ GSS-API が提供するデフォルトの機構と QOP を使用することを強く推奨しますが (OIDを参照)、なんらかの理由で機構または QOP の OID を指定する必要がある場合もあります。したがって、この章では機構または QOP の OID を指定する方法について簡単に説明します。

OID 値が含まれるファイル

GSS-API では、機構と QOP を人が読める形式で表示することができます。Solaris システムでは、/etc/gss/mech/etc/gss/qop の 2 つのファイルに、使用できる機構と QOP についての情報が含まれています。この 2 つのファイルへのアクセス権がない場合 (ほとんどの場合、リモートマシンが許可していないため)、たとえば、その機構または QOP 用に公開されているインターネット標準などの他のソースから文字列リテラルを提供する必要があります。

/etc/gss/mech ファイル

/etc/gss/mech ファイルを調べると、どの機構を使用できるかが分かります。/etc/gss/mech には、機構名が ASCII 文字列と数値の両方の形式で格納されています。/etc/gss/mech の各行は、機構名 (ASCII 文字列)、機構の OID (数値)、その機構が提供するサービスを実装する共有ライブラリ、およびオプションでサービスを実装するカーネルモジュールから構成されます。例 C–1/etc/gss/mech ファイルの例を示します。


例 C–1 /etc/gss/mech ファイル


# 
# Copyright (c) 2000, by Sun Microsystems, Inc.
# All rights reserved.
#
#ident  "@(#)mech 1.6     00/12/04 SMI" 
#
# This file contains the GSS-API based security mechanism names,
# its object identifier (OID) and a shared library that implements 
# the services for that mechanism under GSS-API.
#
# Mechanism Name       Object Identifier      Shared Library  Kernel Module
#
diffie_hellman_640_0   1.3.6.4.1.42.2.26.2.4  dh640-0.so.1
diffie_hellman_1024_0  1.3.6.4.1.42.2.26.2.5  dh1024-0.so.1
kerberos_v5            1.2.840.113554.1.2.2   gl/mech_krb5.so gl_kmech_krb5

/etc/gss/qop ファイル

/etc/gss/qop ファイルには、インストールされている各機構がサポートするすべての QOP が、ASCII 文字列と対応する 32 ビット整数の両方の形式で格納されています。例 C–2/etc/gss/qop ファイルの例を示します。


例 C–2 /etc/gss/qop ファイル


#
# Copyright (c) 2000, by Sun Microsystems, Inc.
# All rights reserved.
#
#ident  "@(#)qop 1.3     00/11/09 SMI" 
#
# This file contains information about the GSS-API based quality of
# protection (QOP), its string name and its value (32-bit integer).
#
# QOP string                    QOP Value       Mechanism Name
#
GSS_KRB5_INTEG_C_QOP_DES_MD5    0               kerberos_v5
GSS_KRB5_CONF_C_QOP_DES         0               kerberos_v5

gss_str_to_oid()

旧バージョンの GSS-API との下位互換性のため、この実装の GSS-API は gss_str_to_oid() 関数をサポートします。gss_str_to_oid() は機構または QOP を表す文字列を (ASCII 文字列または数値のどちらでも) OID に変換します。


注意 – 注意 –

デフォルトの機構と QOP を使用することが強く推奨されているため、gss_str_to_oid()gss_oid_to_str()、および gss_release_oid() をサポートしていない実装の GSS-API もあります。


機構または QOP を表す文字列は、アプリケーション内でハードコード化することも、ユーザー入力から取得することも可能です。しかし、必ずしもすべての実装の GSS-API がこの関数をサポートしているわけではないため、アプリケーションはこの関数に依存すべきではありません。

機構を表す数値には、次の 2 種類の形式があります。1 つの形式は次のとおりです。


{ 1 2 3 4 }


この形式は GSS-API 仕様で正式に指定されています。もう 1 つの形式は次のとおりです。

1.2.3.4


この形式は広く使用されていますが、正式な標準形式ではありません。gss_str_to_oid() は機構の数値として最初の形式を期待します。したがって、2 番目の形式を使用している場合は、gss_str_to_oid() を呼び出す前に 1 番目の形式に変換する必要があります。この例については、parse_oid()を参照してください。機構が有効でない場合、gss_str_to_oid()GSS_S_BAD_MECH を戻します。

gss_str_to_oid() は GSS-API データ領域を割り当てるため、終了時には、割り当てられた OID を gss_release_oid() 関数で削除する必要があります。gss_str_to_oid() と同様に、gss_release_oid() も一般的にサポートされている関数ではありません。したがって、移植性を最大限にしたいプログラムはこの関数に依存すべきではありません。

機構 OID の構築

gss_str_to_oid() は常に使用できるわけではなく、また推奨されるものではないため、使用できる機構を調べて選択するために、より好ましい方法が (若干複雑ですが) いくつか存在します。1 つは、機構 OID を「手動で」構築し、使用できる機構の集合と比較する方法です。もう 1 つは、使用できる機構の集合を取得して、その中から 1 つを選択する方法です。

次に、gss_OID 型の形式を示します。



typedef struct gss_OID_desc struct {
     OM_uint32 length;
     void           *elements;
} gss_OID_desc, *gss_OID;

この構造体の elements フィールドは、gss_OID の通常の BER TLV エンコーディングの値の部分の ASN.1 BER エンコーディングが格納されているオクテット文字列の最初のバイトを指します。length フィールドには、この値のバイト数が格納されています。たとえば、DASS X.509 認証機構に対応する gss_OID 値の場合、length フィールドは 7 で、elements フィールドは「53,14,2,207,163,7,5」という 8 進数値を含む 7 つのオクテットを指します。

機構 OID を構築する 1 つの方法は、gss_OID を宣言して、次に、その要素を手作業で初期化して、機構の OID を表すようにします。前述のとおり、elements 値はハードコード化するか、表から検索するか、あるいは、ユーザー入力から取得できます。この方法は gss_str_to_oid() を使用するよりも手がかかりますが、同じ効果が得られます。

次に、手作業で構築した gss_OID を、使用できる機構の集合と比較します。使用できる機構の集合は、gss_indicate_mechs() または gss_inquire_mechs_for_name() の関数から戻されます。手作業で構築した機構 OID が、使用できる機構の集合の中に存在するかどうかを調べるには、gss_test_oid_set_member() 関数を使用します。gss_test_oid_set_member() がエラーを戻さなかった場合、手作業で構築した OID は GSS-API トランザクション用の機構として使用できます。

OID を手作業で構築する代わりに、gss_indicate_mechs() または gss_inquire_mechs_for_name() を使用すると、使用できる機構の gss_OID_set を取得できます。次に、gss_OID_set の形式を示します。


typedef struct gss_OID_set_desc_struct {
     OM_uint32 length;
     void           *elements;
} gss_OID_set_desc, *gss_OID_set;
elements は機構を表す gss_OID です。すると、アプリケーションは各機構を解析し、それぞれの elements の値 (つまり、機構の数値表記) を表示できます。この結果、ユーザーは表示された値に基づいて使用したい機構を選択し、選択した機構が gss_OID_set の適切なメンバーになるようにアプリケーションで設定できます。あるいは、希望する機構と使用できる機構のリストをアプリケーションで比較することも可能です。