我正在使用 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 的文档,我没有看到一种明确的方法来找到指针处对象的长度。
最佳答案
指针只是一个内存地址,没有任何关于它指向的内存区域的大小的信息。
但是——如果我理解正确的话——你真正需要的是写入基于内存的 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/