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!
}
}
あなたのコードのどの行がスクリーンショットでも表示されますが、エラーメッセージはtruncaです... –
示されているエラーメッセージは、CertArrayPtrを定義している行にあります。 – user3069232