Шифрование с открытым ключом iPhone SecKeyEncrypt возвращает ошибку 9809 (errSSLCrypto) - PullRequest
3 голосов
/ 05 августа 2011

Я пытаюсь использовать библиотеки PKI iPhone для шифрования короткой строки (12345678), но постоянно получаю ошибку -9809 (т.е. errSSLCrypto) всякий раз, когда пытаюсь использовать SecKeyEncrypt. Заголовочный файл SecureTransport.h описывает эту ошибку просто как «скрытую криптографическую ошибку», которая не имела большого значения.

Мой код выглядит следующим образом:

- (NSData *)encryptDataWithPublicKey:(NSString *)plainText {

    OSStatus result = -1;

    NSData *plainTextData = [plainText dataUsingEncoding:NSASCIIStringEncoding];
    size_t plainTextLength = [plainTextData length];

    SecTrustRef trustRef;
    SecTrustResultType trustResult;

    SecPolicyRef policy = SecPolicyCreateBasicX509();

    result = SecTrustCreateWithCertificates(m_oCert, policy, &trustRef);

    if (result != errSecSuccess) {
        NSLog(@"Trust create failed with code: %d",result);
        return nil;
    }

    result = SecTrustEvaluate(trustRef, &trustResult);

    if (result != errSecSuccess) {
        NSLog(@"Trust eval failed with code: %d",result);

        CFRelease(trustRef);
        return nil;
    }

    SecKeyRef publicKey = SecTrustCopyPublicKey(trustRef);

    uint8_t *cipherTextBuf = NULL;
    size_t cipherTextLen = 0;

    size_t keyBlockSize = SecKeyGetBlockSize(publicKey);
    int maxInputSize = keyBlockSize - 11; //If using PKCS1 Padding, else keyBlockSize

    if (plainTextLength > maxInputSize) {
        //Fail
        NSLog(@"Data size is larger than max permitted!");

        CFRelease(trustRef);
        CFRelease(publicKey);
        CFRelease(policy);

        return nil;
    }

    cipherTextBuf = malloc(sizeof(uint8_t)*keyBlockSize);
    memset(cipherTextBuf,0,keyBlockSize);

    //result = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plainTextBuf, plainTextLength, cipherTextBuf, &cipherTextLen);
    result = SecKeyEncrypt(publicKey, kSecPaddingNone, (const uint8_t *)[plainTextData bytes], plainTextLength, cipherTextBuf, &cipherTextLen);

    NSData *cipherText = nil;
    if (result == errSecSuccess) {

        cipherText = [NSData dataWithBytes:cipherTextBuf length:cipherTextLen];

    } else {
        NSLog(@"Error detected: %d",result);
    }

    free(cipherTextBuf);
    cipherTextBuf = NULL;

    CFRelease(trustRef);
    CFRelease(publicKey);
    CFRelease(policy);

    return cipherText;
}

Неважно, какой отступ я использую, они оба дают одинаковую ошибку. Открытый ключ получен из сертификата, предоставленного моим клиентом, и я проверил, чтобы убедиться, что ключ действителен. Что я делаю не так и как правильно использовать функцию?

1 Ответ

7 голосов
/ 08 августа 2011

При использовании SecKeyEncrypt входной cipherTextLength должен соответствовать размеру выходного буфера. Настройка

size_t cipherTextLen = keyBlockSize;

решил проблему.

...