Example #1
0
        private void SendRequestAndExpect(String expected)
        {
            Thread.Sleep(100);
            Request request = Request.NewGet();

            request.SetUri("coap://localhost:" + _serverPort + "/ress");
            String response = request.Send().WaitForResponse(1000).PayloadString;

            Assert.AreEqual(expected, response);
        }
Example #2
0
        private static void KdcJoin(string[] cmds)
        {
            if (cmds.Length != 3)
            {
                Console.WriteLine("Incorrect number of parameters");
                return;
            }

            if ((Program._CurrentOscore == null) || (Program._CurrentOscore.UserData == null) ||
                !(Program._CurrentOscore.UserData is GroupData))
            {
                Console.WriteLine("Can't use the current OSCORE context");
                return;
            }

            GroupData groupData = (GroupData)Program._CurrentOscore.UserData;

            OneKey signKey = OneKey.GenerateKey(null, GeneralValues.KeyType_OKP, "Ed25519");

            byte[] signature = Signer.Sign(groupData.SignNonce, groupData.SignInfo[0], signKey);

            CBORObject join = CBORObject.NewMap();
            CBORObject j2   = CBORObject.NewMap();

            j2.Add(Confirmation.ConfirmationIds.COSE_Key, signKey.AsCBOR());

            join.Add("type", 1);
            join.Add("client_cred", j2);
            join.Add("client_cred_verify", signature);

            Request request = new Request(Method.POST)
            {
                URI           = new Uri(cmds[1]),
                Payload       = @join.EncodeToBytes(),
                ContentType   = MediaType.ApplicationCbor,
                OscoreContext = Program._CurrentOscore
            };


            request.Send();
            Response response = request.WaitForResponse();

            if (response == null || response.StatusCode != StatusCode.Changed)
            {
                Console.WriteLine("Error in the response");
                return;
            }

            CBORObject respBody = CBORObject.DecodeFromBytes(response.Payload);
        }
Example #3
0
 /// <summary>
 /// Performs a CoAP ping and gives up after the given number of milliseconds.
 /// </summary>
 /// <param name="timeout">the time to wait for a pong in milliseconds</param>
 /// <returns>success of the ping</returns>
 public Boolean Ping(Int32 timeout)
 {
     try {
         Request request = new Request(Code.Empty, true)
         {
             Token = CoapConstants.EmptyToken,
             URI   = Uri
         };
         request.Send().WaitForResponse(timeout);
         return(request.IsRejected);
     }
     catch (System.Threading.ThreadInterruptedException) {
         /* ignore */
     }
     return(false);
 }
        private void TestSimpleNONGet(Uri uri)
        {
            Console.WriteLine("Test simple NON GET to " + uri);

            Request request = Request.NewGet();

            request.URI  = uri;
            request.Type = MessageType.NON;
            Response response = request.Send(_clientEndpoint).WaitForResponse(1000);

            Console.WriteLine("Client received response " + response.PayloadString + " with msg type " + response.Type);
            Assert.AreEqual(_currentResponseText, response.PayloadString);
            Assert.AreEqual(MessageType.NON, response.Type);

            _serverSurveillant.WaitUntilDeduplicatorShouldBeEmpty();
            _serverSurveillant.AssertMapsEmpty();
            _clientSurveillant.AssertMapsEmpty();
        }
Example #5
0
        /// <summary>
        /// Send a message to the resource being observed that we want to cancel
        /// the observation.
        /// </summary>
        public void ProactiveCancel()
        {
            Request cancel = Request.NewGet();

            // copy options, but set Observe to cancel
            cancel.SetOptions(Request.GetOptions());
            cancel.MarkObserveCancel();
            // use same Token
            cancel.Token       = Request.Token;
            cancel.Destination = Request.Destination;

            // dispatch final response to the same message observers
            cancel.CopyEventHandler(Request);

            cancel.Send(_endpoint);
            // cancel old ongoing request
            Request.IsCancelled = true;
            Canceled            = true;
        }
