@@ -37,9 +37,9 @@ public final class CertificatesManager {
3737 var cfErr : Unmanaged < CFError > ?
3838 guard let keyData = SecKeyCopyExternalRepresentation ( secKey, & cfErr) as Data ? else {
3939 if let cfError = cfErr? . takeRetainedValue ( ) {
40- // Safely cast CFError -> NSError if possible, otherwise fallback to -1
41- let nsError = cfError as? NSError
42- throw CertificateError . publicKeyExportFailed ( OSStatus ( nsError? . code ?? - 1 ) )
40+ // Bridge CFError -> NSError safely and extract code ( fallback -1)
41+ let nsError = cfError as NSError
42+ throw CertificateError . publicKeyExportFailed ( OSStatus ( nsError. code) )
4343 } else {
4444 throw CertificateError . publicKeyExportFailed ( - 1 )
4545 }
@@ -68,19 +68,20 @@ public final class CertificatesManager {
6868 }
6969 defer { PKCS7_free ( p7) }
7070
71- // Get signers (stack of X509). PKCS7_get0_signers often returns a newly allocated stack pointer.
71+ // Get signers (stack of X509). PKCS7_get0_signers often returns an allocated stack pointer.
7272 guard let signers = PKCS7_get0_signers ( p7, nil , 0 ) else {
7373 throw CertificateError . noCertsInProvision
7474 }
7575
76- // Use OPENSSL_sk_* helpers (macros may be unavailable)
77- let rawStackPtr = UnsafeMutableRawPointer ( signers)
78- let count = Int ( OPENSSL_sk_num ( rawStackPtr) )
76+ // Cast the returned stack pointer to OpaquePointer for OPENSSL_sk_* calls
77+ let stackPtr = OpaquePointer ( signers)
78+
79+ // Use OPENSSL_sk_num and OPENSSL_sk_value with proper index types
80+ let count = Int ( OPENSSL_sk_num ( stackPtr) )
7981 for i in 0 ..< count {
80- // OPENSSL_sk_value returns UnsafeMutableRawPointer?
81- guard let val = OPENSSL_sk_value ( rawStackPtr, i) else { continue }
82- // Interpret the pointer as X509*
83- let x509Ptr = val. assumingMemoryBound ( to: X509 . self)
82+ guard let rawVal = OPENSSL_sk_value ( stackPtr, Int32 ( i) ) else { continue }
83+ // rawVal is UnsafeMutableRawPointer; interpret as X509*
84+ let x509Ptr = rawVal. assumingMemoryBound ( to: X509 . self)
8485
8586 // convert X509 -> DER
8687 var derPtr : UnsafeMutablePointer < UInt8 > ? = nil
@@ -100,8 +101,10 @@ public final class CertificatesManager {
100101 }
101102 }
102103
103- // free the signers stack
104- OPENSSL_sk_pop_free ( rawStackPtr, X509_free)
104+ // free the signers stack using OPENSSL_sk_pop_free and provide X509_free as the free func.
105+ // Need to cast X509_free to the expected C function pointer type.
106+ let freeFunc = unsafeBitCast ( X509_free, to: ( @convention( c) ( UnsafeMutableRawPointer? ) - > Void) . self)
107+ OPENSSL_sk_pop_free ( stackPtr, freeFunc)
105108
106109 guard certs. count > 0 else { throw CertificateError . noCertsInProvision }
107110 return certs
0 commit comments