Xamarin.iOS 如何在安全飞地中创建随机密钥

How to Create random key in secure enclave in Xamarin.iOS

我正在尝试创建一个 RSA 密钥,用于在物理设备上的 Xamarin.iOS 应用程序中签署数据。下面是我的代码

using (var access = new SecAccessControl(SecAccessible.WhenUnlockedThisDeviceOnly, SecAccessControlCreateFlags.BiometryCurrentSet|SecAccessControlCreateFlags.PrivateKeyUsage))
            {
                var keyParameters = new SecKeyGenerationParameters
                {
                    KeyType = SecKeyType.RSA,
                    KeySizeInBits = 2048,
                    Label = AppInfo.PackageName,
                    TokenID = SecTokenID.SecureEnclave,
                    PrivateKeyAttrs = new SecKeyParameters
                    {
                        IsPermanent = true,
                        ApplicationTag = NSData.FromString(AppInfo.PackageName, NSStringEncoding.UTF8),
                        AccessControl = access,
                        CanSign = true,
                        CanVerify = true
                    }
                };
                var privateKey = SecKey.CreateRandomKey(keyParameters.Dictionary, out NSError nsError);
                var publicKey = privateKey.GetPublicKey();
                NSData keyData = publicKey.GetExternalRepresentation();
            }

上面的代码给出了下面的 NSError 和 null 私钥

{The operation couldn’t be completed. (OSStatus error -50 - Key generation failed, error -50)}.

上面的代码在没有 SecAccessControlCreateFlags.PrivateKeyUsageTokenID = SecTokenID.SecureEnclave

的情况下工作正常

请告诉我如何解决这个问题。

Secure Enclave 不支持 RSA 密钥。它只能使用曲线 P256(又名 NIST P-256 或 secp256r1)创建椭圆曲线密钥。如果您想使用 RSA,您只能使用默认的安全实现(没有 Secure Enclave 标志)。

如果你坚持使用secure enclave,你就不得不使用上面提到的曲线。