Example #6
0
        public void UpdateETags(byte[][] eTags)
        {
            Request newRequest = Request.NewGet();

            //  Copy over the options
            newRequest.SetOptions(Request.GetOptions());
            newRequest.ClearETags();
            foreach (byte[] tag in eTags)
            {
                newRequest.AddETag(tag);
            }

            newRequest.Token       = Request.Token;
            newRequest.Destination = Request.Destination;
            newRequest.CopyEventHandler(Request);
            newRequest.Reregistering  += OnReregister;
            newRequest.ObserveRelation = this;

            newRequest.Send(_endpoint);
            Request = newRequest;
        }
        private void ExecutePOSTRequest()
        {
            String payload = "--no payload--";

            try
            {
                Request request = new Request(Method.POST);
                request.SetUri("coap://localhost:" + _serverPort + "/" + request_short + respond_short);
                if (request_short)
                {
                    request.SetPayload(SHORT_POST_REQUEST);
                }
                else
                {
                    request.SetPayload(LONG_POST_REQUEST);
                }
                request.Send(_clientEndpoint);

                // receive response and check
                Response response = request.WaitForResponse(1000);

                Assert.IsNotNull(response);
                payload = response.PayloadString;

                if (respond_short)
                {
                    Assert.AreEqual(SHORT_POST_RESPONSE, payload);
                }
                else
                {
                    Assert.AreEqual(LONG_POST_RESPONSE, payload);
                }
            }
            finally
            {
                Thread.Sleep(100); // Quickly wait until last ACKs arrive
            }
        }
Example #8
0
        /// <summary>
        /// Discovers remote resources.
        /// </summary>
        /// <param name="uriPath">path to be queried</param>
        /// <param name="query">the query to filter resources</param>
        /// <param name="mediaType">format to use - defaults to any</param>
        /// <returns>the descoverd <see cref="WebLink"/> representing remote resources, or null if no response</returns>
        public IEnumerable <WebLink> Discover(string uriPath, String query, int mediaType = MediaType.Undefined)
        {
            Request discover = Prepare(Request.NewGet());

            discover.ClearUriPath().ClearUriQuery().UriPath = uriPath;
            if (!String.IsNullOrEmpty(query))
            {
                discover.UriQuery = query;
            }
            if (mediaType != MediaType.Undefined)
            {
                discover.Accept = mediaType;
            }

            Response links = discover.Send().WaitForResponse(Timeout);

            if (links == null)
            {
                // if no response, return null (e.g., timeout)
                return(null);
            }

            switch (links.ContentType)
            {
            case MediaType.ApplicationLinkFormat:
                return(LinkFormat.Parse(links.PayloadString));

            case MediaType.ApplicationLinkFormatCbor:
                return(LinkFormat.ParseCbor(links.Payload));

            case MediaType.ApplicationLinkFormatJson:
                return(LinkFormat.ParseJson(links.PayloadString));

            default:
                return(_EmptyLinks);
            }
        }
