Я пишу некоторый код клиент-сервер, где я использую инфраструктуру безопасности macOS на клиенте и openssl на сервере.
Сервер генерирует подпись ECDSA, используя закрытый ключ prime256v1.
Затем подпись отправляется клиенту вместе с сертификатом.
Я пытаюсь проверить подпись, но получаю неверную ошибку подписи. Мне не ясно, какой тип алгоритма использовать. Я пробовал много, но продолжаю терпеть неудачу.
Вот код сервера -
unsigned char *digest = // assume this has the correct bytes.
unsigned int digestLen = // assume this is correct.
EVP_PKEY *pkey = /// assume this is filled up with the correct key.
EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new(pkey, NULL);
{
ECDSA_SIG *sigObj = NULL;
EC_KEY *key = EVP_PKEY_get1_EC_KEY(ca_privkey);
sigObj = ECDSA_do_sign(digest, digestLen, key);
sigBytesSize = i2d_ECDSA_SIG(sigObj, &sigBytes);
}
Вот код клиента -
CFErrorRef trustErrorRef = NULL;
SecKeyRef keyRef = NULL;
CFDataRef certDataRef = NULL;
SecCertificateRef certRef = NULL;
SecTrustRef trust = NULL;
SecPolicyRef policy = NULL;
certDataRef = CFDataCreate(kCFAllocatorDefault, certDERBytes, certDERBytesSize);
if( certDataRef )
{
certRef = SecCertificateCreateWithData(kCFAllocatorDefault, certDataRef);
if (certRef != NULL)
{
policy = SecPolicyCreateBasicX509();
if (policy)
{
if ( SecTrustCreateWithCertificates((CFTypeRef)cert, policy, &trust) == noErr )
{
if( SecTrustEvaluateWithError(trust, &trustErrorRef) )
{
keyRef = SecTrustCopyPublicKey(trust);
if( keyRef )
error = SecKeyRawVerify(keyRef, kSecPaddingSigRaw, toVerify, toVerifySize, expectedSignature, expectedSignatureSize);
}
}
}
}
}
Я получаю ошибку недопустимой подписи.
Я пытался использовать SecKeyVerifySignature (), но этот API предоставляет так много типов алгоритмов, что я не могу выбрать, какой из них выбрать, и ни один из них, похоже, не работает.
Кто-нибудь сталкивался с этим раньше?