1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef CRYPTO_UNEXPORTABLE_KEY_MAC_H_ 6*6777b538SAndroid Build Coastguard Worker #define CRYPTO_UNEXPORTABLE_KEY_MAC_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #if defined(__OBJC__) 11*6777b538SAndroid Build Coastguard Worker #import <LocalAuthentication/LocalAuthentication.h> 12*6777b538SAndroid Build Coastguard Worker #endif // defined(__OBJC__) 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #include "crypto/unexportable_key.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace crypto { 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker // UserVerifyingKeyProviderMac is an implementation of the 19*6777b538SAndroid Build Coastguard Worker // UserVerifyingKeyProvider interface on top of Apple's Secure Enclave. Callers 20*6777b538SAndroid Build Coastguard Worker // must provide a keychain access group when instantiating this class. This 21*6777b538SAndroid Build Coastguard Worker // means that the build must be codesigned for any of this to work. 22*6777b538SAndroid Build Coastguard Worker // https://developer.apple.com/documentation/bundleresources/entitlements/keychain-access-groups?language=objc 23*6777b538SAndroid Build Coastguard Worker // 24*6777b538SAndroid Build Coastguard Worker // Only NIST P-256 elliptic curves are supported. 25*6777b538SAndroid Build Coastguard Worker // 26*6777b538SAndroid Build Coastguard Worker // Unlike Windows keys, macOS will store key metadata locally. Callers are 27*6777b538SAndroid Build Coastguard Worker // responsible for deleting keys when they are no longer needed. 28*6777b538SAndroid Build Coastguard Worker class UnexportableKeyProviderMac : public UnexportableKeyProvider { 29*6777b538SAndroid Build Coastguard Worker public: 30*6777b538SAndroid Build Coastguard Worker explicit UnexportableKeyProviderMac(Config config); 31*6777b538SAndroid Build Coastguard Worker ~UnexportableKeyProviderMac() override; 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker #if defined(__OBJC__) 34*6777b538SAndroid Build Coastguard Worker // Like UnexportableKeyProvider::FromWrappedSigningKeySlowly, but lets you 35*6777b538SAndroid Build Coastguard Worker // pass an authenticated LAContext to avoid having macOS prompt the user for 36*6777b538SAndroid Build Coastguard Worker // user verification. 37*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UnexportableSigningKey> FromWrappedSigningKeySlowly( 38*6777b538SAndroid Build Coastguard Worker base::span<const uint8_t> wrapped_key, 39*6777b538SAndroid Build Coastguard Worker LAContext* lacontext); 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker // Like UnexportableKeyProvider::GenerateSigningKeySlowly, but lets you pass 42*6777b538SAndroid Build Coastguard Worker // an authenticated LAContext to avoid having macOS prompt the user for user 43*6777b538SAndroid Build Coastguard Worker // verification. 44*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UnexportableSigningKey> GenerateSigningKeySlowly( 45*6777b538SAndroid Build Coastguard Worker base::span<const SignatureVerifier::SignatureAlgorithm> 46*6777b538SAndroid Build Coastguard Worker acceptable_algorithms, 47*6777b538SAndroid Build Coastguard Worker LAContext* lacontext); 48*6777b538SAndroid Build Coastguard Worker #endif // defined(__OBJC__) 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker // UnexportableKeyProvider: 51*6777b538SAndroid Build Coastguard Worker std::optional<SignatureVerifier::SignatureAlgorithm> SelectAlgorithm( 52*6777b538SAndroid Build Coastguard Worker base::span<const SignatureVerifier::SignatureAlgorithm> 53*6777b538SAndroid Build Coastguard Worker acceptable_algorithms) override; 54*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UnexportableSigningKey> GenerateSigningKeySlowly( 55*6777b538SAndroid Build Coastguard Worker base::span<const SignatureVerifier::SignatureAlgorithm> 56*6777b538SAndroid Build Coastguard Worker acceptable_algorithms) override; 57*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UnexportableSigningKey> FromWrappedSigningKeySlowly( 58*6777b538SAndroid Build Coastguard Worker base::span<const uint8_t> wrapped_key) override; 59*6777b538SAndroid Build Coastguard Worker bool DeleteSigningKey(base::span<const uint8_t> wrapped_key) override; 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker private: 62*6777b538SAndroid Build Coastguard Worker struct ObjCStorage; 63*6777b538SAndroid Build Coastguard Worker const Config::AccessControl access_control_; 64*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ObjCStorage> objc_storage_; 65*6777b538SAndroid Build Coastguard Worker }; 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UnexportableKeyProviderMac> GetUnexportableKeyProviderMac( 68*6777b538SAndroid Build Coastguard Worker UnexportableKeyProvider::Config config); 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker } // namespace crypto 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker #endif // CRYPTO_UNEXPORTABLE_KEY_MAC_H_ 73