我正在使用Lion和Xcode 4.1。SecKeyRawSign osx與EC證書
SecKeyRawSign沒有記錄在OSX中,但它仍然可以被調用併成功地爲RSA證書籤名,但是EC證書失敗。
SecKeyRawSign方法返回-50,即ec cert-384的無效參數。
SecKeyRawSign可以用於OSX和EC Cert嗎?如果是,那麼填充參數是什麼?
在此先感謝。
我正在使用Lion和Xcode 4.1。SecKeyRawSign osx與EC證書
SecKeyRawSign沒有記錄在OSX中,但它仍然可以被調用併成功地爲RSA證書籤名,但是EC證書失敗。
SecKeyRawSign方法返回-50,即ec cert-384的無效參數。
SecKeyRawSign可以用於OSX和EC Cert嗎?如果是,那麼填充參數是什麼?
在此先感謝。
SecKeyRawSign
是Mac OS 10.6和10.7中的一個私有函數,所以你不應該使用它。它與ECC證書有關的問題可能只是其尚未公開的原因之一。
10.7中用於數據簽名的官方高級API是SecSignTransformCreate
,Security Transforms。它應該自動使用合適的摘要算法;如果不是的話,你只需設置kSecDigestTypeAttribute
和kSecDigestLengthAttribute
即可。 AFAIK填充算法不可配置。
在10.6或更低版本中,您必須使用CDSA。首先,您使用CSSM_CSP_CreateSignatureContext
創建一個上下文。簽名算法是CSSM_ALGID_SHA512WithECDSA
(或相似);您可以從SecKeyGetCSPHandle
,SecKeyGetCSSMKey
和SecKeyGetCredentials
中獲得其他參數。簽署上下文後,您可以使用CSSM_SignData
對您的數據進行簽名。摘要算法應該是CSSM_ALGID_NONE
。
填充最好由Thomas Pornin的answer to another question解釋。
@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;
}
我編輯了你的代碼以使其工作。幾點要點: (1)除非另有說明(在InputIs屬性中),否則簽名轉換的輸入是要簽名的明文,而不是其摘要。轉換將自動選擇適當的摘要算法,或者您可以在DigestType/DigestLength屬性中提供一個。 (2)不要忘記實際執行您創建的轉換。 (3)**總是**在您創建或複製的對象上調用CFRelease。 (4)檢查所有返回值,錯誤始終發生。 –
一個巨大的警告:如果您的應用程序沒有使用私鑰簽名數據的證書(例如,如果用戶在Keychain的確認對話框中拒絕訪問),則「SecTransformExecute」不會報告錯誤,但會默默產生虛假數據。 (看起來它會返回一個填充垃圾的32768字節的內部緩衝區。) –
感謝您的回覆。 –