Как получить длину UnsafeMutablePointer <Object>, записанную в OpenSSL BIO в Swift? - PullRequest
0 голосов
/ 06 февраля 2019

Я работаю с OpenSSL и, следовательно, мне приходится работать с некоторыми UnsafeMutablePointer объектами.

Я использую следующий код

  var x509_REQ : UnsafeMutablePointer<X509_REQ> = someObject
  let b = BIO_new(BIO_s_mem())
  let size = 3000

  let status = i2d_X509_REQ_bio(b, x509_REQ)

  guard status == 1 else{
        BIO_free(b)
        return "Failed to execute i2d_X509_REQ_bio command"
  }

  let bp = UnsafeMutableRawPointer.allocate(byteCount: size, alignment: 1)
  BIO_read(b, bp, Int32(size))
  BIO_free(b)

  let data = Data(bytes: bp, count: size)

Приведенный выше код преобразует объект OpenSSL X509_REQ в DER с использованием метода OpenSSL i2d_X509_REQ_bio.У меня проблема - команда BIO_read и объект хранения UnsafeMutablePointer требуют подсчета размера для количества байтов.Кто-нибудь знает правильный способ получить длину в байтах объекта, на который указывает UnsafeMutablePointer<Any> в Swift?(Я жестко кодирую произвольное число прямо сейчас, 3000, что очень плохо). У объекта X509_Req нет никаких вспомогательных методов size или count, и я копаюсь в документации Apple.не вижу четкого способа найти длину объекта по указателю.

1 Ответ

0 голосов
/ 07 февраля 2019

Указатель - это просто адрес памяти, без какой-либо информации о размере области памяти, на которую он указывает.

Однако - если я правильно понимаю задачу - что вы на самом делепотребность - это количество байтов, записанных в основанную на памяти BIO.Вот для чего BIO_get_mem_data.К сожалению, библиотека OpenSSL реализует это как макрос

# define BIO_get_mem_data(b,pp)  BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp)

, который не импортируется в Swift, так что вам придется напрямую вызывать BIO_ctrl.

Пример (проверка ошибок для краткости опущена):

// Create memory-based BIO:
let membio = BIO_new(BIO_s_mem())

// Write to BIO:
let status = i2d_X509_REQ_bio(membio, x509_REQ)

// Get pointer to the start of the memory BIOs data
// and amount of data available:
var ptr: UnsafeMutableRawPointer?
let len = BIO_ctrl(membio, BIO_CTRL_INFO, 0, &ptr)

// Create `Data` object from that memory region:
let data = Data(bytes: ptr!, count: len)

// Release BIO:
BIO_vfree(membio)
...