2011-11-01 94 views
1

我正在使用Lion和Xcode 4.1。SecKeyRawSign osx與EC證書

SecKeyRawSign沒有記錄在OSX中,但它仍然可以被調用併成功地爲RSA證書籤名,但是EC證書失敗。

SecKeyRawSign方法返回-50,即ec cert-384的無效參數。

SecKeyRawSign可以用於OSX和EC Cert嗎?如果是,那麼填充參數是什麼?

在此先感謝。

回答

4

SecKeyRawSign是Mac OS 10.6和10.7中的一個私有函數,所以你不應該使用它。它與ECC證書有關的問題可能只是其尚未公開的原因之一。

10.7中用於數據簽名的官方高級API是SecSignTransformCreateSecurity Transforms。它應該自動使用合適的摘要算法;如果不是的話,你只需設置kSecDigestTypeAttributekSecDigestLengthAttribute即可。 AFAIK填充算法不可配置。

在10.6或更低版本中,您必須使用CDSA。首先,您使用CSSM_CSP_CreateSignatureContext創建一個上下文。簽名算法是CSSM_ALGID_SHA512WithECDSA(或相似);您可以從SecKeyGetCSPHandle,SecKeyGetCSSMKeySecKeyGetCredentials中獲得其他參數。簽署上下文後,您可以使用CSSM_SignData對您的數據進行簽名。摘要算法應該是CSSM_ALGID_NONE

填充最好由Thomas Pornin的answer to another question解釋。

+0

感謝您的回覆。 –

2

@Fnord

感謝您的回覆。我寫了以下代碼:

CFDataRef 
CreateSignature (SecKeyRef privateKeyRef, CFDataRef plaintext, CFErrorRef &error) 
{ 
    SecTransformRef signingTransform = SecSignTransformCreate(privateKeyRef, error); 
    if (signingTransform == NULL) 
     return NULL; 

    Boolean success = SecTransformSetAttribute(signingTransform, 
               kSecTransformInputAttributeName, 
               plaintext, 
               error); 
    if (!success) { 
     CFRelease(signingTransform); 
     return NULL; 
    } 

    CFDataRef signature = SecTransformExecute(signingTransform, error); 
    CFRetain(signature); 
    CFRelease(signingTransform); 
    return signature; 
} 
+0

我編輯了你的代碼以使其工作。幾點要點: (1)除非另有說明(在InputIs屬性中),否則簽名轉換的輸入是要簽名的明文,而不是其摘要。轉換將自動選擇適當的摘要算法,或者您可以在DigestType/DigestLength屬性中提供一個。 (2)不要忘記實際執行您創建的轉換。 (3)**總是**在您創建或複製的對象上調用CFRelease。 (4)檢查所有返回值,錯誤始終發生。 –

+0

一個巨大的警告:如果您的應用程序沒有使用私鑰簽名數據的證書(例如,如果用戶在Keychain的確認對話框中拒絕訪問),則「SecTransformExecute」不會報告錯誤,但會默默產生虛假數據。 (看起來它會返回一個填充垃圾的32768字節的內部緩衝區。) –