private static void CheckError(SecStatusCode resultCode, [CallerMemberName] string caller = null)
 {
     if (resultCode != SecStatusCode.Success)
     {
         throw new Exception(string.Format("Failed to execute {0}. Result code: {1}", caller, resultCode));
     }
 }
 private static void CheckError(SecStatusCode resultCode, [CallerMemberName] string caller = null)
 {
     if (resultCode != SecStatusCode.Success)
     {
         throw new Exception($"Failed to execute {caller}. Result code: {resultCode}");
     }
 }
        public bool Delete()
        {
            var findExisting = new SecRecord(SecKind.Key)
            {
                ApplicationTag = NSData.FromString(this._keyName, NSStringEncoding.UTF8),
                KeyType        = SecKeyType.RSA,
                Synchronizable = this._shouldSyncAcrossDevices
            };

            SecStatusCode code = SecKeyChain.Remove(findExisting);

            return(code == SecStatusCode.Success);
        }
        /// <summary>
        /// Retreives record from the store
        /// </summary>
        /// <returns>The record.</returns>
        /// <param name="key">Key.</param>
        /// <param name="ssc">Ssc.</param>
        private SecRecord GetRecord(string key, out SecStatusCode ssc)
        {
            // create an instance of the record to query
            var sr = new SecRecord(StoreSecKind);

            sr.Account = key;
            if (DefaultAccessible != SecAccessible.Invalid)
            {
                sr.Accessible = DefaultAccessible;
            }

            return(SecKeyChain.QueryAsRecord(sr, out ssc));
        }
Пример #5
0
        static public SecStatusCode ImportPkcs12(NSData data, NSDictionary options, out NSDictionary[] array)
        {
            if (options == null)
            {
                throw new ArgumentNullException("options");
            }

            IntPtr        handle;
            SecStatusCode code = SecPKCS12Import(data.Handle, options.Handle, out handle);

            array = NSArray.ArrayFromHandle <NSDictionary> (handle);
            return(code);
        }
Пример #6
0
        static public SecStatusCode ImportPkcs12(CFData data, CFDictionary options, out CFDictionary [] array)
        {
            if (options == null)
            {
                throw new ArgumentNullException("options");
            }

            IntPtr        handle;
            SecStatusCode code = SecPKCS12Import(data.Handle, options.Handle, out handle);

            array = CFArray.ArrayFromHandle <CFDictionary> (handle, h => new CFDictionary(h, false));
            CFObject.CFRelease(handle);
            return(code);
        }
        //------------------------------------------------------------------------------
        public bool Load(string settingName, SettingBaseAttribute attr, out object value)
        {
            if (!KeyChainUtils.Contains(settingName, m_serviceName, m_synchronizable))
            {
                InternalConfiguration.PlatformHelper.Log(LogLevel.Info,
                                                         "KeyChainSerializer.Load - no such setting",
                                                         settingName);

                value = null;
                return(false);
            }

            string        stringValue;
            SecStatusCode eCode = KeyChainUtils.GetPasswordForUsername(
                settingName,
                m_serviceName,
                out stringValue,
                m_synchronizable);

            if (eCode != SecStatusCode.Success || stringValue == null)
            {
                Advexp.LogLevel ll = Advexp.LogLevel.None;

                if (eCode == SecStatusCode.ItemNotFound)
                {
                    ll = LogLevel.Info;
                }
                else
                {
                    ll = LogLevel.Error;
                }

                InternalConfiguration.PlatformHelper.Log(ll,
                                                         "KeyChainSerializer.Load - error",
                                                         String.Format("Setting is {0}. Error code is {1}",
                                                                       settingName,
                                                                       eCode));
                value = null;
                return(false);
            }

            // in this case simplified object will be corrected in the SettingsSerializer.cs
            value = stringValue;

            InternalConfiguration.PlatformHelper.Log(LogLevel.Info,
                                                     "KeyChainSerializer.Load - success",
                                                     settingName);

            return(true);
        }
Пример #8
0
        static INativeObject [] QueryAsReference(SecRecord query, int max, out SecStatusCode result)
        {
            if (query == null)
            {
                result = SecStatusCode.Param;
                return(null);
            }

            using (var copy = query.QueryDict.MutableCopy()) {
                copy.SetValue(CFBoolean.True.Handle, SecItem.ReturnRef);
                SetLimit(copy, max);
                return(QueryAsReference(copy, out result));
            }
        }
