Swift 2.2 を使用。El Capitan で動作する Xcode 7.3.1
SecKeyGeneratePair を使用して秘密鍵と公開鍵のペアを作成しました。このコードを使用して公開鍵のコピーを取得しました。これをエンコードして、Bluetooth リンク経由で送信できるようにします。
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)")
}
}
}
これで、このコードで base64EncodedString blob のエンコードを解除できます ...
let data = NSData(base64EncodedString: superString8, options: NSDataBase64DecodingOptions(rawValue:0))
しかし、Swift を使用して使用可能な SecKey オブジェクトに戻すにはどうすればよいでしょうか?私はこのリファレンスを見つけ、翻訳を開始しました。しかし、私はここで私の深さから抜け出しているのではないかと心配していますか?
base64 でコード化された文字列から SecKeyRef を取得する
これは私がこれまでに管理したものです..
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!
}
}
