{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/comments/62936345","id":62936345,"diff_hunk":"@@ -0,0 +1,347 @@\n+﻿// Licensed to the .NET Foundation under one or more agreements.\n+// The .NET Foundation licenses this file to you under the MIT license.\n+// See the LICENSE file in the project root for more information.\n+\n+//#define DEBUG_IMPORT_EXPORT\n+\n+using Xunit;\n+\n+namespace System.Security.Cryptography.EcDsa.Tests\n+{\n+    public class ECDsaImportExportTests : ECDsaTestsBase\n+    {\n+        [Theory, MemberData(nameof(TestCurvesFull))]\n+        public void TestNamedCurves(CurveDef curveDef)\n+        {\n+            using (ECDsa ec1 = ECDsaFactory.Create(curveDef.Curve))\n+            {\n+                ECParameters param1 = ec1.ExportParameters(curveDef.IncludePrivate);\n+#if DEBUG_IMPORT_EXPORT\n+                OutputCurveForDebugging(\"1\", param1);\n+#endif\n+                VerifyNamedCurve(param1, ec1, curveDef.KeySize, curveDef.IncludePrivate);\n+\n+                using (ECDsa ec2 = ECDsaFactory.Create())\n+                {\n+                    ec2.ImportParameters(param1);\n+                    ECParameters param2 = ec2.ExportParameters(curveDef.IncludePrivate);\n+#if DEBUG_IMPORT_EXPORT\n+                    OutputCurveForDebugging(\"2\", param2);\n+#endif\n+                    VerifyNamedCurve(param2, ec2, curveDef.KeySize, curveDef.IncludePrivate);\n+\n+                    IsEqual(param1, param2);\n+                }\n+            }\n+        }\n+\n+        [Theory, MemberData(nameof(TestInvalidCurves))]\n+        public void TestNamedCurvesNegative(CurveDef curveDef)\n+        {\n+            // An exception may be thrown during Create() if the Oid is bad, or later during native calls\n+            Assert.Throws<PlatformNotSupportedException>(() => ECDsaFactory.Create(curveDef.Curve).ExportParameters(false));\n+        }\n+\n+        [ConditionalTheory(nameof(ECExplicitCurvesSupported)), MemberData(nameof(TestCurvesFull))]\n+        public void TestExplicitCurves(CurveDef curveDef)\n+        {\n+            using (ECDsa ec1 = ECDsaFactory.Create(curveDef.Curve))\n+            {\n+                ECParameters param1 = ec1.ExportExplicitParameters(curveDef.IncludePrivate);\n+#if DEBUG_IMPORT_EXPORT\n+                OutputCurveForDebugging(\"1\", param1);\n+#endif\n+                VerifyExplicitCurve(param1, ec1, curveDef);\n+\n+                using (ECDsa ec2 = ECDsaFactory.Create())\n+                {\n+                    ec2.ImportParameters(param1);\n+                    ECParameters param2 = ec2.ExportExplicitParameters(curveDef.IncludePrivate);\n+#if DEBUG_IMPORT_EXPORT\n+                    OutputCurveForDebugging(\"2\", param2);\n+#endif\n+                    VerifyExplicitCurve(param1, ec1, curveDef);\n+\n+                    IsEqual(param1, param2);\n+                }\n+            }\n+        }\n+\n+        [ConditionalTheory(nameof(ECExplicitCurvesSupported)), MemberData(nameof(TestCurves))]\n+        public void TestExplicitCurvesSignVerify(CurveDef curveDef)\n+        {\n+            using (ECDsa ec1 = ECDsaFactory.Create(curveDef.Curve))\n+            {\n+                byte[] data = new byte[0x10];\n+                byte[] sig1 = ec1.SignData(data, 0, data.Length, HashAlgorithmName.SHA1);\n+\n+                bool verified;\n+                verified = ec1.VerifyData(data, sig1, HashAlgorithmName.SHA1);\n+                Assert.True(verified);\n+\n+                using (ECDsa ec2 = ECDsaFactory.Create())\n+                {\n+                    ec2.ImportParameters(ec1.ExportExplicitParameters(true));\n+                    Assert.Equal(ec1.KeySize, ec2.KeySize);\n+\n+                    byte[] sig2 = ec2.SignData(data, 0, data.Length, HashAlgorithmName.SHA1);\n+                    verified = ec2.VerifyData(data, sig2, HashAlgorithmName.SHA1);\n+                    Assert.True(verified);\n+\n+                    // Verify key is compatible other signature\n+                    verified = ec2.VerifyData(data, sig1, HashAlgorithmName.SHA1);\n+                    Assert.True(verified);\n+                    verified = ec1.VerifyData(data, sig2, HashAlgorithmName.SHA1);\n+                    Assert.True(verified);\n+\n+                    // Verify with no private key\n+                    using (ECDsa ec3 = ECDsaFactory.Create())\n+                    {\n+                        ec3.ImportParameters(ec2.ExportExplicitParameters(false));\n+                        Assert.Equal(ec2.KeySize, ec3.KeySize);\n+                        verified = ec3.VerifyData(data, sig1, HashAlgorithmName.SHA1);\n+                        Assert.True(verified);\n+                    }\n+                }\n+\n+                // Ensure negative result\n+                unchecked\n+                {\n+                    sig1[sig1.Length - 1]++;\n+                }\n+                verified = ec1.VerifyData(data, sig1, HashAlgorithmName.SHA1);\n+                Assert.False(verified);\n+            }\n+        }\n+\n+        [Theory, MemberData(nameof(TestInvalidCurves))]\n+        public void TestExplicitCurvesNegative(CurveDef curveDef)\n+        {\n+            // An exception may be thrown during Create() if the Oid is bad, or later during native calls\n+            Assert.Throws<PlatformNotSupportedException>(() => ECDsaFactory.Create(curveDef.Curve).ExportExplicitParameters(false));\n+        }\n+\n+        [Fact]\n+        public void TestNamedCurveNegative()\n+        {\n+            Assert.Throws<ArgumentNullException>(() => ECCurve.CreateFromFriendlyName(null));\n+            Assert.Throws<ArgumentNullException>(() => ECCurve.CreateFromValue(null));\n+            Assert.Throws<ArgumentException>(() => ECCurve.CreateFromFriendlyName(\"\"));\n+            Assert.Throws<PlatformNotSupportedException>(() => ECDsaFactory.Create(ECCurve.CreateFromFriendlyName(\"Invalid\")).ExportExplicitParameters(false));\n+            Assert.Throws<ArgumentException>(() => ECCurve.CreateFromValue(\"\"));\n+            Assert.Throws<PlatformNotSupportedException>(() => ECDsaFactory.Create(ECCurve.CreateFromValue(\"Invalid\")).ExportExplicitParameters(false));\n+            Assert.Throws<ArgumentException>(() => ECCurve.CreateFromOid(new Oid(null, null)));\n+            Assert.Throws<ArgumentException>(() => ECCurve.CreateFromOid(new Oid(\"\", \"\")));\n+        }\n+\n+        [Fact]\n+        public void TestKeySizeCreateKey()\n+        {\n+            using (ECDsa ec = ECDsaFactory.Create(ECCurve.NamedCurves.nistP256))\n+            {\n+                // Ensure we obtain the create the handle when asking for KeySize\n+                Assert.Equal(256, ec.KeySize);\n+                ec.Exercise();\n+\n+                ec.KeySize = 521; //nistP521\n+                Assert.Equal(521, ec.KeySize);\n+                ec.Exercise();\n+\n+                Assert.ThrowsAny<CryptographicException>(() => ec.KeySize = 9999);\n+            }\n+        }\n+\n+        [ConditionalFact(nameof(ECExplicitCurvesSupported))]\n+        public void TestExplicitImportValidationNegative()\n+        {\n+            unchecked\n+            {\n+                using (ECDsa ec = ECDsaFactory.Create())\n+                {\n+                    ECParameters parameters = ECDsaTestData.GetNistP256ExplicitTestData();\n+                    Assert.True(parameters.Curve.IsPrime);\n+                    var q = parameters.Q;\n+                    var c = parameters.Curve;\n+                    TestExplicitImportValidation(ec, ref q, ref c, true);\n+\n+                    q.X = null; TestExplicitImportValidation(ec, ref q, ref c);\n+                    q.X = new byte[] { }; TestExplicitImportValidation(ec, ref q, ref c);\n+                    q.X = new byte[1] { 0x10 }; TestExplicitImportValidation(ec, ref q, ref c);\n+                    --q.X[0]; TestExplicitImportValidation(ec, ref q, ref c);\n+\n+                    q.Y = null; TestExplicitImportValidation(ec, ref q, ref c);\n+                    q.Y = new byte[] { }; TestExplicitImportValidation(ec, ref q, ref c);\n+                    q.Y = new byte[1] { 0x10 }; TestExplicitImportValidation(ec, ref q, ref c);\n+                    --q.Y[0]; TestExplicitImportValidation(ec, ref q, ref c);\n+\n+                    c.A = null; TestExplicitImportValidation(ec, ref q, ref c);\n+                    c.A = new byte[] { }; TestExplicitImportValidation(ec, ref q, ref c);\n+                    c.A = new byte[1] { 0x10 }; TestExplicitImportValidation(ec, ref q, ref c);\n+                    --c.A[0]; TestExplicitImportValidation(ec, ref q, ref c);\n+\n+                    c.B = null; TestExplicitImportValidation(ec, ref q, ref c);\n+                    c.B = new byte[] { }; TestExplicitImportValidation(ec, ref q, ref c);\n+                    c.B = new byte[1] { 0x10 }; TestExplicitImportValidation(ec, ref q, ref c);\n+                    --c.B[0]; TestExplicitImportValidation(ec, ref q, ref c);\n+\n+                    c.Order = null; TestExplicitImportValidation(ec, ref q, ref c);\n+                    c.Order = new byte[] { }; TestExplicitImportValidation(ec, ref q, ref c);\n+\n+                    c.Prime = null; TestExplicitImportValidation(ec, ref q, ref c);\n+                    c.Prime = new byte[] { }; TestExplicitImportValidation(ec, ref q, ref c);\n+                    c.Prime = new byte[1] { 0x10 }; TestExplicitImportValidation(ec, ref q, ref c);\n+                    --c.Prime[0]; TestExplicitImportValidation(ec, ref q, ref c);\n+                }\n+            }\n+        }\n+\n+        private void TestExplicitImportValidation(ECDsa ec, ref ECPoint q, ref ECCurve c, bool success = false)\n+        {\n+            Assert.True(c.IsPrime);\n+            ECParameters parameters = new ECParameters();\n+            parameters.Q = q;\n+            parameters.Curve = c;\n+            if (success)\n+            {\n+                ec.ImportParameters(parameters);\n+            }\n+            else\n+            {\n+                Assert.ThrowsAny<CryptographicException>(() => ec.ImportParameters(parameters));\n+            }\n+\n+            // Reset the values for the next test\n+            parameters = ECDsaTestData.GetNistP256ExplicitTestData();\n+            q = parameters.Q;\n+            c = parameters.Curve;\n+        }\n+\n+        [ConditionalFact(nameof(ECDsa224Available))]\n+        public void TestNamedImportValidationNegative()\n+        {\n+            unchecked\n+            {\n+                using(ECDsa ec = ECDsaFactory.Create())\n+                {\n+                    ECParameters parameters = ECDsaTestData.GetNistP224KeyTestData();\n+                    Assert.True(parameters.Curve.IsNamed);\n+                    var q = parameters.Q;\n+                    var c = parameters.Curve;\n+                    TestNamedImportValidation(ec, ref q, ref c, true);\n+\n+                    q.X = null; TestNamedImportValidation(ec, ref q, ref c);\n+                    q.X = new byte[] { }; TestNamedImportValidation(ec, ref q, ref c);\n+                    q.X = new byte[1] { 0x10 }; TestNamedImportValidation(ec, ref q, ref c);\n+                    q.X[0]--;  TestNamedImportValidation(ec, ref q, ref c);\n+\n+                    q.Y = null; TestNamedImportValidation(ec, ref q, ref c);\n+                    q.Y = new byte[] { }; TestNamedImportValidation(ec, ref q, ref c);\n+                    q.Y = new byte[1] { 0x10 }; TestNamedImportValidation(ec, ref q, ref c);\n+                    q.Y[0]--; TestNamedImportValidation(ec, ref q, ref c);\n+\n+                    parameters.Curve = ECCurve.CreateFromOid(new Oid(\"Invalid\", \"Invalid\"));\n+                    // Ideally this throws PlatformNotSupportedException, but underlying code does not know\n+                    //  curve name is not supported\n+                    Assert.ThrowsAny<CryptographicException>(() => ec.ImportParameters(parameters));\n+                }\n+            }\n+        }\n+\n+        [ConditionalFact(nameof(ECExplicitCurvesSupported))]\n+        public void TestGeneralExportWithExplicitParameters()\n+        {\n+            using (ECDsa ecdsa = ECDsaFactory.Create())\n+            {\n+                ECParameters param = ECDsaTestData.GetNistP256ExplicitTestData();\n+                param.Validate();\n+                ecdsa.ImportParameters(param);\n+                Assert.True(param.Curve.IsExplicit);\n+\n+                param = ecdsa.ExportParameters(false);\n+                param.Validate();\n+\n+                // We should have explicit values, not named, as this curve has no name.\n+                Assert.True(param.Curve.IsExplicit);\n+            }\n+        }\n+\n+        private void TestNamedImportValidation(ECDsa ec, ref ECPoint q, ref ECCurve c, bool success = false)\n+        {\n+            ECParameters p = new ECParameters();\n+            p.Q = q;\n+            p.Curve = c;\n+            if (success)\n+            {\n+                ec.ImportParameters(p);\n+            }\n+            else\n+            {\n+                Assert.ThrowsAny<CryptographicException>(() => ec.ImportParameters(p));\n+            }\n+            p = ECDsaTestData.GetNistP224KeyTestData();\n+            q = p.Q;\n+            c = p.Curve;\n+        }\n+\n+        [ConditionalFact(nameof(ECDsa224Available))]\n+        public void TestExplicitKey()\n+        {\n+            using (ECDsa ec = ECDsaFactory.Create())\n+            {\n+                ECParameters parameters = ECDsaTestData.GetNistP224KeyTestData();\n+                ec.ImportParameters(parameters);\n+                VerifyNamedCurve(parameters, ec, 224, true);","path":"src/Common/tests/System/Security/Cryptography/AlgorithmImplementations/ECDsa/ECDsaImportExport.cs","position":243,"original_position":293,"commit_id":"d6fe0e45187a8dea09e4edbcfa68b48cbe2a123c","original_commit_id":"56eb829d4478ab9f39a67de9ae29d330ed3b0112","user":{"login":"bartonjs","id":10642668,"avatar_url":"https://avatars.githubusercontent.com/u/10642668?v=3","gravatar_id":"","url":"https://api.github.com/users/bartonjs","html_url":"https://github.com/bartonjs","followers_url":"https://api.github.com/users/bartonjs/followers","following_url":"https://api.github.com/users/bartonjs/following{/other_user}","gists_url":"https://api.github.com/users/bartonjs/gists{/gist_id}","starred_url":"https://api.github.com/users/bartonjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bartonjs/subscriptions","organizations_url":"https://api.github.com/users/bartonjs/orgs","repos_url":"https://api.github.com/users/bartonjs/repos","events_url":"https://api.github.com/users/bartonjs/events{/privacy}","received_events_url":"https://api.github.com/users/bartonjs/received_events","type":"User","site_admin":false},"body":"Yeah, I totally missed the implication of \"Key\" there.  My bad; but I like the new name :)","created_at":"2016-05-11T22:14:05Z","updated_at":"2016-05-11T22:14:05Z","html_url":"https://github.com/dotnet/corefx/pull/6789#discussion_r62936345","pull_request_url":"https://api.github.com/repos/dotnet/corefx/pulls/6789","_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments/62936345"},"html":{"href":"https://github.com/dotnet/corefx/pull/6789#discussion_r62936345"},"pull_request":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/6789"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/6789","id":62315654,"html_url":"https://github.com/dotnet/corefx/pull/6789","diff_url":"https://github.com/dotnet/corefx/pull/6789.diff","patch_url":"https://github.com/dotnet/corefx/pull/6789.patch","issue_url":"https://api.github.com/repos/dotnet/corefx/issues/6789","number":6789,"state":"open","locked":false,"title":"Elliptic curve cng and openssl support","user":{"login":"steveharter","id":6986755,"avatar_url":"https://avatars.githubusercontent.com/u/6986755?v=3","gravatar_id":"","url":"https://api.github.com/users/steveharter","html_url":"https://github.com/steveharter","followers_url":"https://api.github.com/users/steveharter/followers","following_url":"https://api.github.com/users/steveharter/following{/other_user}","gists_url":"https://api.github.com/users/steveharter/gists{/gist_id}","starred_url":"https://api.github.com/users/steveharter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/steveharter/subscriptions","organizations_url":"https://api.github.com/users/steveharter/orgs","repos_url":"https://api.github.com/users/steveharter/repos","events_url":"https://api.github.com/users/steveharter/events{/privacy}","received_events_url":"https://api.github.com/users/steveharter/received_events","type":"User","site_admin":false},"body":"API doc is #7688 with those core APIs previously committed with #8156\r\n\r\nPlease ignore the .sln and some of the csproj and project.json changes related to project-project references as are they are there for development purposes (until algorithms.dll can be referenced via 4.2 nuget ref).","created_at":"2016-03-09T23:39:22Z","updated_at":"2016-05-11T22:14:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3b5b95ad135f64f48c729d84a01c921f8d7ccecc","assignee":{"login":"steveharter","id":6986755,"avatar_url":"https://avatars.githubusercontent.com/u/6986755?v=3","gravatar_id":"","url":"https://api.github.com/users/steveharter","html_url":"https://github.com/steveharter","followers_url":"https://api.github.com/users/steveharter/followers","following_url":"https://api.github.com/users/steveharter/following{/other_user}","gists_url":"https://api.github.com/users/steveharter/gists{/gist_id}","starred_url":"https://api.github.com/users/steveharter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/steveharter/subscriptions","organizations_url":"https://api.github.com/users/steveharter/orgs","repos_url":"https://api.github.com/users/steveharter/repos","events_url":"https://api.github.com/users/steveharter/events{/privacy}","received_events_url":"https://api.github.com/users/steveharter/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/dotnet/corefx/milestones/8","html_url":"https://github.com/dotnet/corefx/milestones/1.0.0-rtm","labels_url":"https://api.github.com/repos/dotnet/corefx/milestones/8/labels","id":1719259,"number":8,"title":"1.0.0-rtm","description":"2016 https://github.com/aspnet/Home/wiki/Roadmap","creator":{"login":"joshfree","id":1302850,"avatar_url":"https://avatars.githubusercontent.com/u/1302850?v=3","gravatar_id":"","url":"https://api.github.com/users/joshfree","html_url":"https://github.com/joshfree","followers_url":"https://api.github.com/users/joshfree/followers","following_url":"https://api.github.com/users/joshfree/following{/other_user}","gists_url":"https://api.github.com/users/joshfree/gists{/gist_id}","starred_url":"https://api.github.com/users/joshfree/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joshfree/subscriptions","organizations_url":"https://api.github.com/users/joshfree/orgs","repos_url":"https://api.github.com/users/joshfree/repos","events_url":"https://api.github.com/users/joshfree/events{/privacy}","received_events_url":"https://api.github.com/users/joshfree/received_events","type":"User","site_admin":false},"open_issues":81,"closed_issues":81,"state":"open","created_at":"2016-04-19T20:53:30Z","updated_at":"2016-05-11T21:54:01Z","due_on":"2016-06-30T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/dotnet/corefx/pulls/6789/commits","review_comments_url":"https://api.github.com/repos/dotnet/corefx/pulls/6789/comments","review_comment_url":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/corefx/issues/6789/comments","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/d6fe0e45187a8dea09e4edbcfa68b48cbe2a123c","head":{"label":"steveharter:Crypto","ref":"Crypto","sha":"d6fe0e45187a8dea09e4edbcfa68b48cbe2a123c","user":{"login":"steveharter","id":6986755,"avatar_url":"https://avatars.githubusercontent.com/u/6986755?v=3","gravatar_id":"","url":"https://api.github.com/users/steveharter","html_url":"https://github.com/steveharter","followers_url":"https://api.github.com/users/steveharter/followers","following_url":"https://api.github.com/users/steveharter/following{/other_user}","gists_url":"https://api.github.com/users/steveharter/gists{/gist_id}","starred_url":"https://api.github.com/users/steveharter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/steveharter/subscriptions","organizations_url":"https://api.github.com/users/steveharter/orgs","repos_url":"https://api.github.com/users/steveharter/repos","events_url":"https://api.github.com/users/steveharter/events{/privacy}","received_events_url":"https://api.github.com/users/steveharter/received_events","type":"User","site_admin":false},"repo":{"id":39029448,"name":"dotnet_corefx","full_name":"steveharter/dotnet_corefx","owner":{"login":"steveharter","id":6986755,"avatar_url":"https://avatars.githubusercontent.com/u/6986755?v=3","gravatar_id":"","url":"https://api.github.com/users/steveharter","html_url":"https://github.com/steveharter","followers_url":"https://api.github.com/users/steveharter/followers","following_url":"https://api.github.com/users/steveharter/following{/other_user}","gists_url":"https://api.github.com/users/steveharter/gists{/gist_id}","starred_url":"https://api.github.com/users/steveharter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/steveharter/subscriptions","organizations_url":"https://api.github.com/users/steveharter/orgs","repos_url":"https://api.github.com/users/steveharter/repos","events_url":"https://api.github.com/users/steveharter/events{/privacy}","received_events_url":"https://api.github.com/users/steveharter/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/steveharter/dotnet_corefx","description":"This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others.","fork":true,"url":"https://api.github.com/repos/steveharter/dotnet_corefx","forks_url":"https://api.github.com/repos/steveharter/dotnet_corefx/forks","keys_url":"https://api.github.com/repos/steveharter/dotnet_corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/steveharter/dotnet_corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/steveharter/dotnet_corefx/teams","hooks_url":"https://api.github.com/repos/steveharter/dotnet_corefx/hooks","issue_events_url":"https://api.github.com/repos/steveharter/dotnet_corefx/issues/events{/number}","events_url":"https://api.github.com/repos/steveharter/dotnet_corefx/events","assignees_url":"https://api.github.com/repos/steveharter/dotnet_corefx/assignees{/user}","branches_url":"https://api.github.com/repos/steveharter/dotnet_corefx/branches{/branch}","tags_url":"https://api.github.com/repos/steveharter/dotnet_corefx/tags","blobs_url":"https://api.github.com/repos/steveharter/dotnet_corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/steveharter/dotnet_corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/steveharter/dotnet_corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/steveharter/dotnet_corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/steveharter/dotnet_corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/steveharter/dotnet_corefx/languages","stargazers_url":"https://api.github.com/repos/steveharter/dotnet_corefx/stargazers","contributors_url":"https://api.github.com/repos/steveharter/dotnet_corefx/contributors","subscribers_url":"https://api.github.com/repos/steveharter/dotnet_corefx/subscribers","subscription_url":"https://api.github.com/repos/steveharter/dotnet_corefx/subscription","commits_url":"https://api.github.com/repos/steveharter/dotnet_corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/steveharter/dotnet_corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/steveharter/dotnet_corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/steveharter/dotnet_corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/steveharter/dotnet_corefx/contents/{+path}","compare_url":"https://api.github.com/repos/steveharter/dotnet_corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/steveharter/dotnet_corefx/merges","archive_url":"https://api.github.com/repos/steveharter/dotnet_corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/steveharter/dotnet_corefx/downloads","issues_url":"https://api.github.com/repos/steveharter/dotnet_corefx/issues{/number}","pulls_url":"https://api.github.com/repos/steveharter/dotnet_corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/steveharter/dotnet_corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/steveharter/dotnet_corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/steveharter/dotnet_corefx/labels{/name}","releases_url":"https://api.github.com/repos/steveharter/dotnet_corefx/releases{/id}","deployments_url":"https://api.github.com/repos/steveharter/dotnet_corefx/deployments","created_at":"2015-07-13T18:20:31Z","updated_at":"2016-01-13T22:53:29Z","pushed_at":"2016-05-11T20:13:51Z","git_url":"git://github.com/steveharter/dotnet_corefx.git","ssh_url":"git@github.com:steveharter/dotnet_corefx.git","clone_url":"https://github.com/steveharter/dotnet_corefx.git","svn_url":"https://github.com/steveharter/dotnet_corefx","homepage":"http://dotnet.github.io/core/","size":67495,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dotnet:master","ref":"master","sha":"dbdae6947381db563b081fe7dbcf116ff9df36bc","user":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":26295345,"name":"corefx","full_name":"dotnet/corefx","owner":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotnet/corefx","description":"This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others.","fork":false,"url":"https://api.github.com/repos/dotnet/corefx","forks_url":"https://api.github.com/repos/dotnet/corefx/forks","keys_url":"https://api.github.com/repos/dotnet/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/corefx/teams","hooks_url":"https://api.github.com/repos/dotnet/corefx/hooks","issue_events_url":"https://api.github.com/repos/dotnet/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/corefx/events","assignees_url":"https://api.github.com/repos/dotnet/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/corefx/tags","blobs_url":"https://api.github.com/repos/dotnet/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/corefx/languages","stargazers_url":"https://api.github.com/repos/dotnet/corefx/stargazers","contributors_url":"https://api.github.com/repos/dotnet/corefx/contributors","subscribers_url":"https://api.github.com/repos/dotnet/corefx/subscribers","subscription_url":"https://api.github.com/repos/dotnet/corefx/subscription","commits_url":"https://api.github.com/repos/dotnet/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/corefx/merges","archive_url":"https://api.github.com/repos/dotnet/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/corefx/downloads","issues_url":"https://api.github.com/repos/dotnet/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/corefx/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/corefx/releases{/id}","deployments_url":"https://api.github.com/repos/dotnet/corefx/deployments","created_at":"2014-11-06T23:42:48Z","updated_at":"2016-05-11T17:26:50Z","pushed_at":"2016-05-11T22:10:51Z","git_url":"git://github.com/dotnet/corefx.git","ssh_url":"git@github.com:dotnet/corefx.git","clone_url":"https://github.com/dotnet/corefx.git","svn_url":"https://github.com/dotnet/corefx","homepage":"http://dotnet.github.io/","size":93076,"stargazers_count":9655,"watchers_count":9655,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2308,"mirror_url":null,"open_issues_count":965,"forks":2308,"open_issues":965,"watchers":9655,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/6789"},"html":{"href":"https://github.com/dotnet/corefx/pull/6789"},"issue":{"href":"https://api.github.com/repos/dotnet/corefx/issues/6789"},"comments":{"href":"https://api.github.com/repos/dotnet/corefx/issues/6789/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/6789/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/6789/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/corefx/statuses/d6fe0e45187a8dea09e4edbcfa68b48cbe2a123c"}}}}