Пример #9
0
        /// <inheritdoc/>
        public ICryptographicKey CreateKeyPair(int keySize)
        {
            Requires.Range(keySize > 0, "keySize");

            string keyIdentifier        = Guid.NewGuid().ToString();
            string publicKeyIdentifier  = RsaCryptographicKey.GetPublicKeyIdentifierWithTag(keyIdentifier);
            string privateKeyIdentifier = RsaCryptographicKey.GetPrivateKeyIdentifierWithTag(keyIdentifier);

            // Configure parameters for the joint keypair.
            using var keyPairAttr               = new NSMutableDictionary();
            keyPairAttr[KSec.AttrKeyType]       = KSec.AttrKeyTypeRSA;
            keyPairAttr[KSec.AttrKeySizeInBits] = NSNumber.FromInt32(keySize);

            // Configure parameters for the private key
            using var privateKeyAttr                = new NSMutableDictionary();
            privateKeyAttr[KSec.AttrIsPermanent]    = NSNumber.FromBoolean(true);
            privateKeyAttr[KSec.AttrApplicationTag] = NSData.FromString(privateKeyIdentifier, NSStringEncoding.UTF8);

            // Configure parameters for the public key
            using var publicKeyAttr                = new NSMutableDictionary();
            publicKeyAttr[KSec.AttrIsPermanent]    = NSNumber.FromBoolean(true);
            publicKeyAttr[KSec.AttrApplicationTag] = NSData.FromString(publicKeyIdentifier, NSStringEncoding.UTF8);

            // Parent the individual key parameters to the keypair one.
            keyPairAttr[KSec.PublicKeyAttrs]  = publicKeyAttr;
            keyPairAttr[KSec.PrivateKeyAttrs] = privateKeyAttr;

            // Generate the RSA key.
            SecKey?publicKey = null, privateKey = null;

            try
            {
                SecStatusCode code = SecKey.GenerateKeyPair(keyPairAttr, out publicKey, out privateKey);
                Verify.Operation(code == SecStatusCode.Success, "status was " + code);
            }
            catch (InvalidOperationException ex)
            {
                publicKey?.Dispose();
                privateKey?.Dispose();
                throw new ArgumentException(ex.Message, ex);
            }
            catch
            {
                publicKey?.Dispose();
                privateKey?.Dispose();
                throw;
            }

            return(new RsaCryptographicKey(publicKey, privateKey, keyIdentifier, this.algorithm));
        }
        private bool GenClientContext(AuthenticationToken token)
        {
            using (DisposableList list = new DisposableList())
            {
                SecStatusCode result = 0;

                SecBuffer     out_sec_buffer  = list.AddResource(new SecBuffer(SecBufferType.Token, 64 * 1024));
                SecBufferDesc out_buffer_desc = list.AddResource(new SecBufferDesc(out_sec_buffer));

                InitializeContextRetFlags flags;
                LargeInteger expiry = new LargeInteger();
                if (token != null)
                {
                    List <SecBuffer> buffers = new List <SecBuffer>();
                    buffers.Add(list.AddResource(new SecBuffer(SecBufferType.Token, token.ToArray())));
                    if (_channel_binding != null)
                    {
                        buffers.Add(list.AddResource(SecBuffer.CreateForChannelBinding(_channel_binding)));
                    }
                    SecBufferDesc in_buffer_desc = list.AddResource(new SecBufferDesc(buffers.ToArray()));
                    result = SecurityNativeMethods.InitializeSecurityContext(_creds.CredHandle, _context, _target, _req_attributes, 0,
                                                                             _data_rep, in_buffer_desc, 0, _context, out_buffer_desc, out flags, expiry).CheckResult();
                    Flags = flags;
                }
                else
                {
                    SecBufferDesc    in_buffer_desc = null;
                    List <SecBuffer> buffers        = new List <SecBuffer>();
                    if (_channel_binding != null)
                    {
                        buffers.Add(list.AddResource(SecBuffer.CreateForChannelBinding(_channel_binding)));
                        in_buffer_desc = list.AddResource(new SecBufferDesc(buffers.ToArray()));
                    }

                    result = SecurityNativeMethods.InitializeSecurityContext(_creds.CredHandle, null, _target,
                                                                             _req_attributes, 0, _data_rep, in_buffer_desc, 0, _context,
                                                                             out_buffer_desc, out flags, expiry).CheckResult();
                }

                Expiry = expiry.QuadPart;
                Flags  = flags;
                if (result == SecStatusCode.CompleteNeeded || result == SecStatusCode.CompleteAndContinue)
                {
                    SecurityNativeMethods.CompleteAuthToken(_context, out_buffer_desc).CheckResult();
                }

                Token = AuthenticationToken.Parse(_creds.PackageName, _token_count++, true, out_buffer_desc.ToArray()[0].ToArray());
                return(!(result == SecStatusCode.ContinueNeeded || result == SecStatusCode.CompleteAndContinue));
            }
        }