Example #9
0
        public static void KdcToken(string[] cmds)
        {
            if (cmds.Length != 7)
            {
                Console.WriteLine("Incorrect argument Count: KdcToken <AS> <Audience> <Scope> <OscoreKeys> <Kdc> <Store>");
                return;
            }

            Request request = new Request(Method.POST)
            {
                URI = new Uri(cmds[1])
            };

            Oauth.Request oRequest = new Oauth.Request(Oauth.Request.GrantType_ClientToken)
            {
                Audience = cmds[2],
                Scope    = CBORObject.FromObject(cmds[3])
            };

            request.Payload       = oRequest.EncodeToBytes();
            request.ContentType   = MediaType.ApplicationAceCbor;
            request.OscoreContext = Program._OscoreKeys[cmds[4]];

            request.Send();
            Response response = request.WaitForResponse();

            if (response.StatusCode != StatusCode.Created)
            {
                Console.WriteLine($"Error with response from the AS - Code is {response.StatusCode}");
                return;
            }

            Oauth.Response oResponse = Oauth.Response.FromCBOR(response.Payload);

            Confirmation cnf = oResponse.Confirmation;

            byte[][] oscoreSalts = new byte[2][];

            request = new Request(Method.POST)
            {
                URI = new Uri(cmds[5])
            };

            CBORObject kdcRequest = CBORObject.NewMap();

            kdcRequest.Add(Oauth_Parameter.Access_Token.Key, oResponse.Token);
            if (cnf.AsCBOR.ContainsKey(CBORObject.FromObject(Confirmation.ConfirmationIds.COSE_OSCORE)))
            {
                oscoreSalts[0] = SecureRandom.GetNextBytes(new SecureRandom(), 8);
                kdcRequest.Add(Oauth_Parameter.CNonce.Key, CBORObject.FromObject(oscoreSalts[0]));
                request.ContentFormat = MediaType.ApplicationAceCbor;
            }

            request.Payload = kdcRequest.EncodeToBytes();


            request.Send();
            response = request.WaitForResponse();

            if (response.StatusCode != StatusCode.Created)
            {
                Console.WriteLine("Failure");
                return;
            }

            Console.WriteLine("Successfully posted to KDC");
            CBORObject cborResponse = CBORObject.DecodeFromBytes(response.Payload);

            GroupData groupData = new GroupData();

            if (cborResponse.ContainsKey(Oauth_Parameter.CNonce.Key))
            {
                groupData.ServerNonce = cborResponse[Oauth_Parameter.CNonce.Key].GetByteString();
            }

            if (cborResponse.ContainsKey("sign_info"))
            {
                groupData.SignInfo = CBORObject.DecodeFromBytes(cborResponse["sign_info"].GetByteString());
            }
            else
            {
                groupData.SignInfo = CBORObject.DecodeFromBytes(new byte[] { 0x83, 0x27, 0x06, 0x82, 0x01, 0x06 });
            }

            if (cborResponse.ContainsKey("pub_key_enc"))
            {
                groupData.PubKeyEnc = cborResponse["pub_key_enc"].GetByteString();
            }

            groupData.SignNonce = cborResponse["SignNonce"].GetByteString();

            if (cnf.AsCBOR.ContainsKey(CBORObject.FromObject(Confirmation.ConfirmationIds.COSE_OSCORE)))
            {
                CBORObject oscoreContext = cnf.AsCBOR[CBORObject.FromObject(Confirmation.ConfirmationIds.COSE_OSCORE)];

                byte[] salt = new byte[0];
                if (oscoreContext.ContainsKey(CBORObject.FromObject(6)))
                {
                    salt = oscoreContext[CBORObject.FromObject(CBORObject.FromObject(6))].GetByteString();
                }
                CBORObject alg = null;
                if (oscoreContext.ContainsKey(CBORObject.FromObject(5)))
                {
                    alg = oscoreContext[CBORObject.FromObject(5)];
                }
                CBORObject kdf = null;
                if (oscoreContext.ContainsKey(CBORObject.FromObject(4)))
                {
                    kdf = oscoreContext[CBORObject.FromObject(4)];
                }
                byte[] keyContext = null;
                if (oscoreContext.ContainsKey(CBORObject.FromObject(7)))
                {
                    keyContext = oscoreContext[CBORObject.FromObject(7)].GetByteString();
                }

                oscoreSalts[1] = cborResponse[Oauth_Parameter.CNonce.Key].GetByteString();

                byte[] newSalt = new byte[salt.Length + oscoreSalts[0].Length + oscoreSalts[1].Length];
                Array.Copy(salt, newSalt, salt.Length);
                Array.Copy(oscoreSalts[0], 0, newSalt, salt.Length, oscoreSalts[0].Length);
                Array.Copy(oscoreSalts[1], 0, newSalt, salt.Length + oscoreSalts[0].Length, oscoreSalts[1].Length);

                SecurityContext oscoapContext = SecurityContext.DeriveContext(
                    oscoreContext[CBORObject.FromObject(1)].GetByteString(), keyContext,
                    oscoreContext[CBORObject.FromObject(2)].GetByteString(),
                    oscoreContext[CBORObject.FromObject(3)].GetByteString(),
                    newSalt, alg, kdf);
                oscoapContext.UserData = groupData;

                Program._OscoreKeys.Add(cmds[6], oscoapContext);
            }
            else if (cnf.AsCBOR.ContainsKey(CBORObject.FromObject(Confirmation.ConfirmationIds.COSE_Key)))
            {
                TlsKeyPair tlsKey = new TlsKeyPair(cnf.Key);
                tlsKey.PrivateKey.UserData = groupData;

                Program._TlsKeys.Add(cmds[5], new TlsKeyPair(cnf.Key));
            }
            else
            {
                Console.WriteLine("Don't know how to get the key");
            }
        }