ios - 如何在 Swift 中获取写入 OpenSSL BIO 的 UnsafeMutablePointer<Object> 的长度?

标签 ios swift pointers openssl unsafemutablepointer

我正在使用 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对象没有任何 sizecount它的辅助方法,并深入研究 Apple 的文档,我没有看到一种明确的方法来找到指针处对象的长度。

最佳答案

指针只是一个内存地址,没有任何关于它指向的内存区域的大小的信息。

但是——如果我理解正确的话——你真正需要的是写入基于内存的 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)

关于ios - 如何在 Swift 中获取写入 OpenSSL BIO 的 UnsafeMutablePointer<Object> 的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54561983/

相关文章:

ios - iOS中浏览器的navigator.getUserMedia的 native 替代品是什么?

ios - 如何在 Swift 2.0 中创建一个 dispatch_block_t 数组?

c++ - 删除指针问题

c++ - 指向 char 数组的指针,指针的值不是地址?

ios - 处理 UIView 中许多子 UI 元素的最佳方法

ios - 在 Xcode 中查看类成员文档的直接键盘快捷键?

ios - 我在目录中有图像。必须获取该图像并将其转换为 base64 字符串?

ios - 有没有真正的方法来更改 UIDatePicker - Swift 3 上选定日期的文本颜色?

iOS Swift 3 图像向左旋转 90 度

c - C 中的 () 运算符