Пример #11
0
        void Initialize(IntPtr certHandle, SecPolicy policy)
        {
            if (policy == null)
            {
                throw new ArgumentNullException("policy");
            }

            SecStatusCode result = SecTrustCreateWithCertificates(certHandle, policy.Handle, out handle);

            if (result != SecStatusCode.Success)
            {
                throw new ArgumentException(result.ToString());
            }
        }
Пример #12
0
        public string GetToken()
        {
            byte[] password_bytes;

            SecStatusCode result = SecKeyChain.FindGenericPassword(
                SERVICE, ACCOUNT, out password_bytes);

            if (result != SecStatusCode.Success)
            {
                throw new Exception("Could not find token in Keychain");
            }

            return(Encoding.UTF8.GetString(password_bytes));
        }
Пример #13
0
        public static void RemoveInternetUserNameAndPassword(Uri url)
        {
            var record = SecKeychainFindInternetPassword(url, out _);

            if (record != null)
            {
                SecStatusCode result = SecKeyChain.Remove(record);

                if (result != SecStatusCode.Success)
                {
                    throw new Exception("Could not delete internet password from keychain: " + result.GetStatusDescription());
                }
            }
        }
Пример #14
0
        static public SecStatusCode ImportPkcs12(NSData data, NSDictionary options, out NSDictionary[] array)
        {
            if (options == null)
            {
                throw new ArgumentNullException("options");
            }

            IntPtr        handle;
            SecStatusCode code = SecPKCS12Import(data.Handle, options.Handle, out handle);

            // note: NSArray.ArrayFromHandle will retain the NSDictionary it creates - but the ones
            // we're receiving already are retained, GetRetainedDictionary drops that extra level
            array = NSArray.ArrayFromHandle <NSDictionary> (handle, GetRetainedDictionary);
            return(code);
        }
Пример #15
0
        public void IdentityRecordTest()
        {
            using (var identity = IdentityTest.GetIdentity())
                using (var rec = new SecRecord(identity)) {
                    SecStatusCode code = SecKeyChain.Add(rec);
                    Assert.True(code == SecStatusCode.DuplicateItem || code == SecStatusCode.Success, "Identity added");

                    var ret = rec.GetIdentity();
                    Assert.NotNull(ret, "ret is null");
                    Assert.That(identity.Handle, Is.EqualTo(ret.Handle), "Same Handle");

                    Assert.Throws <InvalidOperationException> (() => rec.GetKey(), "GetKey should throw");
                    Assert.Throws <InvalidOperationException> (() => rec.GetCertificate(), "GetCertificate should throw");
                }
        }
        private FingerprintAuthenticationResultStatus MapStatus(SecStatusCode code)
        {
            switch (code)
            {
            //TODO: add remining status codes
            case SecStatusCode.AuthFailed:
                return(FingerprintAuthenticationResultStatus.Failed);

            case SecStatusCode.Success:
                return(FingerprintAuthenticationResultStatus.Succeeded);

            default:
                return(FingerprintAuthenticationResultStatus.Unknown);
            }
        }
