2017-04-26 1 views
1

J'essaie de synchroniser des clés asymétriques privées entre mon application iOS et son équivalent watchOS. J'ai essayé d'utiliser SecKeyCopyExternalRepresentation pour l'exporter comme CFData et l'envoyer à la montre en utilisant WatchConnectivity. Cependant quand il arrive à la montre je n'ai aucun moyen de convertir les données en SecKey. J'ai essayé d'utiliser SecKeyCreateWithData dans une tentative de le recréer, mais il semble que cela ne fonctionne qu'avec des clés symétriques, car quand je l'ai essayé, il s'est écrasé l'application de la montre. Des idées?Exportation de SecKey depuis iOS vers watchOS

iOS code:

func sendSharedKeyPair(keyPair: (publicKey: SecKey, privateKey: SecKey)) { 
    var error: Unmanaged<CFError>? 

    let publicKeyData = SecKeyCopyExternalRepresentation(keyPair.publicKey, &error) 
    if let error = error { 
     return print("Error sending shared key: \(error)") 
    } 
    let privateKeyData = SecKeyCopyExternalRepresentation(keyPair.privateKey, &error) 
    if let error = error { 
     return print("Error sending shared key: \(error)") 
    } 

    if let publicKeyData = publicKeyData, let privateKeyData = privateKeyData { 
     session.sendMessage(["requestedCommand": WatchControllerCommands.sendSharedKeyPair.rawValue, "keyPair": ["publicKey": publicKeyData, "privateKey": privateKeyData]], replyHandler: nil, errorHandler: { error in 
      print(error) 
     }) 
    } 


} 

code watchos:

func session(_ session: WCSession, didReceiveMessage message: [String : Any]) { 
    guard let requestedCommand = (message["requestedCommand"] as? String).flatMap({ WatchControllerCommands(rawValue: $0) }), requestedCommand == .sendSharedKeyPair else { return } 

    guard let publicKeyData = (message["keyPair"] as? [String: Any])?["publicKey"].flatMap({ $0 as? Data }), let privateKeyData = (message["keyPair"] as? [String: Any])?["privateKey"].flatMap({ $0 as? Data }) else { return print("Couldn't parse keys") } 

    let publicTag = "myAppTag" 
    let privateTag = publicTag + ".private" 

    let privateAttributes = [String(kSecAttrIsPermanent): true, 
          String(kSecAttrApplicationTag): privateTag] as [String : Any] 
    let publicAttributes = [String(kSecAttrIsPermanent): true, 
          String(kSecAttrApplicationTag): publicTag] as [String : Any] 

    var error: Unmanaged<CFError>? 
    let publicCFData = publicKeyData as CFData 
    let privateCFData = privateKeyData as CFData 
    let publicCFDict = publicAttributes as CFDictionary 
    let privateCFDict = privateAttributes as CFDictionary 
    SecKeyCreateWithData(publicCFData, publicCFDict, &error) 
    if let error = error { 
     print(error) 
    } 
    SecKeyCreateWithData(privateCFData, privateCFDict, &error) 
    if let error = error { 
     print(error) 
    } 
} 

Répondre

1

De headerdocs autour SecKeyCreateWithData:

@param attributes contenant du dictionnaire décrivant la clé à importer. Les clés de ce dictionnaire sont les constantes kSecAttr * de SecItem.h. Les attributs obligatoires sont les suivants: * kSecAttrKeyType * kSecAttrKeyClass * kSecAttrKeySizeInBits

Votre code ne définit que kSecAttrIsPermanent et kSecAttrApplicationTag attributs.

+0

qui a fonctionné merci !!!! –

+0

@SerenadeX, heureux d'aider –