我使用的是Lion和Xcode 4.1。
SecKeyRawSign在OSX中没有文档,但它可以被调用并成功签署RSA证书,但在EC证书中失败。
SecKeyRawSign方法返回-50,即ec cert-384的无效参数。
SecKeyRawSign可以用于OSX和EC证书吗?如果是,填充参数是什么?
提前感谢。
SecKeyRawSign
是Mac OS 10.6和10.7中的私有函数,所以你不应该使用它。它在ECC证书上的问题可能只是它没有(尚未?)公开的原因之一。
10.7中用于数据签名的官方高级API是安全转换中的SecSignTransformCreate
。它应该自动使用合适的摘要算法;如果没有,只需将kSecDigestTypeAttribute
和kSecDigestLengthAttribute
设置为所需的任何值。我想填充算法是不可配置的。
在10.6或以下版本中,必须使用CDSA。首先,使用CSSM_CSP_CreateSignatureContext
创建一个上下文。签名算法为CSSM_ALGID_SHA512WithECDSA
(或类似);您可以从SecKeyGetCSPHandle
、SecKeyGetCSSMKey
和SecKeyGetCredentials
中获得其他参数。一旦有了签名上下文,就可以使用CSSM_SignData
对数据进行签名。摘要算法应为CSSM_ALGID_NONE
。
Thomas Pornin对另一个问题的回答最好地解释了填充
@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;
}