Пример #17
0
        public static void RemoveCredentialFromKeychain(string username)
        {
            SecStatusCode code = SecStatusCode.NotAvailable;

            code = SecKeyChain.Remove(new SecRecord(SecKind.GenericPassword)
            {
                Service = ServiceName,
                Account = username
            });

            if (code != SecStatusCode.Success)
            {
                Logging.Info("error removing password from keychain: " + code);
            }
        }
        internal static SecStatusCode AcceptSecurityContext(
            CredentialHandle credential,
            SecHandle context,
            AcceptContextReqFlags req_attributes,
            SecDataRep data_rep,
            IList <SecurityBuffer> input,
            SecHandle new_context,
            IList <SecurityBuffer> output,
            out AcceptContextRetFlags ret_attributes,
            LargeInteger expiry,
            bool throw_on_error)
        {
            using (DisposableList list = new DisposableList())
            {
                var input_buffers  = input?.ToBufferList(list);
                var output_buffers = output?.ToBufferList(list);

                var in_buffer_desc  = input_buffers.ToDesc(list);
                var out_buffer_desc = output_buffers.ToDesc(list);

                SecStatusCode result = SecurityNativeMethods.AcceptSecurityContext(credential.CredHandle, context,
                                                                                   in_buffer_desc, req_attributes, data_rep, new_context, out_buffer_desc, out ret_attributes, expiry).CheckResult(throw_on_error);
                if (!result.IsSuccess())
                {
                    return(result);
                }
                try
                {
                    if (result == SecStatusCode.SEC_I_COMPLETE_NEEDED || result == SecStatusCode.SEC_I_COMPLETE_AND_CONTINUE)
                    {
                        var comp_result = SecurityNativeMethods.CompleteAuthToken(context, out_buffer_desc).CheckResult(throw_on_error);
                        if (!comp_result.IsSuccess())
                        {
                            return(comp_result);
                        }
                    }
                }
                finally
                {
                    if (result.IsSuccess())
                    {
                        output?.UpdateBuffers(out_buffer_desc);
                    }
                }

                return(result);
            }
        }
Пример #19
0
        public SecTrustResult Evaluate()
        {
            if (handle == IntPtr.Zero)
            {
                throw new ObjectDisposedException("SecTrust");
            }

            SecTrustResult trust;
            SecStatusCode  result = SecTrustEvaluate(handle, out trust);

            if (result != SecStatusCode.Success)
            {
                throw new InvalidOperationException(result.ToString());
            }
            return(trust);
        }
Пример #20
0
        public Task DeleteAsync(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                throw new ArgumentException(Resources.ObjectStoreParametersEmpty);
            }

            SecStatusCode status = SecKeyChain.Remove(NewSecRecordForKey(key));

            if (status != SecStatusCode.Success && status != SecStatusCode.ItemNotFound)
            {
                throw new IOException(string.Format(ClientResources.FileAccessErrorMessage, ClientResources.FileAccessActionDelete, key, status.ToString()));
            }

            return(Task.CompletedTask);
        }
Пример #21
0
        public Task SetAsync(string key, string value)
        {
            key = KeyPrefix + key;

            SecRecord record = new SecRecord(SecKind.GenericPassword)
            {
                Account    = key,
                Service    = Service,
                Label      = key,
                Accessible = Accessible,
                ValueData  = NSData.FromString(value, NSStringEncoding.UTF8)
            };

            using (record)
            {
                SecStatusCode result = SecKeyChain.Add(record);
                switch (result)
                {
                case SecStatusCode.DuplicateItem:
                {
                    Debug.WriteLine("Duplicate item found. Attempting to remove and add again.");

                    if (Remove(key))
                    {
                        result = SecKeyChain.Add(record);
                        if (result != SecStatusCode.Success)
                        {
                            throw new Exception($"Error adding record: {result}");
                        }
                    }
                    else
                    {
                        throw new Exception($"Error removing record: {result}");
                    }
                }
                break;

                case SecStatusCode.Success:
                    break;

                default:
                    throw new Exception($"Error adding record: {result}");
                }
            }

            return(Task.CompletedTask);
        }
Пример #22
0
        public void SecItemAdd_Identity()
        {
            using (NSString valueref = new NSString("v_Ref"))
                using (NSMutableDictionary data = new NSMutableDictionary())
                    using (var id = IdentityTest.GetIdentity()) {
                        data.LowlevelSetObject(id.Handle, valueref.Handle);
                        SecStatusCode code     = SecItemAdd(data.Handle, IntPtr.Zero);
                        var           expected = Is.EqualTo(SecStatusCode.DuplicateItem).Or.EqualTo(SecStatusCode.Success);
#if __MACOS__
                        if (!TestRuntime.CheckSystemVersion(PlatformName.MacOSX, 10, 9))
                        {
                            expected = Is.EqualTo(SecStatusCode.Param);
                        }
#endif
                        Assert.That(code, expected);
                    }
        }
