Code Monkey home page Code Monkey logo

Comments (13)

hfossli avatar hfossli commented on July 17, 2024

Private keys can not be migrates. Public keys can. In this case you need to recreate the key pair.

Also you should configure the public key to not be possible to migrate using the flags.

from ellipticcurvekeypair.

giuseppeVacatello avatar giuseppeVacatello commented on July 17, 2024

What is the flag for public key to not migrate? Thank you

from ellipticcurvekeypair.

hfossli avatar hfossli commented on July 17, 2024

Sorry, I meant protection id. You select one of the protection id's that fits your needs from here

https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_attribute_keys_and_values?language=objc#1679100
For example you can choose this one https://developer.apple.com/documentation/security/ksecattraccessibleafterfirstunlockthisdeviceonly?language=objc

Example with kSecAttrAccessibleAlwaysThisDeviceOnly

struct KeyPair {
    static let manager: EllipticCurveKeyPair.Manager = {
        let publicAccessControl = EllipticCurveKeyPair.AccessControl(protection: kSecAttrAccessibleAlwaysThisDeviceOnly, flags: [])
        let privateAccessControl = EllipticCurveKeyPair.AccessControl(protection: kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly, flags: [.userPresence, .privateKeyUsage])
        let config = EllipticCurveKeyPair.Config(
            publicLabel: "payment.sign.public",
            privateLabel: "payment.sign.private",
            operationPrompt: "Confirm payment",
            publicKeyAccessControl: publicAccessControl,
            privateKeyAccessControl: privateAccessControl,
            token: .secureEnclave)
        return EllipticCurveKeyPair.Manager(config: config)
    }()
}

from ellipticcurvekeypair.

giuseppeVacatello avatar giuseppeVacatello commented on July 17, 2024

My problem is in this method:

public func privateKey(context: LAContext? = nil) throws -> PrivateKey {
            do {
                if cachedPrivateKey?.context !== context {
                    cachedPrivateKey = nil
                }
                if let key = cachedPrivateKey {
                    return key
                }
                let key = try helper.getPrivateKey(context: context)
                cachedPrivateKey = key
                return key
            } catch EllipticCurveKeyPair.Error.underlying(_, let underlying) where underlying.code == errSecItemNotFound {
                if config.publicKeyAccessControl.flags.contains(.privateKeyUsage) == false, (try? helper.getPublicKey()) != nil {
                    **throw Error.probablyAuthenticationError(underlying: underlying)**
                }
                let keys = try helper.generateKeyPair(context: nil)
                cachedPublicKey = keys.public
                cachedPrivateKey = keys.private
                return keys.private
            } catch {
                throw error
            }
        }

Once I finish in the catch, the code throws "Error.probablyAuthenticationError(underlying: underlying)" and I can not recover the situation.

Thanks for the tips until now

from ellipticcurvekeypair.

hfossli avatar hfossli commented on July 17, 2024

In the event of an itunes backup and you get this error

Found public key, but couldn't find or access private key. The errSecItemNotFound error is sometimes wrongfully reported when LAContext authentication fails

Then you need to delete the key (pseudo code)

do {
    let privateKey = try manager.privateKey()
} catch {
    if error == Error.probablyAuthenticationError {
        try? manager.deleteKeyPair()
    }
    do {
        let privateKey = try manager.privateKey()
    } catch {
        // this should be handled or reported back to user
    }
}

What is your minimum deployment target? If it is iOS 10 you are lucky, then I have another solution for you.

from ellipticcurvekeypair.

giuseppeVacatello avatar giuseppeVacatello commented on July 17, 2024

yes, it is iOS 10.

from ellipticcurvekeypair.

hfossli avatar hfossli commented on July 17, 2024

Awesome. Then you may choose to not store the public key and instead just derive it from the private key when needed using SecKeyCopyPublicKey. Some modifications to the library is needed in order to get that to work. I want to create a pre-ios-10 version and a post-ios-10 version. Maybe I find time this week.

from ellipticcurvekeypair.

giuseppeVacatello avatar giuseppeVacatello commented on July 17, 2024

In the meantime of your changes how can I fix it?
If I delete the keypair I do not have to regenerate the entire keypair?
In your example above only the private key is regenerated

from ellipticcurvekeypair.

hfossli avatar hfossli commented on July 17, 2024

You need to regenerate the entire keypair

from ellipticcurvekeypair.

giuseppeVacatello avatar giuseppeVacatello commented on July 17, 2024

I did it.
Thank you.
Wait for your modifications of library :)

from ellipticcurvekeypair.

muhamedhfayiz avatar muhamedhfayiz commented on July 17, 2024

I'm also facing the same issue after restoring the ios device. private key not found. able to get a public key. could you please share the code?

from ellipticcurvekeypair.

hfossli avatar hfossli commented on July 17, 2024

It is not possible to restore a private key stored in the secure enclave

from ellipticcurvekeypair.

muhamedhfayiz avatar muhamedhfayiz commented on July 17, 2024

Thank you.
After successful deletion of keypair its works.

from ellipticcurvekeypair.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.