Короткая версия: 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
) и позвольте компилятору автоматически определить тип:
if let x509ReqContainer = d2i_X509_REQ_bio(reqBIO, nil) {
// success ...
} else {
// failed ...
}
Примечание: Вы можете написать Data
в BIO с помощью
let result = reqData.withUnsafeBytes {
BIO_write(reqBIO, $0.baseAddress, Int32($0.count))
}
вместо приведения его к NSData
.