Пример #23
0
        public Task WriteAsync(string key, string contents)
        {
            if (string.IsNullOrEmpty(key) || contents == null)
            {
                throw new ArgumentException(Resources.ObjectStoreParametersEmpty);
            }

            SecStatusCode status = SecStatusCode.IO;

            try
            {
                SecRecord record = ExistingSecRecordForKey(key);

                SecRecord newRecord = NewSecRecordForKey(key);

                if (record == null)
                {
                    newRecord.ValueData = NSData.FromString(contents);

                    status = SecKeyChain.Add(newRecord);
                }
                else
                {
                    SecRecord update = new SecRecord()
                    {
                        ValueData = NSData.FromString(contents)
                    };

                    status = SecKeyChain.Update(newRecord, update);
                }
            }
            catch (Exception e)
            {
                throw new IOException(string.Format(ClientResources.FileAccessErrorMessage, ClientResources.FileAccessActionWrite, key), e);
            }

            if (status != SecStatusCode.Success)
            {
                throw new IOException(string.Format(ClientResources.FileAccessErrorMessage, ClientResources.FileAccessActionWrite, key, status.ToString()));
            }

            return(Task.CompletedTask);
        }
        internal static byte[] GetRawBrokerKey()
        {
            byte[]    brokerKey = null;
            SecRecord record    = new SecRecord(SecKind.GenericPassword)
            {
                Generic     = NSData.FromString(LocalSettingsContainerName),
                Service     = "Broker Key Service",
                Account     = "Broker Key Account",
                Label       = "Broker Key Label",
                Comment     = "Broker Key Comment",
                Description = "Storage for broker key"
            };

            NSData key = SecKeyChain.QueryAsData(record);

            if (key == null)
            {
                AesManaged algo = new AesManaged();
                algo.GenerateKey();
                byte[] rawBytes = algo.Key;
                NSData byteData = NSData.FromArray(rawBytes);
                record = new SecRecord(SecKind.GenericPassword)
                {
                    Generic     = NSData.FromString(LocalSettingsContainerName),
                    Service     = "Broker Key Service",
                    Account     = "Broker Key Account",
                    Label       = "Broker Key Label",
                    Comment     = "Broker Key Comment",
                    Description = "Storage for broker key",
                    ValueData   = byteData
                };

                SecStatusCode code = SecKeyChain.Add(record);
                brokerKey = byteData.ToArray();
            }
            else
            {
                brokerKey = key.ToArray();
            }

            return(brokerKey);
        }
Пример #25
0
        public void SetToken(string token)
        {
            byte[] password_bytes = Encoding.UTF8.GetBytes(token);

            SecStatusCode result = SecKeyChain.AddGenericPassword(
                SERVICE, ACCOUNT, password_bytes);

            if (result == SecStatusCode.DuplicateItem)
            {
                // TODO: Replace the token
                // SecKeyChain.Remove ();
                // StoreToken (token);
                return;
            }

            if (result != SecStatusCode.Success)
            {
                throw new Exception("Could not store token in Keychain");
            }
        }
Пример #26
0
        public override void Delete(string key)
        {
            try
            {
                key = key.ToLower();
                if (string.IsNullOrEmpty(key))
                {
                    return;
                }

                SecRecord queryRec = new SecRecord(SecKind.GenericPassword)
                {
                    Service = serviceId, Label = serviceId, Account = key, Synchronizable = false
                };
                SecStatusCode code = SecKeyChain.Remove(queryRec);
            }
            catch (Exception)
            {
            }
        }
Пример #27
0
        private void TryWriteBrokerApplicationTokenToKeychain(string clientId, string applicationToken)
        {
            iOSTokenCacheAccessor iOSTokenCacheAccessor = new iOSTokenCacheAccessor();

            try
            {
                SecStatusCode secStatusCode = iOSTokenCacheAccessor.SaveBrokerApplicationToken(clientId, applicationToken);

                _logger.Info(string.Format(
                                 CultureInfo.CurrentCulture,
                                 iOSBrokerConstants.AttemptToSaveBrokerApplicationToken + "SecStatusCode: {0}",
                                 secStatusCode));
            }
            catch (Exception ex)
            {
                throw new MsalClientException(
                          MsalError.WritingApplicationTokenToKeychainFailed,
                          MsalErrorMessage.WritingApplicationTokenToKeychainFailed + ex.Message);
            }
        }
