gpt4 book ai didi

ios - 如何使用 OpenSSL 在 Swift 中防止错误输入 d2i_X509_REQ_bio 导致的 fatal error

转载 作者:搜寻专家 更新时间:2023-10-31 22:09:27 39 4
gpt4 key购买 nike

上下文:

我有以下代码将数据加载到 BIO 中,然后使用它获取 X509Req:

    let reqBIO = BIO_new(BIO_s_mem())
let result = BIO_write(reqBIO, (reqData as NSData).bytes, Int32(reqData.count))
let x509ReqContainer: UnsafeMutablePointer<X509_REQ> = d2i_X509_REQ_bio(reqBIO, nil)
BIO_free(reqBIO)

当输入像预期的那样是 base64 编码的 DER 时,这段代码工作得很好。但是,如果我传递一个 base64Encoded 垃圾字符串,它就会爆炸,并且丑陋,抛出 fatal error 。

所以我的问题是:

  1. 我可以调用 OpenSSL 中的某些方法来确定 BIO 是否可以安全地发送到 d2i 函数,以便在这些情况下我可以优雅地失败
  2. 有什么方法可以在 swift 中捕捉到 fatalError 吗? (我猜不是)
  3. 是否有其他方法可以验证我的 base64 字符串是否包含 CSR

最佳答案

简短版本: d2i_X509_REQ_bio() 不会对无效输入“抛出错误”。它只是返回一个空指针。崩溃的是你(可能是无意中)在 Swift 中强行解包一个可选的。

更长的版本: C 函数

X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **x);

返回无效输入的空指针。此 C 函数映射到 Swift 为

func d2i_X509_REQ_bio(...) -> UnsafeMutablePointer<X509_REQ>!

以“隐式解包可选”(IUO) 作为返回类型,空指针表示为 nil。 IUO 几乎等同于“普通”(强)可选,唯一的区别是如果类型检查器需要,它会被强制解包。这就是作业中发生的事情

let x509ReqContainer: UnsafeMutablePointer<X509_REQ> = d2i_X509_REQ_bio(reqBIO, nil)

因为该变量被声明为非可选的。如果 C 函数由于无效输入而返回空指针,则 Swift Optional.nil 将被解包,并且程序因运行时错误而终止。

解决方案:if let(或 guard let)使用可选绑定(bind),让编译器自动推断类型:

if let x509ReqContainer = d2i_X509_REQ_bio(reqBIO, nil) {
// success ...
} else {
// failed ...
}

备注:您可以将数据写入BIO,使用

let result = reqData.withUnsafeBytes {
BIO_write(reqBIO, $0.baseAddress, Int32($0.count))
}

而不是将其转换为 NSData

关于ios - 如何使用 OpenSSL 在 Swift 中防止错误输入 d2i_X509_REQ_bio 导致的 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55540556/

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