Oracle Solaris セキュリティーサービス開発ガイド

機構 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 フィールドは 8 進数で「53,14,2,207,163,7,5」となる値を指します。  

機構 OID を構築する 1 つの方法は、gss_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 です。アプリケーションは、各機構を解析し、それぞれの数値表現を表示できます。ユーザーはこの表示を使用して機構を選択できます。次に、アプリケーションは 選択した機構が gss_OID_set の適切なメンバーになるように設定します。また、希望する機構と使用できる機構のリストを比較することもできます。

createMechOid() 関数

この関数は、完全を期すためにここに表示されています。通常は、GSS_C_NULL_OID によって指定されるデフォルトの機構を使用するようにしてください。


例 C–3 createMechOid() 関数

gss_OID createMechOid(const char *mechStr)
{
        gss_buffer_desc mechDesc;
        gss_OID mechOid;
        OM_uint32 minor;

        if (mechStr == NULL)
                return (GSS_C_NULL_OID);

        mechDesc.length = strlen(mechStr);
        mechDesc.value = (void *) mechStr;

        if (gss_str_to_oid(&minor, &mechDesc, &mechOid) !
            = GSS_S_COMPLETE) {
                fprintf(stderr, "Invalid mechanism oid specified <%s>",
                                mechStr);
                return (GSS_C_NULL_OID);
        }

        return (mechOid);
}