Пример #28
0
        static unsafe string GetUsernameFromKeychainItemRef(IntPtr itemRef)
        {
            int[] formatConstants = { (int)CssmDbAttributeFormat.String };
            int[] attributeTags   = { (int)SecItemAttr.Account };

            fixed(int *tags = attributeTags, formats = formatConstants)
            {
                var attributeInfo = new SecKeychainAttributeInfo {
                    Count  = 1,
                    Tag    = tags,
                    Format = formats
                };
                SecKeychainAttributeList *attributeList = null;
                SecItemClass itemClass = 0;

                try {
                    SecStatusCode status = SecKeychainItemCopyAttributesAndData(itemRef, &attributeInfo, ref itemClass, &attributeList, IntPtr.Zero, IntPtr.Zero);

                    if (status == SecStatusCode.ItemNotFound)
                    {
                        throw new Exception("Could not add internet password to keychain: " + status.GetStatusDescription());
                    }

                    if (status != SecStatusCode.Success)
                    {
                        throw new Exception("Could not find internet username and password: " + status.GetStatusDescription());
                    }

                    var userNameAttr = (SecKeychainAttribute *)attributeList->Attrs;

                    if (userNameAttr->Length == 0)
                    {
                        return(null);
                    }

                    return(Marshal.PtrToStringAuto(userNameAttr->Data, (int)userNameAttr->Length));
                } finally {
                    SecKeychainItemFreeAttributesAndData(attributeList, IntPtr.Zero);
                }
            }
        }
Пример #29
0
        static bool AddItem(Epitech.Intra.SharedApp.Security.Credit credit)
        {
            var secObject = new SecAccessControl(SecAccessible.AfterFirstUnlockThisDeviceOnly);

            if (secObject == null)
            {
                return(false);
            }

            var securityRecord = new SecRecord(SecKind.GenericPassword)
            {
                Service               = "com.Epitech.uIntra",
                ValueData             = new NSString(credit.Login + "|" + credit.Password).Encode(NSStringEncoding.UTF8),
                UseNoAuthenticationUI = true,
                AccessControl         = secObject,
            };

            SecStatusCode status = SecKeyChain.Add(securityRecord);

            return(status == SecStatusCode.Success);
        }
Пример #30
0
        static bool UpdateItem(Epitech.Intra.SharedApp.Security.Credit credit)
        {
            var securityRecord = new SecRecord(SecKind.GenericPassword)
            {
                Service            = "com.Epitech.uIntra",
                UseOperationPrompt = "Authentifiez-vous pour mettre à jours vos identifiants"
            };

            var recordUpdates = new SecRecord(SecKind.Identity)
            {
                ValueData = new NSString(credit.Login + "|" + credit.Password).Encode(NSStringEncoding.UTF8),
            };

            SecStatusCode status = SecStatusCode.ItemNotFound;

            UIApplication.SharedApplication.InvokeOnMainThread(() => {
                status = SecKeyChain.Update(securityRecord, recordUpdates);
            });

            return(status == SecStatusCode.Success);
        }
Пример #31
0
        public void KeyEncryption()
        {
            const int keySize              = 512;
            string    keyIdentifier        = Guid.NewGuid().ToString();
            string    publicKeyIdentifier  = GetPublicKeyIdentifierWithTag(keyIdentifier);
            string    privateKeyIdentifier = GetPrivateKeyIdentifierWithTag(keyIdentifier);

            // Configure parameters for the joint keypair.
            var keyPairAttr = new NSMutableDictionary();

            keyPairAttr[KSec.AttrKeyType]       = KSec.AttrKeyTypeRSA;
            keyPairAttr[KSec.AttrKeySizeInBits] = NSNumber.FromInt32(keySize);

            // Configure parameters for the private key
            var privateKeyAttr = new NSMutableDictionary();

            privateKeyAttr[KSec.AttrIsPermanent]    = NSNumber.FromBoolean(true);
            privateKeyAttr[KSec.AttrApplicationTag] = NSData.FromString(privateKeyIdentifier, NSStringEncoding.UTF8);

            // Configure parameters for the public key
            var publicKeyAttr = new NSMutableDictionary();

            publicKeyAttr[KSec.AttrIsPermanent]    = NSNumber.FromBoolean(true);
            publicKeyAttr[KSec.AttrApplicationTag] = NSData.FromString(publicKeyIdentifier, NSStringEncoding.UTF8);

            // Parent the individual key parameters to the keypair one.
            keyPairAttr[KSec.PublicKeyAttrs]  = publicKeyAttr;
            keyPairAttr[KSec.PrivateKeyAttrs] = privateKeyAttr;

            // Generate the RSA key.
            SecKey        publicKey, privateKey;
            SecStatusCode code = SecKey.GenerateKeyPair(keyPairAttr, out publicKey, out privateKey);

            Verify.Operation(code == SecStatusCode.Success, "status was " + code);

            byte[] plainText = new byte[0]; // when this buffer is non-empty, Encrypt works!
            byte[] cipherText;
            code = publicKey.Encrypt(SecPadding.OAEP, plainText, out cipherText);
            Verify.Operation(code == SecStatusCode.Success, "status was " + code);
        }
