2017-03-17 11 views
1

背景:私はOpenSSLライブラリを使用してSwiftにPKCS12ファイルを作成しています。 Keychainに証明書と秘密鍵が格納されています。UnsafeMutablePointerからData/NSDataを構築する方法<T>

問題:PKCS12ファイルを作成してアプリケーションバンドルに正常に保存できました。 PKCS12ファイル(HTTPSサーバーからの認証チャレンジの受信など)を使用する場合は、Appleが提供する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オブジェクトを取得し、それをファイルに格納します。代わりに、今私はpkcs12リーダー関数に直接p12を渡したいと思います。これを行うには、まず、SecPKCS12Import()関数が必要とするので、p12オブジェクトをData/NSDataオブジェクトに変換する必要があります。

私は、UnsafaMutablePointer<PKCS12>のタイプのp12オブジェクトからData/NSDataオブジェクトを作成する方法を教えてください。SecPKCS12Import()に渡すことができますか?

答えて

1

これは動作するはずです(コンパイルできますが、テストできませんでした)。アイデアは、メモリバッファに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 
} 
+0

ありがとう!それは完璧に動作します!私はBIO_newを使用してバッファを作成することを考えましたが、cntを取得する方法とデータを構築する方法を理解できませんでした。とにかく、あなたの親切な助けをありがとう! –

関連する問題