2016-05-04 8 views
0

Swift 2.2を使用する。 Xcode 7.3.1はEl Capitanで動作しますSecItemCopyMatching swift 2.0を使用してSecKeyGeneratePairによって生成された公開鍵をエクスポートする

SecKeyGeneratePairでプライベート/公開鍵のペアを作成 このコードを使用して公開鍵のコピーを取得します。これをエンコードして、ブルートゥースリンク経由で送信できます。

internal func generateKeyPair(publicKeyTag: String, privateKeyTag:String, keySize: Int) { 

    let privateKeyAttr: [NSString: AnyObject] = [ 
     kSecAttrIsPermanent: true, 
     kSecAttrApplicationTag: privateKeyTag.dataUsingEncoding(NSUTF8StringEncoding)! 
    ] 
    let publicKeyAttr: [NSString: AnyObject] = [ 
     kSecAttrIsPermanent: true, 
     kSecAttrApplicationTag: publicKeyTag.dataUsingEncoding(NSUTF8StringEncoding)! 
    ] 
    let parameters: [NSString: AnyObject] = [ 
     kSecAttrKeyType: kSecAttrKeyTypeRSA, 
     kSecAttrKeySizeInBits: keySize, 
     kSecPrivateKeyAttrs: privateKeyAttr, 
     kSecPublicKeyAttrs: publicKeyAttr 
    ] 

    let result = SecKeyGeneratePair(parameters, &publicKey, &privateKey) 

    if errSecSuccess != result { 
     print("generateKeyPair fail",errSecSuccess, result) 
    } else { 
     //print("\(publicKey)\n\n","\(privateKey)") 

    var dataPtr: AnyObject? 
    let query: [NSString:AnyObject] = [ 
     kSecClass: kSecClassKey, 
     kSecAttrApplicationTag: publicKeyTag.dataUsingEncoding(NSUTF8StringEncoding)!, 
     kSecReturnData: true 
    ] 
    let qResult = SecItemCopyMatching(query, &dataPtr) 
    if (qResult == errSecSuccess) { 
     let PublicKeyText = dataPtr as? NSData 
     base64Encoded = PublicKeyText!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) 
     print("PublicKeyText \(base64Encoded)") 
    } 
    } 
} 

今私は...このコードで

let data = NSData(base64EncodedString: superString8, options: NSDataBase64DecodingOptions(rawValue:0)) 

しかし、どのようスウィフトを使用して、使用可能なSecKeyオブジェクトにそれを取り戻すために、私のbase64EncodedStringブロブをエンコードされていないことができますか?私はこの参照を発見し、それを翻訳し始めました;しかし、私はここで私の深さから抜け出すのを恐れる?

get SecKeyRef from base64 coded string

これは私がこれまで管理するものです。..

 let cert:SecCertificateRef! 
      let policy:SecPolicyRef! 
      cert = SecCertificateCreateWithData(kCFAllocatorDefault, data!) 
      policy = SecPolicyCreateBasicX509(); 
      //var status:OSStatus! 
      var publicKey: SecKeyRef! 
      //var publicKeyPtr = withUnsafeMutablePointer(&publicKey, { $0 }) 
      var trust:SecTrust? 
      let trustPtr = withUnsafeMutablePointer(&trust , { $0}) 
      var certArray:[SecCertificateRef] = [] 
      certArray.append(cert) 

      var unsafeVariable:UnsafePointer<Void> 

      let certArrayPtr = withUnsafeMutablePointer(&unsafeVariable, {$0}) 
      var newTrustType: SecTrustResultType = UInt32(kSecTrustResultInvalid) 
      let newTrustTypePtr = withUnsafeMutablePointer(&newTrustType, {$0}) 

      if (cert != nil) { 
       //certArray[1] = {cert}() 
       // let certs:[SecCertificateRef] = CFArrayCreate(kCFAllocatorDefault, certArrayPtr, 1, nil) as! [SecCertificateRef] 
       let certs:[SecCertificateRef] = CFArrayCreate(kCFAllocatorDefault, certArrayPtr, 1, nil) as! [SecCertificateRef] 
       var status = SecTrustCreateWithCertificates(certs, policy, trustPtr) 
       if (status == errSecSuccess){ 
        //status = SecTrustEvaluate(trust!, trustTypePtr) 
         status = SecTrustEvaluate(trust!, newTrustTypePtr) 
        // Evaulate the trust. 
        switch (Int(newTrustType)) { 
        case kSecTrustResultInvalid: break 
        case kSecTrustResultDeny: break 
        case kSecTrustResultUnspecified: break 
        case kSecTrustResultFatalTrustFailure: break 
        case kSecTrustResultOtherError: break 
        case kSecTrustResultRecoverableTrustFailure: 
         publicKey = SecTrustCopyPublicKey(trust!); 
         break; 
        case kSecTrustResultProceed: 
         publicKey = SecTrustCopyPublicKey(trust!); 
         break; 
        } 

       } 
      } 
     } else { 
      superString8 = superString8 + stringFromData! 
     } 
    } 

enter image description here

+0

あなたのコードのどの行がスクリーンショットでも表示されますが、エラーメッセージはtruncaです... –

+0

示されているエラーメッセージは、CertArrayPtrを定義している行にあります。 – user3069232

答えて

1

このような何か試してみてください:

let certArrayPtr = withUnsafeMutablePointer(&certArray, {$0}) 
    var newTrustType: SecTrustResultType = UInt32(kSecTrustResultInvalid) 
    let newTrustTypePtr = withUnsafeMutablePointer(&newTrustType, {$0}) 

    if (cert != nil) { 
     certArray[1] = {cert}() 
     let certs = CFArrayCreate(kCFAllocatorDefault, unsafeBitCast(certArrayPtr, UnsafeMutablePointer<UnsafePointer<Void>>.self), 1, nil) as! [SecCertificateRef] 

を(ここでは最初と最後の行であります違う... certArrayPtrの必要はありませんvar、およびunsafeBitCastは粗大ですが、障害を乗り越えなければなりません。私はthis related questionでそれを見つけました)。

+0

すごく簡単です。それはコンパイルされ、今は酸テストのために働くのですか? – user3069232

+0

マイケルは、それがコンパイルする理由を投票しました。しかし悲しいことに悲しいことにはうまくいかない。 SeccertificateCreateWithDataは何も作成できないようですが、単にゼロを返します。公開鍵を送るクライアントにコードを移植して、Bluetooth64ベースの会話と転送を除外します。 – user3069232

関連する問題