SecKeyRawSign osx与EC Cert

时间:2011-11-01 13:00:06

标签: macos keychain

我正在使用Lion和Xcode 4.1。

没有为OSX记录SecKeyRawSign仍然可以调用并成功签署RSA证书,但EC证书失败。

SecKeyRawSign方法返回-50,即ec cert-384的无效参数。

SecKeyRawSign可用于OSX和EC Cert吗?如果是,填充参数是什么?

提前致谢。

2 个答案:

答案 0 :(得分:4)

SecKeyRawSign是Mac OS 10.6和10.7中的私有函数,因此您不应该使用它。它的ECC证书问题可能只是它尚未被公开的原因之一。

10.7中用于数据签名的官方高级API在Security Transforms中为SecSignTransformCreate。它应该自动使用合适的摘要算法;如果没有,您只需将kSecDigestTypeAttributekSecDigestLengthAttribute设置为您需要的任何内容。 AFAIK填充算法不可配置。

在10.6或更低版本,您必须使用CDSA。首先,使用CSSM_CSP_CreateSignatureContext创建上下文。签名算法是CSSM_ALGID_SHA512WithECDSA(或类似);您可以从SecKeyGetCSPHandleSecKeyGetCSSMKeySecKeyGetCredentials获取其他参数。获得签名上下文后,您可以使用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;
}