diff --git a/secure_enclave_ml_kem_recover.swift b/secure_enclave_ml_kem_recover.swift new file mode 100755 index 0000000..c4f09d0 --- /dev/null +++ b/secure_enclave_ml_kem_recover.swift @@ -0,0 +1,41 @@ +#!/usr/bin/env swift + +import Foundation +import CryptoKit +import LocalAuthentication + +let se = SecureEnclave.isAvailable; +print("Supports SE: \(se)"); + + +let context = LAContext(); + +guard let privateKeyDataRepresentation = Data( + base64Encoded: "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" +) else { + exit(1) +} + +let privateKeyReference = try SecureEnclave.MLKEM768.PrivateKey( + dataRepresentation: privateKeyDataRepresentation, + authenticationContext: context +) + +print("\(privateKeyReference)"); +print(); +print("Private key reference - publicKey: \(privateKeyReference.publicKey.rawRepresentation.base64EncodedString())"); + +// SharedSecret: wPgRcA9Ooisdsuj9sB6up39SHptGAdt5UENqUVur4pk= +let encapsulatedBase64 = "eGnPHukjhnWio6/JXoDhSoXpWH5ecLhMDwjdjwDTNinuBJ9yEvfcrZS9JJVVYL6ktP3FVnhSis74W0/rgDZk7m2Q98lwDPs/0MzpNjvZThd6T/07/ITJsi/d02OGDd9lGlXWrijSip7p67BEjJKzCLHOvXdD321T4PQZQbm5sFvUfMh1FBI/g1/V9SGtSjsX5KSh8CwjCTI+oHj9LIuZqCxmwyV8KjzNPrPmsUVQSMBa1TkpzKJkjuDe5FZQP0NTCbZW0/IeV59RQSaB74PICTbsN4x352JqmMGdGedzcutnajnPh5jwHUlCZauEryj/YfLIh4xfDDKL8yn/ecCIAuHbIqNXF0J972j4E4n+SBdm53H6gC01j7BKzOH69yxYa0sdQ15w5HQQHqm54UKbfZT0O6xKzBoSsAr9SfkHi86zUAfe4mp/BLrPOU4vScVa9hymlhmgucB/vGY80zUPasabyYykfTdMNRiO+MhINnfrnah5FSrbyo3K8Fxt+XUuRjhCtIR0u1r9D3po++9q+gVMM7vFi8dMJxgstl3y9xk49lcqda8AMHmho+ub6JYnr+pKFbbfLyd2w6bL1J0sN0y00Ji+uGITrVEn9vUTvdyYsUTJjBTX5x1CO/FV2TViApCfyrTJalLelf/mg8u6gxusd71B5AmVaL/W3JxL2Fx8pot9gQwKSK4pScKkZ5HQiPCUPigDyBR9h5pzxndKjHloboh/Ki44jiqspj8QFj2SR3HOQJjdZZCGO/i0iaRrFoY0DgJDW3OzoaHFBxHcFwMtUghaTyzSp+BgRVqDJn+JuL8ziTSmNeH1GH1709kSQisFK1E1pc+8TOYE7XB0c2wEfl/0k60yuil7GH+2xxxXTN3Lt4WWXN21aPHTf7YZfm0fQZOzL5FV+7342z5QqnOgMXELh8ng3slAKkdxzLOFmUDoYA3OPRij73LU5DL0e4iQUWGIyI83thlNmJTl5CE0lOSjmua0ayB+ToSys9yugxGfZM54JCln3odXu5xgik6ltapMTFOQqwBtDOvgbsgjiYIV/pkuJLwyr1pLTgtPnCkO16o3xvGyjaRigNpSS9gkjUUMmfWK46n8O+/qz6guoPFKiInwvC842F02szyIcp9Fm415nRzLPLPsXl3PdphV0lQjU9bu2ExFuRZMiQ3ZnyGVm1RSt+EZ/0twVSWZTZmrf23pLRZim/TqV92NOVpbVVuS2MvmYknmua+zce0mhx7uDMPA4jaWy84cvyus34pgwxPyL0HYuDo/F2yiR0r7z+Vk5+csc2MRnhDLOj3UQoGmddPekutDE4V9LojcbCvyEHfZupLZTfX+IxRGd0zPH40cirt602iBrf8+sYpQJ4gbeZtEVPG08kNL1se5892iXbuJz7u2OvZ8i0C/mMmM+2BAtMNAb3Otz9ohJPogjQDP7BOVuAqP4FPFN1Q=" + +guard let encapsulated = Data( + base64Encoded: encapsulatedBase64, +) else { + exit(1) +} + +let sharedSecret = try privateKeyReference.decapsulate(encapsulated); +let sharedSecretData = sharedSecret.withUnsafeBytes { Data($0) } + +print(); +print("SharedSecret: \(sharedSecretData.base64EncodedString())");