Esempio n. 1
0
        /// <summary>
        /// Basic post request.
        /// </summary>
        /// <returns>The post response.</returns>
        /// <param name="url">URL.</param>
        /// <param name="args">Arguments.</param>
        /// <param name="headers">Headers.</param>
        public static string BasicPostRequest(string url, Dictionary <string, string> args, Dictionary <string, string> headers = null)
        {
            NSString urlString = (NSString)url;

            NSMutableUrlRequest request = new NSMutableUrlRequest();

            request.Url        = new NSUrl(urlString);
            request.HttpMethod = "POST";
            string   boundary    = "---------------------------14737809831466499882746641449";
            NSString contentType = new NSString(string.Format("multipart/form-data; boundary={0}", boundary));

            var keys = new List <object> {
                "Content-Type"
            };
            var objects = new List <object> {
                contentType
            };

            if (headers != null)
            {
                foreach (KeyValuePair <string, string> kvp in headers)
                {
                    keys.Add(kvp.Key);
                    objects.Add(kvp.Value);
                }
            }
            var dictionary = NSDictionary.FromObjectsAndKeys(objects.ToArray(), keys.ToArray());

            request.Headers = dictionary;

            NSMutableData body = new NSMutableData();

            foreach (KeyValuePair <string, string> kvp in args)
            {
                body.AppendData(NSData.FromString(new NSString(string.Format("\r\n--{0}\r\n", boundary))));
                body.AppendData(NSData.FromString(new NSString(string.Format("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n", kvp.Key))));
                body.AppendData(NSData.FromString(new NSString(kvp.Value)));
                body.AppendData(NSData.FromString(new NSString(string.Format("\r\n--{0}--\r\n", boundary))));
            }

            request.Body = body;

            NSUrlResponse resp;
            NSError       err;
            NSData        returnData = NSUrlConnection.SendSynchronousRequest(request, out resp, out err);

            return(NSString.FromData(returnData, NSStringEncoding.UTF8).ToString());
        }
Esempio n. 2
0
 public override void ReceivedData(NSUrlConnection connection, NSData data)
 {
     if (_data == null)
     {
         _data = new NSMutableData();
     }
     _data.AppendData(data);
 }
Esempio n. 3
0
 public virtual void ReceivedData(NSUrlConnection connection, NSData data)
 {
     if (connectionData == null)
     {
         connectionData = new NSMutableData();
         connectionData.AppendData(data);
     }
     else
     {
         connectionData.AppendData(data);
     }
 }
Esempio n. 4
0
 public override void DidReceiveData(NSUrlSession session, NSUrlSessionDataTask dataTask, NSData data)
 {
     System.Diagnostics.Debug.WriteLine("DidReceiveData...");
     if (uploadData.ContainsKey(dataTask.TaskIdentifier))
     {
         uploadData[dataTask.TaskIdentifier].AppendData(data);
     }
     else
     {
         var uData = new NSMutableData();
         uData.AppendData(data);
         uploadData.Add(dataTask.TaskIdentifier, uData);
     }
     // _data.AppendData(data);
 }
Esempio n. 5
0
 public override void ReceivedData(NSUrlConnection connection, NSData data)
 {
     buffer.AppendData(data);
 }
 public override void ReceivedData(NSUrlConnection connection, NSData d)
 {
     data.AppendData(d);
 }
