我正在使用Lion和Xcode 4.1。
没有为OSX记录SecKeyRawSign仍然可以调用并成功签署RSA证书,但EC证书失败。
SecKeyRawSign方法返回-50,即ec cert-384的无效参数。
SecKeyRawSign可用于OSX和EC Cert吗?如果是,填充参数是什么?
提前致谢。
答案 0 :(得分:4)
SecKeyRawSign
是Mac OS 10.6和10.7中的私有函数,因此您不应该使用它。它的ECC证书问题可能只是它尚未被公开的原因之一。
10.7中用于数据签名的官方高级API在Security Transforms中为SecSignTransformCreate
。它应该自动使用合适的摘要算法;如果没有,您只需将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解释。
答案 1 :(得分: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;
}