2013-12-14 43 views
1

我在使用gss_export_name導出一個名稱時遇到問題,雖然一旦名稱被導出,我應該可以直接打印它,但是我打開空白Literaly EXPORTED NAME:,導出的名稱長度:47GSSAPI:gss_export_name返回一個空格

這裏是我的代碼

OM_uint32 major_status; 
gss_cred_usage_t usage; 
OM_uint32 lifetime; 
gss_name_t inquired_name; 
major_status = gss_inquire_cred(&minor_status, GSS_C_NO_CREDENTIAL, &inquired_name, 
          &lifetime, &usage, &oid_set); 
gss_buffer_desc exported_name_buffer; 
major_status = gss_export_name(&minor_status, inquired_name, &exported_name_buffer); 
printf("EXPORTED NAME: %s, EXPORTED NAME LENGTH: %d\n", 
     exported_name_buffer.value, exported_name_buffer.length); 

爲清楚起見,我決定不包括支票,但我也照顧到確保的major_status總是== GSS_S_COMPLETE 欣賞任何想法

+0

挖掘我確實表明你需要在'gss_export_name'之前調用'gss_canonicalize_name'。但是我無法驗證在工作代碼中。 –

+0

我的印象是,只有在從字符串導入名稱而不是從活動憑據導入名稱時才需要規範化。無論哪種方式,在我的其他試驗中,我都這樣做了,仍然空白。緩衝區可能不包含文本值,並且需要進一步解碼。希望能有更多的一點 – pu239ppy

回答

0

不幸的是,gss_export_name的緩衝區輸出是一個ASN.1數據結構,而不是可讀的字符串。 Se節RFC 2743的第3.2節。您需要跳過該結構的頭部,然後以與機制相關的方式解析名稱。 一些GSS-API開發人員強烈建議這樣做。例如,Openssh的gss-api修補程序可以解析Kerberos名稱。這是理論上正確的方法。但實際上,使用gss_display_name並處理該調用的輸出會在實踐中產生更多便攜式結果,即使它可能在多機制應用程序中產生奇怪的結果。您將在GSS-API社區獲得有關如何處理此問題的重要論點。每個人都會同意你應該使用gss_display_name來產生調試和日誌輸出。問題是如果您想要在訪問控制列表上搜索名稱,應該怎麼做。如果您可以直接使用gss_export_name的輸出並執行二進制比較,那就這樣做。但是,如果您需要與人類輸入的輸入進行比較,我認爲使用gss_display_name的輸出會更好,而其他人會認爲解析gss_export_name輸出更好。

+0

gss_display_name正是我所需要的,謝謝! – pu239ppy