跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 10 开发者安全性指南 Oracle Solaris 10 1/13 Information Library (简体中文) |
由于无法始终使用 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_OID 与 gss_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_set。gss_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 的相应成员。应用程序还可以将所需的机制与首选机制的列表进行比较。
说明此函数的目的是为了保持代码完整。通常,应当使用 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); }