Пример #32
0
        public static INativeObject[] QueryAsReference(SecRecord query, int max, out SecStatusCode result)
        {
            if (query == null)
            {
                result = SecStatusCode.Param;
                return(null);
            }

            using (var copy = query.queryDict.MutableCopy()) {
                copy.SetValue(CFBoolean.True.Handle, SecItem.ReturnRef);
                SetLimit(copy, max);

                IntPtr ptr;
                result = SecItem.SecItemCopyMatching(copy.Handle, out ptr);
                if ((result == SecStatusCode.Success) && (ptr != IntPtr.Zero))
                {
                    var array = CFArray.ArrayFromHandle <INativeObject> (ptr, p => {
                        IntPtr cfType = CFType.GetTypeID(p);
                        if (cfType == SecCertificate.GetTypeID())
                        {
                            return(new SecCertificate(p, true));
                        }
                        else if (cfType == SecKey.GetTypeID())
                        {
                            return(new SecKey(p, true));
                        }
                        else if (cfType == SecIdentity.GetTypeID())
                        {
                            return(new SecIdentity(p, true));
                        }
                        else
                        {
                            throw new Exception(String.Format("Unexpected type: 0x{0:x}", cfType));
                        }
                    });
                    return(array);
                }
                return(null);
            }
        }
Пример #33
0
        public static NSData[] QueryAsData(SecRecord query, bool wantPersistentReference, int max, out SecStatusCode status)
        {
            if (query == null)
                throw new ArgumentNullException ("query");

            using (var copy = NSMutableDictionary.FromDictionary (query.queryDict)){
                var n = SetLimit (copy, max);
                copy.LowlevelSetObject (CFBoolean.True.Handle, SecItem.ReturnData);

                IntPtr ptr;
                status = SecItem.SecItemCopyMatching (copy.Handle, out ptr);
                n = null;
                if (status == SecStatusCode.Success){
                    if (max == 1)
                        return new NSData [] { new NSData (ptr) };
                    else
                        return NSArray.ArrayFromHandle<NSData> (ptr);
                }
                return null;
            }
        }
Пример #34
0
        public static NSData QueryAsData(SecRecord query, bool wantPersistentReference, out SecStatusCode status)
        {
            if (query == null)
                throw new ArgumentNullException ("query");

            using (var copy = NSMutableDictionary.FromDictionary (query.queryDict)){
                SetLimit (copy, 1);
                copy.LowlevelSetObject (CFBoolean.True.Handle, SecItem.ReturnData);

                IntPtr ptr;
                status = SecItem.SecItemCopyMatching (copy.Handle, out ptr);
                if (status == SecStatusCode.Success)
                    return new NSData (ptr);
                return null;
            }
        }
Пример #35
0
        public static SecRecord[] QueryAsRecord(SecRecord query, int max, out SecStatusCode result)
        {
            if (query == null)
                throw new ArgumentNullException ("query");

            using (var copy = NSMutableDictionary.FromDictionary (query.queryDict)){
                copy.LowlevelSetObject (CFBoolean.True.Handle, SecItem.ReturnAttributes);
                var n = SetLimit (copy, max);

                IntPtr ptr;
                result = SecItem.SecItemCopyMatching (copy.Handle, out ptr);
                n = null;
                if (result == SecStatusCode.Success){
                    var dicts = NSArray.ArrayFromHandle<NSDictionary> (ptr);
                    var records = new SecRecord [dicts.Length];
                    for (int i = 0; i < dicts.Length; i++)
                        records [i] = new SecRecord (new NSMutableDictionary (dicts [i]));
                    return records;
                }
                return null;
            }
        }
