Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. import UIKit
  2.  
  3. class ViewController: UIViewController {
  4.  
  5. let tag = "com.michaelborgmann.keys"
  6.  
  7. let access: SecAccessControl
  8. let attributes: [String : Any]
  9.  
  10. required init?(coder: NSCoder) {
  11. access = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
  12. kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
  13. [.privateKeyUsage, .biometryCurrentSet],
  14. nil)! // Ignore error
  15.  
  16. attributes = [
  17. kSecAttrKeyType as String: kSecAttrKeyTypeEC,
  18. kSecAttrKeySizeInBits as String: 256,
  19. kSecAttrTokenID as String: kSecAttrTokenIDSecureEnclave,
  20. kSecPrivateKeyAttrs as String: [
  21. kSecAttrIsPermanent as String: true,
  22. kSecAttrApplicationTag as String: tag,
  23. kSecAttrAccessControl as String: access
  24. ]
  25. ]
  26.  
  27. super.init(coder: coder)
  28. }
  29.  
  30. override func viewDidLoad() {
  31. super.viewDidLoad()
  32.  
  33. let keyPair = try! createKeyPair()
  34. let message = "secret message".data(using: .utf8)?.base64EncodedData()
  35.  
  36. let encrypted = encrypt(message!, key: keyPair.public)
  37.  
  38. let decrypted = decrypt(encrypted!, key: keyPair.private)
  39.  
  40. let decode = Data(base64Encoded: decrypted!)
  41. let string = String(data: decode!, encoding: .utf8)
  42.  
  43. print(string)
  44. }
  45.  
  46.  
  47. }
  48.  
  49. extension ViewController {
  50.  
  51. private func createKeyPair() throws -> (`public`: SecKey, `private`: SecKey) {
  52. var error: Unmanaged<CFError>?
  53. guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {
  54. throw error!.takeRetainedValue() as Error
  55. }
  56.  
  57. guard let publicKey = SecKeyCopyPublicKey(privateKey) else {
  58. throw error!.takeRetainedValue() as Error
  59. }
  60.  
  61. return (public: publicKey, private: privateKey)
  62. }
  63.  
  64. private func encrypt(_ digest: Data, key: SecKey) -> Data? {
  65. let algorithm = SecKeyAlgorithm.eciesEncryptionStandardX963SHA256AESGCM
  66. return SecKeyCreateEncryptedData(key, algorithm, digest as CFData, nil) as! Data
  67. }
  68.  
  69. private func decrypt(_ digest: Data, key: SecKey) -> Data?{
  70. let algorithm = SecKeyAlgorithm.eciesEncryptionStandardX963SHA256AESGCM
  71. return SecKeyCreateDecryptedData(key, algorithm, digest as CFData, nil) as! Data
  72. }
  73.  
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement