SecKeyRawSign osx с сертификатом EC - PullRequest
1 голос
/ 01 ноября 2011

Я использую Lion и Xcode 4.1.

SecKeyRawSign не документирован для OSX, однако его можно вызвать и успешно подписать для сертификата RSA, но не удалось выполнить с помощью сертификата EC.

Возвращает метод SecKeyRawSign -50 то есть неверные параметры для ec cert-384.

Можно ли использовать SecKeyRawSign для OSX и EC Cert?Если да, что будет параметром заполнения?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 02 ноября 2011

SecKeyRawSign - это закрытая функция в Mac OS 10.6 и 10.7, поэтому ее не следует использовать.Его проблема с сертификатами ECC может быть просто одной из причин, по которой он (еще?) Не был обнародован.

Официальным высокоуровневым API для подписи данных в 10.7 является SecSignTransformCreate в Security Transforms .Следует автоматически использовать подходящий алгоритм дайджеста;если нет, просто установите kSecDigestTypeAttribute и kSecDigestLengthAttribute на то, что вам нужно.AFAIK алгоритм заполнения не настраивается.

На 10.6 или ниже, вы должны использовать CDSA.Сначала вы создаете контекст с CSSM_CSP_CreateSignatureContext.Алгоритм подписи CSSM_ALGID_SHA512WithECDSA (или аналогичный);Вы можете получить другие аргументы от SecKeyGetCSPHandle, SecKeyGetCSSMKey и SecKeyGetCredentials.Когда у вас есть контекст подписи, вы подписываете свои данные с помощью CSSM_SignData.Алгоритм дайджеста должен быть CSSM_ALGID_NONE.

Заполнение лучше всего объясняется ответом Томаса Порнина на другой вопрос .

2 голосов
/ 03 ноября 2011

@ 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;
}
...