2016-08-01 8 views
1

Я переношу PKI api в Swift 2.2 и нашел следующую ошибку. Все отлично работает в Objective-C.SecKeyEncrypt возвращает ошибку -50 и 0 cipherSize

Объект данных, который должен быть зашифрован, имеет размер 32 байт. Это код, который я использую.

let buflen = 64 
var cipherBuffer = UnsafeMutablePointer<UInt8>.alloc(buflen) 
cipherBuffer[buflen] = 0 // zero terminate 

var cipherLength: Int = 0 

var statusCode: OSStatus? 

let dataPointer = UnsafePointer<UInt8>(data.bytes) 

statusCode = SecKeyEncrypt(publicKey, SecPadding.PKCS1, dataPointer, data.length, cipherBuffer, &cipherLength) 

Это приводит к ошибке -50 и 0 длины шифра.

Я делаю в шестнадцатеричном открытом ключе и dataPointer, чтобы гарантировать, что они правильны, но не могу найти проблему с вызовом SecKeyEncrypt

Любой помощь будет оценен

ответ

1

После некоторых исследований я нашли решение проблемы

Я создавал cipherBuffer с помощью Alloc и ноль прекращения массива, следующим образом:

let buflen = 64 
var cipherBuffer = UnsafeMutablePointer<UInt8>.alloc(buflen) 
cipherBuffer[buflen] = 0 // zero terminate 

Я пробовал следующий подход, и он отлично работает.

let blockSize = SecKeyGetBlockSize(publicKey) //64 
var cipherBuffer = [UInt8](count: Int(blockSize), repeatedValue: 0) 

Учитывая, что оба подхода сообщили блок 64 байт с 0x00 с помощью шестнадцатеричного, я сделал быстрый тест и обзор предыдущего кода и обнаружил, что удаление строки с «cipherBuffer [buflen] = 0» исправляет проблему ,

Кажется, что это связано с нулевым завершением массива, или я, возможно, сделал что-то странное.