// import Swift // import Foundation // import Security import CryptoKit import LocalAuthentication // reference: // https://zenn.dev/iceman/scraps/380f69137c7ea2 // https://www.andyibanez.com/posts/cryptokit-secure-enclave/ @_cdecl("is_support_secure_enclave") func isSupportSecureEnclave() -> Bool { return SecureEnclave.isAvailable } @_cdecl("print_greeting") func printGreeting(modifier: UnsafePointer) { print("Hello \(String(cString: modifier))World!") } enum StringError: Error { case base64error } func generateKeyPair() throws { var error: Unmanaged? = nil; guard let accessCtrl = SecAccessControlCreateWithFlags( nil, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, [.privateKeyUsage, .biometryCurrentSet], &error ) else { throw error!.takeRetainedValue() as Swift.Error } var privateKeyReference = try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init( accessControl: accessCtrl ); var dataRepresentation = privateKeyReference.dataRepresentation; print("Private key reference: \(privateKeyReference)"); print("Private key reference - publicKey: \(privateKeyReference.publicKey)"); print("Private key reference - dataRepresentation: \(privateKeyReference.dataRepresentation)"); print("Private key reference - dataRepresentation: \(privateKeyReference.dataRepresentation.base64EncodedString())"); } func computeEcdh() throws { guard let dataRepresentation = Data(base64Encoded: "BIIB2DGCAdQwgfUMAnJrMYHuMAsMA2JpZAQElx-----" ) else { throw StringError.base64error } let context = LAContext(); let p = try SecureEnclave.P256.KeyAgreement.PrivateKey( dataRepresentation: dataRepresentation, authenticationContext: context) let ephemeralSecretKey = P256.KeyAgreement.PrivateKey() let sharedSecret = try ephemeralSecretKey.sharedSecretFromKeyAgreement(with: p.publicKey) let sharedSecret2 = try p.sharedSecretFromKeyAgreement(with: ephemeralSecretKey.publicKey) print("Shared secret: \(sharedSecret)") print("Shared secret: \(sharedSecret2)") }