@@ -116,37 +116,40 @@ public final class GenerateCert {
116116 return url
117117 }
118118
119- private static func generateRSAKey( bits: Int32 ) throws -> OpaquePointer ? {
120- guard let rsa = RSA_new ( ) else { throw CertGenError . keyGenerationFailed ( " RSA_new failed " ) }
121- guard let bn = BN_new ( ) else { RSA_free ( rsa) ; throw CertGenError . keyGenerationFailed ( " BN_new failed " ) }
122-
123- defer { BN_free ( bn) }
124-
125- if BN_set_word ( bn, UInt ( 65537 ) ) != 1 {
126- RSA_free ( rsa)
127- throw CertGenError . keyGenerationFailed ( " BN_set_word failed " )
128- }
129-
130- if RSA_generate_key_ex ( rsa, bits, bn, nil ) != 1 {
131- RSA_free ( rsa)
132- throw CertGenError . keyGenerationFailed ( " RSA_generate_key_ex failed " )
133- }
134-
135- guard let pkey = EVP_PKEY_new ( ) else {
136- RSA_free ( rsa)
137- throw CertGenError . keyGenerationFailed ( " EVP_PKEY_new failed " )
138- }
139-
140- // Use EVP_PKEY_assign_RSA for OpenSSL 1.x compatibility
141- // For OpenSSL 3.x, this should still work with the right headers
142- if EVP_PKEY_assign ( pkey, EVP_PKEY_RSA, rsa) != 1 {
143- EVP_PKEY_free ( pkey)
144- RSA_free ( rsa)
145- throw CertGenError . keyGenerationFailed ( " EVP_PKEY_assign failed " )
146- }
147-
148- return pkey
119+ private static func generateRSAKey( bits: Int32 ) throws -> OpaquePointer ? {
120+ guard let rsa = RSA_new ( ) else {
121+ throw CertGenError . keyGenerationFailed ( " RSA_new failed " )
122+ }
123+ defer { RSA_free ( rsa) } // Automatically free RSA on any early exit
124+
125+ guard let bn = BN_new ( ) else {
126+ throw CertGenError . keyGenerationFailed ( " BN_new failed " )
127+ }
128+ defer { BN_free ( bn) }
129+
130+ if BN_set_word ( bn, 65537 ) != 1 {
131+ throw CertGenError . keyGenerationFailed ( " BN_set_word failed " )
149132 }
133+
134+ if RSA_generate_key_ex ( rsa, bits, bn, nil ) != 1 {
135+ throw CertGenError . keyGenerationFailed ( " RSA_generate_key_ex failed " )
136+ }
137+
138+ guard let pkey = EVP_PKEY_new ( ) else {
139+ throw CertGenError . keyGenerationFailed ( " EVP_PKEY_new failed " )
140+ }
141+
142+ // ✅ FIX: Correct pointer conversion for OpenSSL API
143+ if EVP_PKEY_assign ( pkey, EVP_PKEY_RSA, UnsafeMutableRawPointer ( rsa) ) != 1 {
144+ EVP_PKEY_free ( pkey)
145+ throw CertGenError . keyGenerationFailed ( " EVP_PKEY_assign failed " )
146+ }
147+
148+ // ✅ IMPORTANT: Prevent RSA from being freed by the defer block,
149+ // as EVP_PKEY_assign now takes ownership.
150+ _ = Unmanaged . passRetained ( rsa) // Transfer ownership
151+ return pkey
152+ }
150153
151154 private static func createSelfSignedCertificate( pkey: OpaquePointer ? ,
152155 commonName: String ,
0 commit comments