Взаимодействие между openssl и структурой безопасности macOS - PullRequest
0 голосов
/ 18 мая 2019

Я пишу некоторый код клиент-сервер, где я использую инфраструктуру безопасности 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 предоставляет так много типов алгоритмов, что я не могу выбрать, какой из них выбрать, и ни один из них, похоже, не работает.

Кто-нибудь сталкивался с этим раньше?

...