Solaris 开发者安全性指南

构造机制 OID

由于无法始终使用 gss_str_to_oid(),因此提供了多种用于查找和选择机制的备用方法。一种方法是手动构造机制 OID,然后将该机制与一组可用的机制进行比较。另一种方法是获取一组可用机制并从其中选择一个机制。

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 值包含一个值为 7 的length 字段和一个指向以下八位字节值的 elements 字段:53,14,2,207,163,7,5

构造机制 OID 的一种方法是声明 gss_OID,然后手动初始化表示指定机制的元素。如上所述,elements 值的输入可以是从表中获取的硬编码值,也可以由用户输入。此方法比使用 gss_str_to_oid() 稍微麻烦些,但是二者的效果相同。

然后,可以将所构造的 gss_OIDgss_indicate_mechs()gss_inquire_mechs_for_name() 函数已返回的一组可用机制进行比较。应用程序可以使用 gss_test_oid_set_member() 函数来检查这组可用机制中是否存在所构造的机制 OID。如果 gss_test_oid_set_member() 没有返回错误,则表明可以将所构造的 OID 用作 GSS-API 事务的机制。

构造预设 OID 的另一种方法是使应用程序使用 gss_indicate_mechs()gss_inquire_mechs_for_name() 来获取可用机制的 gss_OID_setgss_OID_set 具有以下格式:

typedef struct gss_OID_set_desc_struct {

     OM_uint32 length;

     void           *elements;

} gss_OID_set_desc, *gss_OID_set;

其中,每个元素都是一个表示相应机制的 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);

}