Esempio n. 7
0
 public override void DidReceiveData(NSUrlSession session, NSUrlSessionDataTask dataTask, NSData byteData)
 {
     // 接收时可能调用多次
     _dataResponse.AppendData(byteData);
 }
        private byte[] GenerateKeyPairCore(string name)
        {
            using (var parameters = new SecRecord(SecKind.Key))
            {
                parameters.AccessControl = new SecAccessControl(SecAccessible.WhenPasscodeSetThisDeviceOnly, SecAccessControlCreateFlags.TouchIDCurrentSet | SecAccessControlCreateFlags.PrivateKeyUsage);
                parameters.KeyType       = SecKeyType.EC;
                parameters.KeySizeInBits = 256;
                parameters.TokenID       = SecTokenID.SecureEnclave;

                var privateKeyParameters = new NSMutableDictionary();
                privateKeyParameters.Add(kSecAttrApplicationTag, new NSString($"{name}_priv"));
                privateKeyParameters.Add(kSecAttrIsPermanent, NSNumber.FromBoolean(true));

                var publicKeyParameters = new NSMutableDictionary();
                publicKeyParameters.Add(kSecAttrApplicationTag, new NSString($"{name}_pub"));
                publicKeyParameters.Add(kSecAttrIsPermanent, NSNumber.FromBoolean(false));

                var mutableDictionary = (NSMutableDictionary)parameters.ToDictionary();
                mutableDictionary.Add(kSecPrivateKeyAttrs, new NSDictionary(privateKeyParameters));
                mutableDictionary.Add(kSecPublicKeyAttrs, new NSDictionary(publicKeyParameters));

                var result = SecKey.GenerateKeyPair((NSDictionary)mutableDictionary, out var publicKey, out var privateKey);

                if (result == SecStatusCode.Success)
                {
                    privateKey.Dispose();

                    using (var record = new SecRecord(SecKind.Key))
                    {
                        record.KeyClass    = SecKeyClass.Public;
                        record.KeyType     = SecKeyType.EC;
                        record.IsPermanent = false;
                        record.Label       = "Public Key";
                        record.SetValueRef(publicKey);

                        var dict = (NSMutableDictionary)record.ToDictionary();
                        dict.Add(kSecReturnData, NSNumber.FromBoolean(true));

                        var status = SecItemAdd(dict.Handle, out var publicKeyDataPtr);

                        publicKey.Dispose();

                        if (status == SecStatusCode.Success)
                        {
                            var publicKeyData = ObjCRuntime.Runtime.GetINativeObject <NSData>(publicKeyDataPtr, true);

                            if (publicKeyData != null)
                            {
                                // Apple's SecurityFramework uses raw keys which need to be wrapped in proper ASN.1 for outside consumption
                                // See : https://forums.developer.apple.com/thread/8030

                                var header = NSData.FromArray(new byte[] { 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01,
                                                                           0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00 });

                                var buffer = new NSMutableData(header.Length + publicKeyData.Length);
                                buffer.AppendData(header);
                                buffer.AppendData(publicKeyData);

                                return(buffer.ToArray());
                            }
                        }

                        return(null);
                    }
                }
                else
                {
                    throw new SecurityException(result);
                }
            }
        }
        /// <summary>
        /// Upload function using the native functionality of Mac
        /// </summary>
        /// <returns>Response string</returns>
        /// <param name="url">URL.</param>
        /// <param name="paramFileBytes">Parameter file bytes.</param>
        /// <param name="fileFormName">File form name.</param>
        /// <param name="args">Arguments.</param>
        private static string UploadNative(string url, byte [] paramFileBytes, string fileFormName, Dictionary <string, string> args = null, Dictionary <string, string> headers = null, bool onlyData = false)
        {
            NSData   actualFile = NSData.FromArray(paramFileBytes);
            NSString urlString  = (NSString)url;
            //we're gonna send byte data

            NSMutableUrlRequest request = new NSMutableUrlRequest();

            request.Url        = new NSUrl(urlString);
            request.HttpMethod = "POST";
            string   boundary    = "---------------------------14737809831466499882746641449";
            NSString contentType = new NSString(string.Format("multipart/form-data; boundary={0}", boundary));

            var keys = new List <object> {
                "Content-Type"
            };
            var objects = new List <object> {
                contentType
            };

            foreach (KeyValuePair <string, string> kvp in headers)
            {
                if (!keys.Contains(kvp.Key))
                {
                    keys.Add(kvp.Key);
                    objects.Add(kvp.Value);
                }
                else
                {
                    for (int i = 0; i < keys.Count; i++)
                    {
                        if ((string)keys [i] == kvp.Key)
                        {
                            objects [i] = kvp.Value;
                        }
                    }
                }
            }
            var dictionary = NSDictionary.FromObjectsAndKeys(objects.ToArray(), keys.ToArray());

            request.Headers = dictionary;

            NSMutableData body = new NSMutableData();

            if (!onlyData)
            {
                body.AppendData(NSData.FromString(new NSString(string.Format("\r\n--{0}\r\n", boundary))));
                body.AppendData(NSData.FromString(new NSString(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{0}.png\"\r\n", fileFormName))));
                body.AppendData(NSData.FromString(new NSString("Content-Type: application/octet-stream\r\n\r\n")));
            }
            body.AppendData(actualFile);
            if (!onlyData)
            {
                body.AppendData(NSData.FromString(new NSString(string.Format("\r\n--{0}--\r\n", boundary))));

                foreach (KeyValuePair <string, string> kvp in args)
                {
                    body.AppendData(NSData.FromString(new NSString(string.Format("\r\n--{0}\r\n", boundary))));
                    body.AppendData(NSData.FromString(new NSString(string.Format("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n", kvp.Key))));
                    body.AppendData(NSData.FromString(new NSString(kvp.Value)));
                    body.AppendData(NSData.FromString(new NSString(string.Format("\r\n--{0}--\r\n", boundary))));
                }
            }
            //Attach body
            request.Body = body;

            NSUrlResponse resp;
            NSError       err;
            NSData        returnData = NSUrlConnection.SendSynchronousRequest(request, out resp, out err);

            return(NSString.FromData(returnData, NSStringEncoding.UTF8).ToString());
        }