2017-02-11 11 views
0

私はキーチェーンから自分のアプリケーションの秘密鍵を取得しようとしています。そのため、サーバとの認証に使うことができます。私は正常にそこにそれを保存したが、それを元に戻すことはできません。osx keychainからキーを取得する

func getClientKey(){ 
    let keyValptr:UnsafeMutablePointer<UnsafeMutableRawPointer?>? 
    let lenPtr:UnsafeMutablePointer<UInt32>? = UInt32(13) //how do i do this? 
    _ = SecKeychainFindGenericPassword(nil, 
     UInt32(serviceName.characters.count), serviceName, 
     UInt32(accountName.characters.count), accountName, 
     lenPtr, keyValptr, nil) 

    print(keyValptr) 
} 

私は問題があるとコメントしました。どのように関数に渡す正しいポインタを取得するのですか?それはあなたがUnsafeMutablePoiner<T>?(またはUnsafeMutablePoiner<T>)を渡したいとき、一般的に

+0

'VARさlen:UInt32型= 13'をして、あなたの関数に'&len'を渡します。 – vacawama

答えて

1

を(私は値が実際にあるものを選ぶでしょう)UnsafeMutablePointer<UInt32>?は、あなたがタイプT(ないTへのポインタ)の変数を宣言して、それを渡したいですinoutパラメータ(接頭辞&)。

あなたの問題に固有のので、keyValPtrを渡す方法も間違っています。

パラメータpasswordLength: UnsafeMutablePointer<UInt32>?の場合は、タイプUInt32の変数を宣言する必要があります。 passwordData: UnsafeMutablePointer<UnsafeMutableRawPointer?>?の場合は、UnsafeMutableRawPointer?の変数を宣言する必要があります。

残念ながら、これは重大な問題ではない可能性があります。スウィフトStringを直接UnsafePointer<Int8>?に渡すと、UTF-8表現に基づいて長さを計算する必要があります。

あなたはこのような何か書く必要がある場合があります。

func getClientKey() { 
    var keyVal: UnsafeMutableRawPointer? = nil 
    var len: UInt32 = 13 //<- this value is ignored though... 
    let status = SecKeychainFindGenericPassword(
     nil, 
     UInt32(serviceName.utf8.count), serviceName, //### Use `utf8.count` 
     UInt32(accountName.utf8.count), accountName, //### Use `utf8.count` 
     &len,  //### to pass `UnsafeMutablePointer<UInt32>?`, declare a variable of `UInt32`. 
     &keyVal, //### to pass `UnsafeMutablePointer<UnsafeMutableRawPointer?>?`, declare a variable of `UnsafeMutableRawPointer?`. 
     nil 
    ) 

    if status == noErr { 
     let keyData = Data(bytes: keyVal!, count: Int(len)) 
     //### As noted in the API reference of `SecKeychainFindGenericPassword`, 
     // "You should use the SecKeychainItemFreeContent function to free the memory pointed to by this parameter." 
     SecKeychainItemFreeContent(nil, keyVal) 

     print(keyData as NSData) 
     print(String(data: keyData, encoding: .utf8) ?? "?") 
    } else { 
     //You should not silently ignore erros... 
     print("Error: \(status)") 
    } 
} 
関連する問題