Пример #36
0
        public static object QueryAsConcreteType(SecRecord query, out SecStatusCode result)
        {
            if (query == null){
                result = SecStatusCode.Param;
                return null;
            }

            using (var copy = NSMutableDictionary.FromDictionary (query.queryDict)){
                copy.LowlevelSetObject (CFBoolean.True.Handle, SecItem.ReturnRef);
                SetLimit (copy, 1);

                IntPtr ptr;
                result = SecItem.SecItemCopyMatching (copy.Handle, out ptr);
                if (result == SecStatusCode.Success){
                    int cfType = CFType.GetTypeID (ptr);

                    if (cfType == SecCertificate.GetTypeID ())
                        return new SecCertificate (ptr, true);
                    else if (cfType == SecKey.GetTypeID ())
                        return new SecKey (ptr, true);
                    else if (cfType == SecIdentity.GetTypeID ())
                        return new SecIdentity (ptr, true);
                    else
                        throw new Exception (String.Format ("Unexpected type: 0x{0:x}", cfType));
                }
                return null;
            }
        }
Пример #37
0
        public static SecRecord QueryAsRecord(SecRecord query, out SecStatusCode result)
        {
            if (query == null)
                throw new ArgumentNullException ("query");

            using (var copy = NSMutableDictionary.FromDictionary (query.queryDict)){
                SetLimit (copy, 1);
                copy.LowlevelSetObject (CFBoolean.True.Handle, SecItem.ReturnAttributes);
                copy.LowlevelSetObject (CFBoolean.True.Handle, SecItem.ReturnData);
                IntPtr ptr;
                result = SecItem.SecItemCopyMatching (copy.Handle, out ptr);
                if (result == SecStatusCode.Success)
                    return new SecRecord (new NSMutableDictionary (new NSDictionary (ptr)));
                return null;
            }
        }
Пример #38
0
 static string ToMessage(SecStatusCode code)
 {
     switch (code){
     case SecStatusCode.Success:
     case SecStatusCode.Unimplemented:
     case SecStatusCode.Param:
     case SecStatusCode.Allocate:
     case SecStatusCode.NotAvailable:
     case SecStatusCode.DuplicateItem:
     case SecStatusCode.ItemNotFound:
     case SecStatusCode.InteractionNotAllowed:
     case SecStatusCode.Decode:
         return code.ToString ();
     }
     return String.Format ("Unknown error: 0x{0:x}", code);
 }
Пример #39
0
 public SecurityException(SecStatusCode code)
     : base(ToMessage (code))
 {
 }
Пример #40
0
		public static NSData [] QueryAsData (SecRecord query, bool wantPersistentReference, int max, out SecStatusCode status)
		{
			if (query == null)
				throw new ArgumentNullException ("query");

			using (var copy = NSMutableDictionary.FromDictionary (query.queryDict)){
				var n = SetLimit (copy, max);
				copy.LowlevelSetObject (CFBoolean.True.Handle, SecItem.ReturnData);

				IntPtr ptr;
				status = SecItem.SecItemCopyMatching (copy.Handle, out ptr);
				n = null;
				if (status == SecStatusCode.Success){
					if (max == 1)
						return new NSData [] { new NSData (ptr, false) };

					var array = new NSArray (ptr);
					var records = new NSData [array.Count];
					for (uint i = 0; i < records.Length; i++)
						records [i] = new NSData (array.ValueAt (i), false);
					return records;
				}
				return null;
			}
		}
 /// <summary>
 /// Retreives record from the store
 /// </summary>
 /// <returns>The record.</returns>
 /// <param name="key">Key.</param>
 /// <param name="ssc">Ssc.</param>
 private SecRecord GetRecord(string key, out SecStatusCode ssc)
 {
     // create an instance of the record to query
     var sr = new SecRecord(SecKind.GenericPassword);
     sr.Account = key;
     return SecKeyChain.QueryAsRecord(sr, out ssc);
 }