gpt4 book ai didi

ios - 如何从 UnsafeMutablePointer 构建 Data/NSData

转载 作者:行者123 更新时间:2023-11-28 06:22:43 25 4
gpt4 key购买 nike

背景:我正在使用 OpenSSL 库在 Swift 中创建 PKCS12 文件。我将证书和私钥存储在钥匙串(keychain)中。

问题:我能够创建 PKCS12 文件并将其成功存储在应用程序包中。当我想使用 PKCS12 文件时(例如,从 HTTPS 服务器接收身份验证质询),我可以使用 SecPKCS12Import() 加载文件苹果提供的功能。现在,我不想生成物理文件,而是想在需要时生成运行中的 PKCS12 对象。它将存储在内存中。由于我是 Swift 的新手,因此我正在寻求有关从 UnsafeMutablePointer 转换为 Data 的帮助。当您阅读我的以下代码时,您会了解更多:

以前,我有我的 createP12函数实现为:

createP12(pemCert: String, pemPK: String) {
// .......
// Code to load certificate and private key Object..

guard let p12 = PKCS12_create(passPhrase, name, privateKey, certificate, nil, NID_pbe_WithSHA1And3_Key_TripleDES_CBC, NID_pbe_WithSHA1And3_Key_TripleDES_CBC, 0, 0, 0) else {
ERR_print_errors_fp(stderr)
return
}

// Save p12 to file
let fileManager = FileManager.default
let tempDirectory = NSTemporaryDirectory() as NSString
let path = tempDirectory.appendingPathComponent("ssl.p12")

fileManager.createFile(atPath: path, contents: nil, attributes: nil)
guard let fileHandle = FileHandle(forWritingAtPath: path) else {
LogUtils.logError("Cannot open file handle: \(path)")
return
}
let p12File = fdopen(fileHandle.fileDescriptor, "w")

i2d_PKCS12_fp(p12File, p12)
fclose(p12File)
fileHandle.closeFile()
}

然后当我想读取p12文件的时候,可以调用

let p12Data = NSData(contentsOfFile: Bundle.main.path(forResource: mainBundleResource, ofType:resourceType)!)! as Data
var items: CFArray?
let certOptions: NSDictionary = [kSecImportExportPassphrase as NSString: passwordStr as NSString]
self.securityError = SecPKCS12Import(p12Data as NSData, certOptions, &items)
// Code to read attributes

来自 createP12()函数,我首先得到一个 UnsafeMutablePointer<PKCS12> 类型的 p12 对象然后将其存储在文件中。相反,现在我想将 p12 直接传递给 pkcs12 读取器函数。为此,我必须首先将 p12 对象转换为 Data/NSData 对象,因为这是 SecPKCS12Import() 所要求的。功能。

所以,长话短说,我如何从 UnsafaMutablePointer<PKCS12> 类型的 p12 对象构造一个 Data/NSData 对象?因此我可以将它传递给 SecPKCS12Import()

最佳答案

这应该可以工作(可以编译但我无法测试)。这个想法是将 PKCS12 对象写入内存缓冲区,然后创建 Data来自缓冲区:

func p12ToData(p12: UnsafeMutablePointer<PKCS12>) -> Data {

// Write PKCS12 to memory buffer:
let mbio = BIO_new(BIO_s_mem())
i2d_PKCS12_bio(mbio, p12)

// Get pointer to memory buffer and number of bytes. The
// # define BIO_get_mem_data(b,pp) BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp)
// macro is not imported to Swift.
var ptr = UnsafeRawPointer(bitPattern: 1)!
let cnt = BIO_ctrl(mbio, BIO_CTRL_INFO, 1, &ptr)

// Create data from pointer and count:
let data = Data(bytes: ptr, count: cnt)

// Release memory buffer:
BIO_free(mbio)

return data
}

关于ios - 如何从 UnsafeMutablePointer<T> 构建 Data/NSData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42868241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com