60 lines
2.1 KiB
Swift
60 lines
2.1 KiB
Swift
// 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<CChar>) {
|
|
print("Hello \(String(cString: modifier))World!")
|
|
}
|
|
|
|
enum StringError: Error {
|
|
case base64error
|
|
}
|
|
|
|
func generateKeyPair() throws {
|
|
var error: Unmanaged<CFError>? = 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)")
|
|
}
|